diff --git a/Content.Server/Atmos/AtmosCommands.cs b/Content.Server/Atmos/AtmosCommands.cs index 60b8fecd81..c6990433d9 100644 --- a/Content.Server/Atmos/AtmosCommands.cs +++ b/Content.Server/Atmos/AtmosCommands.cs @@ -323,60 +323,6 @@ namespace Content.Server.Atmos } } - public class ClearAtmos : IClientCommand - { - public string Command => "clearatmos"; - public string Description => "Clear a grid of all gases."; - public string Help => "clearatmos "; - public void Execute(IConsoleShell shell, IPlayerSession? player, string[] args) - { - if (args.Length < 1) return; - if (!int.TryParse(args[0], out var id)) - { - shell.SendText(player, "Not enough arguments!"); - } - - var gridId = new GridId(id); - - var mapMan = IoCManager.Resolve(); - - if (!gridId.IsValid() || !mapMan.TryGetGrid(gridId, out var gridComp)) - { - shell.SendText(player, "Invalid grid ID."); - return; - } - - var entMan = IoCManager.Resolve(); - - if (!entMan.TryGetEntity(gridComp.GridEntityId, out var grid)) - { - shell.SendText(player, "Failed to get grid entity."); - return; - } - - if (!grid.HasComponent()) - { - shell.SendText(player, "Grid doesn't have an atmosphere."); - return; - } - - var gam = grid.GetComponent(); - - var tiles = 0; - var moles = 0f; - foreach (var tile in gam) - { - if (tile.Air == null || tile.Air.Immutable) continue; - tiles++; - moles += tile.Air.TotalMoles; - tile.Air.RemoveRatio(1f); - gam.Invalidate(tile.GridIndices); - } - - shell.SendText(player, $"Removed {moles} moles from {tiles} tiles."); - } - } - public class SetTemperature : IClientCommand { public string Command => "settemp"; @@ -499,4 +445,180 @@ namespace Content.Server.Atmos shell.SendText(player, $"Changed the temperature of {tiles} tiles."); } } + + public class DeleteGasCommand : IClientCommand + { + public string Command => "deletegas"; + public string Description => "Removes all gases from a grid, or just of one type if specified."; + public string Help => $"Usage: {Command} / {Command} / {Command} / {Command}"; + + public void Execute(IConsoleShell shell, IPlayerSession? player, string[] args) + { + GridId gridId; + Gas? gas = null; + + switch (args.Length) + { + case 0: + if (player == null) + { + shell.SendText(player, "A grid must be specified when the command isn't used by a player."); + return; + } + + if (player.AttachedEntity == null) + { + shell.SendText(player, "You have no entity to get a grid from."); + return; + } + + gridId = player.AttachedEntity.Transform.GridID; + + if (gridId == GridId.Invalid) + { + shell.SendText(player, "You aren't on a grid to delete gas from."); + return; + } + + break; + case 1: + { + if (!int.TryParse(args[0], out var number)) + { + // Argument is a gas + if (player == null) + { + shell.SendText(player, "A grid id must be specified if not using this command as a player."); + return; + } + + if (player.AttachedEntity == null) + { + shell.SendText(player, "You have no entity from which to get a grid id."); + return; + } + + gridId = player.AttachedEntity.Transform.GridID; + + if (gridId == GridId.Invalid) + { + shell.SendText(player, "You aren't on a grid to delete gas from."); + return; + } + + if (!Enum.TryParse(args[0], true, out var parsedGas)) + { + shell.SendText(player, $"{args[0]} is not a valid gas name."); + return; + } + + gas = parsedGas; + break; + } + + // Argument is a grid + gridId = new GridId(number); + + if (gridId == GridId.Invalid) + { + shell.SendText(player, $"{gridId} is not a valid grid id."); + return; + } + + break; + } + case 2: + { + if (!int.TryParse(args[0], out var first)) + { + shell.SendText(player, $"{args[0]} is not a valid integer for a grid id."); + return; + } + + gridId = new GridId(first); + + if (gridId == GridId.Invalid) + { + shell.SendText(player, $"{gridId} is not a valid grid id."); + return; + } + + if (!Enum.TryParse(args[1], true, out var parsedGas)) + { + shell.SendText(player, $"{args[1]} is not a valid gas."); + return; + } + + gas = parsedGas; + + break; + } + default: + shell.SendText(player, Help); + return; + } + + var mapManager = IoCManager.Resolve(); + + if (!mapManager.TryGetGrid(gridId, out var grid)) + { + shell.SendText(player, $"No grid exists with id {gridId}"); + return; + } + + var entityManager = IoCManager.Resolve(); + + if (!entityManager.TryGetEntity(grid.GridEntityId, out var gridEntity)) + { + shell.SendText(player, $"Grid {gridId} has no entity."); + return; + } + + if (!gridEntity.TryGetComponent(out GridAtmosphereComponent? atmosphere)) + { + shell.SendText(player, $"Grid {gridId} has no {nameof(GridAtmosphereComponent)}"); + return; + } + + var tiles = 0; + var moles = 0f; + + if (gas == null) + { + foreach (var tile in atmosphere) + { + if (tile.Air == null || tile.Air.Immutable) continue; + + tiles++; + moles += tile.Air.TotalMoles; + + tile.Air.Clear(); + + atmosphere.Invalidate(tile.GridIndices); + } + } + else + { + foreach (var tile in atmosphere) + { + if (tile.Air == null || tile.Air.Immutable) continue; + + tiles++; + moles += tile.Air.TotalMoles; + + tile.Air.SetMoles(gas.Value, 0); + + atmosphere.Invalidate(tile.GridIndices); + } + } + + if (gas == null) + { + shell.SendText(player, $"Removed {moles} moles from {tiles} tiles."); + return; + } + + shell.SendText(player, $"Removed {moles} moles of gas {gas} from {tiles} tiles."); + } + } } diff --git a/Resources/Groups/groups.yml b/Resources/Groups/groups.yml index 8762c7c671..9817a40c29 100644 --- a/Resources/Groups/groups.yml +++ b/Resources/Groups/groups.yml @@ -192,9 +192,9 @@ - fillgas - listgases - removegas - - clearatmos - settemp - setatmostemp + - deletegas - tilewalls - events - destroymechanism