From 06a3e6bc6b994cac389e083315b731c0b0e2a824 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Wed, 1 Mar 2023 16:13:52 -0800 Subject: [PATCH] func_escapezone: make it work again. can't find solid info on the rewards so I may have to revisit it anyway for rebalancing issues --- src/server/func_escapezone.qc | 43 +++++++++++++++++++++++++++-- src/server/gamerules.h | 2 ++ src/server/gamerules_multiplayer.qc | 1 + 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/server/func_escapezone.qc b/src/server/func_escapezone.qc index 1245401..5053d8d 100644 --- a/src/server/func_escapezone.qc +++ b/src/server/func_escapezone.qc @@ -29,9 +29,10 @@ Used in the Escape mode (es_* maps). class func_escapezone:NSBrushTrigger { - void(void) func_escapezone; + void func_escapezone(void); - virtual void(void) Respawn; + virtual void Respawn(void); + virtual void Touch(entity); }; void @@ -45,3 +46,41 @@ func_escapezone::Respawn(void) { InitBrushTrigger(); } + + +void +func_escapezone::Touch(entity eToucher) +{ + CSMultiplayerRules rule = (CSMultiplayerRules)g_grMode; + int to_escape = g_cs_total_t; + + /* only 3 Ts need to escape, max */ + if (to_escape > 3) + to_escape = 3; + + player pl = (player)eToucher; + + /* don't matter when rules are not active */ + if (g_cs_gamestate != GAME_ACTIVE) + return; + + /* disallow the wrong players */ + if (pl.classname != "player") + return; + if (pl.team != TEAM_T) + return; + + rule.m_iEscapedTerrorists++; + + /* mark player as spectator for the end of this 'round' */ + pl.MakeTempSpectator(); + + /* threshold has been met to trigger the end of the round */ + if (rule.m_iEscapedTerrorists >= to_escape) { + /* reset */ + rule.m_iEscapedTerrorists = 0; + + /* Ts win the round */ + rule.RoundOver(TEAM_T, 3600, FALSE); + } +} diff --git a/src/server/gamerules.h b/src/server/gamerules.h index ed57c99..58cbb85 100644 --- a/src/server/gamerules.h +++ b/src/server/gamerules.h @@ -45,6 +45,8 @@ class CSMultiplayerRules:CSGameRules entity m_eLastTSpawn; entity m_eLastCTSpawn; + int m_iEscapedTerrorists; + void() CSMultiplayerRules; virtual void(void) InitPostEnts; diff --git a/src/server/gamerules_multiplayer.qc b/src/server/gamerules_multiplayer.qc index 681e769..11c7eab 100644 --- a/src/server/gamerules_multiplayer.qc +++ b/src/server/gamerules_multiplayer.qc @@ -1028,6 +1028,7 @@ CSMultiplayerRules::CSMultiplayerRules(void) forceinfokey(world, "teamscore_1", "0"); forceinfokey(world, "team_2", "Counter-Terrorist"); forceinfokey(world, "teamscore_2", "0"); + m_iEscapedTerrorists = 0; } /*