]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
wallmount debug overlay (#38495)
authorslarticodefast <161409025+slarticodefast@users.noreply.github.com>
Tue, 16 Dec 2025 19:19:37 +0000 (20:19 +0100)
committerGitHub <noreply@github.com>
Tue, 16 Dec 2025 19:19:37 +0000 (19:19 +0000)
* wallmount debug overlay

* make circles a little smoother

* add permissions

* Update Resources/Locale/en-US/commands/show-wallmounts-command.ftl

Co-authored-by: Pok <113675512+Pok27@users.noreply.github.com>
* fix

---------

Co-authored-by: Pok <113675512+Pok27@users.noreply.github.com>
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
Content.Client/Commands/ShowWallmountsCommand.cs [new file with mode: 0644]
Content.Client/Wall/WallmountDebugOverlay.cs [new file with mode: 0644]
Resources/Locale/en-US/commands/show-wallmounts-command.ftl [new file with mode: 0644]
Resources/clientCommandPerms.yml

diff --git a/Content.Client/Commands/ShowWallmountsCommand.cs b/Content.Client/Commands/ShowWallmountsCommand.cs
new file mode 100644 (file)
index 0000000..d44c139
--- /dev/null
@@ -0,0 +1,24 @@
+using Content.Client.Wall;
+using Robust.Client.Graphics;
+using Robust.Shared.Console;
+
+namespace Content.Client.Commands;
+
+/// <summary>
+/// Shows the area in which entities with <see cref="Content.Shared.Wall.WallMountComponent" /> can be interacted from.
+/// </summary>
+public sealed class ShowWallmountsCommand : LocalizedCommands
+{
+    [Dependency] private readonly IOverlayManager _overlay = default!;
+
+    public override string Command => "showwallmounts";
+
+    public override void Execute(IConsoleShell shell, string argStr, string[] args)
+    {
+        var existing = _overlay.RemoveOverlay<WallmountDebugOverlay>();
+        if (!existing)
+            _overlay.AddOverlay(new WallmountDebugOverlay());
+
+        shell.WriteLine(Loc.GetString("cmd-showwallmounts-status", ("status", !existing)));
+    }
+}
diff --git a/Content.Client/Wall/WallmountDebugOverlay.cs b/Content.Client/Wall/WallmountDebugOverlay.cs
new file mode 100644 (file)
index 0000000..02fd9eb
--- /dev/null
@@ -0,0 +1,58 @@
+using Content.Shared.Interaction;
+using Content.Shared.Wall;
+using Robust.Client.Graphics;
+using Robust.Shared.Enums;
+using System.Numerics;
+
+namespace Content.Client.Wall;
+
+/// <summary>
+/// Shows the area in which entities with <see cref="WallMountComponent" /> can be interacted from.
+/// </summary>
+public sealed class WallmountDebugOverlay : Overlay
+{
+    [Dependency] private readonly IEntityManager _entManager = default!;
+    private readonly SharedTransformSystem _transform;
+    private readonly EntityLookupSystem _lookup;
+    private readonly HashSet<Entity<WallMountComponent>> _intersecting = [];
+
+    public override OverlaySpace Space => OverlaySpace.WorldSpace;
+
+    public WallmountDebugOverlay()
+    {
+        IoCManager.InjectDependencies(this);
+
+        _transform = _entManager.System<SharedTransformSystem>();
+        _lookup = _entManager.System<EntityLookupSystem>();
+    }
+
+    protected override void Draw(in OverlayDrawArgs args)
+    {
+        _intersecting.Clear();
+        _lookup.GetEntitiesIntersecting(args.MapId, args.WorldBounds, _intersecting);
+        foreach (var ent in _intersecting)
+        {
+            var (worldPos, worldRot) = _transform.GetWorldPositionRotation(ent.Owner);
+            DrawArc(args.WorldHandle, worldPos, SharedInteractionSystem.InteractionRange, worldRot + ent.Comp.Direction, ent.Comp.Arc);
+        }
+    }
+
+    private static void DrawArc(DrawingHandleWorld handle, Vector2 position, float radius, Angle rot, Angle arc)
+    {
+        // 32 segments for a full circle, but 2 at least
+        var segments = Math.Max((int)(arc.Theta / Math.Tau * 32), 2);
+        var step = arc.Theta / (segments - 1);
+        var verts = new Vector2[segments + 1];
+
+        verts[0] = position;
+        for (var i = 0; i < segments; i++)
+        {
+            var angle = (float)(-arc.Theta / 2 + i * step - rot.Theta + Math.PI);
+            var pos = new Vector2(MathF.Sin(angle), MathF.Cos(angle));
+
+            verts[i + 1] = position + pos * radius;
+        }
+
+        handle.DrawPrimitives(DrawPrimitiveTopology.TriangleFan, verts, Color.Green.WithAlpha(0.5f));
+    }
+}
diff --git a/Resources/Locale/en-US/commands/show-wallmounts-command.ftl b/Resources/Locale/en-US/commands/show-wallmounts-command.ftl
new file mode 100644 (file)
index 0000000..062a51d
--- /dev/null
@@ -0,0 +1,3 @@
+cmd-showwallmounts-desc = Toggles showing wallmount interaction areas.
+cmd-showwallmounts-help = Usage: {$command}
+cmd-showwallmounts-status = Set wallmount debug overlay to {$status}.
index a177bc5fe1cc9864614b6cb23b30876ebc1c7a04..9b086f6fdf2968d182c0c0792a431b78b296b529 100644 (file)
@@ -73,6 +73,7 @@
     - localdelete
     - fullstatereset
     - dumpentities
+    - showwallmounts
     - showaccessreaders
     - quickinspect
 
@@ -84,6 +85,7 @@
     - showsubfloorforever
     - toggleautosave
     - toggledecals
+    - showwallmounts
     - showaccessreaders
 
 - Flags: QUERY