Skip to content

Commit 66f6096

Browse files
authored
API: Knockback (#348)
1 parent 5c06c04 commit 66f6096

10 files changed

Lines changed: 81 additions & 2 deletions

File tree

reapi/extra/amxmodx/scripting/include/reapi_gamedll.inc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,3 +1233,15 @@ native rg_player_relationship(const player, const target);
12331233
* @noreturn
12341234
*/
12351235
native rg_send_death_message(const pKiller, const pVictim, const pAssister, const pevInflictor, const killerWeaponName[], const DeathMessageFlags:iDeathMessageFlags, const KillRarity:iRarityOfKill);
1236+
1237+
/*
1238+
* Adds impulse to the player.
1239+
*
1240+
* @param player Player index.
1241+
* @param attacker Attacker index.
1242+
* @param flKnockbackForce Knockback force.
1243+
* @param flVelModifier Velocity modifier.
1244+
*
1245+
* @noreturn
1246+
*/
1247+
native rg_player_takedamage_impulse(const player, const attacker, const Float:flKnockbackForce, const Float:flVelModifier);

reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,12 @@ enum GamedllFunc_CBasePlayer
946946
* Params: (const this)
947947
*/
948948
RG_CBasePlayer_UpdateStatusBar,
949+
950+
/*
951+
* Description: Called for the victim player after taking damage, when "knockback" and "pain shock" are applied.
952+
* Params: (const this, attacker, Float:flKnockbackForce, Float:flVelModifier)
953+
*/
954+
RG_CBasePlayer_TakeDamageImpulse,
949955
};
950956

951957
/**

reapi/include/cssdk/dlls/API/CSPlayer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ class CCSPlayer: public CCSMonster
119119
virtual void OnSpawnEquip(bool addDefault = true, bool equipGame = true) = 0;
120120
virtual void SetScoreboardAttributes(CBasePlayer *destination = nullptr) = 0;
121121
virtual void Observer_FindNextPlayer(bool bReverse, const char *name = nullptr) = 0;
122+
virtual void TakeDamageImpulse(CBasePlayer *pAttacker, float flKnockbackForce, float flVelModifier) = 0;
122123

123124
CBasePlayer *BasePlayer() const;
124125

reapi/include/cssdk/dlls/regamedll_api.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
#include <API/CSInterfaces.h>
4141

4242
#define REGAMEDLL_API_VERSION_MAJOR 5
43-
#define REGAMEDLL_API_VERSION_MINOR 29
43+
#define REGAMEDLL_API_VERSION_MINOR 30
4444

4545
// CBasePlayer::Spawn hook
4646
typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_Spawn;
@@ -634,6 +634,10 @@ typedef IHookChainRegistryClass<void, class CBasePlayer, BOOL> IReGameHookRegist
634634
typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_UpdateStatusBar;
635635
typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_UpdateStatusBar;
636636

637+
// CBasePlayer::TakeDamageImpulse hook
638+
typedef IHookChainClass<void, class CBasePlayer, class CBasePlayer *, float, float> IReGameHook_CBasePlayer_TakeDamageImpulse;
639+
typedef IHookChainRegistryClass<void, class CBasePlayer, class CBasePlayer *, float, float> IReGameHookRegistry_CBasePlayer_TakeDamageImpulse;
640+
637641
class IReGameHookchains {
638642
public:
639643
virtual ~IReGameHookchains() {}
@@ -797,6 +801,7 @@ class IReGameHookchains {
797801
virtual IReGameHookRegistry_CBasePlayer_Observer_Think *CBasePlayer_Observer_Think() = 0;
798802
virtual IReGameHookRegistry_CBasePlayer_RemoveAllItems *CBasePlayer_RemoveAllItems() = 0;
799803
virtual IReGameHookRegistry_CBasePlayer_UpdateStatusBar *CBasePlayer_UpdateStatusBar() = 0;
804+
virtual IReGameHookRegistry_CBasePlayer_TakeDamageImpulse *CBasePlayer_TakeDamageImpulse() = 0;
800805
};
801806

802807
struct ReGameFuncs_t {

reapi/src/hook_callback.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1776,6 +1776,16 @@ void CBasePlayer_UpdateStatusBar(IReGameHook_CBasePlayer_UpdateStatusBar *chain,
17761776
callVoidForward(RG_CBasePlayer_UpdateStatusBar, original, indexOfEdict(pthis->pev));
17771777
}
17781778

1779+
void CBasePlayer_TakeDamageImpulse(IReGameHook_CBasePlayer_TakeDamageImpulse *chain, CBasePlayer *pthis, CBasePlayer *pAttacker, float flKnockbackForce, float flVelModifier)
1780+
{
1781+
auto original = [chain](int _pthis, int _pAttacker, float _flKnockbackForce, float _flVelModifier)
1782+
{
1783+
chain->callNext(getPrivate<CBasePlayer>(_pthis), getPrivate<CBasePlayer>(_pAttacker), _flKnockbackForce, _flVelModifier);
1784+
};
1785+
1786+
callVoidForward(RG_CBasePlayer_TakeDamageImpulse, original, indexOfEdict(pthis->pev), indexOfEdict(pAttacker->pev), flKnockbackForce, flVelModifier);
1787+
}
1788+
17791789
/*
17801790
* VTC functions
17811791
*/

