#nullable enable using System.Collections.Generic; using Content.Client.Atmos; using Content.Shared.GameObjects.EntitySystems.Atmos; using Content.Shared.Atmos; using Content.Shared.GameTicking; using JetBrains.Annotations; using Robust.Client.Interfaces.Graphics.Overlays; using Robust.Shared.Interfaces.Map; using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Maths; namespace Content.Client.GameObjects.EntitySystems { [UsedImplicitly] internal sealed class AtmosDebugOverlaySystem : SharedAtmosDebugOverlaySystem, IResettingEntitySystem { [Dependency] private readonly IMapManager _mapManager = default!; private readonly Dictionary _tileData = new(); // Configuration set by debug commands and used by AtmosDebugOverlay { /// Value source for display public AtmosDebugOverlayMode CfgMode; /// This is subtracted from value (applied before CfgScale) public float CfgBase = 0; /// The value is divided by this (applied after CfgBase) public float CfgScale = Atmospherics.MolesCellStandard * 2; /// Gas ID used by GasMoles mode public int CfgSpecificGas = 0; /// Uses black-to-white interpolation (as opposed to red-green-blue) for colourblind users public bool CfgCBM = false; // } public override void Initialize() { base.Initialize(); SubscribeNetworkEvent(HandleAtmosDebugOverlayMessage); SubscribeNetworkEvent(HandleAtmosDebugOverlayDisableMessage); _mapManager.OnGridRemoved += OnGridRemoved; var overlayManager = IoCManager.Resolve(); if(!overlayManager.HasOverlay(nameof(AtmosDebugOverlay))) overlayManager.AddOverlay(new AtmosDebugOverlay()); } private void HandleAtmosDebugOverlayMessage(AtmosDebugOverlayMessage message) { _tileData[message.GridId] = message; } private void HandleAtmosDebugOverlayDisableMessage(AtmosDebugOverlayDisableMessage ev) { _tileData.Clear(); } public override void Shutdown() { base.Shutdown(); _mapManager.OnGridRemoved -= OnGridRemoved; var overlayManager = IoCManager.Resolve(); if(!overlayManager.HasOverlay(nameof(GasTileOverlay))) overlayManager.RemoveOverlay(nameof(GasTileOverlay)); } public void Reset() { _tileData.Clear(); } private void OnGridRemoved(GridId gridId) { if (_tileData.ContainsKey(gridId)) { _tileData.Remove(gridId); } } public bool HasData(GridId gridId) { return _tileData.ContainsKey(gridId); } public AtmosDebugOverlayData? GetData(GridId gridIndex, Vector2i indices) { if (!_tileData.TryGetValue(gridIndex, out var srcMsg)) return null; var relative = indices - srcMsg.BaseIdx; if (relative.X < 0 || relative.Y < 0 || relative.X >= LocalViewRange || relative.Y >= LocalViewRange) return null; return srcMsg.OverlayData[relative.X + (relative.Y * LocalViewRange)]; } } internal enum AtmosDebugOverlayMode { TotalMoles, GasMoles, Temperature } }