diff --git a/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc b/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc index abc4bc9f..58d254c4 100644 --- a/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc +++ b/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc @@ -407,6 +407,12 @@ enum GamedllFunc * Params: (const weaponent, const owner, modelName[], Float:origin[3], Float:angles[3], Float:velocity[3], Float:lifeTime, bool:packAmmo) */ RG_CreateWeaponBox, + + /* + * Description: Called when a player is on a ladder. + * Params: (const playerIndex) + */ + RG_PM_LadderMove, }; /** diff --git a/reapi/include/cssdk/dlls/regamedll_api.h b/reapi/include/cssdk/dlls/regamedll_api.h index 53a6d661..7a9f2386 100644 --- a/reapi/include/cssdk/dlls/regamedll_api.h +++ b/reapi/include/cssdk/dlls/regamedll_api.h @@ -237,6 +237,10 @@ typedef IHookChainRegistry IReGameHookRegistry typedef IHookChain IReGameHook_PM_AirMove; typedef IHookChainRegistry IReGameHookRegistry_PM_AirMove; +// PM_LadderMove hook +typedef IHookChain IReGameHook_PM_LadderMove; +typedef IHookChainRegistry IReGameHookRegistry_PM_LadderMove; + // HandleMenu_ChooseAppearance hook typedef IHookChain IReGameHook_HandleMenu_ChooseAppearance; typedef IHookChainRegistry IReGameHookRegistry_HandleMenu_ChooseAppearance; @@ -654,6 +658,8 @@ class IReGameHookchains { virtual IReGameHookRegistry_CBasePlayer_Pain *CBasePlayer_Pain() = 0; virtual IReGameHookRegistry_CBasePlayer_DeathSound *CBasePlayer_DeathSound() = 0; virtual IReGameHookRegistry_CBasePlayer_JoiningThink *CBasePlayer_JoiningThink() = 0; + + virtual IReGameHookRegistry_PM_LadderMove *PM_LadderMove() = 0; }; struct ReGameFuncs_t { diff --git a/reapi/src/hook_callback.cpp b/reapi/src/hook_callback.cpp index 4cca12d0..6a35ca82 100644 --- a/reapi/src/hook_callback.cpp +++ b/reapi/src/hook_callback.cpp @@ -899,6 +899,23 @@ void PM_AirMove(IReGameHook_PM_AirMove *chain, int playerIndex) callVoidForward(RG_PM_AirMove, original, playerIndex); } +void PM_LadderMove_AMXX(Phys_T *data, int playerIndex) +{ + auto original = [data](int _playerIndex) + { + data->m_chain->callNext(data->m_args.pLadder); + }; + + callVoidForward(RG_PM_LadderMove, original, playerIndex); +} + +void PM_LadderMove(IReGameHook_PM_LadderMove *chain, physent_t *pLadder) +{ + PM_LadderMove_args_t args(pLadder); + Phys_T data(chain, args); + PM_LadderMove_AMXX(&data, pLadder->player + 1); +} + BOOL CSGameRules_FShouldSwitchWeapon(IReGameHook_CSGameRules_FShouldSwitchWeapon *chain, CBasePlayer *pPlayer, CBasePlayerItem *pWeapon) { auto original = [chain](int _pPlayer, int _pWeapon) diff --git a/reapi/src/hook_callback.h b/reapi/src/hook_callback.h index 0dc0df1a..6bff756f 100644 --- a/reapi/src/hook_callback.h +++ b/reapi/src/hook_callback.h @@ -402,6 +402,18 @@ void PM_Move_AMXX(Move_t *data, int playerIndex); void PM_Move(IReGameHook_PM_Move *chain, playermove_t *ppmove, int server); void PM_AirMove(IReGameHook_PM_AirMove *chain, int playerIndex); + +struct PM_LadderMove_args_t +{ + PM_LadderMove_args_t(physent_t *_ladder) : pLadder(_ladder) {} + + physent_t *pLadder; +}; + +using Phys_T = hookdata_t; +void PM_LadderMove_AMXX(Phys_T *data); +void PM_LadderMove(IReGameHook_PM_LadderMove *chain, physent_t *pLadder); + void HandleMenu_ChooseAppearance(IReGameHook_HandleMenu_ChooseAppearance *chain, CBasePlayer *pPlayer, int slot); BOOL HandleMenu_ChooseTeam(IReGameHook_HandleMenu_ChooseTeam *chain, CBasePlayer *pPlayer, int slot); void ShowMenu(IReGameHook_ShowMenu *chain, CBasePlayer *pPlayer, int bitsValidSlots, int nDisplayTime, BOOL fNeedMore, char *pszText); diff --git a/reapi/src/hook_list.cpp b/reapi/src/hook_list.cpp index 312ef37f..bd44eba8 100644 --- a/reapi/src/hook_list.cpp +++ b/reapi/src/hook_list.cpp @@ -131,6 +131,7 @@ hook_t hooklist_gamedll[] = { DLL(SpawnHeadGib), DLL(SpawnRandomGibs), DLL(CreateWeaponBox), + DLL(PM_LadderMove), }; hook_t hooklist_animating[] = { diff --git a/reapi/src/hook_list.h b/reapi/src/hook_list.h index 14b45b26..352472cf 100644 --- a/reapi/src/hook_list.h +++ b/reapi/src/hook_list.h @@ -145,6 +145,7 @@ enum GamedllFunc RG_SpawnRandomGibs, RG_CreateWeaponBox, + RG_PM_LadderMove, // [...] };