From 818e1e4e1804bed3194bee458d831bb90ea18af0 Mon Sep 17 00:00:00 2001 From: Nicholas Hastings Date: Thu, 26 Nov 2015 10:32:32 -0500 Subject: [PATCH 1/2] Add support for hooking CanBeAutobalanced to SDKHooks. --- extensions/sdkhooks/extension.cpp | 48 +++++++++++++++++++++++++ extensions/sdkhooks/extension.h | 2 ++ gamedata/sdkhooks.games/engine.ep2v.txt | 6 ++++ gamedata/sdkhooks.games/game.fof.txt | 6 ++++ plugins/include/sdkhooks.inc | 6 ++++ 5 files changed, 68 insertions(+) diff --git a/extensions/sdkhooks/extension.cpp b/extensions/sdkhooks/extension.cpp index 277727d7..ef90d000 100644 --- a/extensions/sdkhooks/extension.cpp +++ b/extensions/sdkhooks/extension.cpp @@ -92,6 +92,9 @@ HookTypeData g_HookTypes[SDKHook_MAXHOOKS] = {"BlockedPost", "", false}, {"OnTakeDamageAlive", "DT_BaseCombatCharacter", false}, {"OnTakeDamageAlivePost", "DT_BaseCombatCharacter", false}, + + // There is no DT for CBaseMultiplayerPlayer. Going up a level + {"CanBeAutobalanced", "DT_BasePlayer", false}, }; SDKHooks g_Interface; @@ -198,6 +201,7 @@ SH_DECL_MANUALHOOK3_void(Weapon_Drop, 0, 0, 0, CBaseCombatWeapon *, const Vector SH_DECL_MANUALHOOK1_void(Weapon_Equip, 0, 0, 0, CBaseCombatWeapon *); SH_DECL_MANUALHOOK2(Weapon_Switch, 0, 0, 0, bool, CBaseCombatWeapon *, int); SH_DECL_MANUALHOOK1_void(Blocked, 0, 0, 0, CBaseEntity *); +SH_DECL_MANUALHOOK0(CanBeAutobalanced, 0, 0, 0, bool); /** @@ -538,6 +542,7 @@ void SDKHooks::SetupHooks() CHECKOFFSET_W(Switch, true, true); CHECKOFFSET(VPhysicsUpdate, true, true); CHECKOFFSET(Blocked, true, true); + CHECKOFFSET(CanBeAutobalanced, true, false); // this one is in a class all its own -_- offset = 0; @@ -720,6 +725,9 @@ HookReturn SDKHooks::Hook(int entity, SDKHookType type, IPluginFunction *callbac case SDKHook_BlockedPost: hookid = SH_ADD_MANUALVPHOOK(Blocked, pEnt, SH_MEMBER(&g_Interface, &SDKHooks::Hook_BlockedPost), true); break; + case SDKHook_CanBeAutobalanced: + hookid = SH_ADD_MANUALVPHOOK(CanBeAutobalanced, pEnt, SH_MEMBER(&g_Interface, &SDKHooks::Hook_CanBeAutobalanced), false); + break; } vhook.SetHookID(hookid); @@ -905,6 +913,46 @@ bool SDKHooks::Hook_LevelInit(char const *pMapName, char const *pMapEntities, ch /** * CBaseEntity Hook Handlers */ +bool SDKHooks::Hook_CanBeAutobalanced() +{ + CBaseEntity *pPlayer = META_IFACEPTR(CBaseEntity); + int entity = gamehelpers->EntityToBCompatRef(pPlayer); + + bool origRet = SH_MCALL(pPlayer, CanBeAutobalanced)(); + bool newRet = origRet; + + CVTableHook vhook(pPlayer); + ke::Vector &vtablehooklist = g_HookList[SDKHook_CanBeAutobalanced]; + for (size_t entry = 0; entry < vtablehooklist.length(); ++entry) + { + if (vhook != vtablehooklist[entry]->vtablehook) + { + continue; + } + + ke::Vector callbackList; + PopulateCallbackList(vtablehooklist[entry]->hooks, callbackList, entity); + for (entry = 0; entry < callbackList.length(); ++entry) + { + cell_t res; + IPluginFunction *callback = callbackList[entry]; + callback->PushCell(entity); + callback->PushCell(origRet); + callback->Execute(&res); + + // Only update our new ret if different from original + // (so if multiple plugins returning different answers, + // the one(s) that changed it win) + if ((res != 0) != origRet) + newRet = !origRet; + } + + break; + } + + RETURN_META_VALUE(MRES_SUPERCEDE, newRet); +} + void SDKHooks::Hook_EndTouch(CBaseEntity *pOther) { cell_t result = Call(META_IFACEPTR(CBaseEntity), SDKHook_EndTouch, pOther); diff --git a/extensions/sdkhooks/extension.h b/extensions/sdkhooks/extension.h index e07bd5c3..27916dfb 100644 --- a/extensions/sdkhooks/extension.h +++ b/extensions/sdkhooks/extension.h @@ -92,6 +92,7 @@ enum SDKHookType SDKHook_BlockedPost, SDKHook_OnTakeDamage_Alive, SDKHook_OnTakeDamage_AlivePost, + SDKHook_CanBeAutobalanced, SDKHook_MAXHOOKS }; @@ -284,6 +285,7 @@ public: /** * CBaseEntity Hook Handlers */ + bool Hook_CanBeAutobalanced(); void Hook_EndTouch(CBaseEntity *pOther); void Hook_EndTouchPost(CBaseEntity *pOther); void Hook_FireBulletsPost(const FireBulletsInfo_t &info); diff --git a/gamedata/sdkhooks.games/engine.ep2v.txt b/gamedata/sdkhooks.games/engine.ep2v.txt index 5255ce11..f83a429e 100644 --- a/gamedata/sdkhooks.games/engine.ep2v.txt +++ b/gamedata/sdkhooks.games/engine.ep2v.txt @@ -5,6 +5,12 @@ { "Offsets" { + "CanBeAutobalanced" + { + "windows" "458" + "linux" "459" + "mac" "459" + } "EndTouch" { "windows" "100" diff --git a/gamedata/sdkhooks.games/game.fof.txt b/gamedata/sdkhooks.games/game.fof.txt index e507c969..e46cb8a7 100644 --- a/gamedata/sdkhooks.games/game.fof.txt +++ b/gamedata/sdkhooks.games/game.fof.txt @@ -4,6 +4,12 @@ { "Offsets" { + "CanBeAutobalanced" + { + "windows" "462" + "linux" "463" + "mac" "463" + } "Blocked" { "windows" "102" diff --git a/plugins/include/sdkhooks.inc b/plugins/include/sdkhooks.inc index f936a9a8..f58c1281 100644 --- a/plugins/include/sdkhooks.inc +++ b/plugins/include/sdkhooks.inc @@ -121,6 +121,7 @@ enum SDKHookType SDKHook_BlockedPost, SDKHook_OnTakeDamageAlive, SDKHook_OnTakeDamageAlivePost, + SDKHook_CanBeAutobalanced, }; /* @@ -129,6 +130,8 @@ enum SDKHookType SDKHook_Blocked, SDKHook_BlockedPost, + SDKHook_CanBeAutobalanced, + SDKHook_EndTouch, SDKHook_EndTouchPost, @@ -291,6 +294,9 @@ typeset SDKHookCB // Reload post function void (int weapon, bool bSuccessful); + + // CanBeAutobalanced + function bool (int client, bool origRet); }; From 2812f227b74f70e66be8dbff2bfc09c69256e4bb Mon Sep 17 00:00:00 2001 From: Kyle Sanderson Date: Tue, 29 Dec 2015 12:44:03 -0800 Subject: [PATCH 2/2] Change SDKHooks CanBeAutoBalanced to only MRES_SUPERCEDE if the return changes. --- extensions/sdkhooks/extension.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/extensions/sdkhooks/extension.cpp b/extensions/sdkhooks/extension.cpp index ef90d000..9a2ee906 100644 --- a/extensions/sdkhooks/extension.cpp +++ b/extensions/sdkhooks/extension.cpp @@ -916,10 +916,6 @@ bool SDKHooks::Hook_LevelInit(char const *pMapName, char const *pMapEntities, ch bool SDKHooks::Hook_CanBeAutobalanced() { CBaseEntity *pPlayer = META_IFACEPTR(CBaseEntity); - int entity = gamehelpers->EntityToBCompatRef(pPlayer); - - bool origRet = SH_MCALL(pPlayer, CanBeAutobalanced)(); - bool newRet = origRet; CVTableHook vhook(pPlayer); ke::Vector &vtablehooklist = g_HookList[SDKHook_CanBeAutobalanced]; @@ -930,11 +926,16 @@ bool SDKHooks::Hook_CanBeAutobalanced() continue; } + int entity = gamehelpers->EntityToBCompatRef(pPlayer); + + bool origRet = SH_MCALL(pPlayer, CanBeAutobalanced)(); + bool newRet = origRet; + ke::Vector callbackList; PopulateCallbackList(vtablehooklist[entry]->hooks, callbackList, entity); for (entry = 0; entry < callbackList.length(); ++entry) { - cell_t res; + cell_t res = origRet; IPluginFunction *callback = callbackList[entry]; callback->PushCell(entity); callback->PushCell(origRet); @@ -943,14 +944,17 @@ bool SDKHooks::Hook_CanBeAutobalanced() // Only update our new ret if different from original // (so if multiple plugins returning different answers, // the one(s) that changed it win) - if ((res != 0) != origRet) + if (res != origRet) newRet = !origRet; } + if (newRet != origRet) + RETURN_META_VALUE(MRES_SUPERCEDE, newRet); + break; } - RETURN_META_VALUE(MRES_SUPERCEDE, newRet); + RETURN_META_VALUE(MRES_IGNORED, false); } void SDKHooks::Hook_EndTouch(CBaseEntity *pOther)