int amx_Push_Hook(AMX *amx, cell value) { // Are we retrieving parameters ? if (bGiveDamage) { switch (bytePushCount) { case 4: iPlayerId = value; break; case 3: iDamagerId = value; break; case 2: fHealthLoss = amx_ctof(value); break; case 1: iWeapon = value; break; case 0: iBodypart = value; break; } // Increase the parameters count bytePushCount++; } pfn_amx_Push = (amx_Push_t)(subhook_get_trampoline(hookPush)); return pfn_amx_Push(amx, value); }
int amx_FindPublic_Hook(AMX *amx, const char *funcname, int *index) { // Is it "OnPlayerGiveDamage" if (!strcmp(funcname, "OnPlayerGiveDamage")) { // Set parameter flags bGiveDamage = true; bytePushCount = 0; } pfn_amx_FindPublic = (amx_FindPublic_t)(subhook_get_trampoline(hookFindPublic)); return pfn_amx_FindPublic(amx, funcname, index); }
int amx_Exec_Hook(AMX *amx, long *retval, int index) { pfn_amx_Exec = (amx_Exec_t)(subhook_get_trampoline(hookExec)); int ret = pfn_amx_Exec(amx, retval, index); if (bGiveDamage) { bGiveDamage = false; if (pServer->GetPlayerManager()->IsPlayerConnected(iDamagerId)) pServer->GetPlayerManager()->GetAt(iDamagerId)->ProcessDamage(iPlayerId, fHealthLoss, iWeapon, iBodypart); } return ret; }
BOOL Mhook_SetHook(PVOID * ppSystemFunctionP, PVOID pHookFunction) { Mhook_MyInit(); if(ppSystemFunctionP==NULL||pHookFunction==NULL) { return FALSE; } PVOID ppSystemFunction=(void*)(*ppSystemFunctionP); if(ppSystemFunction==NULL) return FALSE; if(mhooks_subhooks_count>=MHOOKS_MAX_SUPPORTED_HOOKS) { return FALSE; } else if(mhooks_subhooks_count<0) { mhooks_subhooks_count=0; } mhooks_subhooks[mhooks_subhooks_count]=subhook_new(ppSystemFunction, pHookFunction); if(mhooks_subhooks[mhooks_subhooks_count]==NULL) { return FALSE; } subhook_install(mhooks_subhooks[mhooks_subhooks_count]); if(subhook_is_installed(mhooks_subhooks[mhooks_subhooks_count])) { void * rr= subhook_get_trampoline(mhooks_subhooks[mhooks_subhooks_count]); if(rr==NULL) { subhook_remove(mhooks_subhooks[mhooks_subhooks_count]); subhook_free(mhooks_subhooks[mhooks_subhooks_count]); mhooks_subhooks[mhooks_subhooks_count]=NULL; return FALSE; } *ppSystemFunctionP=(void*)rr; } mhooks_subhooks_count++; return TRUE; }