From 66f60961605bb379593b5ec7ffde6cf25c0e213c Mon Sep 17 00:00:00 2001 From: GLoOoccK <155241167+GLoOoccK@users.noreply.github.com> Date: Sun, 20 Apr 2025 11:33:24 -0300 Subject: [PATCH] API: Knockback (#348) --- .../scripting/include/reapi_gamedll.inc | 12 ++++++ .../scripting/include/reapi_gamedll_const.inc | 6 +++ reapi/include/cssdk/dlls/API/CSPlayer.h | 1 + reapi/include/cssdk/dlls/regamedll_api.h | 7 +++- reapi/src/hook_callback.cpp | 10 +++++ reapi/src/hook_callback.h | 1 + reapi/src/hook_list.cpp | 1 + reapi/src/hook_list.h | 1 + reapi/src/natives/natives_misc.cpp | 42 +++++++++++++++++++ reapi/version/version.h | 2 +- 10 files changed, 81 insertions(+), 2 deletions(-) diff --git a/reapi/extra/amxmodx/scripting/include/reapi_gamedll.inc b/reapi/extra/amxmodx/scripting/include/reapi_gamedll.inc index 0fee9a6..4a89157 100644 --- a/reapi/extra/amxmodx/scripting/include/reapi_gamedll.inc +++ b/reapi/extra/amxmodx/scripting/include/reapi_gamedll.inc @@ -1233,3 +1233,15 @@ native rg_player_relationship(const player, const target); * @noreturn */ native rg_send_death_message(const pKiller, const pVictim, const pAssister, const pevInflictor, const killerWeaponName[], const DeathMessageFlags:iDeathMessageFlags, const KillRarity:iRarityOfKill); + +/* +* Adds impulse to the player. +* +* @param player Player index. +* @param attacker Attacker index. +* @param flKnockbackForce Knockback force. +* @param flVelModifier Velocity modifier. +* +* @noreturn +*/ +native rg_player_takedamage_impulse(const player, const attacker, const Float:flKnockbackForce, const Float:flVelModifier); diff --git a/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc b/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc index af521a7..82749cb 100644 --- a/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc +++ b/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc @@ -946,6 +946,12 @@ enum GamedllFunc_CBasePlayer * Params: (const this) */ RG_CBasePlayer_UpdateStatusBar, + + /* + * Description: Called for the victim player after taking damage, when "knockback" and "pain shock" are applied. + * Params: (const this, attacker, Float:flKnockbackForce, Float:flVelModifier) + */ + RG_CBasePlayer_TakeDamageImpulse, }; /** diff --git a/reapi/include/cssdk/dlls/API/CSPlayer.h b/reapi/include/cssdk/dlls/API/CSPlayer.h index f329495..dd97e37 100644 --- a/reapi/include/cssdk/dlls/API/CSPlayer.h +++ b/reapi/include/cssdk/dlls/API/CSPlayer.h @@ -119,6 +119,7 @@ public: virtual void OnSpawnEquip(bool addDefault = true, bool equipGame = true) = 0; virtual void SetScoreboardAttributes(CBasePlayer *destination = nullptr) = 0; virtual void Observer_FindNextPlayer(bool bReverse, const char *name = nullptr) = 0; + virtual void TakeDamageImpulse(CBasePlayer *pAttacker, float flKnockbackForce, float flVelModifier) = 0; CBasePlayer *BasePlayer() const; diff --git a/reapi/include/cssdk/dlls/regamedll_api.h b/reapi/include/cssdk/dlls/regamedll_api.h index daaec1f..62273fe 100644 --- a/reapi/include/cssdk/dlls/regamedll_api.h +++ b/reapi/include/cssdk/dlls/regamedll_api.h @@ -40,7 +40,7 @@ #include #define REGAMEDLL_API_VERSION_MAJOR 5 -#define REGAMEDLL_API_VERSION_MINOR 29 +#define REGAMEDLL_API_VERSION_MINOR 30 // CBasePlayer::Spawn hook typedef IHookChainClass IReGameHook_CBasePlayer_Spawn; @@ -634,6 +634,10 @@ typedef IHookChainRegistryClass IReGameHookRegist typedef IHookChainClass IReGameHook_CBasePlayer_UpdateStatusBar; typedef IHookChainRegistryClass IReGameHookRegistry_CBasePlayer_UpdateStatusBar; +// CBasePlayer::TakeDamageImpulse hook +typedef IHookChainClass IReGameHook_CBasePlayer_TakeDamageImpulse; +typedef IHookChainRegistryClass IReGameHookRegistry_CBasePlayer_TakeDamageImpulse; + class IReGameHookchains { public: virtual ~IReGameHookchains() {} @@ -797,6 +801,7 @@ public: virtual IReGameHookRegistry_CBasePlayer_Observer_Think *CBasePlayer_Observer_Think() = 0; virtual IReGameHookRegistry_CBasePlayer_RemoveAllItems *CBasePlayer_RemoveAllItems() = 0; virtual IReGameHookRegistry_CBasePlayer_UpdateStatusBar *CBasePlayer_UpdateStatusBar() = 0; + virtual IReGameHookRegistry_CBasePlayer_TakeDamageImpulse *CBasePlayer_TakeDamageImpulse() = 0; }; struct ReGameFuncs_t { diff --git a/reapi/src/hook_callback.cpp b/reapi/src/hook_callback.cpp index 54feb42..fdb723e 100644 --- a/reapi/src/hook_callback.cpp +++ b/reapi/src/hook_callback.cpp @@ -1776,6 +1776,16 @@ void CBasePlayer_UpdateStatusBar(IReGameHook_CBasePlayer_UpdateStatusBar *chain, callVoidForward(RG_CBasePlayer_UpdateStatusBar, original, indexOfEdict(pthis->pev)); } +void CBasePlayer_TakeDamageImpulse(IReGameHook_CBasePlayer_TakeDamageImpulse *chain, CBasePlayer *pthis, CBasePlayer *pAttacker, float flKnockbackForce, float flVelModifier) +{ + auto original = [chain](int _pthis, int _pAttacker, float _flKnockbackForce, float _flVelModifier) + { + chain->callNext(getPrivate(_pthis), getPrivate(_pAttacker), _flKnockbackForce, _flVelModifier); + }; + + callVoidForward(RG_CBasePlayer_TakeDamageImpulse, original, indexOfEdict(pthis->pev), indexOfEdict(pAttacker->pev), flKnockbackForce, flVelModifier); +} + /* * VTC functions */ diff --git a/reapi/src/hook_callback.h b/reapi/src/hook_callback.h index 7e2720d..1065997 100644 --- a/reapi/src/hook_callback.h +++ b/reapi/src/hook_callback.h @@ -575,6 +575,7 @@ void CBasePlayer_Observer_Think(IReGameHook_CBasePlayer_Observer_Think *chain, C void CBasePlayer_RemoveAllItems(IReGameHook_CBasePlayer_RemoveAllItems *chain, CBasePlayer *pthis, BOOL removeSuit); void CSGameRules_SendDeathMessage(IReGameHook_CSGameRules_SendDeathMessage *chain, CBaseEntity *pKiller, CBasePlayer *pVictim, CBasePlayer *pAssister, entvars_t *pevInflictor, const char *killerWeaponName, int iDeathMessageFlags, int iRarityOfKill); void CBasePlayer_UpdateStatusBar(IReGameHook_CBasePlayer_UpdateStatusBar *chain, CBasePlayer *pthis); +void CBasePlayer_TakeDamageImpulse(IReGameHook_CBasePlayer_TakeDamageImpulse *chain, CBasePlayer *pthis, CBasePlayer *pAttacker, float flKnockbackForce, float flVelModifier); /* * VTC functions diff --git a/reapi/src/hook_list.cpp b/reapi/src/hook_list.cpp index 7ff1096..cb8bd17 100644 --- a/reapi/src/hook_list.cpp +++ b/reapi/src/hook_list.cpp @@ -217,6 +217,7 @@ hook_t hooklist_player[] = { DLL(CBasePlayer_Observer_Think), DLL(CBasePlayer_RemoveAllItems), DLL(CBasePlayer_UpdateStatusBar), + DLL(CBasePlayer_TakeDamageImpulse), }; hook_t hooklist_gamerules[] = { diff --git a/reapi/src/hook_list.h b/reapi/src/hook_list.h index fdba2a9..1cdb7bb 100644 --- a/reapi/src/hook_list.h +++ b/reapi/src/hook_list.h @@ -241,6 +241,7 @@ enum GamedllFunc_CBasePlayer RG_CBasePlayer_Observer_Think, RG_CBasePlayer_RemoveAllItems, RG_CBasePlayer_UpdateStatusBar, + RG_CBasePlayer_TakeDamageImpulse, // [...] }; diff --git a/reapi/src/natives/natives_misc.cpp b/reapi/src/natives/natives_misc.cpp index 9a18fd3..de49e9e 100644 --- a/reapi/src/natives/natives_misc.cpp +++ b/reapi/src/natives/natives_misc.cpp @@ -3375,6 +3375,47 @@ cell AMX_NATIVE_CALL rg_send_death_message(AMX *amx, cell *params) return TRUE; } +/* +* Adds impulse to the player. +* +* @param player Player index. +* @param attacker Attacker index. +* @param flKnockbackForce Knockback force. +* @param flVelModifier Velocity modifier. +* +* @noreturn +*/ +cell AMX_NATIVE_CALL rg_player_takedamage_impulse(AMX *amx, cell *params) +{ + enum args_e { arg_count, arg_index, arg_attacker, arg_knockback_force, arg_vel_modifier }; + + CHECK_ISPLAYER(arg_index); + CHECK_ISPLAYER(arg_attacker); + + CBasePlayer *pPlayer = UTIL_PlayerByIndex(params[arg_index]); + CHECK_CONNECTED(pPlayer, arg_index); + + if (!pPlayer->IsAlive()) + { + AMXX_LogError(amx, AMX_ERR_NATIVE, "%s: player %d not alive", __FUNCTION__, params[arg_index]); + return FALSE; + } + + CBasePlayer *pAttacker = UTIL_PlayerByIndex(params[arg_attacker]); + CHECK_CONNECTED(pAttacker, arg_attacker); + + if (!pAttacker->IsAlive()) + { + AMXX_LogError(amx, AMX_ERR_NATIVE, "%s: attacker %d not alive", __FUNCTION__, params[arg_attacker]); + return FALSE; + } + + CAmxArgs args(amx, params); + pPlayer->CSPlayer()->TakeDamageImpulse(pAttacker, args[arg_knockback_force], args[arg_vel_modifier]); + + return TRUE; +} + AMX_NATIVE_INFO Misc_Natives_RG[] = { { "rg_set_animation", rg_set_animation }, @@ -3490,6 +3531,7 @@ AMX_NATIVE_INFO Misc_Natives_RG[] = { "rg_player_relationship", rg_player_relationship }, { "rg_send_death_message", rg_send_death_message }, + { "rg_player_takedamage_impulse", rg_player_takedamage_impulse }, { nullptr, nullptr } }; diff --git a/reapi/version/version.h b/reapi/version/version.h index 62c3300..d3e8b9d 100644 --- a/reapi/version/version.h +++ b/reapi/version/version.h @@ -6,5 +6,5 @@ #pragma once #define VERSION_MAJOR 5 -#define VERSION_MINOR 28 +#define VERSION_MINOR 29 #define VERSION_MAINTENANCE 0