diff --git a/Content.Client/Ghost/GhostSystem.cs b/Content.Client/Ghost/GhostSystem.cs
index 09e0331cdf..b701c0d498 100644
--- a/Content.Client/Ghost/GhostSystem.cs
+++ b/Content.Client/Ghost/GhostSystem.cs
@@ -155,5 +155,10 @@ namespace Content.Client.Ghost
{
_console.RemoteExecuteCommand(null, "ghostroles");
}
+
+ public void ToggleGhostVisibility()
+ {
+ _console.RemoteExecuteCommand(null, "toggleghosts");
+ }
}
}
diff --git a/Content.Client/UserInterface/Systems/Ghost/GhostUIController.cs b/Content.Client/UserInterface/Systems/Ghost/GhostUIController.cs
index c379cbf643..9f10d0dfe2 100644
--- a/Content.Client/UserInterface/Systems/Ghost/GhostUIController.cs
+++ b/Content.Client/UserInterface/Systems/Ghost/GhostUIController.cs
@@ -99,6 +99,7 @@ public sealed class GhostUIController : UIController, IOnSystemChanged
+
diff --git a/Content.Client/UserInterface/Systems/Ghost/Widgets/GhostGui.xaml.cs b/Content.Client/UserInterface/Systems/Ghost/Widgets/GhostGui.xaml.cs
index 0f64e8a275..b20103aaa5 100644
--- a/Content.Client/UserInterface/Systems/Ghost/Widgets/GhostGui.xaml.cs
+++ b/Content.Client/UserInterface/Systems/Ghost/Widgets/GhostGui.xaml.cs
@@ -14,6 +14,7 @@ public sealed partial class GhostGui : UIWidget
public event Action? RequestWarpsPressed;
public event Action? ReturnToBodyPressed;
public event Action? GhostRolesPressed;
+ public event Action? ToggleGhostVisibility;
public GhostGui()
{
@@ -26,6 +27,7 @@ public sealed partial class GhostGui : UIWidget
GhostWarpButton.OnPressed += _ => RequestWarpsPressed?.Invoke();
ReturnToBodyButton.OnPressed += _ => ReturnToBodyPressed?.Invoke();
GhostRolesButton.OnPressed += _ => GhostRolesPressed?.Invoke();
+ ToggleGhostVisibilityButton.OnPressed += _ => ToggleGhostVisibility?.Invoke();
}
public void Hide()
diff --git a/Content.Server/Ghost/GhostSystem.cs b/Content.Server/Ghost/GhostSystem.cs
index 5b4da33782..af79e72f4c 100644
--- a/Content.Server/Ghost/GhostSystem.cs
+++ b/Content.Server/Ghost/GhostSystem.cs
@@ -9,6 +9,7 @@ using Content.Server.Storage.Components;
using Content.Server.Visible;
using Content.Server.Warps;
using Content.Shared.Actions;
+using Content.Shared.Administration;
using Content.Shared.Examine;
using Content.Shared.Follower;
using Content.Shared.Ghost;
@@ -17,6 +18,7 @@ using Content.Shared.Movement.Events;
using JetBrains.Annotations;
using Robust.Server.GameObjects;
using Robust.Server.Player;
+using Robust.Shared.Console;
using Robust.Shared.Physics.Components;
using Robust.Shared.Timing;
@@ -296,4 +298,27 @@ namespace Content.Server.Ghost
return ghostBoo.Handled;
}
}
+
+ [AnyCommand]
+ public sealed class ToggleGhostVisibility : IConsoleCommand
+ {
+ public string Command => "toggleghosts";
+ public string Description => "Toggles ghost visibility";
+ public string Help => $"{Command}";
+ public void Execute(IConsoleShell shell, string argStr, string[] args)
+ {
+ if (shell.Player == null)
+ shell.WriteLine("You can only open the ghost roles UI on a client.");
+
+ var entityManager = IoCManager.Resolve();
+
+ var uid = shell.Player?.AttachedEntity;
+ if (uid == null
+ || !entityManager.HasComponent(uid)
+ || !entityManager.TryGetComponent(uid, out var eyeComponent))
+ return;
+
+ eyeComponent.VisibilityMask ^= (uint) VisibilityFlags.Ghost;
+ }
+ }
}
diff --git a/Resources/Locale/en-US/ghost/ghost-gui.ftl b/Resources/Locale/en-US/ghost/ghost-gui.ftl
index 0ec5f1dcac..74b52cd304 100644
--- a/Resources/Locale/en-US/ghost/ghost-gui.ftl
+++ b/Resources/Locale/en-US/ghost/ghost-gui.ftl
@@ -1,6 +1,7 @@
ghost-gui-return-to-body-button = Return to body
ghost-gui-ghost-warp-button = Ghost Warp
ghost-gui-ghost-roles-button = Ghost Roles ({$count})
+ghost-gui-toggle-ghost-visibility-button = Toggle Ghosts
ghost-target-window-title = Ghost Warp
ghost-target-window-current-button = Warp: {$name}