From a202425dd776873bedac275a6c5ad694f56edd7d Mon Sep 17 00:00:00 2001 From: Sergey Shorokhov Date: Sat, 3 Aug 2024 20:11:08 +0300 Subject: [PATCH] Fix: `ammo`/`weapons` respawn behavior (#982) * `CBasePlayerAmmo`: check spawnflags on `Spawn()` * `CBasePlayerItem`: check spawnflags on `Materialize()` * `CBasePlayerItem`: Add `Respawn()` item when hasn't specific spawnflags * `CBasePlayerItem`: remove `SF_NORESPAWN` flag on `Respawn()` * Use forgotten `AMMO_RESPAWN_TIME` --- regamedll/dlls/ammo.cpp | 6 +++++- regamedll/dlls/multiplay_gamerules.cpp | 2 +- regamedll/dlls/weapons.cpp | 16 ++++++++++++++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/regamedll/dlls/ammo.cpp b/regamedll/dlls/ammo.cpp index bfef8749..1df3622c 100644 --- a/regamedll/dlls/ammo.cpp +++ b/regamedll/dlls/ammo.cpp @@ -10,7 +10,11 @@ void CBasePlayerAmmo::Spawn() SetTouch(&CBasePlayerAmmo::DefaultTouch); - if (g_pGameRules->IsMultiplayer()) + if (g_pGameRules->IsMultiplayer() +#ifdef REGAMEDLL_FIXES + && g_pGameRules->AmmoShouldRespawn(this) == GR_AMMO_RESPAWN_NO +#endif + ) { SetThink(&CBaseEntity::SUB_Remove); pev->nextthink = gpGlobals->time + 2.0f; diff --git a/regamedll/dlls/multiplay_gamerules.cpp b/regamedll/dlls/multiplay_gamerules.cpp index 7caa946b..1ff0a14b 100644 --- a/regamedll/dlls/multiplay_gamerules.cpp +++ b/regamedll/dlls/multiplay_gamerules.cpp @@ -4321,7 +4321,7 @@ int CHalfLifeMultiplay::AmmoShouldRespawn(CBasePlayerAmmo *pAmmo) float CHalfLifeMultiplay::FlAmmoRespawnTime(CBasePlayerAmmo *pAmmo) { - return gpGlobals->time + 20.0f; + return gpGlobals->time + AMMO_RESPAWN_TIME; } Vector CHalfLifeMultiplay::VecAmmoRespawnSpot(CBasePlayerAmmo *pAmmo) diff --git a/regamedll/dlls/weapons.cpp b/regamedll/dlls/weapons.cpp index 454b96f0..9f176541 100644 --- a/regamedll/dlls/weapons.cpp +++ b/regamedll/dlls/weapons.cpp @@ -518,7 +518,11 @@ void CBasePlayerItem::Materialize() UTIL_SetOrigin(pev, pev->origin); SetTouch(&CBasePlayerItem::DefaultTouch); - if (g_pGameRules->IsMultiplayer()) + if (g_pGameRules->IsMultiplayer() +#ifdef REGAMEDLL_FIXES + && g_pGameRules->WeaponShouldRespawn(this) == GR_WEAPON_RESPAWN_NO +#endif + ) { if (!CanDrop()) { @@ -555,8 +559,12 @@ void CBasePlayerItem::CheckRespawn() { switch (g_pGameRules->WeaponShouldRespawn(this)) { - case GR_WEAPON_RESPAWN_YES: + case GR_WEAPON_RESPAWN_YES: { +#ifdef REGAMEDLL_FIXES + Respawn(); +#endif return; + } case GR_WEAPON_RESPAWN_NO: return; } @@ -575,6 +583,10 @@ CBaseEntity *CBasePlayerItem::Respawn() // invisible for now pNewWeapon->pev->effects |= EF_NODRAW; +#ifdef REGAMEDLL_ADD + pNewWeapon->pev->spawnflags &= ~SF_NORESPAWN; +#endif + // no touch pNewWeapon->SetTouch(nullptr); pNewWeapon->SetThink(&CBasePlayerItem::AttemptToMaterialize);