using Content.Server.UserInterface; using Content.Shared.Radar; using Robust.Shared.Map; namespace Content.Server.Radar; public sealed class RadarConsoleSystem : EntitySystem { [Dependency] private readonly IMapManager _mapManager = default!; private static float Frequency = 1.5f; private float _accumulator; public override void Update(float frameTime) { _accumulator += frameTime; if (_accumulator < Frequency) return; _accumulator -= Frequency; foreach (var (component, xform) in EntityManager.EntityQuery()) { var s = component.Owner.GetUIOrNull(RadarConsoleUiKey.Key); if (s is null || s.SubscribedSessions.Count == 0) continue; var (radarPos, _, radarInvMatrix) = xform.GetWorldPositionRotationInvMatrix(); var mapId = xform.MapID; var objects = new List(); _mapManager.FindGridsIntersectingEnumerator(mapId, new Box2(radarPos - component.Range, radarPos + component.Range), out var enumerator, true); while (enumerator.MoveNext(out var grid)) { var phy = Comp(grid.GridEntityId); var transform = Transform(grid.GridEntityId); if (phy.Mass < 50) continue; var rad = Math.Log2(phy.Mass); var gridCenter = transform.WorldMatrix.Transform(phy.LocalCenter); var pos = radarInvMatrix.Transform(gridCenter); pos.Y = -pos.Y; // Robust has an inverted Y, like BYOND. This undoes that. if (pos.Length > component.Range) continue; objects.Add(new RadarObjectData {Color = Color.Aqua, Position = pos, Radius = (float)rad}); } s.SetState(new RadarConsoleBoundInterfaceState(component.Range, objects.ToArray())); } } }