Spawn protection API and cvar (mp_respawn_immunitytime). (#266)

This commit is contained in:
Shorohov Sergey 2018-02-18 14:31:24 +03:00 committed by In-line
parent cbbda5ef21
commit bc2c3176e4
12 changed files with 87 additions and 2 deletions

View File

@ -49,6 +49,7 @@ Archive's bin directory contains 2 subdirectories, 'bugfixed' and 'pure'
| bot_quota_mode | normal | - | - | Determines the type of quota.<br/>`normal` default behaviour<br/>`fill` the server will adjust bots to keep `N` players in the game, where `N` is bot_quota | | bot_quota_mode | normal | - | - | Determines the type of quota.<br/>`normal` default behaviour<br/>`fill` the server will adjust bots to keep `N` players in the game, where `N` is bot_quota |
| mp_item_staytime | 300 | - | - | Time to remove item that have been dropped from the players. | | mp_item_staytime | 300 | - | - | Time to remove item that have been dropped from the players. |
| mp_legacy_bombtarget_touch | 1 | 0 | 1 | Legacy func_bomb_target touch. New one is more strict. <br/>`0` New behavior<br/>`1` Legacy behavior| | mp_legacy_bombtarget_touch | 1 | 0 | 1 | Legacy func_bomb_target touch. New one is more strict. <br/>`0` New behavior<br/>`1` Legacy behavior|
| mp_respawn_immunitytime | 0 | 0 | - | Specifies the players defense time after respawn. (in seconds).<br/>`0` disabled<br/>`>0.00001` time delay to remove protection |
## How to install zBot for CS 1.6? ## How to install zBot for CS 1.6?
* Extract all the files from an [archive](regamedll/extra/zBot/bot_profiles.zip?raw=true) * Extract all the files from an [archive](regamedll/extra/zBot/bot_profiles.zip?raw=true)

7
dist/game.cfg vendored
View File

@ -186,3 +186,10 @@ mp_item_staytime 300
// //
// Default value: "1" // Default value: "1"
mp_legacy_bombtarget_touch "1" mp_legacy_bombtarget_touch "1"
// Specifies the players defense time after respawn. (in seconds).
// 0 - disabled
// >0.00001 - time delay to remove protection
//
// Default value: "0"
mp_respawn_immunitytime "0"

View File

@ -157,6 +157,8 @@ GAMEHOOK_REGISTRY(ThrowHeGrenade);
GAMEHOOK_REGISTRY(ThrowFlashbang); GAMEHOOK_REGISTRY(ThrowFlashbang);
GAMEHOOK_REGISTRY(ThrowSmokeGrenade); GAMEHOOK_REGISTRY(ThrowSmokeGrenade);
GAMEHOOK_REGISTRY(PlantBomb); GAMEHOOK_REGISTRY(PlantBomb);
GAMEHOOK_REGISTRY(CBasePlayer_SetSpawnProtection);
GAMEHOOK_REGISTRY(CBasePlayer_RemoveSpawnProtection);
int CReGameApi::GetMajorVersion() { int CReGameApi::GetMajorVersion() {
return REGAMEDLL_API_VERSION_MAJOR; return REGAMEDLL_API_VERSION_MAJOR;

View File

@ -521,6 +521,14 @@ typedef IHookChainRegistryImpl<CGrenade *, entvars_t *, Vector &, Vector &, floa
typedef IHookChainImpl<CGrenade *, entvars_t *, Vector &, Vector &> CReGameHook_PlantBomb; typedef IHookChainImpl<CGrenade *, entvars_t *, Vector &, Vector &> CReGameHook_PlantBomb;
typedef IHookChainRegistryImpl<CGrenade *, entvars_t *, Vector &, Vector &> CReGameHookRegistry_PlantBomb; typedef IHookChainRegistryImpl<CGrenade *, entvars_t *, Vector &, Vector &> CReGameHookRegistry_PlantBomb;
// CBasePlayer::SetSpawnProtection hook
typedef IHookChainClassImpl<void, CBasePlayer, float> CReGameHook_CBasePlayer_SetSpawnProtection;
typedef IHookChainRegistryClassImpl<void, CBasePlayer, float> CReGameHookRegistry_CBasePlayer_SetSpawnProtection;
// CBasePlayer::RemoveSpawnProtection hook
typedef IHookChainImpl<void, CBasePlayer> CReGameHook_CBasePlayer_RemoveSpawnProtection;
typedef IHookChainRegistryClassImpl<void, CBasePlayer> CReGameHookRegistry_CBasePlayer_RemoveSpawnProtection;
class CReGameHookchains: public IReGameHookchains { class CReGameHookchains: public IReGameHookchains {
public: public:
// CBasePlayer virtual // CBasePlayer virtual
@ -625,6 +633,8 @@ public:
CReGameHookRegistry_ThrowFlashbang m_ThrowFlashbang; CReGameHookRegistry_ThrowFlashbang m_ThrowFlashbang;
CReGameHookRegistry_ThrowSmokeGrenade m_ThrowSmokeGrenade; CReGameHookRegistry_ThrowSmokeGrenade m_ThrowSmokeGrenade;
CReGameHookRegistry_PlantBomb m_PlantBomb; CReGameHookRegistry_PlantBomb m_PlantBomb;
CReGameHookRegistry_CBasePlayer_SetSpawnProtection m_CBasePlayer_SetSpawnProtection;
CReGameHookRegistry_CBasePlayer_RemoveSpawnProtection m_CBasePlayer_RemoveSpawnProtection;
public: public:
virtual IReGameHookRegistry_CBasePlayer_Spawn *CBasePlayer_Spawn(); virtual IReGameHookRegistry_CBasePlayer_Spawn *CBasePlayer_Spawn();
virtual IReGameHookRegistry_CBasePlayer_Precache *CBasePlayer_Precache(); virtual IReGameHookRegistry_CBasePlayer_Precache *CBasePlayer_Precache();
@ -727,6 +737,8 @@ public:
virtual IReGameHookRegistry_ThrowFlashbang *ThrowFlashbang(); virtual IReGameHookRegistry_ThrowFlashbang *ThrowFlashbang();
virtual IReGameHookRegistry_ThrowSmokeGrenade *ThrowSmokeGrenade(); virtual IReGameHookRegistry_ThrowSmokeGrenade *ThrowSmokeGrenade();
virtual IReGameHookRegistry_PlantBomb *PlantBomb(); virtual IReGameHookRegistry_PlantBomb *PlantBomb();
virtual IReGameHookRegistry_CBasePlayer_SetSpawnProtection *CBasePlayer_SetSpawnProtection();
virtual IReGameHookRegistry_CBasePlayer_RemoveSpawnProtection *CBasePlayer_RemoveSpawnProtection();
}; };
extern CReGameHookchains g_ReGameHookchains; extern CReGameHookchains g_ReGameHookchains;

View File

@ -489,3 +489,13 @@ EXT_FUNC void CCSPlayer::StartDeathCam()
{ {
BasePlayer()->StartDeathCam(); BasePlayer()->StartDeathCam();
} }
EXT_FUNC void CCSPlayer::SetSpawnProtection(float flProtectionTime)
{
BasePlayer()->SetSpawnProtection(flProtectionTime);
}
EXT_FUNC void CCSPlayer::RemoveSpawnProtection()
{
BasePlayer()->RemoveSpawnProtection();
}

View File

@ -116,6 +116,7 @@ cvar_t show_radioicon = { "mp_show_radioicon", "1", FCVAR_SERVER, 1.0f,
cvar_t old_bomb_defused_sound = { "mp_old_bomb_defused_sound", "1", FCVAR_SERVER, 1.0f, nullptr }; cvar_t old_bomb_defused_sound = { "mp_old_bomb_defused_sound", "1", FCVAR_SERVER, 1.0f, nullptr };
cvar_t item_staytime = { "mp_item_staytime", "300", FCVAR_SERVER, 300.0f, nullptr }; cvar_t item_staytime = { "mp_item_staytime", "300", FCVAR_SERVER, 300.0f, nullptr };
cvar_t legacy_bombtarget_touch = { "mp_legacy_bombtarget_touch", "1", FCVAR_SERVER, 1.0f, nullptr }; cvar_t legacy_bombtarget_touch = { "mp_legacy_bombtarget_touch", "1", FCVAR_SERVER, 1.0f, nullptr };
cvar_t respawn_immunitytime = { "mp_respawn_immunitytime", "0", FCVAR_SERVER, 0.0f, nullptr };
void GameDLL_Version_f() void GameDLL_Version_f()
{ {
@ -270,6 +271,7 @@ void EXT_FUNC GameDLLInit()
CVAR_REGISTER(&old_bomb_defused_sound); CVAR_REGISTER(&old_bomb_defused_sound);
CVAR_REGISTER(&item_staytime); CVAR_REGISTER(&item_staytime);
CVAR_REGISTER(&legacy_bombtarget_touch); CVAR_REGISTER(&legacy_bombtarget_touch);
CVAR_REGISTER(&respawn_immunitytime);
// print version // print version
CONSOLE_ECHO("ReGameDLL version: " APP_VERSION "\n"); CONSOLE_ECHO("ReGameDLL version: " APP_VERSION "\n");

View File

@ -153,6 +153,7 @@ extern cvar_t show_radioicon;
extern cvar_t old_bomb_defused_sound; extern cvar_t old_bomb_defused_sound;
extern cvar_t item_staytime; extern cvar_t item_staytime;
extern cvar_t legacy_bombtarget_touch; extern cvar_t legacy_bombtarget_touch;
extern cvar_t respawn_immunitytime;
#endif #endif

View File

@ -3635,6 +3635,11 @@ void EXT_FUNC CHalfLifeMultiplay::__API_HOOK(PlayerSpawn)(CBasePlayer *pPlayer)
pPlayer->pev->weapons |= (1 << WEAPON_SUIT); pPlayer->pev->weapons |= (1 << WEAPON_SUIT);
pPlayer->OnSpawnEquip(); pPlayer->OnSpawnEquip();
pPlayer->SetPlayerModel(false); pPlayer->SetPlayerModel(false);
#ifdef REGAMEDLL_ADD
if (respawn_immunitytime.value > 0)
pPlayer->SetSpawnProtection(respawn_immunitytime.value);
#endif
} }
LINK_HOOK_CLASS_CUSTOM_CHAIN(BOOL, CHalfLifeMultiplay, CSGameRules, FPlayerCanRespawn, (CBasePlayer *pPlayer), pPlayer) LINK_HOOK_CLASS_CUSTOM_CHAIN(BOOL, CHalfLifeMultiplay, CSGameRules, FPlayerCanRespawn, (CBasePlayer *pPlayer), pPlayer)

View File

@ -4376,6 +4376,13 @@ void EXT_FUNC CBasePlayer::__API_HOOK(PreThink)()
} }
UpdateLocation(); UpdateLocation();
#ifdef REGAMEDLL_ADD
if (CSPlayer()->m_flSpawnProtectionEndTime > 0 && gpGlobals->time > CSPlayer()->m_flSpawnProtectionEndTime)
{
RemoveSpawnProtection();
}
#endif
} }
// If player is taking time based damage, continue doing damage to player - // If player is taking time based damage, continue doing damage to player -
@ -9516,3 +9523,24 @@ bool CBasePlayer::__API_HOOK(CanSwitchTeam)(TeamName teamToSwap)
return true; return true;
} }
LINK_HOOK_CLASS_VOID_CHAIN(CBasePlayer, SetSpawnProtection, (float flProtectionTime), flProtectionTime)
void EXT_FUNC CBasePlayer::__API_HOOK(SetSpawnProtection)(float flProtectionTime)
{
pev->takedamage = DAMAGE_NO;
pev->rendermode = kRenderTransAdd;
pev->renderamt = 100.0;
CSPlayer()->m_flSpawnProtectionEndTime = gpGlobals->time + flProtectionTime;
}
LINK_HOOK_CLASS_VOID_CHAIN2(CBasePlayer, RemoveSpawnProtection)
void CBasePlayer::__API_HOOK(RemoveSpawnProtection)()
{
pev->takedamage = DAMAGE_AIM;
pev->rendermode = kRenderNormal;
CSPlayer()->m_flSpawnProtectionEndTime = 0.0f;
}

