API: Knockback (#1069)

This commit is contained in:
GLoOoccK 2025-04-20 11:32:49 -03:00 committed by GitHub
parent a4f48f4e42
commit 8d5aa54ceb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 53 additions and 6 deletions

View File

@ -132,6 +132,7 @@ This means that plugins that do binary code analysis (Orpheu for example) probab
| mp_randomspawn | 0 | 0 | 1 | Random player spawns<br/>`0` disabled <br/>`1` enabled<br/>`NOTE`: Navigation `maps/.nav` file required | | mp_randomspawn | 0 | 0 | 1 | Random player spawns<br/>`0` disabled <br/>`1` enabled<br/>`NOTE`: Navigation `maps/.nav` file required |
| 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 | | 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 |
| 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 | | 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 |
| 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. |
</details> </details>

7
dist/game.cfg vendored
View File

@ -680,3 +680,10 @@ mp_playerid_showhealth "1"
// //
// Default value: "3" // Default value: "3"
mp_playerid_field "3" mp_playerid_field "3"
// Knockback force applied to the victim when damaged by strong weapons (e.g. AWP, AK47).
// Works only if not crouching, and not hit in the legs.
// Set to "0" to disable.
//
// Default: "170"
mp_knockback "170"

View File

@ -337,6 +337,7 @@ GAMEHOOK_REGISTRY(CBasePlayer_PlayerDeathThink);
GAMEHOOK_REGISTRY(CBasePlayer_Observer_Think); GAMEHOOK_REGISTRY(CBasePlayer_Observer_Think);
GAMEHOOK_REGISTRY(CBasePlayer_RemoveAllItems); GAMEHOOK_REGISTRY(CBasePlayer_RemoveAllItems);
GAMEHOOK_REGISTRY(CBasePlayer_UpdateStatusBar); GAMEHOOK_REGISTRY(CBasePlayer_UpdateStatusBar);
GAMEHOOK_REGISTRY(CBasePlayer_TakeDamageImpulse);
int CReGameApi::GetMajorVersion() { int CReGameApi::GetMajorVersion() {
return REGAMEDLL_API_VERSION_MAJOR; return REGAMEDLL_API_VERSION_MAJOR;

View File

@ -753,6 +753,10 @@ typedef IHookChainRegistryClassImpl<void, CBasePlayer, BOOL> CReGameHookRegistry
typedef IHookChainClassImpl<void, CBasePlayer> CReGameHook_CBasePlayer_UpdateStatusBar; typedef IHookChainClassImpl<void, CBasePlayer> CReGameHook_CBasePlayer_UpdateStatusBar;
typedef IHookChainRegistryClassImpl<void, CBasePlayer> CReGameHookRegistry_CBasePlayer_UpdateStatusBar; typedef IHookChainRegistryClassImpl<void, CBasePlayer> CReGameHookRegistry_CBasePlayer_UpdateStatusBar;
// CBasePlayer::TakeDamageImpulse hook
typedef IHookChainClassImpl<void, CBasePlayer, CBasePlayer *, float, float> CReGameHook_CBasePlayer_TakeDamageImpulse;
typedef IHookChainRegistryClassImpl<void, CBasePlayer, CBasePlayer *, float, float> CReGameHookRegistry_CBasePlayer_TakeDamageImpulse;
class CReGameHookchains: public IReGameHookchains { class CReGameHookchains: public IReGameHookchains {
public: public:
// CBasePlayer virtual // CBasePlayer virtual
@ -915,6 +919,7 @@ public:
CReGameHookRegistry_CBasePlayer_Observer_Think m_CBasePlayer_Observer_Think; CReGameHookRegistry_CBasePlayer_Observer_Think m_CBasePlayer_Observer_Think;
CReGameHookRegistry_CBasePlayer_RemoveAllItems m_CBasePlayer_RemoveAllItems; CReGameHookRegistry_CBasePlayer_RemoveAllItems m_CBasePlayer_RemoveAllItems;
CReGameHookRegistry_CBasePlayer_UpdateStatusBar m_CBasePlayer_UpdateStatusBar; CReGameHookRegistry_CBasePlayer_UpdateStatusBar m_CBasePlayer_UpdateStatusBar;
CReGameHookRegistry_CBasePlayer_TakeDamageImpulse m_CBasePlayer_TakeDamageImpulse;
public: public:
virtual IReGameHookRegistry_CBasePlayer_Spawn *CBasePlayer_Spawn(); virtual IReGameHookRegistry_CBasePlayer_Spawn *CBasePlayer_Spawn();
@ -1076,6 +1081,7 @@ public:
virtual IReGameHookRegistry_CBasePlayer_Observer_Think *CBasePlayer_Observer_Think(); virtual IReGameHookRegistry_CBasePlayer_Observer_Think *CBasePlayer_Observer_Think();
virtual IReGameHookRegistry_CBasePlayer_RemoveAllItems *CBasePlayer_RemoveAllItems(); virtual IReGameHookRegistry_CBasePlayer_RemoveAllItems *CBasePlayer_RemoveAllItems();
virtual IReGameHookRegistry_CBasePlayer_UpdateStatusBar *CBasePlayer_UpdateStatusBar(); virtual IReGameHookRegistry_CBasePlayer_UpdateStatusBar *CBasePlayer_UpdateStatusBar();
virtual IReGameHookRegistry_CBasePlayer_TakeDamageImpulse *CBasePlayer_TakeDamageImpulse();
}; };
extern CReGameHookchains g_ReGameHookchains; extern CReGameHookchains g_ReGameHookchains;

View File

@ -539,6 +539,11 @@ EXT_FUNC bool CCSPlayer::CheckActivityInGame()
return (fabs(deltaYaw) >= 0.1f && fabs(deltaPitch) >= 0.1f); return (fabs(deltaYaw) >= 0.1f && fabs(deltaPitch) >= 0.1f);
} }
EXT_FUNC void CCSPlayer::TakeDamageImpulse(CBasePlayer *pAttacker, float flKnockbackForce, float flVelModifier)
{
BasePlayer()->TakeDamageImpulse(pAttacker, flKnockbackForce, flVelModifier);
}
void CCSPlayer::ResetVars() void CCSPlayer::ResetVars()
{ {
m_szModel[0] = '\0'; m_szModel[0] = '\0';

View File

@ -199,6 +199,8 @@ cvar_t randomspawn = { "mp_randomspawn", "0", FCVAR_SERVER, 0.0f, nu
cvar_t playerid_showhealth = { "mp_playerid_showhealth", "1", 0, 1.0f, nullptr }; cvar_t playerid_showhealth = { "mp_playerid_showhealth", "1", 0, 1.0f, nullptr };
cvar_t playerid_field = { "mp_playerid_field", "3", 0, 3.0f, nullptr }; cvar_t playerid_field = { "mp_playerid_field", "3", 0, 3.0f, nullptr };
cvar_t knockback = { "mp_knockback", "170", 0, 170.0f, nullptr };
void GameDLL_Version_f() void GameDLL_Version_f()
{ {
if (Q_stricmp(CMD_ARGV(1), "version") != 0) if (Q_stricmp(CMD_ARGV(1), "version") != 0)
@ -485,6 +487,8 @@ void EXT_FUNC GameDLLInit()
CVAR_REGISTER(&flymove_method); CVAR_REGISTER(&flymove_method);
CVAR_REGISTER(&knockback);
// print version // print version
CONSOLE_ECHO("ReGameDLL version: " APP_VERSION "\n"); CONSOLE_ECHO("ReGameDLL version: " APP_VERSION "\n");

View File

@ -216,6 +216,7 @@ extern cvar_t logkills;
extern cvar_t randomspawn; extern cvar_t randomspawn;
extern cvar_t playerid_showhealth; extern cvar_t playerid_showhealth;
extern cvar_t playerid_field; extern cvar_t playerid_field;
extern cvar_t knockback;
#endif #endif

View File

@ -1233,7 +1233,7 @@ BOOL EXT_FUNC CBasePlayer::__API_HOOK(TakeDamage)(entvars_t *pevInflictor, entva
if (!ShouldDoLargeFlinch(m_LastHitGroup, iGunType)) if (!ShouldDoLargeFlinch(m_LastHitGroup, iGunType))
{ {
m_flVelocityModifier = 0.5f; TakeDamageImpulse(pAttack, 0.0f, 0.5f);
if (m_LastHitGroup == HITGROUP_HEAD) if (m_LastHitGroup == HITGROUP_HEAD)
m_bHighDamage = (flDamage > 60); m_bHighDamage = (flDamage > 60);
@ -1246,10 +1246,13 @@ BOOL EXT_FUNC CBasePlayer::__API_HOOK(TakeDamage)(entvars_t *pevInflictor, entva
{ {
if (pev->velocity.Length() < 300) if (pev->velocity.Length() < 300)
{ {
Vector attack_velocity = (pev->origin - pAttack->pev->origin).Normalize() * 170; #ifdef REGAMEDLL_ADD
pev->velocity = pev->velocity + attack_velocity; float knockbackValue = knockback.value;
#else
float knockbackValue = 170;
#endif
m_flVelocityModifier = 0.65f; TakeDamageImpulse(pAttack, knockbackValue, 0.65f);
} }
SetAnimation(PLAYER_LARGE_FLINCH); SetAnimation(PLAYER_LARGE_FLINCH);
@ -10867,6 +10870,17 @@ bool CBasePlayer::Kill()
return true; return true;
} }
LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, TakeDamageImpulse, (CBasePlayer *pAttacker, float flKnockbackForce, float flVelModifier), pAttacker, flKnockbackForce, flVelModifier)
void EXT_FUNC CBasePlayer::__API_HOOK(TakeDamageImpulse)(CBasePlayer *pAttacker, float flKnockbackForce, float flVelModifier)
{
if (flKnockbackForce != 0.0f)
pev->velocity += (pev->origin - pAttacker->pev->origin).Normalize() * flKnockbackForce;
if (flVelModifier != 0.0f)
m_flVelocityModifier = flVelModifier;
}
const usercmd_t *CBasePlayer::GetLastUserCommand() const const usercmd_t *CBasePlayer::GetLastUserCommand() const
{ {
#ifdef REGAMEDLL_API #ifdef REGAMEDLL_API

View File

@ -451,6 +451,7 @@ public:
void Observer_Think_OrigFunc(); void Observer_Think_OrigFunc();
void RemoveAllItems_OrigFunc(BOOL removeSuit); void RemoveAllItems_OrigFunc(BOOL removeSuit);
void UpdateStatusBar_OrigFunc(); void UpdateStatusBar_OrigFunc();
void TakeDamageImpulse_OrigFunc(CBasePlayer *pAttacker, float flKnockbackForce, float flVelModifier);
CCSPlayer *CSPlayer() const; CCSPlayer *CSPlayer() const;
#endif // REGAMEDLL_API #endif // REGAMEDLL_API
@ -659,6 +660,7 @@ public:
void UseEmpty(); void UseEmpty();
void DropIdlePlayer(const char *reason); void DropIdlePlayer(const char *reason);
bool Kill(); bool Kill();
void TakeDamageImpulse(CBasePlayer *pAttacker, float flKnockbackForce, float flVelModifier);
// templates // templates
template<typename T = CBasePlayerItem, typename Functor> template<typename T = CBasePlayerItem, typename Functor>

View File

@ -118,6 +118,7 @@ public:
virtual void OnSpawnEquip(bool addDefault = true, bool equipGame = true); virtual void OnSpawnEquip(bool addDefault = true, bool equipGame = true);
virtual void SetScoreboardAttributes(CBasePlayer *destination = nullptr); virtual void SetScoreboardAttributes(CBasePlayer *destination = nullptr);
virtual void Observer_FindNextPlayer(bool bReverse, const char *name = nullptr); virtual void Observer_FindNextPlayer(bool bReverse, const char *name = nullptr);
virtual void TakeDamageImpulse(CBasePlayer *pAttacker, float flKnockbackForce, float flVelModifier);
bool IsPlayerDominated(int iPlayerIndex) const; bool IsPlayerDominated(int iPlayerIndex) const;
void SetPlayerDominated(CBasePlayer *pPlayer, bool bDominated); void SetPlayerDominated(CBasePlayer *pPlayer, bool bDominated);

View File

@ -38,7 +38,7 @@
#include <API/CSInterfaces.h> #include <API/CSInterfaces.h>
#define REGAMEDLL_API_VERSION_MAJOR 5 #define REGAMEDLL_API_VERSION_MAJOR 5
#define REGAMEDLL_API_VERSION_MINOR 29 #define REGAMEDLL_API_VERSION_MINOR 30
// CBasePlayer::Spawn hook // CBasePlayer::Spawn hook
typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_Spawn; typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_Spawn;
@ -632,6 +632,10 @@ typedef IHookChainRegistryClass<void, class CBasePlayer, BOOL> IReGameHookRegist
typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_UpdateStatusBar; typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_UpdateStatusBar;
typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_UpdateStatusBar; typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_UpdateStatusBar;
// CBasePlayer::TakeDamageImpulse hook
typedef IHookChainClass<void, class CBasePlayer, class CBasePlayer *, float, float> IReGameHook_CBasePlayer_TakeDamageImpulse;
typedef IHookChainRegistryClass<void, class CBasePlayer, class CBasePlayer *, float, float> IReGameHookRegistry_CBasePlayer_TakeDamageImpulse;
class IReGameHookchains { class IReGameHookchains {
public: public:
virtual ~IReGameHookchains() {} virtual ~IReGameHookchains() {}
@ -795,6 +799,7 @@ public:
virtual IReGameHookRegistry_CBasePlayer_Observer_Think *CBasePlayer_Observer_Think() = 0; virtual IReGameHookRegistry_CBasePlayer_Observer_Think *CBasePlayer_Observer_Think() = 0;
virtual IReGameHookRegistry_CBasePlayer_RemoveAllItems *CBasePlayer_RemoveAllItems() = 0; virtual IReGameHookRegistry_CBasePlayer_RemoveAllItems *CBasePlayer_RemoveAllItems() = 0;
virtual IReGameHookRegistry_CBasePlayer_UpdateStatusBar *CBasePlayer_UpdateStatusBar() = 0; virtual IReGameHookRegistry_CBasePlayer_UpdateStatusBar *CBasePlayer_UpdateStatusBar() = 0;
virtual IReGameHookRegistry_CBasePlayer_TakeDamageImpulse *CBasePlayer_TakeDamageImpulse() = 0;
}; };
struct ReGameFuncs_t { struct ReGameFuncs_t {

View File

@ -6,5 +6,5 @@
#pragma once #pragma once
#define VERSION_MAJOR 5 #define VERSION_MAJOR 5
#define VERSION_MINOR 29 #define VERSION_MINOR 30
#define VERSION_MAINTENANCE 0 #define VERSION_MAINTENANCE 0