diff --git a/Content.Server/Commands/SetAnchorCommand.cs b/Content.Server/Commands/SetAnchorCommand.cs new file mode 100644 index 0000000000..532458d55e --- /dev/null +++ b/Content.Server/Commands/SetAnchorCommand.cs @@ -0,0 +1,58 @@ +#nullable enable +using Content.Server.Administration; +using Content.Shared.Administration; +using Robust.Server.Interfaces.Console; +using Robust.Server.Interfaces.Player; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.IoC; + +namespace Content.Server.Commands +{ + [AdminCommand(AdminFlags.Debug)] + public class SetAnchorCommand : IClientCommand + { + public string Command => "setanchor"; + public string Description => "Sets the anchoring state of an entity."; + public string Help => "setanchor "; + public void Execute(IConsoleShell shell, IPlayerSession? player, string[] args) + { + if (args.Length == 0 || args.Length > 2) + { + shell.SendText(player, "Invalid number of argument!"); + return; + } + + if (!int.TryParse(args[0], out var id)) + { + shell.SendText(player, "Invalid argument specified!"); + return; + } + + var entId = new EntityUid(id); + + var entityManager = IoCManager.Resolve(); + + if (!entityManager.TryGetEntity(entId, out var entity) || entity.Deleted || !entity.TryGetComponent(out PhysicsComponent? physics)) + { + shell.SendText(player, "Invalid entity specified!"); + return; + } + + if (args.Length == 2) + { + if (!bool.TryParse(args[1], out var value)) + { + shell.SendText(player, "Invalid argument specified!"); + return; + } + + physics.Anchored = value; + return; + } + + physics.Anchored = !physics.Anchored; + } + } +} diff --git a/Content.Server/GlobalVerbs/SetAnchorVerb.cs b/Content.Server/GlobalVerbs/SetAnchorVerb.cs new file mode 100644 index 0000000000..1fa2246d7d --- /dev/null +++ b/Content.Server/GlobalVerbs/SetAnchorVerb.cs @@ -0,0 +1,56 @@ +#nullable enable +using Content.Server.GameObjects.Components.Nutrition; +using Content.Shared.GameObjects.Components.Damage; +using Content.Shared.GameObjects.Verbs; +using Robust.Server.Console; +using Robust.Server.Interfaces.GameObjects; +using Robust.Shared.GameObjects.Components; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.IoC; + +namespace Content.Server.GlobalVerbs +{ + [GlobalVerb] + public class SetAnchorVerb : GlobalVerb + { + public override bool RequireInteractionRange => false; + public override bool BlockedByContainers => false; + + public override void GetData(IEntity user, IEntity target, VerbData data) + { + data.CategoryData = VerbCategories.Debug; + data.Visibility = VerbVisibility.Invisible; + + var groupController = IoCManager.Resolve(); + + if (user.TryGetComponent(out var player)) + { + if (!target.TryGetComponent(out PhysicsComponent? physics)) + { + return; + } + + if (groupController.CanCommand(player.playerSession, "setanchor")) + { + data.Text = physics.Anchored ? "Unanchor" : "Anchor"; + data.Visibility = VerbVisibility.Visible; + } + } + } + + public override void Activate(IEntity user, IEntity target) + { + if (user.TryGetComponent(out var player)) + { + var groupController = IoCManager.Resolve(); + if (!groupController.CanCommand(player.playerSession, "setanchor")) + return; + + if (target.TryGetComponent(out PhysicsComponent? physics)) + { + physics.Anchored = !physics.Anchored; + } + } + } + } +}