2022-06-28 11:08:29 +02:00
using System.Linq ;
2022-01-12 11:05:39 +01:00
using Content.Server.Administration ;
using Content.Server.Atmos.Components ;
using Content.Shared.Administration ;
using Content.Shared.Atmos ;
2022-07-04 16:51:34 +02:00
using Content.Shared.Maps ;
2022-01-12 11:05:39 +01:00
using Robust.Shared.Console ;
using Robust.Shared.Map ;
2022-11-22 13:12:04 +11:00
using Robust.Shared.Map.Components ;
2022-01-12 11:05:39 +01:00
namespace Content.Server.Atmos.EntitySystems ;
2022-02-16 00:23:23 -07:00
public sealed partial class AtmosphereSystem
2022-01-12 11:05:39 +01:00
{
[Dependency] private readonly IConsoleHost _consoleHost = default ! ;
private void InitializeCommands ( )
{
// Fix Grid Atmos command.
_consoleHost . RegisterCommand ( "fixgridatmos" ,
"Makes every tile on a grid have a roundstart gas mix." ,
2022-06-28 11:08:29 +02:00
"fixgridatmos <grid Ids>" , FixGridAtmosCommand , FixGridAtmosCommandCompletions ) ;
2022-01-12 11:05:39 +01:00
}
private void ShutdownCommands ( )
{
_consoleHost . UnregisterCommand ( "fixgridatmos" ) ;
}
[AdminCommand(AdminFlags.Debug)]
private void FixGridAtmosCommand ( IConsoleShell shell , string argstr , string [ ] args )
{
if ( args . Length = = 0 )
{
shell . WriteError ( "Not enough arguments." ) ;
return ;
}
2022-07-02 22:13:52 -04:00
var mixtures = new GasMixture [ 7 ] ;
2022-01-12 11:05:39 +01:00
for ( var i = 0 ; i < mixtures . Length ; i + + )
mixtures [ i ] = new GasMixture ( Atmospherics . CellVolume ) { Temperature = Atmospherics . T20C } ;
// 0: Air
mixtures [ 0 ] . AdjustMoles ( Gas . Oxygen , Atmospherics . OxygenMolesStandard ) ;
mixtures [ 0 ] . AdjustMoles ( Gas . Nitrogen , Atmospherics . NitrogenMolesStandard ) ;
// 1: Vaccum
// 2: Oxygen (GM)
mixtures [ 2 ] . AdjustMoles ( Gas . Oxygen , Atmospherics . MolesCellGasMiner ) ;
// 3: Nitrogen (GM)
mixtures [ 3 ] . AdjustMoles ( Gas . Nitrogen , Atmospherics . MolesCellGasMiner ) ;
// 4: Plasma (GM)
mixtures [ 4 ] . AdjustMoles ( Gas . Plasma , Atmospherics . MolesCellGasMiner ) ;
// 5: Instant Plasmafire (r)
mixtures [ 5 ] . AdjustMoles ( Gas . Oxygen , Atmospherics . MolesCellGasMiner ) ;
mixtures [ 5 ] . AdjustMoles ( Gas . Plasma , Atmospherics . MolesCellGasMiner ) ;
mixtures [ 5 ] . Temperature = 5000f ;
2022-07-02 22:13:52 -04:00
// 6: (Walk-In) Freezer
mixtures [ 6 ] . AdjustMoles ( Gas . Oxygen , Atmospherics . OxygenMolesStandard ) ;
mixtures [ 6 ] . AdjustMoles ( Gas . Nitrogen , Atmospherics . NitrogenMolesStandard ) ;
mixtures [ 6 ] . Temperature = 235f ; // Little colder than an actual freezer but gives a grace period to get e.g. themomachines set up, should keep warm for a few door openings
2022-06-28 11:08:29 +02:00
foreach ( var arg in args )
2022-01-12 11:05:39 +01:00
{
2023-09-11 09:42:41 +10:00
if ( ! NetEntity . TryParse ( arg , out var netEntity ) | | ! TryGetEntity ( netEntity , out var euid ) )
2022-01-12 11:05:39 +01:00
{
2022-06-28 11:08:29 +02:00
shell . WriteError ( $"Failed to parse euid '{arg}'." ) ;
2022-06-11 18:54:41 -07:00
return ;
2022-01-12 11:05:39 +01:00
}
2022-11-04 10:12:25 +11:00
if ( ! TryComp ( euid , out MapGridComponent ? gridComp ) )
2022-01-12 11:05:39 +01:00
{
2022-06-11 18:54:41 -07:00
shell . WriteError ( $"Euid '{euid}' does not exist or is not a grid." ) ;
return ;
2022-01-12 11:05:39 +01:00
}
2022-06-11 18:54:41 -07:00
if ( ! TryComp ( euid , out GridAtmosphereComponent ? gridAtmosphere ) )
2022-01-12 11:05:39 +01:00
{
2022-06-11 18:54:41 -07:00
shell . WriteError ( $"Grid \" { euid } \ " has no atmosphere component, try addatmos." ) ;
2022-01-12 11:05:39 +01:00
continue ;
}
2023-09-11 09:42:41 +10:00
var transform = Transform ( euid . Value ) ;
2022-07-04 16:51:34 +02:00
2022-01-12 11:05:39 +01:00
foreach ( var ( indices , tileMain ) in gridAtmosphere . Tiles )
{
var tile = tileMain . Air ;
if ( tile = = null )
continue ;
2022-07-04 16:51:34 +02:00
if ( tile . Immutable & & ! IsTileSpace ( euid , transform . MapUid , indices , gridComp ) )
{
tile = new GasMixture ( tile . Volume ) { Temperature = tile . Temperature } ;
tileMain . Air = tile ;
}
2022-01-12 11:05:39 +01:00
tile . Clear ( ) ;
var mixtureId = 0 ;
2022-11-22 13:12:04 +11:00
foreach ( var entUid in gridComp . GetAnchoredEntities ( indices ) )
2022-01-12 11:05:39 +01:00
{
if ( ! TryComp ( entUid , out AtmosFixMarkerComponent ? afm ) )
continue ;
mixtureId = afm . Mode ;
break ;
}
var mixture = mixtures [ mixtureId ] ;
Merge ( tile , mixture ) ;
tile . Temperature = mixture . Temperature ;
2022-07-04 16:51:34 +02:00
gridAtmosphere . InvalidatedCoords . Add ( indices ) ;
2022-01-12 11:05:39 +01:00
}
}
}
2022-06-28 11:08:29 +02:00
private CompletionResult FixGridAtmosCommandCompletions ( IConsoleShell shell , string [ ] args )
{
MapId ? playerMap = null ;
if ( shell . Player is { AttachedEntity : { } playerEnt } )
playerMap = Transform ( playerEnt ) . MapID ;
2022-11-01 11:27:18 +11:00
var options = new List < CompletionOption > ( ) ;
if ( playerMap = = null )
return CompletionResult . FromOptions ( options ) ;
2022-12-12 14:59:02 +11:00
foreach ( var grid in _mapManager . GetAllMapGrids ( playerMap . Value ) . OrderBy ( o = > o . Owner ) )
2022-11-01 11:27:18 +11:00
{
2022-12-12 14:59:02 +11:00
if ( ! TryComp < TransformComponent > ( grid . Owner , out var gridXform ) )
2022-11-01 11:27:18 +11:00
continue ;
2022-12-12 14:59:02 +11:00
options . Add ( new CompletionOption ( grid . Owner . ToString ( ) , $"{MetaData(grid.Owner).EntityName} - Map {gridXform.MapID}" ) ) ;
2022-11-01 11:27:18 +11:00
}
2022-06-28 11:08:29 +02:00
return CompletionResult . FromOptions ( options ) ;
}
2022-01-12 11:05:39 +01:00
}