From d954d042f14a8cc90464cc216ae044de78e0bf4a Mon Sep 17 00:00:00 2001 From: Dmitry Date: Mon, 4 Nov 2019 16:32:52 +0700 Subject: [PATCH] Implement RG_CBasePlayer_DropIdlePlayer hook (#148) * Implement RG_CBasePlayer_DropIdlePlayer hook --- .../amxmodx/scripting/include/reapi_gamedll_const.inc | 7 +++++++ reapi/include/cssdk/dlls/regamedll_api.h | 5 +++++ reapi/src/hook_callback.cpp | 10 ++++++++++ reapi/src/hook_callback.h | 1 + reapi/src/hook_list.cpp | 1 + reapi/src/hook_list.h | 1 + 6 files changed, 25 insertions(+) diff --git a/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc b/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc index d0b65ce..4b61edf 100644 --- a/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc +++ b/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc @@ -761,6 +761,13 @@ enum GamedllFunc_CBasePlayer * Params: (const this) */ RG_CBasePlayer_UseEmpty, + + /* + * Description: Called when a idle player is removed from server. + * Return type: void + * Params: (const this, const reason[]) + */ + RG_CBasePlayer_DropIdlePlayer, }; /** diff --git a/reapi/include/cssdk/dlls/regamedll_api.h b/reapi/include/cssdk/dlls/regamedll_api.h index e05bab4..9189cbf 100644 --- a/reapi/include/cssdk/dlls/regamedll_api.h +++ b/reapi/include/cssdk/dlls/regamedll_api.h @@ -460,6 +460,10 @@ typedef IHookChainRegistryClass I typedef IHookChainClass IReGameHook_CBasePlayerWeapon_DefaultShotgunReload; typedef IHookChainRegistryClass IReGameHookRegistry_CBasePlayerWeapon_DefaultShotgunReload; +// CBasePlayer::DropIdlePlayer hook +typedef IHookChainClass IReGameHook_CBasePlayer_DropIdlePlayer; +typedef IHookChainRegistryClass IReGameHookRegistry_CBasePlayer_DropIdlePlayer; + class IReGameHookchains { public: virtual ~IReGameHookchains() {} @@ -574,6 +578,7 @@ public: virtual IReGameHookRegistry_CBasePlayerWeapon_DefaultDeploy *CBasePlayerWeapon_DefaultDeploy() = 0; virtual IReGameHookRegistry_CBasePlayerWeapon_DefaultReload *CBasePlayerWeapon_DefaultReload() = 0; virtual IReGameHookRegistry_CBasePlayerWeapon_DefaultShotgunReload *CBasePlayerWeapon_DefaultShotgunReload() = 0; + virtual IReGameHookRegistry_CBasePlayer_DropIdlePlayer *CBasePlayer_DropIdlePlayer() = 0; }; struct ReGameFuncs_t { diff --git a/reapi/src/hook_callback.cpp b/reapi/src/hook_callback.cpp index 964200a..23b15d3 100644 --- a/reapi/src/hook_callback.cpp +++ b/reapi/src/hook_callback.cpp @@ -552,6 +552,16 @@ void CBasePlayer_UseEmpty(IReGameHook_CBasePlayer_UseEmpty *chain, CBasePlayer * callVoidForward(RG_CBasePlayer_UseEmpty, original, indexOfEdict(pthis->pev)); } +void CBasePlayer_DropIdlePlayer(IReGameHook_CBasePlayer_DropIdlePlayer *chain, CBasePlayer *pthis, const char *reason) +{ + auto original = [chain](int _pthis, const char *_reason) + { + return chain->callNext(getPrivate(_pthis), _reason); + }; + + callVoidForward(RG_CBasePlayer_DropIdlePlayer, original, indexOfEdict(pthis->pev), reason); +} + void CBaseAnimating_ResetSequenceInfo(IReGameHook_CBaseAnimating_ResetSequenceInfo *chain, CBaseAnimating *pthis) { auto original = [chain](int _pthis) diff --git a/reapi/src/hook_callback.h b/reapi/src/hook_callback.h index 31d3df4..5b26575 100644 --- a/reapi/src/hook_callback.h +++ b/reapi/src/hook_callback.h @@ -389,6 +389,7 @@ void CBasePlayer_SetSpawnProtection(IReGameHook_CBasePlayer_SetSpawnProtection * void CBasePlayer_RemoveSpawnProtection(IReGameHook_CBasePlayer_RemoveSpawnProtection *chain, CBasePlayer *pthis); bool CBasePlayer_HintMessageEx(IReGameHook_CBasePlayer_HintMessageEx *chain, CBasePlayer *pthis, const char *pMessage, float duration, bool bDisplayIfPlayerDead, bool bOverride); void CBasePlayer_UseEmpty(IReGameHook_CBasePlayer_UseEmpty *chain, CBasePlayer *pthis); +void CBasePlayer_DropIdlePlayer(IReGameHook_CBasePlayer_DropIdlePlayer *chain, CBasePlayer *pthis, const char *reason); void CBaseAnimating_ResetSequenceInfo(IReGameHook_CBaseAnimating_ResetSequenceInfo *chain, CBaseAnimating *pthis); diff --git a/reapi/src/hook_list.cpp b/reapi/src/hook_list.cpp index f72ffba..354e9a1 100644 --- a/reapi/src/hook_list.cpp +++ b/reapi/src/hook_list.cpp @@ -155,6 +155,7 @@ hook_t hooklist_player[] = { DLL(CBasePlayer_RemoveSpawnProtection), DLL(CBasePlayer_HintMessageEx), DLL(CBasePlayer_UseEmpty), + DLL(CBasePlayer_DropIdlePlayer), }; hook_t hooklist_gamerules[] = { diff --git a/reapi/src/hook_list.h b/reapi/src/hook_list.h index b88f55a..a3849fe 100644 --- a/reapi/src/hook_list.h +++ b/reapi/src/hook_list.h @@ -180,6 +180,7 @@ enum GamedllFunc_CBasePlayer RG_CBasePlayer_RemoveSpawnProtection, RG_CBasePlayer_HintMessageEx, RG_CBasePlayer_UseEmpty, + RG_CBasePlayer_DropIdlePlayer, // [...] };