โปรSF ที่เราจะเขียนในครั้งนี้นะครับ มีทั้งหมดดังนี้
-WallHack
-Chams
-NoFog
-FullBright
-Xray
-NoSmoke(โครงร่าง)
-NoFlash(โครงร่าง)
-WireFrame(ทั้งหมด)
-Crosshair
-Asus Wallhack
-GlassWalls
-NoFlash
-NoSmoke
-NoWater
-NoSky
มาดูขั้นตอนและหลังไวยากรณ์คอมพิวเตอร์กันเลยครับเพื่อนๆ
วันนี้แอดมินแค่เพียงจะชี้ให้เห็นสิ่งที่คุณควรจะต้องการทราบว่าเราเชื่อหรือไม่ คุณสามารถสีอะไรที่คุณต้องการที่จะทำให้โครงการเล็ก ๆ น้อย ๆ สนุก สี Wallz สีเหลือง, สีแดง, สีเขียว! มาดูกันเลยครับ WallHack ขั้นตอนแรก
โค้ด
Globals: int colored walls;
โค้ด
If(colored walls)//your bool statement in globals texnum = (nNumVertices*100000)+nPrimitiveCount;//having it in texnums never hurts, unless its just a stride if(m_Stride == model_rec)//Model Recognition, this recognizes what you want to color in, so we would have to get a Model Recognition logger, go in game and find the Stride for the wall/floor { { pDevice->SetTexture( 0, Red ); / / เราทำให้มันเป็นสีแดง ไงเราจะได้สีที่มันตรวจสอบ shizznet ต่อไปภายใต้การนี้ Chams .. } return pDrawIndexedPrimitive(pDevice, pType, nMinIndex, nNumVertices, nStartIndex, nPrimitiveCount); }
เราจะใส่สีอะไรก็ตาม Chams มันจะทำงานแตกต่างกันออกไปเพื่อหาว่า คนที่อยู่หลังกำแพง(ในเกมส์อ่าครับ)หรือไม่เมื่ออยู่หน้าเรามันจะกำหนดสี .... (ที่เรากำหนดไว้) เมื่อบางสิ่งบางอย่างอยู่ข้างหลังของสิ่งนั้นเช่น กำแพง หลังกล่อง ในโกดัง อะไรประมาณนี้นะครับ งั้นมาดูวิธีที่แอดมินใส่โค้ดสีใน Chams กันเลยนะครับ เราก็จะได้แบบนี้
โค้ด
//==================================Defines============================================ #define ForceRecon (nNumVertices == 83 && nPrimitiveCount == 137 || nNumVertices == 79 && nPrimitiveCount == 105 || nNumVertices == 142 && nPrimitiveCount == 174 || nNumVertices == 278 && nPrimitiveCount == 462 || nNumVertices == 263 && nPrimitiveCount == 290 || nNumVertices == 316 && nPrimitiveCount == 556) #define ForceReconAddons (nNumVertices == 432 && nPrimitiveCount == 354 || nNumVertices == 144 && nPrimitiveCount == 136 || nNumVertices == 299 && nPrimitiveCount == 311 || nNumVertices == 167 && nPrimitiveCount == 252 || nNumVertices == 298 && nPrimitiveCount == 506 || nNumVertices == 168 && nPrimitiveCount == 254 || nNumVertices == 860 && nNumVertices == 778 || nNumVertices == 648 && nPrimitiveCount == 710 || nNumVertices == 113 && nPrimitiveCount == 189 || nNumVertices == 142 && nPrimitiveCount == 172 || nNumVertices == 87 && nPrimitiveCount == 90 || nNumVertices == 79 && nPrimitiveCount == 105 || nNumVertices == 84 && nPrimitiveCount == 110 || nNumVertices == 70 && nPrimitiveCount == 70 || nNumVertices == 860 && nPrimitiveCount == 778 || nNumVertices == 85 && nPrimitiveCount == 137) #define Mulan (nNumVertices == 118 && nPrimitiveCount == 126|| nNumVertices == 121 && nPrimitiveCount == 180|| nNumVertices == 124 && nPrimitiveCount == 126|| nNumVertices == 295 && nPrimitiveCount == 482|| nNumVertices == 299 && nPrimitiveCount == 452|| nNumVertices == 474 && nPrimitiveCount == 728) #define MulanAddons (nNumVertices == 162 && nPrimitiveCount == 200|| nNumVertices == 120 && nPrimitiveCount == 188|| nNumVertices == 167 && nPrimitiveCount == 276|| nNumVertices == 108 && nPrimitiveCount == 198|| nNumVertices == 512 && nPrimitiveCount == 728|| nNumVertices == 790 && nPrimitiveCount == 881|| nNumVertices == 619 && nPrimitiveCount == 800|| nNumVertices == 399 && nPrimitiveCount == 532|| nNumVertices == 402 && nPrimitiveCount == 580|| nNumVertices == 102 && nPrimitiveCount == 170|| nNumVertices == 125 && nPrimitiveCount == 98|| nNumVertices == 116 && nPrimitiveCount == 128|| nNumVertices == 160 && nPrimitiveCount == 174) //========================================================
และต่อไปนี้ในการกำหนดรูปแบบตัวอักศรให้เป็นประโยชน์กับ Globals: มากที่สุด เราก็ต้องประกาศ ก่อนเปิดใช้งานโปรแกรม นะครับ เพื่อให้โปรแกรมนั้นรู้ว่าเราได้ เรียกใช้งานมันแล้ว มาดูวิธีประกาศกันเลยครับ
โค้ด
int m_Stride; int texnum; int nNumVertices; int nPrimitiveCount; LPDIRECT3DTEXTURE8 Red; LPDIRECT3DTEXTURE8 Yellow; LPDIRECT3DTEXTURE8 Green; LPDIRECT3DTEXTURE8 Blue; LPDIRECT3DTEXTURE8 Purple; LPDIRECT3DTEXTURE8 Orange; LPDIRECT3DTEXTURE8 Pink; LPDIRECT3DTEXTURE8 White; LPDIRECT3DTEXTURE8 Black; bool chams = false; bool Color = true;
ตอนนี้เราก็ได้รู้เรื่องการประกาศกันไปแล้วนะครับ แต่ในเมื่อเราต้องการประกาศสี แล้วเราจะสร้างสีพวกนั้นยังไงละ? ตอนแรกแอดมินบอกว่ามีใช่ไมครับ จริงๆแล้วเรายังไม่มีอะไรเลยตั้งหาก เพื่อที่จะแสดงให้เห็นถึงวิธีการสร้างสีเหล่านั้นเราจะใช้ฟังก์ชั่นนี้ครับ
โค้ด
//======================================================================================================================================================================================================================================================================================================================// HRESULT GenerateTexture(IDirect3DDevice8 *pD3Ddev, IDirect3DTexture8 **ppD3Dtex, DWORD colour32) { if( FAILED(pD3Ddev->CreateTexture(8, 8, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED, ppD3Dtex)) ) return E_FAIL; WORD colour16 = ((WORD)((colour32>>28)&0xF)<<12) |(WORD)(((colour32>>20)&0xF)<<8) |(WORD)(((colour32>>12)&0xF)<<4) |(WORD)(((colour32>>4)&0xF)<<0); D3DLOCKED_RECT d3dlr; (*ppD3Dtex)->LockRect(0, &d3dlr, 0, 0); WORD *pDst16 = (WORD*)d3dlr.pBits; for(int xy=0; xy < 8*8; xy++) *pDst16++ = colour16; (*ppD3Dtex)->UnlockRect(0); return S_OK; } //==============================================================================================================้
แต่เราต้องทำอะไรให้มากขึ้นกับ (R.I.P Billy Mayes) และเมื่อเราสร้างสีมาแล้ว แต่มันยังใช้งานไม่ได้ มาดูกันเลย
โค้ด
bool Color = true;
จากนั้น การจบ การใช้งานฟังก์ชั่นต่างๆของเรา เราต้องกำหนดสีในแต่ละครั้ง (EndScene) ตรงนี้คือคำสั่ง จบการใช้งานฟังก์ชั่น มาดูขั้นตอนกันเลยครับ
โค้ด
typedef HRESULT ( WINAPI* oEndScene ) ( LPDIRECT3DDEVICE8 pDevice ); oEndScene pEndScene; HRESULT WINAPI myEndScene(LPDIRECT3DDEVICE8 pDevice) { if(Color) { GenerateTexture(pDevice, &Red, D3DCOLOR_ARGB (255 , 255 , 0 , 0 )); GenerateTexture(pDevice, &Yellow, D3DCOLOR_ARGB (255 , 255 , 255 , 0 )); GenerateTexture(pDevice, &Green, D3DCOLOR_ARGB (255 , 0 , 255 , 0 )); GenerateTexture(pDevice, &Blue, D3DCOLOR_ARGB (255 , 0 , 0 , 255 )); GenerateTexture(pDevice, &Purple, D3DCOLOR_ARGB (255 , 102 , 0 , 153 )); GenerateTexture(pDevice, &Pink, D3DCOLOR_ARGB (255 , 255 , 20 , 147 )); GenerateTexture(pDevice, &Orange, D3DCOLOR_ARGB (255 , 255 , 165 , 0 )); GenerateTexture(pDevice, &Black, D3DCOLOR_ARGB (255 , 0 , 0 , 0 )); GenerateTexture(pDevice, &White, D3DCOLOR_ARGB (255 , 255 , 255 , 255 )); Color=false; } return pEndScene(pDevice); }
ขั้นตอนต่อไปเรามาดูวิธีการใช้ Generate Texture ตอนนี้เรามีสีทั้งหมดแล้วนะครับ (ไอเทมอาจเพิ่มมากขึ้นถ้าเราพบใน google) เราจะทำจบการใช้งานฟังก์ชั่นให้เพิ่มขึ้น และในฟังก์ชั่นของเราควรที่รู้จัก DrawIndexedPrimitive การกำหนดนั้นก็เหมือนกับสีพื้นและสีผนังของเรานะครับโค้ดไอเทมทั้งหมด ในSF นะครับ เช่น เสื้อ กางเกง หมวก รองเท้า ระเบิดและปืนต่างๆ มาดูโค้ดกันเลย
โค้ด
typedef HRESULT ( WINAPI* oDrawIndexedPrimitive ) ( LPDIRECT3DDEVICE8 pDevice, D3DPRIMITIVETYPE pType, UINT nMinIndex, UINT nNumVertices, UINT nStartIndex, UINT nPrimitiveCount ); oDrawIndexedPrimitive pDrawIndexedPrimitive; HRESULT WINAPI myDrawIndexedPrimitive(LPDIRECT3DDEVICE8 pDevice, D3DPRIMITIVETYPE pType, UINT nMinIndex, UINT nNumVertices, UINT nStartIndex, UINT nPrimitiveCount) { if(chams) { texnum = (nNumVertices*100000)+nPrimitiveCount; if(m_Stride==40 && (texnum==34900580)|| // Delta Force Head (texnum==36100604)|| // Spetsnaz Head (texnum==38000658)|| // Spetsnaz Legs (texnum==18300268)|| // Spetsnaz Body (texnum==36200604)|| // GIGN Head (texnum==21200306)|| // GIGN Body (texnum==35500568)|| // GSG9 Head (texnum==2200024)|| // GSG9 Bangs (texnum==8800105)|| // GSG9 Feet (texnum==36900650)|| // GSG9 Legs (texnum==19600314)|| // GSG9 Body (texnum==36700612)|| // SAS Head (texnum==8500105)|| // SAS Feet (texnum==37000650)|| // SAS Legs (texnum==18000274)|| // SAS Body (texnum==35300556)|| // KSF Head (texnum==7500121)|| // KSF Arms (texnum==9200115)|| // KSF Feet (texnum==12400168)|| // KSF Hands (texnum==30100522)|| // KSF Legs (texnum==18700288)|| // KSF Body (texnum==40900594)|| // ARTC Head (texnum==11700190)|| // ARTC Arms (texnum==9100118)|| // ARTC Feet (texnum==12500170)|| // ARTC Hands (texnum==37000634)|| // ARTC Legs (texnum==41700516)|| // ARTC Body (texnum==19400260)|| // ROKMC Body (texnum==37900592)|| // ROKMC Head (texnum==36500642)|| // ROKMC Legs (texnum==44800776)|| // SRG Head (texnum==15900200)|| // SRG Left Arm (texnum==10500168)|| // SRG Right Arm (texnum==80401016)|| // SRG Body (texnum==10000121)|| // SRG Feet (texnum==13200180)|| // SRG Hands (ForceRecon)|| // ForceRecon (Mulan)|| (texnum==33800534)) // SRG Leg { pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_NEVER); pDevice->SetTexture(0,Yellow); pDrawIndexedPrimitive(pDevice, pType, nMinIndex, nNumVertices, nStartIndex, nPrimitiveCount); pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESSEQUAL); pDevice->SetTexture(0,Red); } if (nNumVertices == 213 && nPrimitiveCount == 174) // M67 Grenade =============== // { pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_NEVER); pDevice->SetTexture(0,Red); pDrawIndexedPrimitive(pDevice, pType, nMinIndex, nNumVertices, nStartIndex, nPrimitiveCount); pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESSEQUAL); pDevice->SetTexture(0,Green); } if (nNumVertices == 158 && nPrimitiveCount == 131) // Flashbang =============== // { pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_NEVER); pDevice->SetTexture(0,Red); pDrawIndexedPrimitive(pDevice, pType, nMinIndex, nNumVertices, nStartIndex, nPrimitiveCount); pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESSEQUAL); pDevice->SetTexture(0,Green); } if (nNumVertices == 171 && nPrimitiveCount == 143) // Smoke Grenade =============== // { pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_NEVER); pDevice->SetTexture(0,Red); pDrawIndexedPrimitive(pDevice, pType, nMinIndex, nNumVertices, nStartIndex, nPrimitiveCount); pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESSEQUAL); pDevice->SetTexture(0,Blue); } if (nNumVertices == 271 && nPrimitiveCount == 257) // VX Grenade =============== // { pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_NEVER); pDevice->SetTexture(0,Red); pDrawIndexedPrimitive(pDevice, pType, nMinIndex, nNumVertices, nStartIndex, nPrimitiveCount); pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESSEQUAL); pDevice->SetTexture(0,Blue); } if (nNumVertices == 338 && nPrimitiveCount == 339) // RGD-5 Grenade =============== // { pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_NEVER); pDevice->SetTexture(0,Red); pDrawIndexedPrimitive(pDevice, pType, nMinIndex, nNumVertices, nStartIndex, nPrimitiveCount); pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESSEQUAL); pDevice->SetTexture(0,Yellow); } if (m_Stride==40 && // Equipment =============== // (texnum==13200212)|| // Delta Force Helmet (texnum==13200212)|| // Delta Force Helmet 2 (texnum==34700538)|| // Delta Force Gas Mask (texnum==19500352)|| // Delta Force Balaclava (texnum==84900778)|| // Delta Force Clan BDU (texnum==27500442)|| // Delta Force Body Armor (texnum==42800576)|| // Delta Force Body Armor 2 (texnum==52100658)|| // Delta Force Tactical Vest (texnum==12200196)|| // Spetsnaz Helmet (texnum==27100464)|| // Spetsnaz Gas Mask (texnum==33600552)|| // Spetsnaz Body Armor (texnum==44100646)|| // Spetsnaz Tactical Vest (texnum==17800292)|| // GIGN Red Bandana (texnum==21300290)|| // GIGN Helmet (texnum==2800036)|| // GIGN Helmet Lens (texnum==35700558)|| // GIGN Gas Mask (texnum==22100396)|| // GIGN Balaclava (texnum==29700492)|| // GIGN Body Armor (texnum==11200188)|| // ROKMC Beret (texnum==12000194)|| // ROKMC Helmet (texnum==29800450)|| // ROKMC Gas Mask (texnum==27100394)|| // ROKMC Body Armor (texnum==28700374)|| // ROKMC X Harness (texnum==34700470)|| // ROKMC X Harness (texnum==5100056)|| // ROKMC Pouch (texnum==9900163)|| // ROKMC Left Arm (texnum==18300163)|| // ROKMC Right Arm (texnum==16400266)|| // GSG9 Red Bandana (texnum==16200243)|| // GSG9 Helmet (texnum==31900466)|| // GSG9 Gas Mask (texnum==19300342)|| // GSG9 Balaclava (texnum==83600752)|| // GSG9 Clan BDU (texnum==33400477)|| // GSG9 Body Armor (texnum==10500163)|| // GSG9 Rolled Up Sleeves (texnum==38100666)|| // GSG9 Tactical Knee Pads (texnum==9600172)|| // SAS Boonie Hat (texnum==14200236)|| // SAS Helmet (texnum==37800552)|| // SAS Gas Mask (texnum==28100486)|| // SAS Balaclava (texnum==62400752)|| // SAS Clan BDU (texnum==27900456)|| // SAS Body Armor (texnum==45700654)|| // SAS Tactical Vest (texnum==39800532)|| // SAS Tactical Vest 2 (texnum==9200100)|| // SAS Holster (texnum==4800040)|| // SAS Magazine Pouch (texnum==4000044)|| // SAS Pouch (texnum==6500110) || // KSF Boonie Hat (texnum==12900208)|| // KSF Helmet (texnum==29600448)|| // KSF Gas Mask (texnum==31100398)|| // KSF Sunglasses (texnum==84700776)|| // KSF Clan BDU (texnum==600004)|| // KSF Clan BDU Logo (texnum==36500606)|| // KSF Body Armor (texnum==63100646)|| // KSF Tactical Vest (texnum==19800163)|| // KSF Rolled Up Sleeves (texnum==7000066)|| // KSF Holster (texnum==10400190)|| // SRG Beret (texnum==23800294)|| // SRG Deer Head (texnum==11600180)|| // SRG NIJ IIIA Helmet (texnum==17100278)|| // SRG Red Bandana (texnum==14600198)|| // SRG Battle Cap (texnum==18200266)|| // SRG Helmet (texnum==19100106)|| // SRG Gas Mask (texnum==54300350)|| // SRG Sunglasses (texnum==30800380)|| // SRG Mid Class Sunglasses (texnum==79300995)|| // SRG Clan BDU 1 (texnum==13300138)|| // SRG Clan BDU 2 (texnum==300001)|| // SRG Clan BDU 3 (texnum==1200012)|| // SRG Clan BDU Logo (texnum==10900110)|| // SRG Bulletproof Vest (texnum==6200064)|| // SRG Holster (ForceReconAddons)|| (MulanAddons)|| (texnum==22700250)) // SRG Pouch { pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_NEVER); pDevice->SetTexture(0,Green); pDrawIndexedPrimitive(pDevice, pType, nMinIndex, nNumVertices, nStartIndex, nPrimitiveCount); pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESSEQUAL); pDevice->SetTexture(0,Blue); } if (m_Stride==40 && // Guns =============== // (texnum==187200968)|| // GALIL (texnum==187200968)|| // GALIL 2 (texnum==149701124)|| // UZI (texnum==193701304)|| // M249 (texnum==232501431)|| // SIG551 (texnum==161500751)|| // FA-MAS (texnum==107400724)|| // FR-F2 (texnum==141600900)|| // AN94 (texnum==145900805)|| // G36C (texnum==42200339)|| // K1 (texnum==23400116)|| // K1 2 (texnum==17500073)|| // K1 3 (texnum==3200012)|| // K1 4 (texnum==2300012)|| // K1 5 (texnum==71900459)|| // MP5 (texnum==1800008)|| // MP5 2 (texnum==20300084)|| // MP5 3 (texnum==16700083)|| // MP5 4 (texnum==79100469)|| // M4A1 (texnum==12000044)|| // M4A1 2 (texnum==16800062)|| // M4A1 3 (texnum==2400008)|| // M4A1 4 (texnum==600002)|| // M4A1 5 (texnum==12800050)|| // M4A1 6 (texnum==2600010)|| // M4A1 7 (texnum==4200014)|| // M4A1 8 (texnum==1400008)|| // M4A1 9 (texnum==80600442)|| // M16A2 (texnum==13400052)|| // M16A2 2 (texnum==17600066)|| // M16A2 3 (texnum==5400018)|| // M16A2 4 (texnum==46200348)|| // STEYR_AUG (texnum==27000133)|| // STEYR_AUG 2 (texnum==4100025)|| // STEYR_AUG 3 (texnum==1200006)|| // STEYR_AUG 4 (texnum==400002)|| // STEYR_AUG 5 (texnum==46800367)|| // PSG-1 (texnum==9600042)|| // PSG-1 2 (texnum==18800092)|| // PSG-1 3 (texnum==16900071)|| // PSG-1 4 (texnum==3400012)|| // PSG-1 5 (texnum==800004)|| // PSG-1 6 (texnum==40500383)|| // K2 (texnum==15800089)|| // K2 2 (texnum==2200012)|| // K2 3 (texnum==7000034)|| // K2 4 (texnum==60700349)|| // P90 (texnum==5500033)|| // P90 2 (texnum==47700227)|| // P90 3 (texnum==10300047)|| // P90 4 (texnum==3800014)|| // P90 5 (texnum==50300349)|| // AK-74 (texnum==14700071)|| // AK-74 2 (texnum==13100061)|| // AK-74 3 (texnum==194501145)|| // MG36 (texnum==116000670)|| // DESERT EAGLE (texnum==182101089)|| // MR73 (texnum==62500454)|| // REMINGTON M870 (texnum==95200571)|| // BENELLI M1 (texnum==40700334)|| // GLOCK 23 (texnum==71500449)|| // BERETTA M92F (texnum==11000044)|| // BERETTA M92F 2 (texnum==16500075)|| // BERETTA M92F 3 (texnum==4400020)|| // BERETTA M92F 4 (texnum==2800014)|| // BERETTA M92F 5 (texnum==92000543)|| // COLT 45 (texnum==239001276)) // DRAGONUV { pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_NEVER); pDevice->SetTexture(0,Blue); pDrawIndexedPrimitive(pDevice, pType, nMinIndex, nNumVertices, nStartIndex, nPrimitiveCount); pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESSEQUAL); pDevice->SetTexture(0,Green); } } return pDrawIndexedPrimitive(pDevice, pType, nMinIndex, nNumVertices, nStartIndex, nPrimitiveCount); }
ตอนนี้เพื่อนๆก็ได้รู้มาพอสมควรแล้วนะครับ อธิบายต่อเลยละกัน
4ชนิดที่แตกต่างกันออกไป ทุกรูปแบบเช่นเดียวกับตัวละครของแต่ละคนหรือการวิ่งของแต่ละคนนะครับ Numvertices หรือ Primcount ในกรณีที่ผู้เล่นคนอื่นวิ่งเข้ามาใกล้ตัวเรา ระยะ 40ก้าว เราจะได้รับ Chammed ... แต่เราจะใช้ numvertices primcount และมันจะ ชี้ ให้เราเห็น สิ่งที่เคลื่อนไหวพร้อมสีที่เรากำหนดไว้ก่อนหน้านี้ และมันจะลดความซับซ้อนของ เกมส์ลงนะครับ ส่วนใหญ่จะไม่ได้มีการวิ่งยที่เราจะรับรู้ทุกอย่างเหมือน soldierfront และเราต้อง numverts และ primcounts ... เหมือนกังวน, modelrecognition ผู้เล่นจะวิ่ง == 40 ดังนั้น texnum เป็น
โค้ด
texnum = (nNumVertices*100000)+nPrimitiveCount;
เพียงใช้ฟังก์ชั่นนี้เมื่อเรากำลัง useing nNumvertices primcout และตอนนี้เพื่อนๆก็ได้รู้ทุกอย่างเกี่ยวกับ texnums และนะครับ และใน globals เราจะมาพูดถึง Chams กันนะครับ มาดูกันเลย
โค้ด
pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_NEVER); pDevice->SetTexture(0,Yellow); pDrawIndexedPrimitive(pDevice, pType, nMinIndex, nNumVertices, nStartIndex, nPrimitiveCount); pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESSEQUAL); pDevice->SetTexture(0,Red);
นี้เป็นโค้ด wallhack ทั้งหมดที่เพื่อนๆจำเป็นต้องรู้ก็คือว่าเราช่วยให้บัฟเฟอร์และเปลี่ยนพวกให้ที่จะเห็นผู้เล่นคนอื่นที่อยู่หลังกำแพง .. และ ที่คุณเห็น นะครับ
โค้ด
pDevice->SetTexture(0,Yellow);
โค้ด
pDevice->SetTexture(0,Red);
และนี้ก็คือวิธีที่แอดมินใส่สี texnums ของเรานะครับ (การรับรู้ทุกรูปแบบ) ผู้เล่นคนอื่นที่อยู่หลังกำแพงที่2ในด้านหน้าสีของผนัง เราสามารถเปลี่ยนสีอะไรก็ได้นะครับ ในที่นี้แอดมินได้พูดถึงเรื่อง globals อยู่นะครับ เรามาสร้างการประกาศสีฟังก์ชั่นกันเถอะ (ในกรณีที่เพื่อนๆบางคนลืมนะครับ)
โค้ด
LPDIRECT3DTEXTURE8 Red; LPDIRECT3DTEXTURE8 Yellow; LPDIRECT3DTEXTURE8 Green; LPDIRECT3DTEXTURE8 Blue; LPDIRECT3DTEXTURE8 Purple; LPDIRECT3DTEXTURE8 Orange; LPDIRECT3DTEXTURE8 Pink; LPDIRECT3DTEXTURE8 White; LPDIRECT3DTEXTURE8 Black;
ตอนนี้ thats Chams โอ้ของเราและปืนเพื่อนๆก็สามารถปรับเปลี่ยนสีบนมีรหัส wallhack ที่เหมาะสมกับการใช้งานของตัวเองได้นะครับภ ดังนั้นสิ่งที่แอดมินพยายามจะพูดคือคุณสามารถสีอะไรตราบใดที่เพื่อนๆได้รับการยอมรับรูปแบบของ ย้าย! / / ============================================= ================================================== ================================================== ================================================== ================================================== ================================================== ============== / / ตอนนี้เรามี Chams ของเราและอะไรจริงๆ ที่เราต้องการสีครับ แต่การรับรู้ของเรามาจาก SetStreamSource สถานที่ที่แตกต่างกัน ฟังก์ชั่นอื่น นะครับ
โค้ด
typedef HRESULT ( WINAPI* oSetStreamSource ) ( LPDIRECT3DDEVICE8 pDevice, UINT nStreamNumber, LPDIRECT3DVERTEXBUFFER8 pStreamData, UINT nStride ); oSetStreamSource pSetStreamSource; HRESULT WINAPI mySetStreamSource(LPDIRECT3DDEVICE8 pDevice, UINT nStreamNumber, LPDIRECT3DVERTEXBUFFER8 pStreamData, UINT nStride) { if(nStreamNumber==0) m_Stride = nStride; return pSetStreamSource(pDevice, nStreamNumber, pStreamData, nStride); }
ดูโค้ดที่บอกว่า m_Stride = nStride? ดี nStride นอกเหนือของ modelrecognition และเราใช้ m_Stride โดยบอกว่าพวกมันเท่ากันและกัน m_Stride ในโค้ดของเรา Chams = nStride .. ตอนนี้คุณจะพูดว่าทำไม dontwe เพียงแค่ใช้ nStride แทน? ดีที่เรามีการใช้ฟังก์ชั่นนี้เพื่อระบุหรือใช้ระบบการรับรู้รูปแบบ ตอนนี้เราต้องกำหนดการเปิดใช้งานฟังก์ชั่นนะครับ แล้วกลับไปที่ endscene (จบการใช้งานฟังก์ชั่น)ตอนนี้ทำไมต้องทำ Endscene เป็นสิ่งสำคัญเพื่อ เพราะมันทำให้ทุกเฟรมต่อวินาที ต้องการเพิ่มฮอต เราจะทำดังนี้
โค้ด
if (GetAsyncKeyState(VK_F1)&1) // if we click f1 { chams = !chams; } // chams = on
ตอนนี้เรากำหนดชื่อจะต้องมีสิ่งที่เหมื่อนว่ามันเป็น แอดมินจำได้ว่า เราใช้ (colored walls) มาก่อนสินะ
โค้ด
if (GetAsyncKeyState(VK_F2)&1) // if we click f2 { colored walls = !colored walls; } // colored walls = on
ชื่อจะต้องมีฟังก์ชั่นเช่นเดียวกัน ถ้าและเป็นอยู่ใน globals, thats ทำไมเรากำหนดเช่นChams บูล = false; เพื่อให้เราสามารถเพิ่มฮอตคีย์เพื่อ Chams และรู้จักมัน ว้าที่มากแต่เราต้องใส่มันมากขึ้น ( Dam billy mayes) ต้องการไม่มีหมอกเอ็กซ์เรย์, Fullbright? ประกาศให้เป็นครั้งแรกเช่น Chams
โค้ด
int nofog; int xray; int fullbright;
ตอนนี้ที่เราสามารถใส่ชื่อหรือ เครดิตฟังก์ชันอื่น SetRenderState เพื่อให้เพื่อนๆมีสองตัวเลือก ใส่ใส่ชื่อหรือ SRS. P. ได้รับการตรวจพบในเกมส่วนใหญ่ดังนั้นแอดมินวางไว้ใน SetRenderstate, มันจะช่วยให้เพื่อนๆได้ใช้ฟังก์ชั่นอื่น ๆ ได้นะครับ
โค้ด
typedef HRESULT ( WINAPI* oSetRenderState ) ( LPDIRECT3DDEVICE8 pDevice, D3DRENDERSTATETYPE State, DWORD Value); oSetRenderState pSetRenderState; HRESULT WINAPI mySetRenderState(LPDIRECT3DDEVICE8 pDevice, D3DRENDERSTATETYPE State, DWORD Value) { if(fullbright) { pDevice->SetRenderState(D3DRS_LIGHTING, false); //d3d lighting off pDevice->SetRenderState(D3DRS_AMBIENT,D3DCOLOR_ARGB(255,255,255,255)); // use all colors to glow up the lighting ingame } if(nofog) // if nofog on { // เปิด pDevice->SetRenderState(D3DRS_FOGENABLE, false); // ปิดการใช้งานในส่วนนี้ } // จบฟังก์ชั่น if(xray) { if(m_Stride == Modelrecognition) //สามารถกำหนดการวิ่ง { m_pD3Ddev->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); } } return pSetRenderState(pDevice,State, Value); }
ตอนนี้เรามี3โปรที่แตกต่างกันใน SRS (SetRenderstate)!เหมือนกับก่อนหน้านี้ที่เราแค่ต้องเพิ่มการเรียกใช้งานฟังก์ชั่น และจบการใช้งานฟังก์ชั่นนะครับ
โค้ด
if (GetAsyncKeyState(VK_F3)&1) // if we click f3 { //then nofog = !nofog; //nofog = on } //end of then
ในตอนนี้เรามี
-Wallhack
-Chams
-NoFog
-Xray
-FullBright
และต่อไปเราจะทำ Crosshair ใส่ globals นะครับมาดูโค้ดกันเลย
โค้ด
float ScreenCenterX = 0.0f; float ScreenCenterY = 0.0f; bool xhair = false; D3DCOLOR redt = D3DCOLOR_XRGB( 255, 0, 0 );
ทำเหมือนเดิมครับประกาศ xhair เรายังให้มันเป็นสีแดง (เพื่อนๆแค่ใช้สีปกติคือสีแดงหรือสีอะไรก็ได้นะครับ) ดังนั้นที่นี่เราก็จะยังทำเหมือนทุกครั้งก็คือ จบการใช้งานฟังก์ชั่นในแต่ละครั้ง(endscene)
โค้ด
if(xhair) { D3DRECT rec2 = {ScreenCenterX-20, ScreenCenterY, ScreenCenterX+ 20, ScreenCenterY+2}; D3DRECT rec3 = {ScreenCenterX, ScreenCenterY-20, ScreenCenterX+ 2,ScreenCenterY+20}; pDevice->Clear(1, &rec2, D3DCLEAR_TARGET,redt, 0, 0); pDevice->Clear(1, &rec3, D3DCLEAR_TARGET,redt, 0, 0); }
เรากำลังเขียนก่อน endscene ที่มันว่า redt เพื่อนๆสามารถเปลี่ยนได้นะครับ ของสีที่เราประกาศ แต่การที่จะเพิ่มการเล็งของเรานั้นต้อง screenpositioning และเราต้องใช้ฟังก์ชั่น SetViewPor ครับ มาดูโค้ดกันเลย
โค้ด
typedef HRESULT (WINAPI* oSetViewport)(LPDIRECT3DDEVICE8 pDevice,CONST D3DVIEWPORT8* pViewport); oSetViewport pSetViewport; HRESULT WINAPI mySetViewport(LPDIRECT3DDEVICE8 pDevice,CONST D3DVIEWPORT8* pViewport) { ScreenCenterX = ( float )pViewport->Width / 2; ScreenCenterY = ( float )pViewport->Height / 2; return pSetViewport(pDevice,pViewport); }
จากนี้เราแค่ใส่ตำแหน่งการเปิดโปรแกรมเหมือนเช่นเคยนะครับ และเพื่อนคงรู้แล้วนะครับว่าต้องทำอย่างไรต่อไป กลับไปที่ Endscene เพิ่มการเรียกใช้งานฟังก์ชั่น มาดูโค้ดกันเลย
โค้ด
if (GetAsyncKeyState(VK_F8)&1) // if we click f8 { xhair = !xhair; } // xhair = on
และในตอนนี้เรามีทั้งหมด
-WallHack
-Chams
-Nofog
-Xray
-Fullbright
-Crosshair
แล้วนะครับ มาดูกันต่อเลยนะครับ
โค้ด
typedef HRESULT ( WINAPI* oDrawIndexedPrimitive ) ( LPDIRECT3DDEVICE8 pDevice, D3DPRIMITIVETYPE pType, UINT nMinIndex, UINT nNumVertices, UINT nStartIndex, UINT nPrimitiveCount ); oDrawIndexedPrimitive pDrawIndexedPrimitive, OriginalDrawIndexedPrimitive; HRESULT WINAPI myDrawIndexedPrimitive(LPDIRECT3DDEVICE8 pDevice, D3DPRIMITIVETYPE pType, UINT nMinIndex, UINT nNumVertices, UINT nStartIndex, UINT nPrimitiveCount) { if(WireFame) if(m_Stride == modelrecog) { // then pDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); } // end of then
นี้สามารถไปได้ทั้ง SetRenderState มันไม่สำคัญเท่าไหร่หรอกครับ บางทีถ้าได้รับการตรวจพบ เราคงต้องยอมรับรูปแบบที่จะเลือกสิ่งที่เราต้องการ wireframe ต้องการสิ่งที่คุณต้องการสี ในการจดจำ globals มาดูโค้ดกันเลยครับ
โค้ด
int WireFrame;
เพิ่มการเรียกใช้ฟังก์ชั่น
โค้ด
if (GetAsyncKeyState(VK_F3)&1) // if we click f3 { //then wireframe = !wireframe; //wireframe = on } // end of then
ตอนนี้เพื่อนๆรู้อะไรดีๆเกี่ยวกับการสอนเขียนโปรSF เราสามารถสร้าง nosmoke และแฟลชกับเรื่องนี้ แต่เราจะต้อง modelrecognition ของควันและแฟลช (ระเบิดในSF) จำไว้ว่าแอดมินบอกว่าอยู่ในระยะ == 40 ก้าวแสดงผลทุกอย่างใน soldierfront? ดูโค้ดกันเลย
if(m_Stride == 40)
{ // then
pDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
} // end of then
[/CODE]
แล้วทุกอย่างจะ wiredframe เวลาจบ sexy AsusWallhack Globals
โค้ด
int AsusWallhack;
และเรามาดูโค้ดใน SetRenderstate ต่อกันเลยนะครับ
โค้ด
typedef HRESULT ( WINAPI* oDrawIndexedPrimitive ) ( LPDIRECT3DDEVICE8 pDevice, D3DPRIMITIVETYPE pType, UINT nMinIndex, UINT nNumVertices, UINT nStartIndex, UINT nPrimitiveCount ); oDrawIndexedPrimitive pDrawIndexedPrimitive, OriginalDrawIndexedPrimitive; HRESULT WINAPI myDrawIndexedPrimitive(LPDIRECT3DDEVICE8 pDevice, D3DPRIMITIVETYPE pType, UINT nMinIndex, UINT nNumVertices, UINT nStartIndex, UINT nPrimitiveCount) { if(AsusWallhack) if(Model_rec//for walls) { pDevice->SetRenderState( D3DRS_SRCBLEND, 3 ); pDevice->SetRenderState( D3DRS_DESTBLEND, 4 ); pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, true ); } }
แล้วเพิ่มการเรียกใช้งานฟังก์ชั่นนะครับ
ดังนั้นสั่งที่แอดมินสอนเขียนโปรSF ในบทความนี้ก็มีทั้งหมด
-WallHack
-Chams
-NoFog
-FullBright
-Xray
-NoSmoke(wireFrame)
-NoFlash(Wireframe)
-WireFrame(Whole screen)
-Crosshair
-Asus Wallhack
แอดมินขอ อัพเดทฟังก์ชั่น NoSKy,NOFlash,NoSmoke,NoWater เลยนะครับ
โค้ด
int nosky;
โค้ด
if(nosky) { if(modelrec) { return D3D_OK } }
โค้ด
int noflash;
ฟังก์ชั่นNoSmoke
int nosmoke;
โค้ด
if(nosmoke) { if(ModelRec) { return D3D_OK; } }
ฟังก์ชั่นNoWater
โค้ด
int nowater; if(nowater) { if(ModelRec) { return D3D_OK; } }
ตอนนี้แอดมินจะอธิบายสำหรับคำของแต่ละ อย่างทั้งหมดอยู่ภายใต้แนวคิดเดียวกันนะครับ ตอนนี้สำหรับการเห็นรูปแบบที่เพื่อนๆจะต้องเห็นในรูปแบบ Logger เราต้องไปหา skys Stride/Numvert/Primcount, the waters stride/numvert/primcount,และ แฟลช(บนหน้าจอของเรา) และควัน(ที่เรามองเห็น) stride/numvert/primcount ดังนั้นการเข้าสู่ระบของGMจะยาก แต่มันจะคุ้มค่า เมื่อเพื่อนๆเข้าสู่เกมส์เข้าไปใช้ควันและแฟลชเรียบ แอดมินไม่ได้พูดเกี่ยวกับ ผู้เล่นคนอื่นเมื่อผู้เล่นคนอื่นอยู่ในโกดัง,แอดมินพูดถึงเมื่อทั้งหน้าจอของเราติดแฟลชหรือเมื่อควันได้อยู่เต็มหน้าจอของเรา มาดูโค้ดต่อเลยนะครับ
โค้ด
return D3D_OK;
สิ่งที่เราจะต้องเขียนต่อไป
โค้ด
return 0;
rerurn 0 หมายถึง กลับไปเริ่มต้นใหม่ ect เป็น GLASSWALLS
โค้ด
int GlassWalls;
โค้ด
if(GlassWalls) { if(ModelRec) { return D3D_OK; } }
การรับรู้ที่เป็นรูปแบบการรับรู้หลังผนังซึ่งเป็น probally ง่ายต่อการค้นหา Returning 0 จะทำให้มันมองไม่เห็นเราเกินไป เช่นเดียวกับวิธีการที่เราจะเห็นเฉพาะ Chams และถ้าเราต้องการคนที่จะเริ่มได้รับเราสามารถ return D3D_OK รับรู้เกี่ยวกับผู้เล่นคนอื่นกลายเป็นมองไม่เห็นมาดูกันว่าpaysites มากให้ออกพล่าม? Btw ไปกว่าการตรวจสอบบางอย่าง ใน Windows XP,Soldierfront สแกน DrawIndexedPrimitive เพื่อที่จะตรวจสอบ ดังนั้น Chams และ wallhack จะต้องรอ สำหรับตอนนี้ทำให้ทุกสิ่งที่เราสามารถทำได้ใน setrenderstate WireFrame เต็มหน้าจอจะยังคงช่วยให้ตอนนี้สำหรับ hooking เราจะต้องใช้ Detours: เพิ่มไปอีกนะครับ มาดูโค้ดกันเลย
โค้ด
//==========================================FindPatt======================================================================// bool bCompare(const BYTE* pData, const BYTE* bMask, const char* szMask) { for(;*szMask;++szMask,++pData,++bMask) if(*szMask=='x' && *pData!=*bMask) return 0; return (*szMask) == NULL; } //======================================================================= DWORD FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask) { for(DWORD i=0; i<dwLen; i++) if (bCompare((BYTE*)(dwAddress+i),bMask,szMask)) return (DWORD)(dwAddress+i); return 0; } //======================================================================= void *DetourFunc(BYTE *src, const BYTE *dst, const int len) { BYTE *jmp = (BYTE*)malloc(len+5); DWORD dwBack; VirtualProtect(src, len, PAGE_READWRITE, &dwBack); memcpy(jmp, src, len); jmp += len; jmp[0] = 0xE9; *(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5; src[0] = 0x90; //50 src[1] = 0x90; // 58 src[2] = 0xE9; *(DWORD*)(&src[3]) = (DWORD)(dst - src) - 7; for (int i=7; i<len; i++) src[i] = 0x90; VirtualProtect(src, len, dwBack, &dwBack); return (jmp-len); }
ตอนนี้ ต้องจำไว้ว่าเราจำเป็นต้องกำหนดสิ่งเหล่านี้ด้วย เหมือนๆที่ผ่านมานะครับ
โค้ด
bool bCompare(const BYTE* pData, const BYTE* bMask, const char* szMask); DWORD FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask); void *DetourFunc(BYTE *src, const BYTE *dst, const int len); int D3D8BASE (void); int sleepthread2 (void); int sleepthread (void);
หลังจากนั้นให้ heres the hook!
โค้ด
//=======================================Vtable Hook====================================================================// int D3D8BASE (void) { HMODULE D3D8BASE = NULL; for (;D3D8BASE == NULL;Sleep(100)) D3D8BASE = LoadLibrary("d3d8.dll"); DWORD* VTableHook = 0; DWORD hD3D8 = (DWORD)GetModuleHandle("d3d8.dll"); DWORD VIRTUALTABLE = FindPattern(hD3D8, 0x128000, (PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx"); memcpy(&VTableHook, (void*)(VIRTUALTABLE+2), 4); DWORD dwEndScene = VTableHook[35]; DWORD dwDrawIndexedPrimitive = VTableHook[71]; DWORD dwSetStreamSource = VTableHook[83]; DWORD dwSetViewport = VTableHook[40]; DWORD dwSetRenderState = VTableHook[50]; pDrawIndexedPrimitive = (oDrawIndexedPrimitive)DetourFunc((PBYTE)dwDrawIndexedPrimitive, (PBYTE)myDrawIndexedPrimitive, 7); pSetStreamSource = (oSetStreamSource)DetourFunc((PBYTE)dwSetStreamSource, (PBYTE)mySetStreamSource, 7); pEndScene = (oEndScene)DetourFunc((PBYTE)dwEndScene, (PBYTE)myEndScene, 7); pSetViewport = (oSetViewport)DetourFunc((PBYTE)dwSetViewport, (PBYTE)mySetViewport, 7); pSetRenderState = (oSetRenderState)DetourFunc((PBYTE)dwSetRenderState, (PBYTE)mySetRenderState, 7); return 0; } BOOL WINAPI DllMain ( HMODULE hDll, DWORD dwReason, LPVOID lpReserved ) { DisableThreadLibraryCalls(hDll); if ( dwReason == DLL_PROCESS_ATTACH ) { CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)D3D8BASE, NULL, NULL, NULL); } return TRUE; }
เป็นการเส็จพิธีครับ จบแล้วครับกับการสอนครั้งนี้ ฟังก์ชั่นที่สอนไปทั้งหมดมี
-WallHack
-Chams
-NoFog
-FullBright
-Xray
-NoSmoke(โครงร่าง)
-NoFlash(โครงร่าง)
-WireFrame(ทั้งหมด)
-Crosshair
-Asus Wallhack
-GlassWalls
-NoFlash
-NoSmoke
-NoWater
-NoSky