reapi/src/hook_callback.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,7 @@ void CBasePlayer_Observer_Think(IReGameHook_CBasePlayer_Observer_Think *chain, C
575575
void CBasePlayer_RemoveAllItems(IReGameHook_CBasePlayer_RemoveAllItems *chain, CBasePlayer *pthis, BOOL removeSuit);
576576
void CSGameRules_SendDeathMessage(IReGameHook_CSGameRules_SendDeathMessage *chain, CBaseEntity *pKiller, CBasePlayer *pVictim, CBasePlayer *pAssister, entvars_t *pevInflictor, const char *killerWeaponName, int iDeathMessageFlags, int iRarityOfKill);
577577
void CBasePlayer_UpdateStatusBar(IReGameHook_CBasePlayer_UpdateStatusBar *chain, CBasePlayer *pthis);
578+
void CBasePlayer_TakeDamageImpulse(IReGameHook_CBasePlayer_TakeDamageImpulse *chain, CBasePlayer *pthis, CBasePlayer *pAttacker, float flKnockbackForce, float flVelModifier);
578579

579580
/*
580581
* VTC functions

reapi/src/hook_list.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ hook_t hooklist_player[] = {
217217
DLL(CBasePlayer_Observer_Think),
218218
DLL(CBasePlayer_RemoveAllItems),
219219
DLL(CBasePlayer_UpdateStatusBar),
220+
DLL(CBasePlayer_TakeDamageImpulse),
220221
};
221222

222223
hook_t hooklist_gamerules[] = {

reapi/src/hook_list.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ enum GamedllFunc_CBasePlayer
241241
RG_CBasePlayer_Observer_Think,
242242
RG_CBasePlayer_RemoveAllItems,
243243
RG_CBasePlayer_UpdateStatusBar,
244+
RG_CBasePlayer_TakeDamageImpulse,
244245

245246
// [...]
246247
};

reapi/src/natives/natives_misc.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3375,6 +3375,47 @@ cell AMX_NATIVE_CALL rg_send_death_message(AMX *amx, cell *params)
33753375
return TRUE;
33763376
}
33773377

3378+
/*
3379+
* Adds impulse to the player.
3380+
*
3381+
* @param player Player index.
3382+
* @param attacker Attacker index.
3383+
* @param flKnockbackForce Knockback force.
3384+
* @param flVelModifier Velocity modifier.
3385+
*
3386+
* @noreturn
3387+
*/
3388+
cell AMX_NATIVE_CALL rg_player_takedamage_impulse(AMX *amx, cell *params)
3389+
{
3390+
enum args_e { arg_count, arg_index, arg_attacker, arg_knockback_force, arg_vel_modifier };
3391+
3392+
CHECK_ISPLAYER(arg_index);
3393+
CHECK_ISPLAYER(arg_attacker);
3394+
3395+
CBasePlayer *pPlayer = UTIL_PlayerByIndex(params[arg_index]);
3396+
CHECK_CONNECTED(pPlayer, arg_index);
3397+
3398+
if (!pPlayer->IsAlive())
3399+
{
3400+
AMXX_LogError(amx, AMX_ERR_NATIVE, "%s: player %d not alive", __FUNCTION__, params[arg_index]);
3401+
return FALSE;
3402+
}
3403+
3404+
CBasePlayer *pAttacker = UTIL_PlayerByIndex(params[arg_attacker]);
3405+
CHECK_CONNECTED(pAttacker, arg_attacker);
3406+
3407+
if (!pAttacker->IsAlive())
3408+
{
3409+
AMXX_LogError(amx, AMX_ERR_NATIVE, "%s: attacker %d not alive", __FUNCTION__, params[arg_attacker]);
3410+
return FALSE;
3411+
}
3412+
3413+
CAmxArgs args(amx, params);
3414+
pPlayer->CSPlayer()->TakeDamageImpulse(pAttacker, args[arg_knockback_force], args[arg_vel_modifier]);
3415+
3416+
return TRUE;
3417+
}
3418+
33783419
AMX_NATIVE_INFO Misc_Natives_RG[] =
33793420
{
33803421
{ "rg_set_animation", rg_set_animation },
@@ -3490,6 +3531,7 @@ AMX_NATIVE_INFO Misc_Natives_RG[] =
34903531
{ "rg_player_relationship", rg_player_relationship },
34913532

34923533
{ "rg_send_death_message", rg_send_death_message },
3534+
{ "rg_player_takedamage_impulse", rg_player_takedamage_impulse },
34933535

34943536
{ nullptr, nullptr }
34953537
};

reapi/version/version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66
#pragma once
77

88
#define VERSION_MAJOR 5
9-
#define VERSION_MINOR 28
9+
#define VERSION_MINOR 29
1010
#define VERSION_MAINTENANCE 0

0 commit comments

Comments
 (0)