Virtual Hook System by Juli
Это готовая система хука виртуальных функций, которая позволит любому "чайнику" отловить любое виртуальное событие в игровом мире. Присутствует поддержка новых и старых билдов. По поводу ReGameDLL не знаю, но если там оффсеты отличаются, то подружить и с ReGameDLL тоже не проблема.
Установка
Первым делом необходимо вызвать функцию проверки build'а (вообще, компилятора, но пусть будет так). Вызывать ее необходимо в событии attach'а. Для этого хукаем OnMetaAttach also OnAmxxAttach и вызываем необходимую функцию:
- Код: Выделить всё
void OnAmxxAttach()
{
checkCompiler();
}
Пример использования
- Код: Выделить всё
#include "amxxmodule.h"
#include "virtual_hook.h"
VIRTUAL_CALLBACK(void) PlayerTakeDamage(void *pthis VIRTUAL_ARG, entvars_t *pInflictor, entvars_t *pAttacker, float fDamage, int iDamagebits);
virtualHook pTakeDamage("player", virtualHookName::takedamage, (void *)PlayerTakeDamage);
void OnAmxxAttach()
{
checkCompiler();
}
void ServerActivate(edict_s *a, int b, int c)
{
pTakeDamage.registerHook();
}
void ServerDeactivate()
{
pTakeDamage.removeHook();
}
VIRTUAL_CALLBACK(void) PlayerTakeDamage(void *pthis VIRTUAL_ARG, entvars_t *pInflictor, entvars_t *pAttacker, float fDamage, int iDamagebits)
{
//pre
VIRTUAL_CALL<void>(pTakeDamage.getAddress(), pthis, pInflictor, pAttacker, fDamage, iDamagebits); //call original function in gamedll
//post
edict_t *pVictim = UTIL_PrivateToEdict(pthis); //get this edict
const char *szName = STRING(pVictim->v.netname); //get this player name
CENTER_SAY(PLID, "Player %s received damage", szName); //say to all print_center
}
Доступные функции класса
- Код: Выделить всё
//регистрирует виртуальную функцию
bool registerHook();
//удаляет хук виртуальной функции//
bool removeHook();
/*получает адрес оригинальной функции
необходимо для вызова, с помощью функции VIRTUAL_CALL*/
void *getAddress();
//возвращает состояние, зарегистрирована функция или нет
bool getState();
Дополнительные функции
- Код: Выделить всё
//возвращает оффсет необходимой функции
inline int getVirtualOffset(int hookid);
//говорилось в пункте "Установка"
void checkCompiler(void);
//вызов оригинальной функции по адресу
template <typename ReturnType>
inline ReturnType VIRTUAL_CALL(void *address, /*аргументы функции*/);
//получение edict из void
inline edict_t * UTIL_PrivateToEdict(void * pvPrivateData);
//получение edict из entvars
inline edict_t * UTIL_EntvarsToEdict(entvars_t * pthis);
//получение целочисленного индекса из edict
inline int UTIL_EdictToIndex(edict_t * pthis);
//получение целочисленного индекса из entvars
inline int UTIL_EntvarToIndex(entvars_t * pthis);
//получение целочисленного индекса из void
inline int UTIL_PrivateToIndex(void * pthis);
P.S.: Аргументы отлавливаемых функций можете увидеть в комментариях к перечислению virtualHookName:
- Код: Выделить всё
enum virtualHookName
{
base,
pev,
spawn, //Function params: function(void *this) | Return type: void
precache, //Function params: function(void *this) | Return type: void
keyvalue, //Function params: function(void *this, int kvd_handle) | Return type: void
objectcaps, //Function params: function(void *this) | Return type: int
activate, //Function params: function(void *this) | Return type: void
setobjectcollisionbox, //Function params: function(void *this) | Return type: void
classify, //Function params: function(void *this) | Return type: int
deathnotice, //Function params: function(void *this, entvars_t *idchild) | Return type: void
traceattack, //Function params: function(void *this, entvars_t *attacker, float damage, float direction[3], int traceresult, int damagebits) | Return type: void
takedamage, //Function params: function(void *this, entvars_t *inflictor, entvars_t *attacker, float damage, int damagebits) | Return type: int
takehealth, //Function params: function(void *this, float health, int damagebits) | Return type: int
killed, //Function params: function(void *this, entvars_t *attacker, int shouldgib) | Return type: void
bloodcolor, //Function params: function(void *this) | Return type: int
tracebleed, //Function params: function(void *this, float damage, float direction[3], int trace_handle, int damagebits) | Return type: void
istriggered, //Function params: function(void *this, void *activator) | Return type: int
mymonsterpointer, //Function params: function(void *this) | Return type: void
mysquadmonsterpointer, //Function params: function(void *this) | Return type: void
gettogglestate, //Function params: function(void *this) | Return type: int
addpoints, //Function params: function(void *this, int points, int cangonegative) | Return type: void
addpointstoteam, //Function params: function(void *this, int points, int cangonegative) | Return type: void
addplayeritem, //Function params: function(void *this, void *other) | Return type: int
removeplayeritem, //Function params: function(void *this, void *other) | Return type: int
giveammo, //Function params: function(void *this, int amount, const char *name, int max) | Return type: int
getdelay, //Function params: function(void *this) | Return type: float
ismoving, //Function params: function(void *this) | Return type: int
overridereset, //Function params: function(void *this) | Return type: void
damagedecal, //Function params: function(void *this, int damagebits) | Return type: int
settogglestate, //Function params: function(void *this, int state) | Return type: void
startsneaking, //Function params: function(void *this) | Return type: void
stopsneaking, //Function params: function(void *this) | Return type: void
oncontrols, //Function params: function(void *this, int idon) | Return type: int
issneaking, //Function params: function(void *this) | Return type: int
isalive, //Function params: function(void *this) | Return type: int
isbspmodel, //Function params: function(void *this) | Return type: int
reflectgauss, //Function params: function(void *this) | Return type: int
hastarget, //Function params: function(void *this, int strindex) | Return type: int
isinworld, //Function params: function(void *this) | Return type: int
isplayer, //Function params: function(void *this) | Return type: int
isnetclient, //Function params: function(void *this) | Return type: int
teamid, //Function params: function(void *this) | Return type: char
getnexttarget, //Function params: function(void *this) | Return type: void
think, //Function params: function(void *this) | Return type: void
touch, //Function params: function(void *this, void *other) | Return type: void
use, //Function params: function(void *this, void *caller, void *activator, int use_type, float value) | Return type: void
blocked, //Function params: function(void *this, void *other) | Return type: void
respawn, //Function params: function(void *this) | Return type: void
updateowner, //Function params: function(void *this) | Return type: void
fbecomeprone, //Function params: function(void *this) | Return type: int
center, //Function params: function(void *this) | Return type: Vector
eyeposition, //Function params: function(void *this) | Return type: Vector
earposition, //Function params: function(void *this) | Return type: Vector
bodytarget, //Function params: function(void *this, Vector *srcvector) | Return type: Vector
illumination, //Function params: function(void *this) | Return type: int
fvisible, //Function params: function(void *this, void *other) | Return type: int
fvecvisible, //Function params: function(void *this, Vector *origin) | Return type: int
player_jump, //Function params: function(void *this) | Return type: void
player_duck, //Function params: function(void *this) | Return type: void
player_prethink, //Function params: function(void *this) | Return type: void
player_postthink, //Function params: function(void *this) | Return type: void
player_getgunposition, //Function params: function(void *this) | Return type: Vector
player_shouldfadeondeath, //Function params: function(void *this) | Return type: int
player_impulsecommands, //Function params: function(void *this) | Return type: void
player_updateclientdata, //Function params: function(void *this) | Return type: void
item_addtoplayer, //Function params: function(void *this, void *player) | Return type: int
item_addduplicate, //Function params: function(void *this, void *original) | Return type: int
item_getiteminfo, //Function params: function(void *this) | Return type: int
item_candeploy, //Function params: function(void *this) | Return type: int
item_deploy, //Function params: function(void *this) | Return type: int
item_canholster, //Function params: function(void *this) | Return type: void
item_holster, //Function params: function(void *this) | Return type: void
item_updateiteminfo, //Function params: function(void *this) | Return type: void
item_preframe, //Function params: function(void *this) | Return type: void
item_postframe, //Function params: function(void *this) | Return type: void
item_drop, //Function params: function(void *this) | Return type: void
item_kill, //Function params: function(void *this) | Return type: void
item_attachtoplayer, //Function params: function(void *this, void *player) | Return type: void
item_primaryammoindex, //Function params: function(void *this) | Return type: int
item_secondaryammoindex, //Function params: function(void *this) | Return type: int
item_updateclientdata, //Function params: function(void *this, void *player) | Return type: int
item_getweaponptr, //Function params: function(void *this) | Return type: void
item_itemslot, //Function params: function(void *this) | Return type: int
weapon_extractammo, //Function params: function(void *this, void *target) | Return type: int
weapon_extractclipammo, //Function params: function(void *this, void *target) | Return type: int
weapon_addweapon, //Function params: function(void *this) | Return type: int
weapon_playemptysound, //Function params: function(void *this) | Return type: int
weapon_resetemptysound, //Function params: function(void *this) | Return type: void
weapon_sendweaponanim, //Function params: function(void *this, int anim, int skiplocal, int body) | Return type: void
weapon_isusable, //Function params: function(void *this) | Return type: int
weapon_primaryattack, //Function params: function(void *this) | Return type: void
weapon_secondaryattack, //Function params: function(void *this) | Return type: void
weapon_reload, //Function params: function(void *this) | Return type: void
weapon_weaponidle, //Function params: function(void *this) | Return type: void
weapon_retireweapon, //Function params: function(void *this) | Return type: void
weapon_shouldweaponidle, //Function params: function(void *this) | Return type: int
weapon_usedecrement, //Function params: function(void *this) | Return type: int
cstrike_restart, //Function params: function(void *this) | Return type: void
cstrike_roundrespawn, //Function params: function(void *this) | Return type: void
cstrike_item_candrop, //Function params: function(void *this) | Return type: int
cstrike_item_getmaxspeed, //Function params: function(void *this) | Return type: float
end // No use me
};