Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Hook Funkcji DLL / Enginechar *Orpheu


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
2 odpowiedzi w tym temacie

#1 Ortega

    mów mi Orti

  • Power User

Reputacja: 363
Wszechpomocny

  • Postów:640
  • GG:
  • Steam:steam
  • Imię:Marcin
  • Lokalizacja:Sosnowiec
Offline

Napisano 18.09.2010 11:07

Witajcie. Wpadłem sobie na taki pomysł pisząc plugin, żeby wyjaśnić pokrótce w jaki sposób wykorzystywać moduł Orpheu do różnych ciekawych bądź mniej i użytecznych celów.

Zanim przystąpicie do dalszego czytania upewnijcie się, czy na pewno rozumiecie choć trochę strukturę C++ na przykładzie:
void        (*pfnPlaybackEvent)            ( int flags, const edict_t *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 );


Jeśli tak, to można zaczynać.
W Orpheu zasadniczo do pobrania funkcji używamy dwóch specjalnych natywnych funkcji, które zaraz wymienię oraz opiszę kiedy z czym i po co się to je.
Najpierw wypadałoby dołączyć orpheu.inc, bez którego to ciężko będzie cokolwiek napisać x) Następnie deklarujemy moduły:

#include < amxmodx >
#include < orpheu >
#include < orpheu_stocks >


Kolejnym krokiem do omówienia przed funkcjami pobierającymi będzie lista funkcji biblioteki oraz tworzenie na bazie listy sygnatur niezbędnych do jakiegokolwiek działania pluginu.
enginefuncs_s
Spoiler


dll_functions
Spoiler


Do pierwszych funkcji używamy:
OrpheuGetEngineFunction

Natomiast do drugich:
OrpheuGetDLLFunction


Tworzenie sygnatur
Pokażę na prostym przykładzie jak stworzyć dobrą sygnaturę dla wybranej funkcji:

dla
void			(*pfnClientUserInfoChanged)( edict_t *pEntity, char *infobuffer );

{
    "name" : "NAZWA_SYGNATURY",
    "library" : "BIBLIOTEKA",
    "arguments" :
    [
        {
            "type" : "edict_t *"
        },
        {
            "type" : "char *"
        }
    ]
}

Co ważne dla funkcji z listy pierwszej BIBLIOTEKA nosi nazwę engine, w pozostałych przypadkach mod.
NAZWA_SYGNATURY, będzie miała znaczenie w późniejszym pluginie, więc polecam dać jakąś sensowną oczywiście bez polskich znaków diakrytycznych xD



Dobrze, więc gdy mamy już tą potrzebną wiedzę z powyżej możemy zacząć pisanie naszego pluginu operującego na funkcjach bibliotek gry.
public plugin_precache( ) {
//
}

Wypadałoby stworzyć nową zmienna o typie:
OrpheuFunction

czyli np:
new OrpheuFunction:DLLNumOne;

Przydzielamy teraz jej wartość w tym przypadku chcemy pobrać funkcję engine, więc używamy do tego:
OrpheuGetEngineFunction

czyli
DLLNumOne = OrpheuGetEngineFunction( "DOKLADNA_NAZWA_FUNKCJI_BIBLIOTEKI", "NAZWA_SYGNATURY" );

Teraz chcemy oczywiście hook'nąć tą funkcję, zatem musimy użyć
OrpheuRegisterHook

Następnie w pierwszym parametrze trzeba wskazać funkcję na której chcemy operować w naszym przypadku to zmienna DLLNumOne.
Kolejny parametr to funkcja jaka ma być wykonana na zarejestrowanie hook'a. Ustawimy sobie OnEngineHook.
Ostatnim parametrem może być typ Pre lub Post do tego służą definy orpheu takie jak:
OrpheuHookPre
OrpheuHookPost


No i teraz jak to wygląda wszystko w całości:

#include < amxmodx >
#include < orpheu >
#include < orpheu_stocks >

new OrpheuFunction:DLLNumOne;

public plugin_precache( ) {
DLLNumOne = OrpheuGetEngineFunction( "pfnClientUserInfoChanged", "SYGNAUTRA" );

OrpheuRegisterHook( DLLNumOne, "OnDLLHook", OrpheuHookPre );
}

public OnDLLHook( edict_t, String:infobuffer ) {
//NO I OPERUJEMY NA HOOK'U :)
}


To tyle w tym poradniku, kolejny będzie o szukaniu stringów w DLL ;) Może się komuś przyda. Zamieszczam też plik eiface.h, w którym są jeszcze komentarze dot. kiedy jak i czego dot. niektóre z funkcji.

Załączone pliki


  • +
  • -
  • 3

#2 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1 344
Godlike

  • Postów:3 563
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 18.09.2010 11:35

fajne tylko dobrym pomyslem bylo by opisanie jakies skrotowe tych funkcji
  • +
  • -
  • 0
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D

#3 Owner123

    Wszechpomocny

  • Użytkownik

Reputacja: 146
Zaawansowany

  • Postów:331
  • Lokalizacja:Barty ;]
Offline

Napisano 23.09.2010 17:33

No, no zawsze mnie zastanawiało jak użyć tych dwóch natyw :D GJ.
  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych