void RegisterWeapon( edict_t *pEdict, char * strWeapon ) { pEdict = CREATE_ENTITY(); CALL_GAME_ENTITY(PLID, strWeapon, &pEdict->v); if (pEdict->pvPrivateData == NULL) { REMOVE_ENTITY(pEdict); return; } #ifdef _WIN32 void **vtable = *((void***)((char*)pEdict->pvPrivateData)); #elif __linux__ void **vtable = *((void***)(((char*)pEdict->pvPrivateData) + 0x94)); #endif REMOVE_ENTITY(pEdict); if(vtable == NULL) return; int **ivtable = (int **)vtable; pOrigFuncDeploy = (void *)ivtable[VirtFuncDeploy]; pOrigFuncAmmoIndex = (void *)ivtable[VirtFuncAmmoIndex]; #ifdef _WIN32 DWORD OldFlags; VirtualProtect(&ivtable[VirtFuncDeploy], sizeof(int *), PAGE_READWRITE, &OldFlags); VirtualProtect(&ivtable[VirtFuncAmmoIndex], sizeof(int *), PAGE_READWRITE, &OldFlags); #elif __linux__ mprotect(&ivtable[VirtFuncDeploy], sizeof(int*), PROT_READ | PROT_WRITE); mprotect(&ivtable[VirtFuncAmmoIndex], sizeof(int*), PROT_READ | PROT_WRITE); #endif ivtable[VirtFuncDeploy] = (int *)HookDeploy; ivtable[VirtFuncAmmoIndex] = (int *)HookPrimaryAmmoIndex; } void MakeHookEntity() { edict_t* usp = NULL; edict_t* knife = NULL; RegisterWeapon( usp, "weapon_usp" ); RegisterWeapon( knife, "weapon_knife" ); }