CREDITSEz
nem az én munkám, és csak egy rövid tutorial lesz. A hivatalos fórumon
ipsBruno jött rá erre az új fajta hooking methodra. Az érdekesség az, hogy senki se tudja, hogy mûködik, mivel az
#if defined ág a függvény létrehozása elõtt található: tehát akkor még nem is létezett. De mûködik.
A MÓDSZERIsmerjük (vagy nem) a y_hookot, az _ALS módszert, az automatás verziót, CallLocalFunction-os verziót, és még rengeteg mást, amivel függvényt lehet hookolni. Ha valaki nem tudná, mi az, valami ilyesmit kell elképzelni:
// streamer.ini
STREAMER_Startup() {
// streamer kód
printf(\"streamer betöltve!\");
return 1;
}
Azt akarjuk, hogy a fenti függvény az OnGameModeInit lényegi lefutása elõtt fusson le. A legegyszerûbb, és sokak által mai napig használt módszer a következõ:
//gm.pwn
#include <a_samp>
#include <streamer.ini>
public OnGameModeInit() {
STREAMER_Startup();
// gm kód
return 1;
}
Ez szép és jó, de könnyen találhatunk hiányosságokat is: például mindig bele kell írni a kódba, és mindig a GameModeInit legelsõ soraként. Ez több hasonlóan beágyazott függvénykönyvtárnál problémás lehet.
Na: erre talált egy új modszert a fenti fórumozó:
//streamer.ini
public OnGameModeInit()
{
// streamer kód
printf(\"Streamer betöltve!\");
#if defined GameModeInit
return GameModeInit();
#else
return true;
#endif
}
#define OnGameModeInit GameModeInit
#if defined GameModeInit
forward GameModeInit();
#endif
A GM-ben pedig meghívjuk a következõt:
//gm.pwn
#include <a_samp>
#include <streamer.ini>
public OnGameModeInit () {
print(\"Játékmód betöltve\");
return true;
}
Ezzel ugyanazt a hatást értük el, elõször a \"Streamer betöltve!\" majd a \"Játékmód betöltve!\" kimenet jelenik meg. A legjobb az egészben az, hogy akkor is mûködik, ha sosem hívódott meg a játékmódban az OnGameModeInit, nem warningol, és persze, hogy nem használ sem automatát, sem CallLocalFunctiont, mivel az egész direktívákból áll, a fordítónak szinte semmi dolga nincs az egésszel: amitõl hihetetlen gyors lesz.