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 ;
2024-06-26 11:56:38 +00:00
using Content.Shared.Atmos.Components ;
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 ;
}
2024-06-26 11:56:38 +00:00
// Force Invalidate & update air on all tiles
Entity < GridAtmosphereComponent , GasTileOverlayComponent , MapGridComponent , TransformComponent > grid =
new ( euid . Value , gridAtmosphere , Comp < GasTileOverlayComponent > ( euid . Value ) , gridComp , Transform ( euid . Value ) ) ;
2022-07-04 16:51:34 +02:00
2024-06-26 11:56:38 +00:00
RebuildGridTiles ( grid ) ;
2022-01-12 11:05:39 +01:00
2024-06-26 11:56:38 +00:00
var query = GetEntityQuery < AtmosFixMarkerComponent > ( ) ;
foreach ( var ( indices , tile ) in gridAtmosphere . Tiles . ToArray ( ) )
{
if ( tile . Air is not { Immutable : false } air )
2024-03-25 03:17:56 +11:00
continue ;
2024-06-26 11:56:38 +00:00
air . Clear ( ) ;
2022-01-12 11:05:39 +01:00
var mixtureId = 0 ;
2024-06-26 11:56:38 +00:00
var enumerator = _mapSystem . GetAnchoredEntitiesEnumerator ( grid , grid , indices ) ;
while ( enumerator . MoveNext ( out var entUid ) )
2022-01-12 11:05:39 +01:00
{
2024-06-26 11:56:38 +00:00
if ( query . TryComp ( entUid , out var marker ) )
mixtureId = marker . Mode ;
2022-01-12 11:05:39 +01:00
}
2024-06-26 11:56:38 +00:00
var mixture = mixtures [ mixtureId ] ;
Merge ( air , mixture ) ;
air . Temperature = mixture . Temperature ;
2022-01-12 11:05:39 +01:00
}
}
}
2022-06-28 11:08:29 +02:00
2024-06-26 11:56:38 +00:00
/// <summary>
/// Clears & re-creates all references to <see cref="TileAtmosphere"/>s stored on a grid.
/// </summary>
private void RebuildGridTiles (
Entity < GridAtmosphereComponent , GasTileOverlayComponent , MapGridComponent , TransformComponent > ent )
{
foreach ( var indices in ent . Comp1 . Tiles . Keys )
{
InvalidateVisuals ( ( ent , ent ) , indices ) ;
}
var atmos = ent . Comp1 ;
atmos . MapTiles . Clear ( ) ;
atmos . ActiveTiles . Clear ( ) ;
atmos . ExcitedGroups . Clear ( ) ;
atmos . HotspotTiles . Clear ( ) ;
atmos . SuperconductivityTiles . Clear ( ) ;
atmos . HighPressureDelta . Clear ( ) ;
atmos . CurrentRunTiles . Clear ( ) ;
atmos . CurrentRunExcitedGroups . Clear ( ) ;
atmos . InvalidatedCoords . Clear ( ) ;
atmos . CurrentRunInvalidatedTiles . Clear ( ) ;
atmos . PossiblyDisconnectedTiles . Clear ( ) ;
atmos . Tiles . Clear ( ) ;
var volume = GetVolumeForTiles ( ent ) ;
TryComp ( ent . Comp4 . MapUid , out MapAtmosphereComponent ? mapAtmos ) ;
var enumerator = _map . GetAllTilesEnumerator ( ent , ent ) ;
while ( enumerator . MoveNext ( out var tileRef ) )
{
var tile = GetOrNewTile ( ent , ent , tileRef . Value . GridIndices ) ;
UpdateTileData ( ent , mapAtmos , tile ) ;
UpdateAdjacentTiles ( ent , tile , activate : true ) ;
UpdateTileAir ( ent , tile , volume ) ;
}
}
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 ) ;
2023-10-19 12:34:31 -07:00
foreach ( var grid in _mapManager . GetAllGrids ( playerMap . Value ) . OrderBy ( o = > o . Owner ) )
2022-11-01 11:27:18 +11:00
{
2023-10-19 12:34:31 -07:00
var uid = grid . Owner ;
2024-10-04 11:27:12 +03:00
if ( ! TryComp ( uid , out TransformComponent ? gridXform ) )
2022-11-01 11:27:18 +11:00
continue ;
2023-10-19 12:34:31 -07:00
options . Add ( new CompletionOption ( uid . ToString ( ) , $"{MetaData(uid).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
}