示例#1
0
文件: Hooks.cpp 项目: paulommu/FCNPC
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);
}
示例#2
0
文件: Hooks.cpp 项目: paulommu/FCNPC
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);
}
示例#3
0
文件: Hooks.cpp 项目: paulommu/FCNPC
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;
}