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" );
}
Comments