diff --git a/README.md b/README.md
index c1b005ebd..6a41158c8 100644
--- a/README.md
+++ b/README.md
@@ -117,6 +117,9 @@ This means that plugins that do binary code analysis (Orpheu for example) probab
| mp_freezetime_jump | 1 | 0 | 1 | Allow players to jump during freezetime.
`0` disabled
`1` enabled |
| mp_defuser_allocation | 0 | 0 | 2 | Give defuser on player spawn.
`0` disabled
`1` Random players.
`2` All players. |
| mp_location_area_info | 0 | 0 | 3 | Enable location area info.
`0` disabled
`1` show location below HUD radar.
`2` show location in HUD chat. `NOT RECOMMENDED!` [:speech_balloon:](## "Not all client builds are compatible")
`3` both displayed. `NOT RECOMMENDED!` [:speech_balloon:](## "Not all client builds are compatible")
`NOTE`: Navigation `maps/.nav` file required and should contain place names
`NOTE`: If option `2` or `3` is enabled, be sure to enable `mp_chat_loc_fallback 1` |
+| mp_item_respawn_time | 30 | 0.0 | - | The respawn time for items (such as health packs, armor, etc.). |
+| mp_weapon_respawn_time | 20 | 0.0 | - | The respawn time for weapons. |
+| mp_ammo_respawn_time | 20 | 0.0 | - | The respawn time for ammunition. |
| mp_scoreboard_fix | 0 | 0 | 1 | Enable ReGameDLL scoreboard bug fix(Dead players could see the bomb or defuse kit).
`0` disabled
`1` enabled
`NOTE`: Absolutely cannot fix it in "CNCS😂" |
diff --git a/dist/game.cfg b/dist/game.cfg
index ed7d5a3c2..fbe2c0707 100644
--- a/dist/game.cfg
+++ b/dist/game.cfg
@@ -589,6 +589,24 @@ mp_defuser_allocation "0"
// Default value: "0"
mp_location_area_info "0"
+// The respawn time for items (such as health packs, armor, etc.).
+// 0 - disable delay
+//
+// Default value: "30"
+mp_item_respawn_time "30"
+
+// The respawn time for weapons.
+// 0 - disable delay
+//
+// Default value: "20"
+mp_weapon_respawn_time "20"
+
+// The respawn time for ammunition.
+// 0 - disable delay
+//
+// Default value: "20"
+mp_ammo_respawn_time "20"
+
// Enable ReGameDLL scoreboard bug fix(Dead players could see the bomb or defuse kit)
// 0 - disable
// 1 - enabled
diff --git a/regamedll/dlls/ammo.cpp b/regamedll/dlls/ammo.cpp
index bfef8749e..1df3622cc 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/game.cpp b/regamedll/dlls/game.cpp
index 6d09e3bc2..7441288fb 100644
--- a/regamedll/dlls/game.cpp
+++ b/regamedll/dlls/game.cpp
@@ -181,6 +181,10 @@ cvar_t defuser_allocation = { "mp_defuser_allocation", "0", 0, 0.0f, nullpt
cvar_t location_area_info = { "mp_location_area_info", "0", 0, 0.0f, nullptr };
cvar_t chat_loc_fallback = { "mp_chat_loc_fallback", "1", 1, 0.0f, nullptr };
+cvar_t item_respawn_time = { "mp_item_respawn_time", "30", FCVAR_SERVER, 30.0f, nullptr };
+cvar_t weapon_respawn_time = { "mp_weapon_respawn_time", "20", FCVAR_SERVER, 20.0f, nullptr };
+cvar_t ammo_respawn_time = { "mp_ammo_respawn_time", "20", FCVAR_SERVER, 20.0f, nullptr };
+
cvar_t scoreboard_fix = { "mp_scoreboard_fix", "0", FCVAR_SERVER, 0.0f, nullptr };
void GameDLL_Version_f()
@@ -448,6 +452,10 @@ void EXT_FUNC GameDLLInit()
CVAR_REGISTER(&location_area_info);
CVAR_REGISTER(&chat_loc_fallback);
+ CVAR_REGISTER(&item_respawn_time);
+ CVAR_REGISTER(&weapon_respawn_time);
+ CVAR_REGISTER(&ammo_respawn_time);
+
CVAR_REGISTER(&scoreboard_fix);
// print version
diff --git a/regamedll/dlls/game.h b/regamedll/dlls/game.h
index 92d8eb1db..843f12fd6 100644
--- a/regamedll/dlls/game.h
+++ b/regamedll/dlls/game.h
@@ -204,6 +204,10 @@ extern cvar_t defuser_allocation;
extern cvar_t location_area_info;
extern cvar_t chat_loc_fallback;
+extern cvar_t item_respawn_time;
+extern cvar_t weapon_respawn_time;
+extern cvar_t ammo_respawn_time;
+
extern cvar_t scoreboard_fix;
#endif
diff --git a/regamedll/dlls/multiplay_gamerules.cpp b/regamedll/dlls/multiplay_gamerules.cpp
index 7caa946b8..e1b8a7e4e 100644
--- a/regamedll/dlls/multiplay_gamerules.cpp
+++ b/regamedll/dlls/multiplay_gamerules.cpp
@@ -4221,7 +4221,11 @@ void EXT_FUNC CHalfLifeMultiplay::__API_HOOK(PlayerGotWeapon)(CBasePlayer *pPlay
// What is the time in the future at which this weapon may spawn?
float CHalfLifeMultiplay::FlWeaponRespawnTime(CBasePlayerItem *pWeapon)
{
+#ifdef REGAMEDLL_ADD
+ return gpGlobals->time + weapon_respawn_time.value;
+#else
return gpGlobals->time + WEAPON_RESPAWN_TIME;
+#endif
}
// Returns 0 if the weapon can respawn now,
@@ -4289,7 +4293,11 @@ int CHalfLifeMultiplay::ItemShouldRespawn(CItem *pItem)
// At what time in the future may this Item respawn?
float CHalfLifeMultiplay::FlItemRespawnTime(CItem *pItem)
{
+#ifdef REGAMEDLL_ADD;
+ return gpGlobals->time + item_respawn_time.value;
+#else
return gpGlobals->time + ITEM_RESPAWN_TIME;
+#endif
}
// Where should this item respawn?
@@ -4321,7 +4329,11 @@ int CHalfLifeMultiplay::AmmoShouldRespawn(CBasePlayerAmmo *pAmmo)
float CHalfLifeMultiplay::FlAmmoRespawnTime(CBasePlayerAmmo *pAmmo)
{
- return gpGlobals->time + 20.0f;
+#ifdef REGAMEDLL_ADD
+ return gpGlobals->time + ammo_respawn_time.value;
+#else
+ return gpGlobals->time + AMMO_RESPAWN_TIME;
+#endif
}
Vector CHalfLifeMultiplay::VecAmmoRespawnSpot(CBasePlayerAmmo *pAmmo)
diff --git a/regamedll/dlls/weapons.cpp b/regamedll/dlls/weapons.cpp
index 454b96f04..9f1765418 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);