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); };