View File

@ -343,7 +343,6 @@ public:
virtual BOOL AddPlayerItem(CBasePlayerItem *pItem); virtual BOOL AddPlayerItem(CBasePlayerItem *pItem);
virtual BOOL RemovePlayerItem(CBasePlayerItem *pItem); virtual BOOL RemovePlayerItem(CBasePlayerItem *pItem);
virtual int GiveAmmo(int iAmount, const char *szName, int iMax = -1); virtual int GiveAmmo(int iAmount, const char *szName, int iMax = -1);
#ifndef REGAMEDLL_API #ifndef REGAMEDLL_API
virtual void StartSneaking() { m_tSneaking = gpGlobals->time - 1; } virtual void StartSneaking() { m_tSneaking = gpGlobals->time - 1; }
virtual void StopSneaking() { m_tSneaking = gpGlobals->time + 30; } virtual void StopSneaking() { m_tSneaking = gpGlobals->time + 30; }
@ -420,6 +419,8 @@ public:
CGrenade *ThrowGrenade_OrigFunc(CBasePlayerWeapon *pWeapon, VectorRef vecSrc, VectorRef vecThrow, float time, unsigned short usEvent = 0); CGrenade *ThrowGrenade_OrigFunc(CBasePlayerWeapon *pWeapon, VectorRef vecSrc, VectorRef vecThrow, float time, unsigned short usEvent = 0);
void SwitchTeam_OrigFunc(); void SwitchTeam_OrigFunc();
bool CanSwitchTeam_OrigFunc(TeamName teamToSwap); bool CanSwitchTeam_OrigFunc(TeamName teamToSwap);
void SetSpawnProtection_OrigFunc(float flProtectionTime);
void RemoveSpawnProtection_OrigFunc();
CCSPlayer *CSPlayer() const; CCSPlayer *CSPlayer() const;
#endif // REGAMEDLL_API #endif // REGAMEDLL_API
@ -609,6 +610,9 @@ public:
CBasePlayerItem *GetItemByName(const char *itemName); CBasePlayerItem *GetItemByName(const char *itemName);
CBasePlayerItem *GetItemById(WeaponIdType weaponID); CBasePlayerItem *GetItemById(WeaponIdType weaponID);
void SetSpawnProtection(float flProtectionTime);
void RemoveSpawnProtection();
// templates // templates
template<typename T = CBasePlayerItem, typename Functor> template<typename T = CBasePlayerItem, typename Functor>
T *ForEachItem(int slot, const Functor &func) const T *ForEachItem(int slot, const Functor &func) const

