void MakeVirtualHook()
{
edict_t *pEdict = CREATE_ENTITY();
edict_t *pEntity = CREATE_ENTITY();
CALL_GAME_ENTITY(PLID, "player", &pEdict->v);
CALL_GAME_ENTITY(PLID, "weapon_knife", &pEntity->v);
if (pEdict->pvPrivateData == NULL)
{
REMOVE_ENTITY(pEdict);
return;
}
if (pEntity->pvPrivateData == NULL)
{
REMOVE_ENTITY(pEntity);
return;
}
#ifdef _WIN32
void **vtable = *((void***)((char*)pEdict->pvPrivateData));
void **vtable = *((void***)((char*)pEntity->pvPrivateData));
#elif __linux__
void **vtable = *((void***)(((char*)pEdict->pvPrivateData) + 0x94));
void **vtable = *((void***)(((char*)pEntity->pvPrivateData) + 0x94));
#endif
REMOVE_ENTITY(pEdict);
REMOVE_ENTITY(pEntity);
if(vtable == NULL)
return;
int **ivtable = (int **)vtable;
pOrigFuncSpawn = (void *)ivtable[VirtFuncSpawn];
pOrigFuncTakeDamage = (void *)ivtable[VirtFuncTakeDamage];
pOrigFuncTraceAttack = (void *)ivtable[VirtFuncTraceAttack];
pOrigFuncKilled = (void *)ivtable[VirtFuncKilled];
pOrigFuncPlayerPostThink = (void *)ivtable[VirtFuncPlayerPostThink];
pOrigFuncResetMaxSpeed = (void *)ivtable[VirtFuncResetMaxSpeed];
pOrigFuncDeploy = (void *)ivtable[VirtFuncDeploy];
#ifdef _WIN32
DWORD OldFlags;
VirtualProtect(&ivtable[VirtFuncSpawn], sizeof(int *), PAGE_READWRITE, &OldFlags);
VirtualProtect(&ivtable[VirtFuncTakeDamage], sizeof(int *), PAGE_READWRITE, &OldFlags);
VirtualProtect(&ivtable[VirtFuncTraceAttack], sizeof(int *), PAGE_READWRITE, &OldFlags);
VirtualProtect(&ivtable[VirtFuncKilled], sizeof(int *), PAGE_READWRITE, &OldFlags);
VirtualProtect(&ivtable[VirtFuncPlayerPostThink], sizeof(int *), PAGE_READWRITE, &OldFlags);
VirtualProtect(&ivtable[VirtFuncResetMaxSpeed], sizeof(int *), PAGE_READWRITE, &OldFlags);
VirtualProtect(&ivtable[VirtFuncDeploy], sizeof(int *), PAGE_READWRITE, &OldFlags);
#elif __linux__
mprotect(&ivtable[VirtFuncSpawn], sizeof(int*), PROT_READ | PROT_WRITE);
mprotect(&ivtable[VirtFuncTakeDamage], sizeof(int*), PROT_READ | PROT_WRITE);
mprotect(&ivtable[VirtFuncTraceAttack], sizeof(int*), PROT_READ | PROT_WRITE);
mprotect(&ivtable[VirtFuncKilled], sizeof(int*), PROT_READ | PROT_WRITE);
mprotect(&ivtable[VirtFuncPlayerPostThink], sizeof(int*), PROT_READ | PROT_WRITE);
mprotect(&ivtable[VirtFuncResetMaxSpeed], sizeof(int*), PROT_READ | PROT_WRITE);
mprotect(&ivtable[VirtFuncDeploy], sizeof(int*), PROT_READ | PROT_WRITE);
#endif
ivtable[VirtFuncSpawn] = (int *)HookSpawn;
ivtable[VirtFuncTakeDamage] = (int *)HookTakeDamage;
ivtable[VirtFuncTraceAttack] = (int *)HookTraceAttack;
ivtable[VirtFuncKilled] = (int *)HookKilled;
ivtable[VirtFuncPlayerPostThink] = (int *)HookPlayerPostThink;
ivtable[VirtFuncResetMaxSpeed] = (int *)HookResetMaxSpeed;
ivtable[VirtFuncDeploy] = (int *)HookDeploy;
}
Comments