Skocz do zawartości
(◕‿◕)

Hooki - ALS 4

Rekomendowane odpowiedzi

Witajcie, postanowiłem napisać krótki poradnik o hookach z wykorzystaniem techniki ALS

 

Czym są hooki?

To proste, na przykładzie.

Piszemy GM'a dzielonego na moduły (to oczywiście przykład), jesteśmy na pisaniu AntyCheat'a, mamy za Sobą już trochę kodu, trochę funkcji, kilka komend i jakiś system. I teraz chcemy dodać Sobie anty-money'a, zapisujemy stan gotówki gracza do jakiegoś PVar'a i tworzymy nową funkcję na sprawdzanie czy gracz rzeczywiście ma tyle gotówki ile my mamy w PVarz'e

 

No i pierwszy problem, musimy przelecieć cały kod, żeby zmienić GetPlayerMoney na naszą funkcję, a da się to zrobić szybciej i prościej

 

Można również dorzucać od Siebie kod do callbacków

 

A, bym zapomniał. W informatyce hookiem nazywamy mechanizm do przechwytywania komunikatów, kodu itp. tak więc niestety taki kod

public OnGameModeInit()
{
    MyLib_Init();
    Streamer_Init();
    // etc...
}

Hookiem nie jest

 

Funkcje

Najpierw zajmiemy się funkcjami, dajmy na to, że chcę aby każda funkcja print miała przed printowanym tekstem godzinę

Czyli, żeby

print("Serwer startuje...");

Wyprintował w konsoli

 

 

[Godzina:Minuta:Sekunda] Serwer startuje...

 

 

 

 

Kod wygląda tak

#if defined _ALS_print //Sprawdzamy czy hook istnieje
    #undef print //Jeśli tak usuwamy stary
#else
    #define _ALS_print //Jeśli nie tworzymy nowy
#endif
 
#define print MojaFunkcja_print //Podmieniamy print na naszą wersję

Teraz musimy tylko dodać naszą funkcję

stock MojaFunkcja_print(string[])
{
new Hour, Minute, Second; //Zmienne
gettime(Hour, Minute, Second); //Pobieramy czas
printf("[%02d:%02d:%02d] %s", Hour, Minute, Second, string); //Printujemy czas + naszego stringa
return 1;
}

I gotowe!

 

Teraz jeżeli damy w OnGameModeInit

print("Serwer startuje...");

Otrzymamy

 

 

[13:33:09] Serwer startuje...

 

 

 

Jakby nie patrzeć, jest to tylko przykład, bo tak na prawdę, w logach zawsze ten czas jest podany ;)

Możesz w takiej Swojej funkcji użyć również podmienianej, w tym przypadku print'a

stock MojaFunkcja_print(string[])
{
new Hour, Minute, Second;
gettime(Hour, Minute, Second);
printf("[%02d:%02d:%02d] %s", Hour, Minute, Second, string);
print("print też działa :)");
return 1;
}

Należy pamiętać, że "_ALS_" musi zostać użyte, jeśli damy za to np. "_SSS_" 

#if defined _SSS_print
    #undef print 
#else
    #define _SSS_print
#endif
 
#define print MojaFunkcja_print
Zasadniczo nic się nie stanie, ale istnieje duże prawdopodobieństwo, że będzie gryzło się z innymi bibliotekami i stworzymy Sobie niepotrzebne problemy
 
A i jeszcze jedna sprawa - kod ten musi znaleźć się przed wywołaniem pierwszego print, ponieważ dopiero po tym za print zostanie wstawiona nasza funkcja
 
No i oczywiście, ja pokazuje na print, ale tak samo można zrobić z każdą funkcją
 
Callbacki
Tu sprawa ma się podobnie


#if defined _ALS_OnGameModeInit //Czy hook istnieje?
    #undef OnGameModeInit //Jeśli tak usuwamy stary
#else
    #define _ALS_OnGameModeInit //Jeśli nie tworzymy nowy
#endif
#define OnGameModeInit MojaWersja_OnGameModeInit //Podmieniamy OnGameModeInit na Swojego
#if defined MojaWersja_OnGameModeInit //Sprawdzamy czy nasz została zdefiniowana, a robimy to w linijce wyżej 
    forward MojaWersja_OnGameModeInit(); //Jeśli tak - dodajemy forwarda
#endif

 
Teraz "nasza wersja OnGameModeInit"


public MojaWersja_OnGameModeInit()
{
for(new i = 10; i >= 0; i--)
{
printf("%d", i);
}
print("Boom!");
}
 
Ostatni krok to dodanie do oryginalnego "OnGameModeInit" 


#if defined MojaWersja_OnGameModeInit //Sprawdzamy czy "nasza wersja" istnieje
        MojaWersja_OnGameModeInit(); //Wywołujemy
#endif

 
Gotowe, teraz w konsoli mamy odliczanie 

 

[13:53:16] 10
[13:53:16] 9
[13:53:16] 8
[13:53:16] 7
[13:53:16] 6
[13:53:16] 5
[13:53:16] 4
[13:53:16] 3
[13:53:16] 2
[13:53:16] 1
[13:53:16] 0
[13:53:16] Start!

 

 
Oczywiście, wy możecie modyfikować jaki tylko chcecie callback, ja wybrałem OnGameModeInit, bo szybko można sprawdzać
 
 
No i to chyba tyle, możliwe, że komuś się przyda ;)
Edytowane przez __root__

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×