View File

@ -33,7 +33,7 @@
class CCSPlayer: public CCSMonster { class CCSPlayer: public CCSMonster {
public: public:
CCSPlayer() : m_bForceShowMenu(false), m_flRespawnPending(0) CCSPlayer() : m_bForceShowMenu(false), m_flRespawnPending(0), m_flSpawnProtectionEndTime(0)
{ {
m_szModel[0] = '\0'; m_szModel[0] = '\0';
} }
@ -80,6 +80,8 @@ public:
virtual void ResetSequenceInfo(); virtual void ResetSequenceInfo();
virtual void StartDeathCam(); virtual void StartDeathCam();
virtual bool RemovePlayerItemEx(const char* pszItemName, bool bRemoveAmmo); virtual bool RemovePlayerItemEx(const char* pszItemName, bool bRemoveAmmo);
virtual void SetSpawnProtection(float flProtectionTime);
virtual void RemoveSpawnProtection();
CBasePlayer *BasePlayer() const; CBasePlayer *BasePlayer() const;
@ -87,6 +89,7 @@ public:
char m_szModel[32]; char m_szModel[32];
bool m_bForceShowMenu; bool m_bForceShowMenu;
float m_flRespawnPending; float m_flRespawnPending;
float m_flSpawnProtectionEndTime;
}; };
// Inlines // Inlines

