sm-ext-dhooks2/sourcemod/scripting/dynhooks-test.sp
Peace-Maker aa3018a27d Add support to define function signatures in gamedata
A "Functions" section is parsed in gamedata files that allow you to define the signature of functions including metadata like the calling convention and specifying the register an argument is passed in.
A new native DHookCreateFromConf can be used to setup a hook or detour from one of that function sections in the "Functions" section.
2018-01-25 17:18:30 +01:00

115 lines
4.5 KiB
SourcePawn

#include <dhooks>
#include <sdktools>
// Uses Flashbang Tools gamedata
// https://forums.alliedmods.net/showthread.php?t=159876
Handle hFlashbangDetonateDetour;
Handle hFlashbangDeafen;
//Handle hPercentageOfFlashForPlayer;
public void OnPluginStart()
{
Handle temp = LoadGameConfigFile("fbtools.games");
if(temp == INVALID_HANDLE)
{
SetFailState("Why you no has gamedata?");
}
hFlashbangDetonateDetour = DHookCreateDetour(Address_Null, CallConv_THISCALL, ReturnType_Void, ThisPointer_CBaseEntity);
if (!hFlashbangDetonateDetour)
SetFailState("Failed to setup detour for Detonate");
if (!DHookSetFromConf(hFlashbangDetonateDetour, temp, SDKConf_Signature, "CFlashbangProjectile::Detonate"))
SetFailState("Failed to load Detonate signature from gamedata");
if (!DHookEnableDetour(hFlashbangDetonateDetour, false, Detour_OnFlashbangDetonate))
SetFailState("Failed to detour Detonate.");
if (!DHookEnableDetour(hFlashbangDetonateDetour, true, Detour_OnFlashbangDetonate_Post))
SetFailState("Failed to detour Detonate post.");
PrintToServer("CFlashbangProjectile::Detonate detoured!");
hFlashbangDeafen = DHookCreateFromConf(temp, "Deafen");
if (!hFlashbangDeafen)
SetFailState("Failed to setup detour for Deafen");
/*hFlashbangDeafen = DHookCreateDetour(Address_Null, CallConv_THISCALL, ReturnType_Void, ThisPointer_CBaseEntity);
if (!hFlashbangDeafen)
SetFailState("Failed to setup detour for Deafen");
if (!DHookSetFromConf(hFlashbangDeafen, temp, SDKConf_Signature, "Deafen"))
SetFailState("Failed to load Deafen signature from gamedata");
DHookAddParam(hFlashbangDeafen, HookParamType_Float, .custom_register=DHookRegister_XMM1);*/
if (!DHookEnableDetour(hFlashbangDeafen, false, Detour_OnDeafen))
SetFailState("Failed to detour Deafen.");
if (!DHookEnableDetour(hFlashbangDeafen, true, Detour_OnDeafen_Post))
SetFailState("Failed to detour Deafen post.");
PrintToServer("CCSPlayer::Deafen detoured!");
/*hPercentageOfFlashForPlayer = DHookCreateDetour(Address_Null, CallConv_CDECL, ReturnType_Float, ThisPointer_Ignore);
if (!hPercentageOfFlashForPlayer)
SetFailState("Failed to setup detour for PercentageOfFlashForPlayer");
if (!DHookSetFromConf(hPercentageOfFlashForPlayer, temp, SDKConf_Signature, "PercentageOfFlashForPlayer"))
SetFailState("Failed to load PercentageOfFlashForPlayer signature from gamedata");
DHookAddParam(hPercentageOfFlashForPlayer, HookParamType_CBaseEntity);
DHookAddParam(hPercentageOfFlashForPlayer, HookParamType_Object, 12);
DHookAddParam(hPercentageOfFlashForPlayer, HookParamType_CBaseEntity);
if (!DHookEnableDetour(hPercentageOfFlashForPlayer, false, Detour_OnPercentageOfFlashForPlayer))
SetFailState("Failed to detour PercentageOfFlashForPlayer.");
if (!DHookEnableDetour(hPercentageOfFlashForPlayer, true, Detour_OnPercentageOfFlashForPlayer_Post))
SetFailState("Failed to detour PercentageOfFlashForPlayer post.");
PrintToServer("PercentageOfFlashForPlayer detoured!");*/
}
public MRESReturn Detour_OnFlashbangDetonate(int pThis)
{
PrintToServer("Detonate called on entity %d!", pThis);
return MRES_Handled;
}
public MRESReturn Detour_OnFlashbangDetonate_Post(int pThis)
{
PrintToServer("Detonate post called on entity %d!", pThis);
return MRES_Handled;
}
public MRESReturn Detour_OnDeafen(int pThis, Handle hParams)
{
PrintToServer("Deafen called on entity %d! distance: %f", pThis, DHookGetParam(hParams, 1));
DHookSetParam(hParams, 1, 999.0);
return MRES_ChangedHandled;
}
public MRESReturn Detour_OnDeafen_Post(int pThis, Handle hParams)
{
PrintToServer("Deafen post called on entity %d! distance: %f", pThis, DHookGetParam(hParams, 1));
}
public MRESReturn Detour_OnPercentageOfFlashForPlayer(Handle hReturn, Handle hParams)
{
float pos[3];
DHookGetParamObjectPtrVarVector(hParams, 2, 0, ObjectValueType_Vector, pos);
PrintToServer("PercentageOfFlashForPlayer called! entity1 %d, pos [%f %f %f], entity2 %d", DHookGetParam(hParams, 1), pos[0], pos[1], pos[2], DHookGetParam(hParams, 3));
DHookSetReturn(hReturn, 0.3);
return MRES_Supercede;
}
public MRESReturn Detour_OnPercentageOfFlashForPlayer_Post(Handle hReturn, Handle hParams)
{
float pos[3];
DHookGetParamObjectPtrVarVector(hParams, 2, 0, ObjectValueType_Vector, pos);
PrintToServer("PercentageOfFlashForPlayer_Post called! entity1 %d, pos [%f %f %f], entity2 %d: %f", DHookGetParam(hParams, 1), pos[0], pos[1], pos[2], DHookGetParam(hParams, 3), DHookGetReturn(hReturn));
}