Add OnTakeDamage_Alive hook support to SDKHooks (bug=6249).

This commit is contained in:
Nicholas Hastings 2014-09-03 17:45:34 -04:00
parent 40b1067ef7
commit be55587d70
3 changed files with 407 additions and 362 deletions

View File

@ -90,6 +90,8 @@ HookTypeData g_HookTypes[SDKHook_MAXHOOKS] =
{"GetMaxHealth", "", false}, {"GetMaxHealth", "", false},
{"Blocked", "", false}, {"Blocked", "", false},
{"BlockedPost", "", false}, {"BlockedPost", "", false},
{"OnTakeDamageAlive", "DT_BaseCombatCharacter", false},
{"OnTakeDamageAlivePost", "DT_BaseCombatCharacter", false},
}; };
SDKHooks g_Interface; SDKHooks g_Interface;
@ -168,6 +170,7 @@ SH_DECL_MANUALHOOK0(GetMaxHealth, 0, 0, 0, int);
#endif #endif
SH_DECL_MANUALHOOK1_void(GroundEntChanged, 0, 0, 0, void *); SH_DECL_MANUALHOOK1_void(GroundEntChanged, 0, 0, 0, void *);
SH_DECL_MANUALHOOK1(OnTakeDamage, 0, 0, 0, int, CTakeDamageInfoHack &); SH_DECL_MANUALHOOK1(OnTakeDamage, 0, 0, 0, int, CTakeDamageInfoHack &);
SH_DECL_MANUALHOOK1(OnTakeDamageAlive, 0, 0, 0, int, CTakeDamageInfoHack &);
SH_DECL_MANUALHOOK0_void(PreThink, 0, 0, 0); SH_DECL_MANUALHOOK0_void(PreThink, 0, 0, 0);
SH_DECL_MANUALHOOK0_void(PostThink, 0, 0, 0); SH_DECL_MANUALHOOK0_void(PostThink, 0, 0, 0);
SH_DECL_MANUALHOOK0(Reload, 0, 0, 0, bool); SH_DECL_MANUALHOOK0(Reload, 0, 0, 0, bool);
@ -515,6 +518,7 @@ void SDKHooks::SetupHooks()
CHECKOFFSET(FireBullets, false, true); CHECKOFFSET(FireBullets, false, true);
CHECKOFFSET(GroundEntChanged, false, true); CHECKOFFSET(GroundEntChanged, false, true);
CHECKOFFSET(OnTakeDamage, true, true); CHECKOFFSET(OnTakeDamage, true, true);
CHECKOFFSET(OnTakeDamageAlive,true, true);
CHECKOFFSET(PreThink, true, true); CHECKOFFSET(PreThink, true, true);
CHECKOFFSET(PostThink, true, true); CHECKOFFSET(PostThink, true, true);
CHECKOFFSET(Reload, true, true); CHECKOFFSET(Reload, true, true);
@ -607,6 +611,12 @@ HookReturn SDKHooks::Hook(int entity, SDKHookType type, IPluginFunction *callbac
case SDKHook_OnTakeDamagePost: case SDKHook_OnTakeDamagePost:
hookid = SH_ADD_MANUALVPHOOK(OnTakeDamage, pEnt, SH_MEMBER(&g_Interface, &SDKHooks::Hook_OnTakeDamagePost), true); hookid = SH_ADD_MANUALVPHOOK(OnTakeDamage, pEnt, SH_MEMBER(&g_Interface, &SDKHooks::Hook_OnTakeDamagePost), true);
break; break;
case SDKHook_OnTakeDamageAlive:
hookid = SH_ADD_MANUALVPHOOK(OnTakeDamageAlive, pEnt, SH_MEMBER(&g_Interface, &SDKHooks::Hook_OnTakeDamageAlive), false);
break;
case SDKHook_OnTakeDamageAlivePost:
hookid = SH_ADD_MANUALVPHOOK(OnTakeDamageAlive, pEnt, SH_MEMBER(&g_Interface, &SDKHooks::Hook_OnTakeDamageAlivePost), true);
break;
case SDKHook_PreThink: case SDKHook_PreThink:
hookid = SH_ADD_MANUALVPHOOK(PreThink, pEnt, SH_MEMBER(&g_Interface, &SDKHooks::Hook_PreThink), false); hookid = SH_ADD_MANUALVPHOOK(PreThink, pEnt, SH_MEMBER(&g_Interface, &SDKHooks::Hook_PreThink), false);
break; break;
@ -999,12 +1009,12 @@ void SDKHooks::Hook_GroundEntChangedPost(void *pVar)
Call(META_IFACEPTR(CBaseEntity), SDKHook_GroundEntChangedPost); Call(META_IFACEPTR(CBaseEntity), SDKHook_GroundEntChangedPost);
} }
int SDKHooks::Hook_OnTakeDamage(CTakeDamageInfoHack &info) int SDKHooks::HandleOnTakeDamageHook(CTakeDamageInfoHack &info, SDKHookType hookType)
{ {
CBaseEntity *pEntity = META_IFACEPTR(CBaseEntity); CBaseEntity *pEntity = META_IFACEPTR(CBaseEntity);
CVTableHook vhook(pEntity); CVTableHook vhook(pEntity);
ke::Vector<CVTableList *> &vtablehooklist = g_HookList[SDKHook_OnTakeDamage]; ke::Vector<CVTableList *> &vtablehooklist = g_HookList[hookType];
for (size_t entry = 0; entry < vtablehooklist.length(); ++entry) for (size_t entry = 0; entry < vtablehooklist.length(); ++entry)
{ {
if (vhook != vtablehooklist[entry]->vtablehook) if (vhook != vtablehooklist[entry]->vtablehook)
@ -1090,12 +1100,12 @@ int SDKHooks::Hook_OnTakeDamage(CTakeDamageInfoHack &info)
RETURN_META_VALUE(MRES_IGNORED, 0); RETURN_META_VALUE(MRES_IGNORED, 0);
} }
int SDKHooks::Hook_OnTakeDamagePost(CTakeDamageInfoHack &info) int SDKHooks::HandleOnTakeDamageHookPost(CTakeDamageInfoHack &info, SDKHookType hookType)
{ {
CBaseEntity *pEntity = META_IFACEPTR(CBaseEntity); CBaseEntity *pEntity = META_IFACEPTR(CBaseEntity);
CVTableHook vhook(pEntity); CVTableHook vhook(pEntity);
ke::Vector<CVTableList *> &vtablehooklist = g_HookList[SDKHook_OnTakeDamagePost]; ke::Vector<CVTableList *> &vtablehooklist = g_HookList[hookType];
for (size_t entry = 0; entry < vtablehooklist.length(); ++entry) for (size_t entry = 0; entry < vtablehooklist.length(); ++entry)
{ {
if (vhook != vtablehooklist[entry]->vtablehook) if (vhook != vtablehooklist[entry]->vtablehook)
@ -1136,6 +1146,26 @@ int SDKHooks::Hook_OnTakeDamagePost(CTakeDamageInfoHack &info)
RETURN_META_VALUE(MRES_IGNORED, 0); RETURN_META_VALUE(MRES_IGNORED, 0);
} }
int SDKHooks::Hook_OnTakeDamage(CTakeDamageInfoHack &info)
{
return HandleOnTakeDamageHook(info, SDKHook_OnTakeDamage);
}
int SDKHooks::Hook_OnTakeDamagePost(CTakeDamageInfoHack &info)
{
return HandleOnTakeDamageHookPost(info, SDKHook_OnTakeDamagePost);
}
int SDKHooks::Hook_OnTakeDamageAlive(CTakeDamageInfoHack &info)
{
return HandleOnTakeDamageHook(info, SDKHook_OnTakeDamageAlive);
}
int SDKHooks::Hook_OnTakeDamageAlivePost(CTakeDamageInfoHack &info)
{
return HandleOnTakeDamageHookPost(info, SDKHook_OnTakeDamageAlivePost);
}
void SDKHooks::Hook_PreThink() void SDKHooks::Hook_PreThink()
{ {
Call(META_IFACEPTR(CBaseEntity), SDKHook_PreThink); Call(META_IFACEPTR(CBaseEntity), SDKHook_PreThink);

View File

@ -90,6 +90,8 @@ enum SDKHookType
SDKHook_GetMaxHealth, SDKHook_GetMaxHealth,
SDKHook_Blocked, SDKHook_Blocked,
SDKHook_BlockedPost, SDKHook_BlockedPost,
SDKHook_OnTakeDamageAlive,
SDKHook_OnTakeDamageAlivePost,
SDKHook_MAXHOOKS SDKHook_MAXHOOKS
}; };
@ -288,6 +290,8 @@ public:
void Hook_GroundEntChangedPost(void *pVar); void Hook_GroundEntChangedPost(void *pVar);
int Hook_OnTakeDamage(CTakeDamageInfoHack &info); int Hook_OnTakeDamage(CTakeDamageInfoHack &info);
int Hook_OnTakeDamagePost(CTakeDamageInfoHack &info); int Hook_OnTakeDamagePost(CTakeDamageInfoHack &info);
int Hook_OnTakeDamageAlive(CTakeDamageInfoHack &info);
int Hook_OnTakeDamageAlivePost(CTakeDamageInfoHack &info);
void Hook_PreThink(); void Hook_PreThink();
void Hook_PreThinkPost(); void Hook_PreThinkPost();
void Hook_PostThink(); void Hook_PostThink();
@ -339,6 +343,10 @@ private:
void HandleEntityDeleted(CBaseEntity *pEntity, int ref); void HandleEntityDeleted(CBaseEntity *pEntity, int ref);
void Unhook(CBaseEntity *pEntity); void Unhook(CBaseEntity *pEntity);
void Unhook(IPluginContext *pContext); void Unhook(IPluginContext *pContext);
private:
int HandleOnTakeDamageHook(CTakeDamageInfoHack &info, SDKHookType hookType);
int HandleOnTakeDamageHookPost(CTakeDamageInfoHack &info, SDKHookType hookType);
}; };
extern CGlobalVars *gpGlobals; extern CGlobalVars *gpGlobals;

View File

@ -119,6 +119,8 @@ enum SDKHookType
SDKHook_GetMaxHealth, /**< ep2v and later */ SDKHook_GetMaxHealth, /**< ep2v and later */
SDKHook_Blocked, SDKHook_Blocked,
SDKHook_BlockedPost, SDKHook_BlockedPost,
SDKHook_OnTakeDamageAlive,
SDKHook_OnTakeDamageAlivePost,
}; };
/* /*
@ -139,6 +141,9 @@ enum SDKHookType
SDKHook_OnTakeDamage, SDKHook_OnTakeDamage,
SDKHook_OnTakeDamagePost, SDKHook_OnTakeDamagePost,
SDKHook_OnTakeDamageAlive,
SDKHook_OnTakeDamageAlivePost,
SDKHook_PreThink, SDKHook_PreThink,
SDKHook_PreThinkPost, SDKHook_PreThinkPost,
@ -244,6 +249,7 @@ union SDKHookCB
function Action (int entity, int &maxhealth); function Action (int entity, int &maxhealth);
// OnTakeDamage // OnTakeDamage
// OnTakeDamagAlive
// Note: The weapon parameter is not used by all games and damage sources. // Note: The weapon parameter is not used by all games and damage sources.
// Note: Force application is dependent on game and damage type(s) // Note: Force application is dependent on game and damage type(s)
// SDKHooks 1.0+ // SDKHooks 1.0+
@ -256,6 +262,7 @@ union SDKHookCB
float[3] damageForce, float[3] damagePosition, int damagecustom); float[3] damageForce, float[3] damagePosition, int damagecustom);
// OnTakeDamagePost // OnTakeDamagePost
// OnTakeDamageAlivePost
function void (int victim, int attacker, int inflictor, float damage, int damagetype); function void (int victim, int attacker, int inflictor, float damage, int damagetype);
function void (int victim, int attacker, int inflictor, float damage, int damagetype, const float[3] damageForce, const float[3] damagePosition); function void (int victim, int attacker, int inflictor, float damage, int damagetype, const float[3] damageForce, const float[3] damagePosition);