View File

@ -424,6 +424,14 @@ typedef IHookChainRegistry<class CGrenade *, entvars_t *, Vector &, Vector &, fl
typedef IHookChain<class CGrenade *, entvars_t *, Vector &, Vector &> IReGameHook_PlantBomb; typedef IHookChain<class CGrenade *, entvars_t *, Vector &, Vector &> IReGameHook_PlantBomb;
typedef IHookChainRegistry<class CGrenade *, entvars_t *, Vector &, Vector &> IReGameHookRegistry_PlantBomb; typedef IHookChainRegistry<class CGrenade *, entvars_t *, Vector &, Vector &> IReGameHookRegistry_PlantBomb;
// CBasePlayer::SetSpawnProtection hook
typedef IHookChainClass<void, class CBasePlayer, float> IReGameHook_CBasePlayer_SetSpawnProtection;
typedef IHookChainRegistryClass<void, class CBasePlayer, float> IReGameHookRegistry_CBasePlayer_SetSpawnProtection;
// CBasePlayer::RemoveSpawnProtection hook
typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_RemoveSpawnProtection;
typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_RemoveSpawnProtection;
class IReGameHookchains { class IReGameHookchains {
public: public:
virtual ~IReGameHookchains() {} virtual ~IReGameHookchains() {}
@ -529,6 +537,8 @@ public:
virtual IReGameHookRegistry_ThrowFlashbang *ThrowFlashbang() = 0; virtual IReGameHookRegistry_ThrowFlashbang *ThrowFlashbang() = 0;
virtual IReGameHookRegistry_ThrowSmokeGrenade *ThrowSmokeGrenade() = 0; virtual IReGameHookRegistry_ThrowSmokeGrenade *ThrowSmokeGrenade() = 0;
virtual IReGameHookRegistry_PlantBomb *PlantBomb() = 0; virtual IReGameHookRegistry_PlantBomb *PlantBomb() = 0;
virtual IReGameHookRegistry_CBasePlayer_RemoveSpawnProtection *CBasePlayer_RemoveSpawnProtection() = 0;
virtual IReGameHookRegistry_CBasePlayer_SetSpawnProtection *CBasePlayer_SetSpawnProtection() = 0;
}; };
struct ReGameFuncs_t { struct ReGameFuncs_t {