Skip to content

Commit 8d5aa54

Browse files
authored
API: Knockback (#1069)
1 parent a4f48f4 commit 8d5aa54

File tree

12 files changed

+53
-6
lines changed

12 files changed

+53
-6
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ This means that plugins that do binary code analysis (Orpheu for example) probab
132132
| mp_randomspawn | 0 | 0 | 1 | Random player spawns<br/>`0` disabled <br/>`1` enabled<br/>`NOTE`: Navigation `maps/.nav` file required |
133133
| mp_playerid_showhealth | 1 | 0 | 2 | Player ID display mode.<br/>`0` don't show health<br/>`1` show health for teammates only (default CS behaviour)<br/>`2` show health for all players |
134134
| mp_playerid_field | 3 | 0 | 3 | Player ID field display mode.<br/>`0` don't show additional information<br/>`1` show team name<br/>`2` show health percentage<br/>`3` show both team name and health percentage |
135+
| mp_knockback | 170 | - | - | Knockback force applied to the victim when damaged by strong weapons (e.g. `AWP`, `AK47`).<br/>Works only if not crouching, and not hit in the legs.<br/>Set to `0` to disable. |
135136

136137
</details>
137138

dist/game.cfg

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,3 +680,10 @@ mp_playerid_showhealth "1"
680680
//
681681
// Default value: "3"
682682
mp_playerid_field "3"
683+
684+
// Knockback force applied to the victim when damaged by strong weapons (e.g. AWP, AK47).
685+
// Works only if not crouching, and not hit in the legs.
686+
// Set to "0" to disable.
687+
//
688+
// Default: "170"
689+
mp_knockback "170"

regamedll/dlls/API/CAPI_Impl.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,7 @@ GAMEHOOK_REGISTRY(CBasePlayer_PlayerDeathThink);
337337
GAMEHOOK_REGISTRY(CBasePlayer_Observer_Think);
338338
GAMEHOOK_REGISTRY(CBasePlayer_RemoveAllItems);
339339
GAMEHOOK_REGISTRY(CBasePlayer_UpdateStatusBar);
340+
GAMEHOOK_REGISTRY(CBasePlayer_TakeDamageImpulse);
340341

341342
int CReGameApi::GetMajorVersion() {
342343
return REGAMEDLL_API_VERSION_MAJOR;

regamedll/dlls/API/CAPI_Impl.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,10 @@ typedef IHookChainRegistryClassImpl<void, CBasePlayer, BOOL> CReGameHookRegistry
753753
typedef IHookChainClassImpl<void, CBasePlayer> CReGameHook_CBasePlayer_UpdateStatusBar;
754754
typedef IHookChainRegistryClassImpl<void, CBasePlayer> CReGameHookRegistry_CBasePlayer_UpdateStatusBar;
755755

756+
// CBasePlayer::TakeDamageImpulse hook
757+
typedef IHookChainClassImpl<void, CBasePlayer, CBasePlayer *, float, float> CReGameHook_CBasePlayer_TakeDamageImpulse;
758+
typedef IHookChainRegistryClassImpl<void, CBasePlayer, CBasePlayer *, float, float> CReGameHookRegistry_CBasePlayer_TakeDamageImpulse;
759+
756760
class CReGameHookchains: public IReGameHookchains {
757761
public:
758762
// CBasePlayer virtual
@@ -915,6 +919,7 @@ class CReGameHookchains: public IReGameHookchains {
915919
CReGameHookRegistry_CBasePlayer_Observer_Think m_CBasePlayer_Observer_Think;
916920
CReGameHookRegistry_CBasePlayer_RemoveAllItems m_CBasePlayer_RemoveAllItems;
917921
CReGameHookRegistry_CBasePlayer_UpdateStatusBar m_CBasePlayer_UpdateStatusBar;
922+
CReGameHookRegistry_CBasePlayer_TakeDamageImpulse m_CBasePlayer_TakeDamageImpulse;
918923

919924
public:
920925
virtual IReGameHookRegistry_CBasePlayer_Spawn *CBasePlayer_Spawn();
@@ -1076,6 +1081,7 @@ class CReGameHookchains: public IReGameHookchains {
10761081
virtual IReGameHookRegistry_CBasePlayer_Observer_Think *CBasePlayer_Observer_Think();
10771082
virtual IReGameHookRegistry_CBasePlayer_RemoveAllItems *CBasePlayer_RemoveAllItems();
10781083
virtual IReGameHookRegistry_CBasePlayer_UpdateStatusBar *CBasePlayer_UpdateStatusBar();
1084+
virtual IReGameHookRegistry_CBasePlayer_TakeDamageImpulse *CBasePlayer_TakeDamageImpulse();
10791085
};
10801086

10811087
extern CReGameHookchains g_ReGameHookchains;

regamedll/dlls/API/CSPlayer.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,11 @@ EXT_FUNC bool CCSPlayer::CheckActivityInGame()
539539
return (fabs(deltaYaw) >= 0.1f && fabs(deltaPitch) >= 0.1f);
540540
}
541541

542+
EXT_FUNC void CCSPlayer::TakeDamageImpulse(CBasePlayer *pAttacker, float flKnockbackForce, float flVelModifier)
543+
{
544+
BasePlayer()->TakeDamageImpulse(pAttacker, flKnockbackForce, flVelModifier);
545+
}
546+
542547
void CCSPlayer::ResetVars()
543548
{
544549
m_szModel[0] = '\0';

regamedll/dlls/game.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,8 @@ cvar_t randomspawn = { "mp_randomspawn", "0", FCVAR_SERVER, 0.0f, nu
199199
cvar_t playerid_showhealth = { "mp_playerid_showhealth", "1", 0, 1.0f, nullptr };
200200
cvar_t playerid_field = { "mp_playerid_field", "3", 0, 3.0f, nullptr };
201201

202+
cvar_t knockback = { "mp_knockback", "170", 0, 170.0f, nullptr };
203+
202204
void GameDLL_Version_f()
203205
{
204206
if (Q_stricmp(CMD_ARGV(1), "version") != 0)
@@ -485,6 +487,8 @@ void EXT_FUNC GameDLLInit()
485487

486488
CVAR_REGISTER(&flymove_method);
487489

490+
CVAR_REGISTER(&knockback);
491+
488492
// print version
489493
CONSOLE_ECHO("ReGameDLL version: " APP_VERSION "\n");
490494

regamedll/dlls/game.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ extern cvar_t logkills;
216216
extern cvar_t randomspawn;
217217
extern cvar_t playerid_showhealth;
218218
extern cvar_t playerid_field;
219+
extern cvar_t knockback;
219220

220221
#endif
221222

regamedll/dlls/player.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,7 +1233,7 @@ BOOL EXT_FUNC CBasePlayer::__API_HOOK(TakeDamage)(entvars_t *pevInflictor, entva
12331233

12341234
if (!ShouldDoLargeFlinch(m_LastHitGroup, iGunType))
12351235
{
1236-
m_flVelocityModifier = 0.5f;
1236+
TakeDamageImpulse(pAttack, 0.0f, 0.5f);
12371237

12381238
if (m_LastHitGroup == HITGROUP_HEAD)
12391239
m_bHighDamage = (flDamage > 60);
@@ -1246,10 +1246,13 @@ BOOL EXT_FUNC CBasePlayer::__API_HOOK(TakeDamage)(entvars_t *pevInflictor, entva
12461246
{
12471247
if (pev->velocity.Length() < 300)
12481248
{
1249-
Vector attack_velocity = (pev->origin - pAttack->pev->origin).Normalize() * 170;
1250-
pev->velocity = pev->velocity + attack_velocity;
1249+
#ifdef REGAMEDLL_ADD
1250+
float knockbackValue = knockback.value;
1251+
#else
1252+
float knockbackValue = 170;
1253+
#endif
12511254

1252-
m_flVelocityModifier = 0.65f;
1255+
TakeDamageImpulse(pAttack, knockbackValue, 0.65f);
12531256
}
12541257

12551258
SetAnimation(PLAYER_LARGE_FLINCH);
@@ -10867,6 +10870,17 @@ bool CBasePlayer::Kill()
1086710870
return true;
1086810871
}
1086910872

10873+
LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, TakeDamageImpulse, (CBasePlayer *pAttacker, float flKnockbackForce, float flVelModifier), pAttacker, flKnockbackForce, flVelModifier)
10874+
10875+
void EXT_FUNC CBasePlayer::__API_HOOK(TakeDamageImpulse)(CBasePlayer *pAttacker, float flKnockbackForce, float flVelModifier)
10876+
{
10877+
if (flKnockbackForce != 0.0f)
10878+
pev->velocity += (pev->origin - pAttacker->pev->origin).Normalize() * flKnockbackForce;
10879+
10880+
if (flVelModifier != 0.0f)
10881+
m_flVelocityModifier = flVelModifier;
10882+
}
10883+
1087010884
const usercmd_t *CBasePlayer::GetLastUserCommand() const
1087110885
{
1087210886
#ifdef REGAMEDLL_API

regamedll/dlls/player.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,7 @@ class CBasePlayer: public CBaseMonster {
451451
void Observer_Think_OrigFunc();
452452
void RemoveAllItems_OrigFunc(BOOL removeSuit);
453453
void UpdateStatusBar_OrigFunc();
454+
void TakeDamageImpulse_OrigFunc(CBasePlayer *pAttacker, float flKnockbackForce, float flVelModifier);
454455

455456
CCSPlayer *CSPlayer() const;
456457
#endif // REGAMEDLL_API
@@ -659,6 +660,7 @@ class CBasePlayer: public CBaseMonster {
659660
void UseEmpty();
660661
void DropIdlePlayer(const char *reason);
661662
bool Kill();
663+
void TakeDamageImpulse(CBasePlayer *pAttacker, float flKnockbackForce, float flVelModifier);
662664

663665
// templates
664666
template<typename T = CBasePlayerItem, typename Functor>

regamedll/public/regamedll/API/CSPlayer.h

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

122123
bool IsPlayerDominated(int iPlayerIndex) const;
123124
void SetPlayerDominated(CBasePlayer *pPlayer, bool bDominated);

regamedll/public/regamedll/regamedll_api.h

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

4040
#define REGAMEDLL_API_VERSION_MAJOR 5
41-
#define REGAMEDLL_API_VERSION_MINOR 29
41+
#define REGAMEDLL_API_VERSION_MINOR 30
4242

4343
// CBasePlayer::Spawn hook
4444
typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_Spawn;
@@ -632,6 +632,10 @@ typedef IHookChainRegistryClass<void, class CBasePlayer, BOOL> IReGameHookRegist
632632
typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_UpdateStatusBar;
633633
typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_UpdateStatusBar;
634634

635+
// CBasePlayer::TakeDamageImpulse hook
636+
typedef IHookChainClass<void, class CBasePlayer, class CBasePlayer *, float, float> IReGameHook_CBasePlayer_TakeDamageImpulse;
637+
typedef IHookChainRegistryClass<void, class CBasePlayer, class CBasePlayer *, float, float> IReGameHookRegistry_CBasePlayer_TakeDamageImpulse;
638+
635639
class IReGameHookchains {
636640
public:
637641
virtual ~IReGameHookchains() {}
@@ -795,6 +799,7 @@ class IReGameHookchains {
795799
virtual IReGameHookRegistry_CBasePlayer_Observer_Think *CBasePlayer_Observer_Think() = 0;
796800
virtual IReGameHookRegistry_CBasePlayer_RemoveAllItems *CBasePlayer_RemoveAllItems() = 0;
797801
virtual IReGameHookRegistry_CBasePlayer_UpdateStatusBar *CBasePlayer_UpdateStatusBar() = 0;
802+
virtual IReGameHookRegistry_CBasePlayer_TakeDamageImpulse *CBasePlayer_TakeDamageImpulse() = 0;
798803
};
799804

800805
struct ReGameFuncs_t {

regamedll/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 29
9+
#define VERSION_MINOR 30
1010
#define VERSION_MAINTENANCE 0

0 commit comments

Comments
 (0)