1
0

RespawnCommand.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System.Linq;
  2. using Content.Server.Administration;
  3. using Content.Server.Mind;
  4. using Content.Shared.Players;
  5. using Robust.Server.Player;
  6. using Robust.Shared.Console;
  7. using Robust.Shared.Network;
  8. namespace Content.Server.GameTicking.Commands
  9. {
  10. sealed class RespawnCommand : LocalizedEntityCommands
  11. {
  12. [Dependency] private readonly IPlayerManager _player = default!;
  13. [Dependency] private readonly IPlayerLocator _locator = default!;
  14. [Dependency] private readonly GameTicker _gameTicker = default!;
  15. [Dependency] private readonly MindSystem _mind = default!;
  16. public override string Command => "respawn";
  17. public override async void Execute(IConsoleShell shell, string argStr, string[] args)
  18. {
  19. var player = shell.Player;
  20. if (args.Length > 1)
  21. {
  22. shell.WriteError(Loc.GetString("cmd-respawn-invalid-args"));
  23. return;
  24. }
  25. NetUserId userId;
  26. if (args.Length == 0)
  27. {
  28. if (player == null)
  29. {
  30. shell.WriteError(Loc.GetString("cmd-respawn-no-player"));
  31. return;
  32. }
  33. userId = player.UserId;
  34. }
  35. else
  36. {
  37. var located = await _locator.LookupIdByNameOrIdAsync(args[0]);
  38. if (located == null)
  39. {
  40. shell.WriteError(Loc.GetString("cmd-respawn-unknown-player"));
  41. return;
  42. }
  43. userId = located.UserId;
  44. }
  45. if (!_player.TryGetSessionById(userId, out var targetPlayer))
  46. {
  47. if (!_player.TryGetPlayerData(userId, out var data))
  48. {
  49. shell.WriteError(Loc.GetString("cmd-respawn-unknown-player"));
  50. return;
  51. }
  52. _mind.WipeMind(data.ContentData()?.Mind);
  53. shell.WriteError(Loc.GetString("cmd-respawn-player-not-online"));
  54. return;
  55. }
  56. _gameTicker.Respawn(targetPlayer);
  57. }
  58. public override CompletionResult GetCompletion(IConsoleShell shell, string[] args)
  59. {
  60. if (args.Length != 1)
  61. return CompletionResult.Empty;
  62. var options = _player.Sessions.OrderBy(c => c.Name).Select(c => c.Name).ToArray();
  63. return CompletionResult.FromHintOptions(options, Loc.GetString("cmd-respawn-player-completion"));
  64. }
  65. }
  66. }