RunVerbAsCommand.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using System.Linq;
  2. using Content.Server.Administration;
  3. using Content.Shared.Administration;
  4. using Content.Shared.Verbs;
  5. using Robust.Shared.Toolshed;
  6. using Robust.Shared.Toolshed.Syntax;
  7. using Robust.Shared.Toolshed.TypeParsers;
  8. namespace Content.Server.Toolshed.Commands.Verbs;
  9. [ToolshedCommand, AdminCommand(AdminFlags.Moderator)]
  10. public sealed class RunVerbAsCommand : ToolshedCommand
  11. {
  12. private SharedVerbSystem? _verb;
  13. [CommandImplementation]
  14. public IEnumerable<NetEntity> RunVerbAs(
  15. IInvocationContext ctx,
  16. [PipedArgument] IEnumerable<NetEntity> input,
  17. EntityUid runner,
  18. string verb
  19. )
  20. {
  21. _verb ??= GetSys<SharedVerbSystem>();
  22. verb = verb.ToLowerInvariant();
  23. foreach (var i in input)
  24. {
  25. if (EntityManager.Deleted(runner) && runner.IsValid())
  26. ctx.ReportError(new DeadEntity(runner));
  27. if (ctx.GetErrors().Any())
  28. yield break;
  29. var eId = EntityManager.GetEntity(i);
  30. var verbs = _verb.GetLocalVerbs(eId, runner, Verb.VerbTypes, true);
  31. // if the "verb name" is actually a verb-type, try run any verb of that type.
  32. var verbType = Verb.VerbTypes.FirstOrDefault(x => x.Name == verb);
  33. if (verbType != null)
  34. {
  35. var verbTy = verbs.FirstOrDefault(v => v.GetType() == verbType);
  36. if (verbTy != null)
  37. {
  38. _verb.ExecuteVerb(verbTy, runner, eId, forced: true);
  39. yield return i;
  40. }
  41. }
  42. foreach (var verbTy in verbs)
  43. {
  44. if (verbTy.Text.ToLowerInvariant() == verb)
  45. {
  46. _verb.ExecuteVerb(verbTy, runner, eId, forced: true);
  47. yield return i;
  48. }
  49. }
  50. }
  51. }
  52. }