1
0

TileWallsCommand.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using Content.Server.Administration;
  2. using Content.Shared.Administration;
  3. using Content.Shared.Maps;
  4. using Content.Shared.Tag;
  5. using Robust.Shared.Console;
  6. using Robust.Shared.Map;
  7. using Robust.Server.GameObjects;
  8. using Robust.Shared.Map.Components;
  9. namespace Content.Server.Construction.Commands;
  10. [AdminCommand(AdminFlags.Mapping)]
  11. public sealed class TileWallsCommand : IConsoleCommand
  12. {
  13. [Dependency] private readonly IEntityManager _entManager = default!;
  14. [Dependency] private readonly ITileDefinitionManager _tileDefManager = default!;
  15. // ReSharper disable once StringLiteralTypo
  16. public string Command => "tilewalls";
  17. public string Description => "Puts an underplating tile below every wall on a grid.";
  18. public string Help => $"Usage: {Command} <gridId> | {Command}";
  19. [ValidatePrototypeId<ContentTileDefinition>]
  20. public const string TilePrototypeId = "Plating";
  21. [ValidatePrototypeId<TagPrototype>]
  22. public const string WallTag = "Wall";
  23. public void Execute(IConsoleShell shell, string argStr, string[] args)
  24. {
  25. var player = shell.Player;
  26. EntityUid? gridId;
  27. switch (args.Length)
  28. {
  29. case 0:
  30. if (player?.AttachedEntity is not { Valid: true } playerEntity)
  31. {
  32. shell.WriteError("Only a player can run this command.");
  33. return;
  34. }
  35. gridId = _entManager.GetComponent<TransformComponent>(playerEntity).GridUid;
  36. break;
  37. case 1:
  38. if (!NetEntity.TryParse(args[0], out var idNet) || !_entManager.TryGetEntity(idNet, out var id))
  39. {
  40. shell.WriteError($"{args[0]} is not a valid entity.");
  41. return;
  42. }
  43. gridId = id;
  44. break;
  45. default:
  46. shell.WriteLine(Help);
  47. return;
  48. }
  49. if (!_entManager.TryGetComponent(gridId, out MapGridComponent? grid))
  50. {
  51. shell.WriteError($"No grid exists with id {gridId}");
  52. return;
  53. }
  54. if (!_entManager.EntityExists(gridId))
  55. {
  56. shell.WriteError($"Grid {gridId} doesn't have an associated grid entity.");
  57. return;
  58. }
  59. var tagSystem = _entManager.EntitySysManager.GetEntitySystem<TagSystem>();
  60. var underplating = _tileDefManager[TilePrototypeId];
  61. var underplatingTile = new Tile(underplating.TileId);
  62. var changed = 0;
  63. var enumerator = _entManager.GetComponent<TransformComponent>(gridId.Value).ChildEnumerator;
  64. while (enumerator.MoveNext(out var child))
  65. {
  66. if (!_entManager.EntityExists(child))
  67. {
  68. continue;
  69. }
  70. if (!tagSystem.HasTag(child, WallTag))
  71. {
  72. continue;
  73. }
  74. var childTransform = _entManager.GetComponent<TransformComponent>(child);
  75. if (!childTransform.Anchored)
  76. {
  77. continue;
  78. }
  79. var mapSystem = _entManager.System<MapSystem>();
  80. var tile = mapSystem.GetTileRef(gridId.Value, grid, childTransform.Coordinates);
  81. var tileDef = (ContentTileDefinition)_tileDefManager[tile.Tile.TypeId];
  82. if (tileDef.ID == TilePrototypeId)
  83. {
  84. continue;
  85. }
  86. mapSystem.SetTile(gridId.Value, grid, childTransform.Coordinates, underplatingTile);
  87. changed++;
  88. }
  89. shell.WriteLine($"Changed {changed} tiles.");
  90. }
  91. }