From 03c56bf23e49c612b3552eac961bdcc11fdb644c Mon Sep 17 00:00:00 2001 From: wrexbe <81056464+wrexbe@users.noreply.github.com> Date: Sun, 9 Jan 2022 20:07:40 -0800 Subject: [PATCH] Refactored RoundEndSystem (#5990) * No RestartRound if round id changed * Refactored RoundEndSystem --- .../CommunicationsConsoleComponent.cs | 12 +- .../Commands/RestartRoundCommand.cs | 5 +- Content.Server/RoundEnd/RoundEndSystem.cs | 133 +++++++++--------- 3 files changed, 69 insertions(+), 81 deletions(-) diff --git a/Content.Server/Communications/CommunicationsConsoleComponent.cs b/Content.Server/Communications/CommunicationsConsoleComponent.cs index 7d8b826bcb..8a0104ea32 100644 --- a/Content.Server/Communications/CommunicationsConsoleComponent.cs +++ b/Content.Server/Communications/CommunicationsConsoleComponent.cs @@ -17,11 +17,12 @@ using Timer = Robust.Shared.Timing.Timer; namespace Content.Server.Communications { [RegisterComponent] - public class CommunicationsConsoleComponent : SharedCommunicationsConsoleComponent + public class CommunicationsConsoleComponent : SharedCommunicationsConsoleComponent, IEntityEventSubscriber { [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IChatManager _chatManager = default!; [Dependency] private readonly IEntityManager _entities = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; private bool Powered => !_entities.TryGetComponent(Owner, out ApcPowerReceiverComponent? receiver) || receiver.Powered; @@ -42,10 +43,7 @@ namespace Content.Server.Communications UserInterface.OnReceiveMessage += UserInterfaceOnOnReceiveMessage; } - RoundEndSystem.OnRoundEndCountdownStarted += UpdateBoundInterface; - RoundEndSystem.OnRoundEndCountdownCancelled += UpdateBoundInterface; - RoundEndSystem.OnRoundEndCountdownFinished += UpdateBoundInterface; - RoundEndSystem.OnCallCooldownEnded += UpdateBoundInterface; + _entityManager.EventBus.SubscribeEvent(EventSource.Local, this, (s) => UpdateBoundInterface()); } protected override void Startup() @@ -76,9 +74,7 @@ namespace Content.Server.Communications protected override void OnRemove() { - RoundEndSystem.OnRoundEndCountdownStarted -= UpdateBoundInterface; - RoundEndSystem.OnRoundEndCountdownCancelled -= UpdateBoundInterface; - RoundEndSystem.OnRoundEndCountdownFinished -= UpdateBoundInterface; + _entityManager.EventBus.UnsubscribeEvent(EventSource.Local, this); base.OnRemove(); } diff --git a/Content.Server/GameTicking/Commands/RestartRoundCommand.cs b/Content.Server/GameTicking/Commands/RestartRoundCommand.cs index 63a6610b26..4341c0ed07 100644 --- a/Content.Server/GameTicking/Commands/RestartRoundCommand.cs +++ b/Content.Server/GameTicking/Commands/RestartRoundCommand.cs @@ -1,10 +1,9 @@ -using System; +using System; using Content.Server.Administration; using Content.Server.RoundEnd; using Content.Shared.Administration; using Robust.Shared.Console; using Robust.Shared.GameObjects; -using Robust.Shared.IoC; namespace Content.Server.GameTicking.Commands { @@ -13,7 +12,7 @@ namespace Content.Server.GameTicking.Commands { public string Command => "restartround"; public string Description => "Ends the current round and starts the countdown for the next lobby."; - public string Help => String.Empty; + public string Help => string.Empty; public void Execute(IConsoleShell shell, string argStr, string[] args) { diff --git a/Content.Server/RoundEnd/RoundEndSystem.cs b/Content.Server/RoundEnd/RoundEndSystem.cs index 51237af694..60fa7cf012 100644 --- a/Content.Server/RoundEnd/RoundEndSystem.cs +++ b/Content.Server/RoundEnd/RoundEndSystem.cs @@ -19,79 +19,60 @@ namespace Content.Server.RoundEnd { [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IChatManager _chatManager = default!; + [Dependency] private readonly GameTicker _gameTicker = default!; [Dependency] private readonly AdminLogSystem _adminLog = default!; - public const float RestartRoundTime = 20f; - private CancellationTokenSource _roundEndCancellationTokenSource = new(); - private CancellationTokenSource _callCooldownEndedTokenSource = new(); - public bool IsRoundEndCountdownStarted { get; private set; } - public TimeSpan RoundEndCountdownTime { get; set; } = TimeSpan.FromMinutes(4); - public TimeSpan? ExpectedCountdownEnd = null; + private readonly TimeSpan _cooldownDuration = TimeSpan.FromSeconds(30); + private readonly TimeSpan _countdownDuration = TimeSpan.FromMinutes(4); + private readonly TimeSpan _restartRoundDuration = TimeSpan.FromSeconds(20); - public TimeSpan LastCallTime { get; private set; } - - public TimeSpan CallCooldown { get; } = TimeSpan.FromSeconds(30); - - // TODO: Make these regular eventbus events... - public delegate void RoundEndCountdownStarted(); - public event RoundEndCountdownStarted? OnRoundEndCountdownStarted; - - public delegate void RoundEndCountdownCancelled(); - public event RoundEndCountdownCancelled? OnRoundEndCountdownCancelled; - - public delegate void RoundEndCountdownFinished(); - public event RoundEndCountdownFinished? OnRoundEndCountdownFinished; - - public delegate void CallCooldownEnded(); - public event CallCooldownEnded? OnCallCooldownEnded; + private CancellationTokenSource? _countdownTokenSource = null; + private CancellationTokenSource? _cooldownTokenSource = null; + public TimeSpan? ExpectedCountdownEnd { get; set; } = null; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(Reset); } - void Reset(RoundRestartCleanupEvent ev) + private void Reset(RoundRestartCleanupEvent ev) { - IsRoundEndCountdownStarted = false; - _roundEndCancellationTokenSource.Cancel(); - _roundEndCancellationTokenSource = new CancellationTokenSource(); - _callCooldownEndedTokenSource.Cancel(); - _callCooldownEndedTokenSource = new CancellationTokenSource(); + if (_countdownTokenSource != null) + { + _countdownTokenSource.Cancel(); + _countdownTokenSource = null; + } + + if (_cooldownTokenSource != null) + { + _cooldownTokenSource.Cancel(); + _cooldownTokenSource = null; + } + ExpectedCountdownEnd = null; - LastCallTime = default; } public bool CanCall() { - return _gameTiming.CurTime >= LastCallTime + CallCooldown; - } - - private void ActivateCooldown() - { - _callCooldownEndedTokenSource.Cancel(); - _callCooldownEndedTokenSource = new CancellationTokenSource(); - LastCallTime = _gameTiming.CurTime; - Timer.Spawn(CallCooldown, () => OnCallCooldownEnded?.Invoke(), _callCooldownEndedTokenSource.Token); + return _cooldownTokenSource == null; } public void RequestRoundEnd(EntityUid? requester = null, bool checkCooldown = true) { - RequestRoundEnd(RoundEndCountdownTime, requester, checkCooldown); + RequestRoundEnd(_countdownDuration, requester, checkCooldown); } public void RequestRoundEnd(TimeSpan countdownTime, EntityUid? requester = null, bool checkCooldown = true) { - if (IsRoundEndCountdownStarted) - return; + if (_gameTicker.RunLevel != GameRunLevel.InRound) return; - if (checkCooldown && !CanCall()) - { - return; - } + if (checkCooldown && _cooldownTokenSource != null) return; + + if (_countdownTokenSource != null) return; + _countdownTokenSource = new(); if (requester != null) { @@ -102,29 +83,25 @@ namespace Content.Server.RoundEnd _adminLog.Add(LogType.ShuttleCalled, LogImpact.High, $"Shuttle called"); } - IsRoundEndCountdownStarted = true; - _chatManager.DispatchStationAnnouncement(Loc.GetString("round-end-system-shuttle-called-announcement",("minutes", countdownTime.Minutes)), Loc.GetString("Station"), false); SoundSystem.Play(Filter.Broadcast(), "/Audio/Announcements/shuttlecalled.ogg"); ExpectedCountdownEnd = _gameTiming.CurTime + countdownTime; - Timer.Spawn(countdownTime, EndRound, _roundEndCancellationTokenSource.Token); + Timer.Spawn(countdownTime, EndRound, _countdownTokenSource.Token); ActivateCooldown(); - - OnRoundEndCountdownStarted?.Invoke(); + RaiseLocalEvent(RoundEndSystemChangedEvent.Default); } public void CancelRoundEndCountdown(EntityUid? requester = null, bool checkCooldown = true) { - if (!IsRoundEndCountdownStarted) - return; + if (_gameTicker.RunLevel != GameRunLevel.InRound) return; + if (checkCooldown && _cooldownTokenSource != null) return; - if (checkCooldown && !CanCall()) - { - return; - } + if (_countdownTokenSource == null) return; + _countdownTokenSource.Cancel(); + _countdownTokenSource = null; if (requester != null) { @@ -135,31 +112,47 @@ namespace Content.Server.RoundEnd _adminLog.Add(LogType.ShuttleRecalled, LogImpact.High, $"Shuttle recalled"); } - IsRoundEndCountdownStarted = false; - _chatManager.DispatchStationAnnouncement(Loc.GetString("round-end-system-shuttle-recalled-announcement"), Loc.GetString("Station"), false); SoundSystem.Play(Filter.Broadcast(), "/Audio/Announcements/shuttlerecalled.ogg"); - _roundEndCancellationTokenSource.Cancel(); - _roundEndCancellationTokenSource = new CancellationTokenSource(); - ExpectedCountdownEnd = null; - ActivateCooldown(); - - OnRoundEndCountdownCancelled?.Invoke(); + RaiseLocalEvent(RoundEndSystemChangedEvent.Default); } public void EndRound() { - OnRoundEndCountdownFinished?.Invoke(); - var gameTicker = Get(); - gameTicker.EndRound(); + if (_gameTicker.RunLevel != GameRunLevel.InRound) return; + RaiseLocalEvent(RoundEndSystemChangedEvent.Default); + _gameTicker.EndRound(); + _countdownTokenSource?.Cancel(); + _countdownTokenSource = new(); + _chatManager.DispatchServerAnnouncement(Loc.GetString("round-end-system-round-restart-eta-announcement", ("seconds", _restartRoundDuration.Seconds))); + Timer.Spawn(_restartRoundDuration, AfterEndRoundRestart, _countdownTokenSource.Token); + } - _chatManager.DispatchServerAnnouncement(Loc.GetString("round-end-system-round-restart-eta-announcement", ("seconds", RestartRoundTime))); + private void AfterEndRoundRestart() + { + if (_gameTicker.RunLevel != GameRunLevel.InRound) return; + _gameTicker.RestartRound(); + } - Timer.Spawn(TimeSpan.FromSeconds(RestartRoundTime), () => gameTicker.RestartRound(), CancellationToken.None); + private void ActivateCooldown() + { + _cooldownTokenSource?.Cancel(); + _cooldownTokenSource = new(); + Timer.Spawn(_cooldownDuration, () => + { + _cooldownTokenSource.Cancel(); + _cooldownTokenSource = null; + RaiseLocalEvent(RoundEndSystemChangedEvent.Default); + }, _cooldownTokenSource.Token); } } + + public class RoundEndSystemChangedEvent : EntityEventArgs + { + public static RoundEndSystemChangedEvent Default { get; } = new(); + } }