CatStation/Content.Server/Fluids/EntitySystems/PuddleDebugDebugOverlaySystem.cs
TemporalOroboros 84b2f07157
The IMapManager is dead (#44002)
* Axes the easy IMapManager references

* Axes the references to unported (obsolete) IMapManager methods

* Converts salvageruler command to a LocalizedEntityCommand so it can use SharedMapSystem

* Removes IMapManager from GameTicker
This required axing the map nuke during restart, but that should be fine?
Maps are entities so EntityManager.FlushEntities should delete them all and that's the preceding line

* submodule update(?)

---------

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
2026-07-01 20:44:54 -07:00

92 lines
2.9 KiB
C#

using System.Numerics;
using Content.Shared.Fluids;
using Content.Shared.Fluids.Components;
using Robust.Shared.Map;
using Robust.Shared.Map.Components;
using Robust.Shared.Player;
using Robust.Shared.Timing;
namespace Content.Server.Fluids.EntitySystems;
public sealed partial class PuddleDebugDebugOverlaySystem : SharedPuddleDebugOverlaySystem
{
[Dependency] private IGameTiming _timing = default!;
[Dependency] private PuddleSystem _puddle = default!;
[Dependency] private SharedTransformSystem _transform = default!;
[Dependency] private SharedMapSystem _map = default!;
private readonly HashSet<ICommonSession> _playerObservers = [];
private List<Entity<MapGridComponent>> _grids = [];
public bool ToggleObserver(ICommonSession observer)
{
NextTick ??= _timing.CurTime + Cooldown;
if (_playerObservers.Contains(observer))
{
RemoveObserver(observer);
return false;
}
_playerObservers.Add(observer);
return true;
}
private void RemoveObserver(ICommonSession observer)
{
if (!_playerObservers.Remove(observer))
{
return;
}
var message = new PuddleOverlayDisableMessage();
RaiseNetworkEvent(message, observer.Channel);
}
public override void Update(float frameTime)
{
base.Update(frameTime);
if (NextTick == null || _timing.CurTime < NextTick)
return;
foreach (var session in _playerObservers)
{
if (session.AttachedEntity is not { Valid: true } entity)
continue;
var transform = Comp<TransformComponent>(entity);
var worldBounds = Box2.CenteredAround(_transform.GetWorldPosition(transform),
new Vector2(LocalViewRange, LocalViewRange));
_grids.Clear();
_map.FindGridsIntersecting(transform.MapID, worldBounds, ref _grids);
foreach (var grid in _grids)
{
var data = new List<PuddleDebugOverlayData>();
var gridUid = grid.Owner;
if (!Exists(gridUid))
continue;
foreach (var uid in _map.GetAnchoredEntities(gridUid, grid, worldBounds))
{
PuddleComponent? puddle = null;
TransformComponent? xform = null;
if (!Resolve(uid, ref puddle, ref xform, false))
continue;
var pos = xform.Coordinates.ToVector2i(EntityManager, _transform);
var vol = _puddle.CurrentVolume(uid, puddle);
data.Add(new PuddleDebugOverlayData(pos, vol));
}
RaiseNetworkEvent(new PuddleOverlayDebugMessage(GetNetEntity(gridUid), data.ToArray()), session);
}
}
NextTick = _timing.CurTime + Cooldown;
}
}