1
0

PuddleDebugDebugOverlaySystem.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using System.Numerics;
  2. using Content.Shared.Fluids;
  3. using Content.Shared.Fluids.Components;
  4. using Robust.Shared.Map;
  5. using Robust.Shared.Map.Components;
  6. using Robust.Shared.Player;
  7. using Robust.Shared.Timing;
  8. namespace Content.Server.Fluids.EntitySystems;
  9. public sealed class PuddleDebugDebugOverlaySystem : SharedPuddleDebugOverlaySystem
  10. {
  11. [Dependency] private readonly IGameTiming _timing = default!;
  12. [Dependency] private readonly IMapManager _mapManager = default!;
  13. [Dependency] private readonly PuddleSystem _puddle = default!;
  14. [Dependency] private readonly SharedTransformSystem _transform = default!;
  15. [Dependency] private readonly SharedMapSystem _map = default!;
  16. private readonly HashSet<ICommonSession> _playerObservers = [];
  17. private List<Entity<MapGridComponent>> _grids = [];
  18. public bool ToggleObserver(ICommonSession observer)
  19. {
  20. NextTick ??= _timing.CurTime + Cooldown;
  21. if (_playerObservers.Contains(observer))
  22. {
  23. RemoveObserver(observer);
  24. return false;
  25. }
  26. _playerObservers.Add(observer);
  27. return true;
  28. }
  29. private void RemoveObserver(ICommonSession observer)
  30. {
  31. if (!_playerObservers.Remove(observer))
  32. {
  33. return;
  34. }
  35. var message = new PuddleOverlayDisableMessage();
  36. RaiseNetworkEvent(message, observer.Channel);
  37. }
  38. public override void Update(float frameTime)
  39. {
  40. base.Update(frameTime);
  41. if (NextTick == null || _timing.CurTime < NextTick)
  42. return;
  43. foreach (var session in _playerObservers)
  44. {
  45. if (session.AttachedEntity is not { Valid: true } entity)
  46. continue;
  47. var transform = EntityManager.GetComponent<TransformComponent>(entity);
  48. var worldBounds = Box2.CenteredAround(_transform.GetWorldPosition(transform),
  49. new Vector2(LocalViewRange, LocalViewRange));
  50. _grids.Clear();
  51. _mapManager.FindGridsIntersecting(transform.MapID, worldBounds, ref _grids);
  52. foreach (var grid in _grids)
  53. {
  54. var data = new List<PuddleDebugOverlayData>();
  55. var gridUid = grid.Owner;
  56. if (!Exists(gridUid))
  57. continue;
  58. foreach (var uid in _map.GetAnchoredEntities(gridUid, grid, worldBounds))
  59. {
  60. PuddleComponent? puddle = null;
  61. TransformComponent? xform = null;
  62. if (!Resolve(uid, ref puddle, ref xform, false))
  63. continue;
  64. var pos = xform.Coordinates.ToVector2i(EntityManager, _mapManager, _transform);
  65. var vol = _puddle.CurrentVolume(uid, puddle);
  66. data.Add(new PuddleDebugOverlayData(pos, vol));
  67. }
  68. RaiseNetworkEvent(new PuddleOverlayDebugMessage(GetNetEntity(gridUid), data.ToArray()), session);
  69. }
  70. }
  71. NextTick = _timing.CurTime + Cooldown;
  72. }
  73. }