This is ready system to hook virtual functions, which will allow catch any virtual event in the gaming world. There is support for the new and old builds (you don't need to bother about offsets and their differences in the old and new builds, it was all done instead of you).
Installation
The first step is to call the check build function (at all, check compiler, but let will be so). For this, catch OnMetaAttach also OnAmxxAttach function, in which we call the necessary function:
Code: Select all
void OnAmxxAttach()
{
checkCompiler();
} Code: Select all
#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 in center
} Code: Select all
//register this virtual function
bool registerHook();
//remove this virtual function
bool removeHook();
/*got address this virtual function
you need to call, by using the VIRTUAL_CALL function*/
void *getAddress();
//got state this function (registered or no registered)
bool getState();Additional functions
Code: Select all
//got offset necessary function
inline int getVirtualOffset(int hookid);
//mentioned in paragraph "Installation"
inline void checkCompiler(void);
//for call the original function at address
template <typename ReturnType>
inline ReturnType VIRTUAL_CALL(void *address, /*arguments required function*/);
inline edict_t * UTIL_PrivateToEdict(void * pvPrivateData);
inline edict_t * UTIL_EntvarsToEdict(entvars_t * pthis);
inline int UTIL_EdictToIndex(edict_t * pthis);
inline int UTIL_EntvarToIndex(entvars_t * pthis);
inline int UTIL_PrivateToIndex(void * pthis); Code: Select all
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
}; 