diff --git a/Content.Client/GameObjects/EntitySystems/AtmosDebugOverlaySystem.cs b/Content.Client/GameObjects/EntitySystems/AtmosDebugOverlaySystem.cs index 2a0895d1e1..5ba8c401d5 100644 --- a/Content.Client/GameObjects/EntitySystems/AtmosDebugOverlaySystem.cs +++ b/Content.Client/GameObjects/EntitySystems/AtmosDebugOverlaySystem.cs @@ -1,21 +1,14 @@ #nullable enable -using System; using System.Collections.Generic; using Content.Client.Atmos; -using Content.Shared.Atmos; using Content.Shared.GameObjects.EntitySystems.Atmos; using Content.Shared.GameTicking; using JetBrains.Annotations; -using Robust.Client.Graphics; using Robust.Client.Interfaces.Graphics.Overlays; -using Robust.Client.Interfaces.ResourceManagement; -using Robust.Client.ResourceManagement; -using Robust.Client.Utility; using Robust.Shared.Interfaces.Map; using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Maths; -using Robust.Shared.Utility; namespace Content.Client.GameObjects.EntitySystems { @@ -24,18 +17,17 @@ namespace Content.Client.GameObjects.EntitySystems { [Dependency] private readonly IMapManager _mapManager = default!; - private Dictionary _tileData = + private readonly Dictionary _tileData = new Dictionary(); - private AtmosphereSystem _atmosphereSystem = default!; - public override void Initialize() { base.Initialize(); - SubscribeNetworkEvent(HandleAtmosDebugOverlayMessage); - _mapManager.OnGridRemoved += OnGridRemoved; - _atmosphereSystem = Get(); + SubscribeNetworkEvent(HandleAtmosDebugOverlayMessage); + SubscribeNetworkEvent(HandleAtmosDebugOverlayDisableMessage); + + _mapManager.OnGridRemoved += OnGridRemoved; var overlayManager = IoCManager.Resolve(); if(!overlayManager.HasOverlay(nameof(AtmosDebugOverlay))) @@ -47,6 +39,11 @@ namespace Content.Client.GameObjects.EntitySystems _tileData[message.GridId] = message; } + private void HandleAtmosDebugOverlayDisableMessage(AtmosDebugOverlayDisableMessage ev) + { + _tileData.Clear(); + } + public override void Shutdown() { base.Shutdown(); diff --git a/Content.Server/Atmos/AtmosCommands.cs b/Content.Server/Atmos/AtmosCommands.cs index ed4bf567bb..19b3151f4a 100644 --- a/Content.Server/Atmos/AtmosCommands.cs +++ b/Content.Server/Atmos/AtmosCommands.cs @@ -639,22 +639,23 @@ namespace Content.Server.Atmos public class ShowAtmos : IClientCommand { public string Command => "showatmos"; - public string Description => "Toggles seeing atmos debug overlay"; + public string Description => "Toggles seeing atmos debug overlay."; public string Help => $"Usage: {Command}"; public void Execute(IConsoleShell shell, IPlayerSession? player, string[] args) { - if (player == null) return; + if (player == null) + { + shell.SendText(player, "You must be a player to use this command."); + return; + } + var atmosDebug = EntitySystem.Get(); - if (atmosDebug.PlayerObservers.Contains(player)) - { - atmosDebug.PlayerObservers.Remove(player); - shell.SendText(player, $"Ok, disabled"); - } - else - { - atmosDebug.PlayerObservers.Add(player); - shell.SendText(player, $"Ok, enabled"); - } + var enabled = atmosDebug.ToggleObserver(player); + + shell.SendText(player, enabled + ? "Enabled the atmospherics debug overlay." + : "Disabled the atmospherics debug overlay."); } - }} + } +} diff --git a/Content.Server/GameObjects/EntitySystems/Atmos/AtmosDebugOverlaySystem.cs b/Content.Server/GameObjects/EntitySystems/Atmos/AtmosDebugOverlaySystem.cs index e40ce9ce3a..eaf42d4122 100644 --- a/Content.Server/GameObjects/EntitySystems/Atmos/AtmosDebugOverlaySystem.cs +++ b/Content.Server/GameObjects/EntitySystems/Atmos/AtmosDebugOverlaySystem.cs @@ -1,7 +1,5 @@ #nullable enable -using System; using System.Collections.Generic; -using System.Runtime.CompilerServices; using Content.Server.GameObjects.Components.Atmos; using Content.Server.Atmos; using Content.Shared; @@ -12,41 +10,36 @@ using Robust.Server.Interfaces.Player; using Robust.Server.Player; using Robust.Shared.Enums; using Robust.Shared.Interfaces.Configuration; -using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Map; using Robust.Shared.Interfaces.Timing; -using Robust.Shared.Map; +using Robust.Shared.IoC; using Robust.Shared.Maths; -using Robust.Shared.Timing; namespace Content.Server.GameObjects.EntitySystems.Atmos { [UsedImplicitly] public sealed class AtmosDebugOverlaySystem : SharedAtmosDebugOverlaySystem { - [Robust.Shared.IoC.Dependency] private readonly IGameTiming _gameTiming = default!; - [Robust.Shared.IoC.Dependency] private readonly IPlayerManager _playerManager = default!; - [Robust.Shared.IoC.Dependency] private readonly IEntityManager _entityManager = default!; - [Robust.Shared.IoC.Dependency] private readonly IMapManager _mapManager = default!; - [Robust.Shared.IoC.Dependency] private readonly IConfigurationManager _configManager = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] private readonly IMapManager _mapManager = default!; + [Dependency] private readonly IConfigurationManager _configManager = default!; /// - /// Players allowed to see the atmos debug overlay + /// Players allowed to see the atmos debug overlay. + /// To modify it see and + /// . /// - public HashSet PlayerObservers = new HashSet(); + private readonly HashSet _playerObservers = new HashSet(); /// /// Overlay update ticks per second. /// private float _updateCooldown; - private AtmosphereSystem _atmosphereSystem = default!; - public override void Initialize() { base.Initialize(); - - _atmosphereSystem = Get(); _playerManager.PlayerStatusChanged += OnPlayerStatusChanged; } @@ -56,16 +49,53 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos _playerManager.PlayerStatusChanged -= OnPlayerStatusChanged; } + public bool AddObserver(IPlayerSession observer) + { + return _playerObservers.Add(observer); + } + + public bool HasObserver(IPlayerSession observer) + { + return _playerObservers.Contains(observer); + } + + public bool RemoveObserver(IPlayerSession observer) + { + if (!_playerObservers.Remove(observer)) + { + return false; + } + + var message = new AtmosDebugOverlayDisableMessage(); + RaiseNetworkEvent(message, observer.ConnectedClient); + + return true; + } + + /// + /// Adds the given observer if it doesn't exist, removes it otherwise. + /// + /// The observer to toggle. + /// true if added, false if removed. + public bool ToggleObserver(IPlayerSession observer) + { + if (HasObserver(observer)) + { + RemoveObserver(observer); + return false; + } + else + { + AddObserver(observer); + return true; + } + } + private void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e) { if (e.NewStatus != SessionStatus.InGame) { - if (PlayerObservers.Contains(e.Session)) - { - PlayerObservers.Remove(e.Session); - } - - return; + RemoveObserver(e.Session); } } @@ -104,7 +134,7 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos // Now we'll go through each player, then through each chunk in range of that player checking if the player is still in range // If they are, check if they need the new data to send (i.e. if there's an overlay for the gas). // Afterwards we reset all the chunk data for the next time we tick. - foreach (var session in PlayerObservers) + foreach (var session in _playerObservers) { if (session.AttachedEntity == null) continue; @@ -115,7 +145,7 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos foreach (var grid in _mapManager.FindGridsIntersecting(entity.Transform.MapID, worldBounds)) { - if (!_entityManager.TryGetEntity(grid.GridEntityId, out var gridEnt)) continue; + if (!EntityManager.TryGetEntity(grid.GridEntityId, out var gridEnt)) continue; if (!gridEnt.TryGetComponent(out var gam)) continue; diff --git a/Content.Shared/GameObjects/EntitySystems/Atmos/SharedAtmosDebugOverlaySystem.cs b/Content.Shared/GameObjects/EntitySystems/Atmos/SharedAtmosDebugOverlaySystem.cs index 1afbd55e32..1d13d02e54 100644 --- a/Content.Shared/GameObjects/EntitySystems/Atmos/SharedAtmosDebugOverlaySystem.cs +++ b/Content.Shared/GameObjects/EntitySystems/Atmos/SharedAtmosDebugOverlaySystem.cs @@ -53,5 +53,10 @@ namespace Content.Shared.GameObjects.EntitySystems.Atmos OverlayData = overlayData; } } + + [Serializable, NetSerializable] + public sealed class AtmosDebugOverlayDisableMessage : EntitySystemMessage + { + } } }