diff --git a/README.md b/README.md
index 24be85bea..ca6a8b472 100644
--- a/README.md
+++ b/README.md
@@ -42,16 +42,17 @@ Archive's bin directory contains 2 subdirectories, 'bugfixed' and 'pure'
| mp_forcerespawn | 0 | 0 | - | Players will automatically respawn when killed.
`0` disabled
`>0.00001` time delay to respawn |
| mp_hostage_hurtable | 1 | 0 | 1 | The hostages can take damage.
`0` disabled
`1` from any team
`2` only from `CT`
`3` only from `T` |
| mp_show_radioicon | 1 | 0 | 1 | Show radio icon.
`0` disabled
`1` enabled |
-| mp_old_bomb_defused_sound | 0 | 0 | 1 | Play "Bomb has been defused" sound instead of "Counter-Terrorists win" when bomb was defused
`0` disabled
`1` enabled |
+| mp_old_bomb_defused_sound | 1 | 0 | 1 | Play "Bomb has been defused" sound instead of "Counter-Terrorists win" when bomb was defused
`0` disabled
`1` enabled |
| showtriggers | 0 | 0 | 1 | Debug cvar shows triggers. |
| sv_alltalk | 0 | 0 | 4 | When players can hear each other ([further explanation](../../wiki/sv_alltalk)).
`0` dead don't hear alive
`1` no restrictions
`2` teammates hear each other
`3` Same as 2, but spectators hear everybody
`4` alive hear alive, dead hear dead and alive.
| bot_deathmatch | 0 | 0 | 1 | Set's the mode for the zBot.
`0` disabled
`1` enable mode Deathmatch and not allow to do the scenario |
| bot_quota_mode | normal | - | - | Determines the type of quota.
`normal` default behaviour
`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_legacy_bombtarget_touch | 1 | 0 | 1 | Legacy func_bomb_target touch. New one is more strict.
`0` New behavior
`1` Legacy behavior|
## How to install zBot for CS 1.6?
* Extract all the files from an [archive](regamedll/extra/zBot/bot_profiles.zip?raw=true)
-* Enter '-bots' option at the command line HLDS
+* Enter `-bots` option at the command line HLDS
## Build instructions
There are several software requirements for building Regamedll_CS:
diff --git a/dist/game.cfg b/dist/game.cfg
index 42c3c966c..769adb43d 100644
--- a/dist/game.cfg
+++ b/dist/game.cfg
@@ -137,8 +137,10 @@ mp_hostage_hurtable 1
mp_show_radioicon 1
// Play "Bomb has been defused" sound instead of "Counter-Terrorists win" when bomb was defused
-// 0 - disabled
-// 1 - enabled (default hehavior)
+// 0 - disabled (default behavior)
+// 1 - enabled
+//
+// Default value: "1"
mp_old_bomb_defused_sound 1
// Set's the mode for the zBot
@@ -177,3 +179,10 @@ sv_alltalk 0
//
// Default value: "300"
mp_item_staytime 300
+
+// Legacy func_bomb_target touch. New one is more strict.
+// 0 - New behavior
+// 1 - Legacy behavior
+//
+// Default value: "1"
+mp_legacy_bombtarget_touch "1"
diff --git a/regamedll/dlls/game.cpp b/regamedll/dlls/game.cpp
index 66697a402..0260905ec 100644
--- a/regamedll/dlls/game.cpp
+++ b/regamedll/dlls/game.cpp
@@ -109,13 +109,13 @@ cvar_t fraglimit = { "mp_fraglimit", "0", FCVAR_SERVER, 0.0f, nullpt
cvar_t round_restart_delay = { "mp_round_restart_delay", "5", FCVAR_SERVER, 0.0f, nullptr };
cvar_t showtriggers = { "showtriggers", "0", 0, 0.0f, nullptr }; // debug cvar shows triggers
// TODO: Maybe it's better to register in the engine?
-
-cvar_t hostagehurtable = { "mp_hostage_hurtable", "1", FCVAR_SERVER, 0.0f, nullptr };
-cvar_t roundover = { "mp_roundover", "0", FCVAR_SERVER, 0.0f, nullptr };
-cvar_t forcerespawn = { "mp_forcerespawn", "0", FCVAR_SERVER, 0.0f, nullptr };
-cvar_t show_radioicon = { "mp_show_radioicon", "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 hostagehurtable = { "mp_hostage_hurtable", "1", FCVAR_SERVER, 1.0f, nullptr };
+cvar_t roundover = { "mp_roundover", "0", FCVAR_SERVER, 0.0f, nullptr };
+cvar_t forcerespawn = { "mp_forcerespawn", "0", FCVAR_SERVER, 0.0f, nullptr };
+cvar_t show_radioicon = { "mp_show_radioicon", "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 legacy_bombtarget_touch = { "mp_legacy_bombtarget_touch", "1", FCVAR_SERVER, 1.0f, nullptr };
void GameDLL_Version_f()
{
@@ -269,6 +269,7 @@ void EXT_FUNC GameDLLInit()
CVAR_REGISTER(&show_radioicon);
CVAR_REGISTER(&old_bomb_defused_sound);
CVAR_REGISTER(&item_staytime);
+ CVAR_REGISTER(&legacy_bombtarget_touch);
// print version
CONSOLE_ECHO("ReGameDLL version: " APP_VERSION "\n");
diff --git a/regamedll/dlls/game.h b/regamedll/dlls/game.h
index 69492207e..f8e45aa09 100644
--- a/regamedll/dlls/game.h
+++ b/regamedll/dlls/game.h
@@ -152,6 +152,7 @@ extern cvar_t forcerespawn;
extern cvar_t show_radioicon;
extern cvar_t old_bomb_defused_sound;
extern cvar_t item_staytime;
+extern cvar_t legacy_bombtarget_touch;
#endif
diff --git a/regamedll/dlls/triggers.cpp b/regamedll/dlls/triggers.cpp
index af5774761..1ab8f340f 100644
--- a/regamedll/dlls/triggers.cpp
+++ b/regamedll/dlls/triggers.cpp
@@ -1833,6 +1833,28 @@ void CBombTarget::Spawn()
SetUse(&CBombTarget::BombTargetUse);
}
+bool CBombTarget::IsPlayerInBombSite(CBasePlayer *pPlayer)
+{
+ // Player should at least intersect with func_bomb_target.
+ if (!Intersects(pPlayer->pev->origin, pPlayer->pev->origin))
+ return false;
+
+ const Vector &absmin = pPlayer->pev->absmin;
+ const Vector &absmax = pPlayer->pev->absmax;
+
+ // Ensure that player's body is inside func_bomb_target's X,Y axes.
+ if (pev->absmin.x > absmin.x || pev->absmin.y > absmin.y)
+ {
+ return false;
+ }
+ if (pev->absmax.x < absmax.x || pev->absmax.y < absmax.y)
+ {
+ return false;
+ }
+
+ return true;
+}
+
void CBombTarget::BombTargetTouch(CBaseEntity *pOther)
{
if (!pOther->IsPlayer())
@@ -1840,7 +1862,11 @@ void CBombTarget::BombTargetTouch(CBaseEntity *pOther)
CBasePlayer *pPlayer = static_cast(pOther);
- if (pPlayer->m_bHasC4)
+ if (pPlayer->m_bHasC4
+#ifdef REGAMEDLL_FIXES
+ && (legacy_bombtarget_touch.value || IsPlayerInBombSite(pPlayer))
+#endif
+ )
{
pPlayer->m_signals.Signal(SIGNAL_BOMB);
pPlayer->m_pentCurBombTarget = ENT(pev);
diff --git a/regamedll/dlls/triggers.h b/regamedll/dlls/triggers.h
index cf8ca0b19..86f85aa1a 100644
--- a/regamedll/dlls/triggers.h
+++ b/regamedll/dlls/triggers.h
@@ -406,10 +406,10 @@ class CBuyZone: public CBaseTrigger
class CBombTarget: public CBaseTrigger
{
+private:
+ bool IsPlayerInBombSite(CBasePlayer *pPlayer);
public:
virtual void Spawn();
-
-public:
void EXPORT BombTargetTouch(CBaseEntity *pOther);
void EXPORT BombTargetUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value);
};