Fix running showatmos twice not disabling the atmos overlay (#2557)
* Fix running showatmos twice not disabling the atmos overlay * Remove entity manager dependency
This commit is contained in:
@@ -1,21 +1,14 @@
|
|||||||
#nullable enable
|
#nullable enable
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Content.Client.Atmos;
|
using Content.Client.Atmos;
|
||||||
using Content.Shared.Atmos;
|
|
||||||
using Content.Shared.GameObjects.EntitySystems.Atmos;
|
using Content.Shared.GameObjects.EntitySystems.Atmos;
|
||||||
using Content.Shared.GameTicking;
|
using Content.Shared.GameTicking;
|
||||||
using JetBrains.Annotations;
|
using JetBrains.Annotations;
|
||||||
using Robust.Client.Graphics;
|
|
||||||
using Robust.Client.Interfaces.Graphics.Overlays;
|
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.Interfaces.Map;
|
||||||
using Robust.Shared.IoC;
|
using Robust.Shared.IoC;
|
||||||
using Robust.Shared.Map;
|
using Robust.Shared.Map;
|
||||||
using Robust.Shared.Maths;
|
using Robust.Shared.Maths;
|
||||||
using Robust.Shared.Utility;
|
|
||||||
|
|
||||||
namespace Content.Client.GameObjects.EntitySystems
|
namespace Content.Client.GameObjects.EntitySystems
|
||||||
{
|
{
|
||||||
@@ -24,18 +17,17 @@ namespace Content.Client.GameObjects.EntitySystems
|
|||||||
{
|
{
|
||||||
[Dependency] private readonly IMapManager _mapManager = default!;
|
[Dependency] private readonly IMapManager _mapManager = default!;
|
||||||
|
|
||||||
private Dictionary<GridId, AtmosDebugOverlayMessage> _tileData =
|
private readonly Dictionary<GridId, AtmosDebugOverlayMessage> _tileData =
|
||||||
new Dictionary<GridId, AtmosDebugOverlayMessage>();
|
new Dictionary<GridId, AtmosDebugOverlayMessage>();
|
||||||
|
|
||||||
private AtmosphereSystem _atmosphereSystem = default!;
|
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
SubscribeNetworkEvent<AtmosDebugOverlayMessage>(HandleAtmosDebugOverlayMessage);
|
|
||||||
_mapManager.OnGridRemoved += OnGridRemoved;
|
|
||||||
|
|
||||||
_atmosphereSystem = Get<AtmosphereSystem>();
|
SubscribeNetworkEvent<AtmosDebugOverlayMessage>(HandleAtmosDebugOverlayMessage);
|
||||||
|
SubscribeNetworkEvent<AtmosDebugOverlayDisableMessage>(HandleAtmosDebugOverlayDisableMessage);
|
||||||
|
|
||||||
|
_mapManager.OnGridRemoved += OnGridRemoved;
|
||||||
|
|
||||||
var overlayManager = IoCManager.Resolve<IOverlayManager>();
|
var overlayManager = IoCManager.Resolve<IOverlayManager>();
|
||||||
if(!overlayManager.HasOverlay(nameof(AtmosDebugOverlay)))
|
if(!overlayManager.HasOverlay(nameof(AtmosDebugOverlay)))
|
||||||
@@ -47,6 +39,11 @@ namespace Content.Client.GameObjects.EntitySystems
|
|||||||
_tileData[message.GridId] = message;
|
_tileData[message.GridId] = message;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void HandleAtmosDebugOverlayDisableMessage(AtmosDebugOverlayDisableMessage ev)
|
||||||
|
{
|
||||||
|
_tileData.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
public override void Shutdown()
|
public override void Shutdown()
|
||||||
{
|
{
|
||||||
base.Shutdown();
|
base.Shutdown();
|
||||||
|
|||||||
@@ -639,22 +639,23 @@ namespace Content.Server.Atmos
|
|||||||
public class ShowAtmos : IClientCommand
|
public class ShowAtmos : IClientCommand
|
||||||
{
|
{
|
||||||
public string Command => "showatmos";
|
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 string Help => $"Usage: {Command}";
|
||||||
|
|
||||||
public void Execute(IConsoleShell shell, IPlayerSession? player, string[] args)
|
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<AtmosDebugOverlaySystem>();
|
var atmosDebug = EntitySystem.Get<AtmosDebugOverlaySystem>();
|
||||||
if (atmosDebug.PlayerObservers.Contains(player))
|
var enabled = atmosDebug.ToggleObserver(player);
|
||||||
{
|
|
||||||
atmosDebug.PlayerObservers.Remove(player);
|
shell.SendText(player, enabled
|
||||||
shell.SendText(player, $"Ok, disabled");
|
? "Enabled the atmospherics debug overlay."
|
||||||
}
|
: "Disabled the atmospherics debug overlay.");
|
||||||
else
|
|
||||||
{
|
|
||||||
atmosDebug.PlayerObservers.Add(player);
|
|
||||||
shell.SendText(player, $"Ok, enabled");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}}
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
#nullable enable
|
#nullable enable
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using Content.Server.GameObjects.Components.Atmos;
|
using Content.Server.GameObjects.Components.Atmos;
|
||||||
using Content.Server.Atmos;
|
using Content.Server.Atmos;
|
||||||
using Content.Shared;
|
using Content.Shared;
|
||||||
@@ -12,41 +10,36 @@ using Robust.Server.Interfaces.Player;
|
|||||||
using Robust.Server.Player;
|
using Robust.Server.Player;
|
||||||
using Robust.Shared.Enums;
|
using Robust.Shared.Enums;
|
||||||
using Robust.Shared.Interfaces.Configuration;
|
using Robust.Shared.Interfaces.Configuration;
|
||||||
using Robust.Shared.Interfaces.GameObjects;
|
|
||||||
using Robust.Shared.Interfaces.Map;
|
using Robust.Shared.Interfaces.Map;
|
||||||
using Robust.Shared.Interfaces.Timing;
|
using Robust.Shared.Interfaces.Timing;
|
||||||
using Robust.Shared.Map;
|
using Robust.Shared.IoC;
|
||||||
using Robust.Shared.Maths;
|
using Robust.Shared.Maths;
|
||||||
using Robust.Shared.Timing;
|
|
||||||
|
|
||||||
namespace Content.Server.GameObjects.EntitySystems.Atmos
|
namespace Content.Server.GameObjects.EntitySystems.Atmos
|
||||||
{
|
{
|
||||||
[UsedImplicitly]
|
[UsedImplicitly]
|
||||||
public sealed class AtmosDebugOverlaySystem : SharedAtmosDebugOverlaySystem
|
public sealed class AtmosDebugOverlaySystem : SharedAtmosDebugOverlaySystem
|
||||||
{
|
{
|
||||||
[Robust.Shared.IoC.Dependency] private readonly IGameTiming _gameTiming = default!;
|
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
||||||
[Robust.Shared.IoC.Dependency] private readonly IPlayerManager _playerManager = default!;
|
[Dependency] private readonly IPlayerManager _playerManager = default!;
|
||||||
[Robust.Shared.IoC.Dependency] private readonly IEntityManager _entityManager = default!;
|
[Dependency] private readonly IMapManager _mapManager = default!;
|
||||||
[Robust.Shared.IoC.Dependency] private readonly IMapManager _mapManager = default!;
|
[Dependency] private readonly IConfigurationManager _configManager = default!;
|
||||||
[Robust.Shared.IoC.Dependency] private readonly IConfigurationManager _configManager = default!;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Players allowed to see the atmos debug overlay
|
/// Players allowed to see the atmos debug overlay.
|
||||||
|
/// To modify it see <see cref="AddObserver"/> and
|
||||||
|
/// <see cref="RemoveObserver"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public HashSet<IPlayerSession> PlayerObservers = new HashSet<IPlayerSession>();
|
private readonly HashSet<IPlayerSession> _playerObservers = new HashSet<IPlayerSession>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Overlay update ticks per second.
|
/// Overlay update ticks per second.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private float _updateCooldown;
|
private float _updateCooldown;
|
||||||
|
|
||||||
private AtmosphereSystem _atmosphereSystem = default!;
|
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
|
|
||||||
_atmosphereSystem = Get<AtmosphereSystem>();
|
|
||||||
_playerManager.PlayerStatusChanged += OnPlayerStatusChanged;
|
_playerManager.PlayerStatusChanged += OnPlayerStatusChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,16 +49,53 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos
|
|||||||
_playerManager.PlayerStatusChanged -= OnPlayerStatusChanged;
|
_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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds the given observer if it doesn't exist, removes it otherwise.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="observer">The observer to toggle.</param>
|
||||||
|
/// <returns>true if added, false if removed.</returns>
|
||||||
|
public bool ToggleObserver(IPlayerSession observer)
|
||||||
|
{
|
||||||
|
if (HasObserver(observer))
|
||||||
|
{
|
||||||
|
RemoveObserver(observer);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AddObserver(observer);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e)
|
private void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e)
|
||||||
{
|
{
|
||||||
if (e.NewStatus != SessionStatus.InGame)
|
if (e.NewStatus != SessionStatus.InGame)
|
||||||
{
|
{
|
||||||
if (PlayerObservers.Contains(e.Session))
|
RemoveObserver(e.Session);
|
||||||
{
|
|
||||||
PlayerObservers.Remove(e.Session);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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
|
// 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).
|
// 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.
|
// 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;
|
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))
|
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<GridAtmosphereComponent>(out var gam)) continue;
|
if (!gridEnt.TryGetComponent<GridAtmosphereComponent>(out var gam)) continue;
|
||||||
|
|
||||||
|
|||||||
@@ -53,5 +53,10 @@ namespace Content.Shared.GameObjects.EntitySystems.Atmos
|
|||||||
OverlayData = overlayData;
|
OverlayData = overlayData;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Serializable, NetSerializable]
|
||||||
|
public sealed class AtmosDebugOverlayDisableMessage : EntitySystemMessage
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user