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; }