Merge pull request #456 from alliedmodders/canbeautobalanced
Add support for hooking CanBeAutobalanced to SDKHooks.
This commit is contained in:
commit
7fbcb81916
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -5,6 +5,12 @@
|
|||||||
{
|
{
|
||||||
"Offsets"
|
"Offsets"
|
||||||
{
|
{
|
||||||
|
"CanBeAutobalanced"
|
||||||
|
{
|
||||||
|
"windows" "458"
|
||||||
|
"linux" "459"
|
||||||
|
"mac" "459"
|
||||||
|
}
|
||||||
"EndTouch"
|
"EndTouch"
|
||||||
{
|
{
|
||||||
"windows" "100"
|
"windows" "100"
|
||||||
|
@ -4,6 +4,12 @@
|
|||||||
{
|
{
|
||||||
"Offsets"
|
"Offsets"
|
||||||
{
|
{
|
||||||
|
"CanBeAutobalanced"
|
||||||
|
{
|
||||||
|
"windows" "462"
|
||||||
|
"linux" "463"
|
||||||
|
"mac" "463"
|
||||||
|
}
|
||||||
"Blocked"
|
"Blocked"
|
||||||
{
|
{
|
||||||
"windows" "102"
|
"windows" "102"
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user