Jeżeli temat zamieściłem w złym miejscu to proszę moderatora/administratora o jego nie usuwanie tylko przeniesienie do właściwego działu na tym forum.
Stworzymy naszego własnego "hacka", który będzie miał menu, po przyciśnięciu przycisku "Insert".
Pierwsze co zrobimy, to pobieramy pGL_HackBase120 z mojego chomika. -
http://chomikuj.pl/dominikxx8/Hack
Po ściągnięciu tego na dysk, wypakowywujemy na pulpit. Otwieramy opengl.cpp jakimkolwiek programem może być notatnik jednak najlepiej by był to Notepad ++ i edytujemy!
Dajemy CTRL + F i szukamy struct basehookcvar_s. Gdy już znaleźliśmy, to edytujemy:
struct basehookcvar_s
{
float wallhack; // floaty, dzięki którym będziemy mogli robić funkcję naszego "hacka"
float whitewalls;
float wireframe;
float thirdperson;
float nosky;
float nightmode;
float menu;
};
basehookcvar_s cvar;
Teraz szukamy struct basehookmenu_s/ i edytujemy:
struct basehookmenu_s
{
char title[16]; // szkielet naszego menu
float* value;
float min;
float max;
float step;
};
int menuIndex = 0;
int menuItems = 11;
basehookmenu_s menu[11];
Teraz szukamy void InitMenu() i edytujemy:
void InitMenu()
{
strcpy( menu[0].title, "WallHack" ); // nazwa przycisku tego w menu
menu[0].value = &cvar.wallhack; // cvar (patrz wyżej)
menu[0].min = 0; // minimalna wartość
menu[0].max = 1; // maksymalna wartość
menu[0].step = 1; // tego chyba nie trzeba tłumaczyć
strcpy( menu[1].title, "WhiteWall" );
menu[1].value = &cvar.whitewalls;
menu[1].min = 0;
menu[1].max = 1;
menu[1].step = 1;
strcpy( menu[2].title, "WireFrame" );
menu[2].value = &cvar.wireframe;
menu[2].min = 0;
menu[2].max = 3;
menu[2].step = 1;
strcpy( menu[3].title, "ThirdPerson" );
menu[3].value = &cvar.thirdperson;
menu[3].min = 0;
menu[3].max = 1;
menu[3].step = 1;
strcpy( menu[6].title, "NoSky");
menu[6].value = &cvar.nosky;
menu[6].min = 0;
menu[6].max = 1;
menu[6].step = 1;
strcpy( menu[7].title, "NightMode");
menu[7].value = &cvar.nightmode;
menu[7].min = 0;
menu[7].max = 1;
menu[7].step = 1;
}
Dobra, zrobiliśmy nasze menu, ale teraz trzeba je jakoś wyświetlić.. CTRL + F na HUD_Redraw i szukamy komentarza gdzie pisze // Menu.
// Menu
if(cvar.menu)
{
gEngfuncs.pfnClientCmd("unbind mouse1");
gEngfuncs.pfnClientCmd("unbind mwheelup");
gEngfuncs.pfnClientCmd("unbind mwheeldown");
}
if(!cvar.menu)
{
gEngfuncs.pfnClientCmd("bind mouse1 +attack");
gEngfuncs.pfnClientCmd("bind mwheelup invprev");
gEngfuncs.pfnClientCmd("bind mwheeldown invnext");
}
if( cvar.menu )
{
int x = 200;
int xx = 220;
int y = 100;
int yy = 200;
int yyy = 316;
InitMenu();
// Draw's Glowing Hud Text
DrawGlowHudString( x - 130, 84, 0, 0, 128, "sup3rh00k v1.0" );
for(int i=0;i<menuItems;i++)
{
if( i!=menuIndex )
{
DrawHudString( x - 130, 100 + (16*i), 255, 255, 255, menu[i].title );
DrawHudString( x - 60, 100 + (16*i), 255, 255, 255, "%2.2f", menu[i].value[0] );
}
else
{
static int b = 0;
static bool mode = 1;
if( mode )
b+=10;
else
b-=10;
if( b<0 )
{
b=0;mode=1;
}
if( b>255 )
{
b=255;mode=0;
}
DrawGlowHudString( x - 130, 100 + (16*i), 0, 0, b, menu[i].title );
DrawGlowHudString( x - 60, 100 + (16*i), 0, 0, b, "%2.2f", menu[i].value[0] );
}
}
}
}
Oto i nasze menu. Teraz szukamy HUD_Key_Event.
// Setup Hotkey for toggleing of Menu
if( keynum == 147 ) // Insert
{
if( eventcode == 1 )
cvar.menu=!cvar.menu;
}
if( cvar.menu && (eventcode==1) )
{
if( keynum == 128 )
{
if( menuIndex>0 ) menuIndex--;
}
if( keynum == 129 ) // dolna strzałka
{
if( menuIndex<menuItems-1 ) menuIndex++;
}
if( keynum == 130 ) // lewa strzałka
{
if( menu[menuIndex].value )
{
menu[menuIndex].value[0] -= menu[menuIndex].step;
if( menu[menuIndex].value[0] < menu[menuIndex].min )
menu[menuIndex].value[0] = menu[menuIndex].max;
}
}
if( keynum == 131 ) // prawa strzałka
{
if( menu[menuIndex].value )
{
menu[menuIndex].value[0] += menu[menuIndex].step;
if( menu[menuIndex].value[0] > menu[menuIndex].max )
menu[menuIndex].value[0] = menu[menuIndex].min;
}
}
if( keynum == 239 )
{
if( menuIndex<menuItems-1 ) menuIndex++;
}
if( keynum == 240 )
{
if( menuIndex>0 ) menuIndex--;
}
if( keynum == 241 )
{
if( eventcode )
{
menu[menuIndex].value[0] += menu[menuIndex].step;
if( menu[menuIndex].value[0] > menu[menuIndex].max )
menu[menuIndex].value[0] = menu[menuIndex].min;
}
}
if( keynum == 242 )
{
if( eventcode )
{
menu[menuIndex].value[0] -= menu[menuIndex].step;
if( menu[menuIndex].value[0] < menu[menuIndex].min )
menu[menuIndex].value[0] = menu[menuIndex].max;
}
}
}
}
Te wszystkie keynum == wartość, są to wirtualne kody klawiszy, np. enter to 13.
To co wyżej podałem, stanie się to wtedy gdy ten co pisze "hacka" czyli wy naciśnie.
Dobra, teraz funkcje. Szukamy glBegin i szukamy komenta // Wallhack.
//Wallhack
if(cvar.wallhack == 1)
{
if(!(mode==GL_TRIANGLES||mode==GL_TRIANGLE_STRIP||mode==GL_TRIANGLE_FAN||mode==GL_QUADS))
{
GLfloat curcol[4];
glGetFloatv(GL_CURRENT_COLOR, curcol);
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glColor4f(curcol[0],curcol[1],curcol[2],0.5f);
glClearColor(0.0f,0.0f,0.0f,0.0f);
}
}
Teraz druga rzecz jaką podałem w cvarach, są to białe ściany.
//Whitewalls
if(cvar.whitewalls == 1)
{
if(!(mode==GL_TRIANGLES||mode==GL_TRIANGLE_STRIP||mode==GL_TRIANGLE_FAN||mode==GL_QUADS))
{
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
}
}
Poszukajcie sobie CTRL + F //Whitewalls.
WireFrame:
//WireFrame Skinny lines->1, Thich lines->3, Thickest->5.. if (cvar.wireframe==1) // moce 1 { if (mode == GL_POLYGON) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glLineWidth(1.0); glColor3f(255,255,255); } else { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } } if (cvar.wireframe==2) // mode 2 { if (mode == GL_POLYGON) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glLineWidth(3.0); glColor3f(255,255,255); } else { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } } if (cvar.wireframe==3) // mode 3 { if (mode == GL_POLYGON) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glLineWidth(5.0); glColor3f(255,255,255); } else { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } }
Widok z trzeciej osoby:
//3rd Person
if(cvar.thirdperson)
{
gEngfuncs.pfnGetCvarPointer("chase_active")->value = 1;
gEngfuncs.pfnGetCvarPointer("r_drawviewmodel")->value = 0;
}
if(!cvar.thirdperson)
{
gEngfuncs.pfnGetCvarPointer("chase_active")->value = 0;
gEngfuncs.pfnGetCvarPointer("r_drawviewmodel")->value = 1;
}
Na początku, gdzie jest komentarz Bool for NoSky dodajemy:
bool bnosky = false;
Teraz dodajemy w glBegin:
// NoSky
if (mode == GL_QUADS && cvar.nosky)
bnosky = true;
else
bnosky = false;
NightMode:
// Nightmode
if(cvar.nightmode)
{
if(mode != GL_TRIANGLES && mode != GL_TRIANGLE_STRIP && mode != GL_TRIANGLE_FAN && mode != GL_QUADS)
{
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
}
}
I gotowe! Nie pisałem tego, tzn. tutorial tak, ale tych wszystkich funkcji to nie. Pozbierałem wszystko z tego forum i google w jedną kupe i macie. Działa wszystko na 100%. Nie musicie się martwić.
Oczywiście do tego można zrobić strzykawkę (wstrzykiwanie w proces, dll injection).
Kod źródłowy pokazujący dll injection, możecie pobrać również z mojego chomika w folderze "Hack":
http://chomikuj.pl/dominikxx8/Hack
Kompilacja: Ściągamy Microsoft Visual C++ Enterprise Edition i jazda
Jakby brakowało bibliotek (ja używam express edition -,-), można pobrać z innych kompilatorów, np. Dev-Cpp, MinGw.