From ad5192695f2e2e1a0b5cdf11b3abb171f0e8cb85 Mon Sep 17 00:00:00 2001 From: Vera Aguilera Puerto <6766154+Zumorica@users.noreply.github.com> Date: Sun, 10 Jan 2021 20:07:54 +0100 Subject: [PATCH] Adds verb and command to make any entity "sentient" (player-controllable) (#2970) * Adds verb and command to make any entity "sentient" (player-controllable) * oops --- .../Commands/MakeSentientCommand.cs | 52 +++++++++++++++++++ .../GlobalVerbs/MakeSentientVerb.cs | 49 +++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 Content.Server/Commands/MakeSentientCommand.cs create mode 100644 Content.Server/GlobalVerbs/MakeSentientVerb.cs diff --git a/Content.Server/Commands/MakeSentientCommand.cs b/Content.Server/Commands/MakeSentientCommand.cs new file mode 100644 index 0000000000..53197b3908 --- /dev/null +++ b/Content.Server/Commands/MakeSentientCommand.cs @@ -0,0 +1,52 @@ +#nullable enable +using Content.Server.Administration; +using Content.Server.GameObjects.Components.Mobs; +using Content.Server.GameObjects.Components.Movement; +using Content.Shared.Administration; +using Robust.Server.Interfaces.Console; +using Robust.Server.Interfaces.Player; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.IoC; + +namespace Content.Server.Commands +{ + [AdminCommand(AdminFlags.Fun)] + public class MakeSentientCommand : IClientCommand + { + public string Command => "makesentient"; + public string Description => "Makes an entity sentient (able to be controlled by a player)"; + public string Help => "makesentient "; + + public void Execute(IConsoleShell shell, IPlayerSession? player, string[] args) + { + if (args.Length != 1) + { + shell.SendText(player, "Wrong number of arguments."); + return; + } + + if (!int.TryParse(args[0], out var id)) + { + shell.SendText(player, "Invalid argument."); + return; + } + + var entId = new EntityUid(id); + + var entityManager = IoCManager.Resolve(); + + if (!entityManager.TryGetEntity(entId, out var entity) || entity.Deleted) + { + shell.SendText(player, "Invalid entity specified!"); + return; + } + + if(entity.HasComponent()) + entity.RemoveComponent(); + + entity.EnsureComponent(); + entity.EnsureComponent(); + } + } +} diff --git a/Content.Server/GlobalVerbs/MakeSentientVerb.cs b/Content.Server/GlobalVerbs/MakeSentientVerb.cs new file mode 100644 index 0000000000..5206e89264 --- /dev/null +++ b/Content.Server/GlobalVerbs/MakeSentientVerb.cs @@ -0,0 +1,49 @@ +using Content.Server.Commands; +using Content.Server.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.Verbs; +using Robust.Server.Console; +using Robust.Server.Interfaces.Console; +using Robust.Server.Interfaces.GameObjects; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Localization; + +namespace Content.Server.GlobalVerbs +{ + [GlobalVerb] + public class MakeSentientVerb : GlobalVerb + { + public override bool RequireInteractionRange => false; + public override bool BlockedByContainers => false; + + public override void GetData(IEntity user, IEntity target, VerbData data) + { + data.Visibility = VerbVisibility.Invisible; + + var groupController = IoCManager.Resolve(); + + if (user == target || target.HasComponent()) + return; + + var player = user.GetComponent().playerSession; + if (groupController.CanCommand(player, "makesentient")) + { + data.Visibility = VerbVisibility.Visible; + data.Text = Loc.GetString("Make Sentient"); + data.CategoryData = VerbCategories.Debug; + } + } + + public override void Activate(IEntity user, IEntity target) + { + var groupController = IoCManager.Resolve(); + + var player = user.GetComponent().playerSession; + if (!groupController.CanCommand(player, "makesentient")) + return; + + new MakeSentientCommand().Execute(IoCManager.Resolve(), player, + new[] {target.Uid.ToString()}); + } + } +}