From cc61f49de31282155704950138a2d7521780520c Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Thu, 3 Dec 2020 01:49:22 +0100 Subject: [PATCH] Add time limit to SSS (#2682) --- .../GameTicking/GameRules/RuleSuspicion.cs | 53 ++++++++++++++++--- Content.Shared/CCVars.cs | 3 ++ 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/Content.Server/GameTicking/GameRules/RuleSuspicion.cs b/Content.Server/GameTicking/GameRules/RuleSuspicion.cs index 20b28c1066..32f185162c 100644 --- a/Content.Server/GameTicking/GameRules/RuleSuspicion.cs +++ b/Content.Server/GameTicking/GameRules/RuleSuspicion.cs @@ -34,9 +34,15 @@ namespace Content.Server.GameTicking.GameRules [Dependency] private readonly IConfigurationManager _cfg = default!; private readonly CancellationTokenSource _checkTimerCancel = new(); + private CancellationTokenSource _maxTimerCancel = new(); + + public TimeSpan RoundMaxTime { get; set; } = TimeSpan.FromSeconds(CCVars.SuspicionMaxTimeSeconds.DefaultValue); + public TimeSpan RoundEndDelay { get; set; } = TimeSpan.FromSeconds(10); public override void Added() { + RoundMaxTime = TimeSpan.FromSeconds(_cfg.GetCVar(CCVars.SuspicionMaxTimeSeconds)); + _chatManager.DispatchServerAnnouncement(Loc.GetString("There are traitors on the station! Find them, and kill them!")); bool Predicate(IPlayerSession session) => session.ContentData()?.Mind?.HasRole() ?? false; @@ -45,19 +51,56 @@ namespace Content.Server.GameTicking.GameRules EntitySystem.Get().AccessType = DoorSystem.AccessTypes.AllowAllNoExternal; - Timer.SpawnRepeating(DeadCheckDelay, _checkWinConditions, _checkTimerCancel.Token); + Timer.SpawnRepeating(DeadCheckDelay, CheckWinConditions, _checkTimerCancel.Token); + + _gameTicker.OnRunLevelChanged += RunLevelChanged; } public override void Removed() { base.Removed(); + _gameTicker.OnRunLevelChanged -= RunLevelChanged; + EntitySystem.Get().AccessType = DoorSystem.AccessTypes.Id; _checkTimerCancel.Cancel(); } - private void _checkWinConditions() + public void RestartTimer() + { + _maxTimerCancel.Cancel(); + _maxTimerCancel = new CancellationTokenSource(); + Timer.Spawn(RoundMaxTime, TimerFired, _maxTimerCancel.Token); + } + + public void StopTimer() + { + _maxTimerCancel.Cancel(); + } + + private void TimerFired() + { + _chatManager.DispatchServerAnnouncement(Loc.GetString("Time has run out for the traitors!")); + + EndRound(Victory.Innocents); + } + + private void RunLevelChanged(GameRunLevelChangedEventArgs args) + { + switch (args.NewRunLevel) + { + case GameRunLevel.InRound: + RestartTimer(); + break; + case GameRunLevel.PreRoundLobby: + case GameRunLevel.PostRound: + StopTimer(); + break; + } + } + + private void CheckWinConditions() { if (!_cfg.GetCVar(CCVars.GameLobbyEnableWin)) return; @@ -131,12 +174,10 @@ namespace Content.Server.GameTicking.GameRules _gameTicker.EndRound(text); - var restartDelay = 10; - - _chatManager.DispatchServerAnnouncement(Loc.GetString("Restarting in {0} seconds.", restartDelay)); + _chatManager.DispatchServerAnnouncement(Loc.GetString("Restarting in {0} seconds.", (int) RoundEndDelay.TotalSeconds)); _checkTimerCancel.Cancel(); - Timer.Spawn(TimeSpan.FromSeconds(restartDelay), () => _gameTicker.RestartRound()); + Timer.Spawn(RoundEndDelay, () => _gameTicker.RestartRound()); } } } diff --git a/Content.Shared/CCVars.cs b/Content.Shared/CCVars.cs index 8b82290561..5aea88aab2 100644 --- a/Content.Shared/CCVars.cs +++ b/Content.Shared/CCVars.cs @@ -74,6 +74,9 @@ namespace Content.Shared public static readonly CVarDef SuspicionStartingBalance = CVarDef.Create("suspicion.starting_balance", 20); + public static readonly CVarDef SuspicionMaxTimeSeconds = + CVarDef.Create("suspicion.max_time_seconds", 300); + /* * Traitor */