Exemplo n.º 1
0
DetourResult DetourCallback(CBaseEntity *pEnt)
{
	edict_t *pEdict = gameents->BaseEntityToEdict((CBaseEntity *)pEnt);

	if (!pEdict)
	{
		g_pSM->LogMessage(myself, "Entity Error");
		return Result_Ignore;
	}

	sm_sendprop_info_t info;

	if (!gamehelpers->FindSendPropInfo(pEdict->GetNetworkable()->GetServerClass()->GetName(), "m_hOwnerEntity", &info))
	{
		g_pSM->LogMessage(myself, "Offset Error");
		return Result_Ignore;
	}

	if (!g_critForward)
	{
		g_pSM->LogMessage(myself, "Invalid Forward");
		return Result_Ignore;
	}

	int returnValue=0;

	CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pEnt + info.actual_offset);
	int index = CheckBaseHandle(hndl);

	g_critForward->PushCell(index); //Client index
	g_critForward->PushCell(engine->IndexOfEdict(pEdict)); // Weapon index
	g_critForward->PushString(pEdict->GetClassName()); //Weapon classname
	g_critForward->PushCellByRef(&returnValue); //return value

	cell_t result = 0;

	g_critForward->Execute(&result);

	if (result)
	{
		if (returnValue)
		{
			return Result_Crit;
		}
		else
		{
			return Result_NoCrit;
		}
	}
	else
	{
		return Result_Ignore;
	}
}
Exemplo n.º 2
0
bool CriticalHitManager::CriticalDetour(void *pWeapon)
{
	edict_t *pEdict = gameents->BaseEntityToEdict((CBaseEntity *)pWeapon);
	
	if (!pEdict)
	{
		g_pSM->LogMessage(myself, "Entity Error");
		return false;
	}

	sm_sendprop_info_t info;

	if (!gamehelpers->FindSendPropInfo(pEdict->GetNetworkable()->GetServerClass()->GetName(), "m_hOwnerEntity", &info))
	{
		g_pSM->LogMessage(myself, "Offset Error");
		return false;
	}

	if (!forward)
	{
		g_pSM->LogMessage(myself, "Invalid Forward");
		return false;
	}
	
	CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pWeapon + info.actual_offset);
	int index = CheckBaseHandle(hndl);

	forward->PushCell(index); //Client index
	forward->PushCell(engine->IndexOfEdict(pEdict)); // Weapon index
	forward->PushString(pEdict->GetClassName()); //Weapon classname
	forward->PushCellByRef(&g_returnvalue); //return value

	cell_t result = 0;

	forward->Execute(&result);

	return !!result;
}