1
0

LoadGameMapCommand.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using System.Numerics;
  2. using Content.Server.GameTicking;
  3. using Content.Server.Maps;
  4. using Content.Shared.Administration;
  5. using Robust.Shared.Console;
  6. using Robust.Shared.EntitySerialization;
  7. using Robust.Shared.Map;
  8. using Robust.Shared.Prototypes;
  9. namespace Content.Server.Administration.Commands
  10. {
  11. [AdminCommand(AdminFlags.Round | AdminFlags.Spawn)]
  12. public sealed class LoadGameMapCommand : IConsoleCommand
  13. {
  14. public string Command => "loadgamemap";
  15. public string Description => "Loads the given game map at the given coordinates.";
  16. public string Help => "loadgamemap <mapid> <gamemap> [<x> <y> [<name>]] ";
  17. public void Execute(IConsoleShell shell, string argStr, string[] args)
  18. {
  19. var prototypeManager = IoCManager.Resolve<IPrototypeManager>();
  20. var entityManager = IoCManager.Resolve<IEntityManager>();
  21. var gameTicker = entityManager.EntitySysManager.GetEntitySystem<GameTicker>();
  22. var mapSys = entityManager.EntitySysManager.GetEntitySystem<SharedMapSystem>();
  23. if (args.Length is not (2 or 4 or 5))
  24. {
  25. shell.WriteError(Loc.GetString("shell-wrong-arguments-number"));
  26. return;
  27. }
  28. if (!prototypeManager.TryIndex<GameMapPrototype>(args[1], out var gameMap))
  29. {
  30. shell.WriteError($"The given map prototype {args[0]} is invalid.");
  31. return;
  32. }
  33. if (!int.TryParse(args[0], out var mapId))
  34. return;
  35. var stationName = args.Length == 5 ? args[4] : null;
  36. Vector2? offset = null;
  37. if (args.Length >= 4)
  38. offset = new Vector2(int.Parse(args[2]), int.Parse(args[3]));
  39. var id = new MapId(mapId);
  40. var grids = mapSys.MapExists(id)
  41. ? gameTicker.MergeGameMap(gameMap, id, stationName: stationName, offset: offset)
  42. : gameTicker.LoadGameMapWithId(gameMap, id, stationName: stationName, offset: offset);
  43. shell.WriteLine($"Loaded {grids.Count} grids.");
  44. }
  45. public CompletionResult GetCompletion(IConsoleShell shell, string[] args)
  46. {
  47. switch (args.Length)
  48. {
  49. case 1:
  50. return CompletionResult.FromHint(Loc.GetString("cmd-hint-savemap-id"));
  51. case 2:
  52. var opts = CompletionHelper.PrototypeIDs<GameMapPrototype>();
  53. return CompletionResult.FromHintOptions(opts, Loc.GetString("cmd-hint-savemap-path"));
  54. case 3:
  55. return CompletionResult.FromHint(Loc.GetString("cmd-hint-loadmap-x-position"));
  56. case 4:
  57. return CompletionResult.FromHint(Loc.GetString("cmd-hint-loadmap-y-position"));
  58. case 5:
  59. return CompletionResult.FromHint(Loc.GetString("cmd-hint-loadmap-rotation"));
  60. case 6:
  61. return CompletionResult.FromHint(Loc.GetString("cmd-hint-loadmap-uids"));
  62. }
  63. return CompletionResult.Empty;
  64. }
  65. }
  66. [AdminCommand(AdminFlags.Round | AdminFlags.Spawn)]
  67. public sealed class ListGameMaps : IConsoleCommand
  68. {
  69. public string Command => "listgamemaps";
  70. public string Description => "Lists the game maps that can be used by loadgamemap";
  71. public string Help => "listgamemaps";
  72. public void Execute(IConsoleShell shell, string argStr, string[] args)
  73. {
  74. var prototypeManager = IoCManager.Resolve<IPrototypeManager>();
  75. var entityManager = IoCManager.Resolve<IEntityManager>();
  76. var gameTicker = entityManager.EntitySysManager.GetEntitySystem<GameTicker>();
  77. if (args.Length != 0)
  78. {
  79. shell.WriteError(Loc.GetString("shell-wrong-arguments-number"));
  80. return;
  81. }
  82. foreach (var prototype in prototypeManager.EnumeratePrototypes<GameMapPrototype>())
  83. {
  84. shell.WriteLine($"{prototype.ID} - {prototype.MapName}");
  85. }
  86. }
  87. }
  88. }