SetMindCommand.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using Content.Server.Players;
  2. using Content.Shared.Administration;
  3. using Content.Shared.Mind;
  4. using Content.Shared.Mind.Components;
  5. using Content.Shared.Players;
  6. using Robust.Server.Player;
  7. using Robust.Shared.Console;
  8. namespace Content.Server.Administration.Commands
  9. {
  10. [AdminCommand(AdminFlags.Admin)]
  11. sealed class SetMindCommand : IConsoleCommand
  12. {
  13. [Dependency] private readonly IEntityManager _entManager = default!;
  14. public string Command => "setmind";
  15. public string Description => Loc.GetString("set-mind-command-description", ("requiredComponent", nameof(MindContainerComponent)));
  16. public string Help => Loc.GetString("set-mind-command-help-text", ("command", Command));
  17. public void Execute(IConsoleShell shell, string argStr, string[] args)
  18. {
  19. if (args.Length < 2)
  20. {
  21. shell.WriteLine(Loc.GetString("shell-wrong-arguments-number"));
  22. return;
  23. }
  24. if (!int.TryParse(args[0], out var entInt))
  25. {
  26. shell.WriteLine(Loc.GetString("shell-entity-uid-must-be-number"));
  27. return;
  28. }
  29. bool ghostOverride = true;
  30. if (args.Length > 2)
  31. {
  32. ghostOverride = bool.Parse(args[2]);
  33. }
  34. var nent = new NetEntity(entInt);
  35. if (!_entManager.TryGetEntity(nent, out var eUid))
  36. {
  37. shell.WriteLine(Loc.GetString("shell-invalid-entity-id"));
  38. return;
  39. }
  40. if (!_entManager.HasComponent<MindContainerComponent>(eUid))
  41. {
  42. shell.WriteLine(Loc.GetString("set-mind-command-target-has-no-mind-message"));
  43. return;
  44. }
  45. if (!IoCManager.Resolve<IPlayerManager>().TryGetSessionByUsername(args[1], out var session))
  46. {
  47. shell.WriteLine(Loc.GetString("shell-target-player-does-not-exist"));
  48. return;
  49. }
  50. // hm, does player have a mind? if not we may need to give them one
  51. var playerCData = session.ContentData();
  52. if (playerCData == null)
  53. {
  54. shell.WriteLine(Loc.GetString("set-mind-command-target-has-no-content-data-message"));
  55. return;
  56. }
  57. var mindSystem = _entManager.System<SharedMindSystem>();
  58. var metadata = _entManager.GetComponent<MetaDataComponent>(eUid.Value);
  59. var mind = playerCData.Mind ?? mindSystem.CreateMind(session.UserId, metadata.EntityName);
  60. mindSystem.TransferTo(mind, eUid, ghostOverride);
  61. }
  62. public CompletionResult GetCompletion(IConsoleShell shell, string[] args)
  63. {
  64. if (args.Length == 2)
  65. {
  66. return CompletionResult.FromHintOptions(CompletionHelper.SessionNames(), Loc.GetString("cmd-mind-command-hint"));
  67. }
  68. return CompletionResult.Empty;
  69. }
  70. }
  71. }