Merge pull request #456 from alliedmodders/canbeautobalanced

Add support for hooking CanBeAutobalanced to SDKHooks.
This commit is contained in:
Nicholas Hastings 2015-12-29 15:56:24 -05:00
commit 7fbcb81916
5 changed files with 72 additions and 0 deletions

View File

@ -92,6 +92,9 @@ HookTypeData g_HookTypes[SDKHook_MAXHOOKS] =
{"BlockedPost", "", false}, {"BlockedPost", "", false},
{"OnTakeDamageAlive", "DT_BaseCombatCharacter", false}, {"OnTakeDamageAlive", "DT_BaseCombatCharacter", false},
{"OnTakeDamageAlivePost", "DT_BaseCombatCharacter", false}, {"OnTakeDamageAlivePost", "DT_BaseCombatCharacter", false},
// There is no DT for CBaseMultiplayerPlayer. Going up a level
{"CanBeAutobalanced", "DT_BasePlayer", false},
}; };
SDKHooks g_Interface; 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_MANUALHOOK1_void(Weapon_Equip, 0, 0, 0, CBaseCombatWeapon *);
SH_DECL_MANUALHOOK2(Weapon_Switch, 0, 0, 0, bool, CBaseCombatWeapon *, int); SH_DECL_MANUALHOOK2(Weapon_Switch, 0, 0, 0, bool, CBaseCombatWeapon *, int);
SH_DECL_MANUALHOOK1_void(Blocked, 0, 0, 0, CBaseEntity *); 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_W(Switch, true, true);
CHECKOFFSET(VPhysicsUpdate, true, true); CHECKOFFSET(VPhysicsUpdate, true, true);
CHECKOFFSET(Blocked, true, true); CHECKOFFSET(Blocked, true, true);
CHECKOFFSET(CanBeAutobalanced, true, false);
// this one is in a class all its own -_- // this one is in a class all its own -_-
offset = 0; offset = 0;
@ -720,6 +725,9 @@ HookReturn SDKHooks::Hook(int entity, SDKHookType type, IPluginFunction *callbac
case SDKHook_BlockedPost: case SDKHook_BlockedPost:
hookid = SH_ADD_MANUALVPHOOK(Blocked, pEnt, SH_MEMBER(&g_Interface, &SDKHooks::Hook_BlockedPost), true); hookid = SH_ADD_MANUALVPHOOK(Blocked, pEnt, SH_MEMBER(&g_Interface, &SDKHooks::Hook_BlockedPost), true);
break; break;
case SDKHook_CanBeAutobalanced:
hookid = SH_ADD_MANUALVPHOOK(CanBeAutobalanced, pEnt, SH_MEMBER(&g_Interface, &SDKHooks::Hook_CanBeAutobalanced), false);
break;
} }
vhook.SetHookID(hookid); vhook.SetHookID(hookid);
@ -905,6 +913,50 @@ bool SDKHooks::Hook_LevelInit(char const *pMapName, char const *pMapEntities, ch
/** /**
* CBaseEntity Hook Handlers * CBaseEntity Hook Handlers
*/ */
bool SDKHooks::Hook_CanBeAutobalanced()
{
CBaseEntity *pPlayer = META_IFACEPTR(CBaseEntity);
CVTableHook vhook(pPlayer);
ke::Vector<CVTableList *> &vtablehooklist = g_HookList[SDKHook_CanBeAutobalanced];
for (size_t entry = 0; entry < vtablehooklist.length(); ++entry)
{
if (vhook != vtablehooklist[entry]->vtablehook)
{
continue;
}
int entity = gamehelpers->EntityToBCompatRef(pPlayer);
bool origRet = SH_MCALL(pPlayer, CanBeAutobalanced)();
bool newRet = origRet;
ke::Vector<IPluginFunction *> callbackList;
PopulateCallbackList(vtablehooklist[entry]->hooks, callbackList, entity);
for (entry = 0; entry < callbackList.length(); ++entry)
{
cell_t res = origRet;
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 != origRet)
newRet = !origRet;
}
if (newRet != origRet)
RETURN_META_VALUE(MRES_SUPERCEDE, newRet);
break;
}
RETURN_META_VALUE(MRES_IGNORED, false);
}
void SDKHooks::Hook_EndTouch(CBaseEntity *pOther) void SDKHooks::Hook_EndTouch(CBaseEntity *pOther)
{ {
cell_t result = Call(META_IFACEPTR(CBaseEntity), SDKHook_EndTouch, pOther); cell_t result = Call(META_IFACEPTR(CBaseEntity), SDKHook_EndTouch, pOther);

View File

@ -92,6 +92,7 @@ enum SDKHookType
SDKHook_BlockedPost, SDKHook_BlockedPost,
SDKHook_OnTakeDamage_Alive, SDKHook_OnTakeDamage_Alive,
SDKHook_OnTakeDamage_AlivePost, SDKHook_OnTakeDamage_AlivePost,
SDKHook_CanBeAutobalanced,
SDKHook_MAXHOOKS SDKHook_MAXHOOKS
}; };
@ -284,6 +285,7 @@ public:
/** /**
* CBaseEntity Hook Handlers * CBaseEntity Hook Handlers
*/ */
bool Hook_CanBeAutobalanced();
void Hook_EndTouch(CBaseEntity *pOther); void Hook_EndTouch(CBaseEntity *pOther);
void Hook_EndTouchPost(CBaseEntity *pOther); void Hook_EndTouchPost(CBaseEntity *pOther);
void Hook_FireBulletsPost(const FireBulletsInfo_t &info); void Hook_FireBulletsPost(const FireBulletsInfo_t &info);

View File

@ -5,6 +5,12 @@
{ {
"Offsets" "Offsets"
{ {
"CanBeAutobalanced"
{
"windows" "458"
"linux" "459"
"mac" "459"
}
"EndTouch" "EndTouch"
{ {
"windows" "100" "windows" "100"

View File

@ -4,6 +4,12 @@
{ {
"Offsets" "Offsets"
{ {
"CanBeAutobalanced"
{
"windows" "462"
"linux" "463"
"mac" "463"
}
"Blocked" "Blocked"
{ {
"windows" "102" "windows" "102"

View File

@ -121,6 +121,7 @@ enum SDKHookType
SDKHook_BlockedPost, SDKHook_BlockedPost,
SDKHook_OnTakeDamageAlive, SDKHook_OnTakeDamageAlive,
SDKHook_OnTakeDamageAlivePost, SDKHook_OnTakeDamageAlivePost,
SDKHook_CanBeAutobalanced,
}; };
/* /*
@ -129,6 +130,8 @@ enum SDKHookType
SDKHook_Blocked, SDKHook_Blocked,
SDKHook_BlockedPost, SDKHook_BlockedPost,
SDKHook_CanBeAutobalanced,
SDKHook_EndTouch, SDKHook_EndTouch,
SDKHook_EndTouchPost, SDKHook_EndTouchPost,
@ -291,6 +294,9 @@ typeset SDKHookCB
// Reload post // Reload post
function void (int weapon, bool bSuccessful); function void (int weapon, bool bSuccessful);
// CanBeAutobalanced
function bool (int client, bool origRet);
}; };