* Refactors the entirety of the AtmosphereSystem public-facing API to allow for multiple atmos backends. * actually compiles * Remove commented out code * funny bracket * Move archived moles, temperature from GasMixture to TileAtmosphere. * WIP customizable map default mixture still VERY buggy * broken mess aaaaaaaaaaaaa * Fix lattice, etc not being considered space * visualization for "IsSpace" * help * Update Content.Client/Atmos/Overlays/AtmosDebugOverlay.cs Co-authored-by: Moony <moonheart08@users.noreply.github.com> * Holy SHIT it compiles AGAIN * Fix AtmosDeviceSystem crash at shutdown * Fix immutable tiles on map blueprints not being fixed by fixgridatmos/revalidate. * Use space instead of gasmixture immutable for heat capacity calculations * Remove all LINDA-specific code from GasMixture, move it to TileAtmosphere/AtmosphereSystem instead. * Fix roundstart tiles not processing * Update Content.Server/Atmos/Commands/SetTemperatureCommand.cs Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Update Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs Changed Files tab is so large I can't commit both suggestions at once mfw Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: Moony <moonheart08@users.noreply.github.com> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
129 lines
4.1 KiB
C#
129 lines
4.1 KiB
C#
using Content.Server.Atmos.EntitySystems;
|
|
using Content.Server.Atmos.Piping.Components;
|
|
using Content.Server.NodeContainer.NodeGroups;
|
|
using Robust.Shared.Serialization;
|
|
|
|
namespace Content.Server.Atmos.Components
|
|
{
|
|
/// <summary>
|
|
/// Internal Atmos class. Use <see cref="AtmosphereSystem"/> to interact with atmos instead.
|
|
/// </summary>
|
|
[RegisterComponent, Serializable,
|
|
Access(typeof(AtmosphereSystem), typeof(GasTileOverlaySystem), typeof(AtmosDebugOverlaySystem))]
|
|
public sealed class GridAtmosphereComponent : Component, ISerializationHooks
|
|
{
|
|
[ViewVariables(VVAccess.ReadWrite)]
|
|
public bool Simulated { get; set; } = true;
|
|
|
|
[ViewVariables]
|
|
public bool ProcessingPaused { get; set; } = false;
|
|
|
|
[ViewVariables]
|
|
public float Timer { get; set; } = 0f;
|
|
|
|
[ViewVariables]
|
|
public int UpdateCounter { get; set; } = 1; // DO NOT SET TO ZERO BY DEFAULT! It will break roundstart atmos...
|
|
|
|
[DataField("uniqueMixes")]
|
|
public List<GasMixture>? UniqueMixes;
|
|
|
|
[DataField("tiles")]
|
|
public Dictionary<Vector2i, int>? TilesUniqueMixes;
|
|
|
|
[ViewVariables]
|
|
public readonly Dictionary<Vector2i, TileAtmosphere> Tiles = new(1000);
|
|
|
|
[ViewVariables]
|
|
public readonly HashSet<TileAtmosphere> ActiveTiles = new(1000);
|
|
|
|
[ViewVariables]
|
|
public int ActiveTilesCount => ActiveTiles.Count;
|
|
|
|
[ViewVariables]
|
|
public readonly HashSet<ExcitedGroup> ExcitedGroups = new(1000);
|
|
|
|
[ViewVariables]
|
|
public int ExcitedGroupCount => ExcitedGroups.Count;
|
|
|
|
[ViewVariables]
|
|
public readonly HashSet<TileAtmosphere> HotspotTiles = new(1000);
|
|
|
|
[ViewVariables]
|
|
public int HotspotTilesCount => HotspotTiles.Count;
|
|
|
|
[ViewVariables]
|
|
public readonly HashSet<TileAtmosphere> SuperconductivityTiles = new(1000);
|
|
|
|
[ViewVariables]
|
|
public int SuperconductivityTilesCount => SuperconductivityTiles.Count;
|
|
|
|
[ViewVariables]
|
|
public HashSet<TileAtmosphere> HighPressureDelta = new(1000);
|
|
|
|
[ViewVariables]
|
|
public int HighPressureDeltaCount => HighPressureDelta.Count;
|
|
|
|
[ViewVariables]
|
|
public readonly HashSet<IPipeNet> PipeNets = new();
|
|
|
|
[ViewVariables]
|
|
public readonly HashSet<AtmosDeviceComponent> AtmosDevices = new();
|
|
|
|
[ViewVariables]
|
|
public Queue<TileAtmosphere> CurrentRunTiles = new();
|
|
|
|
[ViewVariables]
|
|
public Queue<ExcitedGroup> CurrentRunExcitedGroups = new();
|
|
|
|
[ViewVariables]
|
|
public Queue<IPipeNet> CurrentRunPipeNet = new();
|
|
|
|
[ViewVariables]
|
|
public Queue<AtmosDeviceComponent> CurrentRunAtmosDevices = new();
|
|
|
|
[ViewVariables]
|
|
public readonly HashSet<Vector2i> InvalidatedCoords = new(1000);
|
|
|
|
[ViewVariables]
|
|
public Queue<Vector2i> CurrentRunInvalidatedCoordinates = new();
|
|
|
|
[ViewVariables]
|
|
public int InvalidatedCoordsCount => InvalidatedCoords.Count;
|
|
|
|
[ViewVariables]
|
|
public long EqualizationQueueCycleControl { get; set; }
|
|
|
|
[ViewVariables]
|
|
public AtmosphereProcessingState State { get; set; } = AtmosphereProcessingState.Revalidate;
|
|
|
|
void ISerializationHooks.BeforeSerialization()
|
|
{
|
|
var uniqueMixes = new List<GasMixture>();
|
|
var uniqueMixHash = new Dictionary<GasMixture, int>();
|
|
var tiles = new Dictionary<Vector2i, int>();
|
|
|
|
foreach (var (indices, tile) in Tiles)
|
|
{
|
|
if (tile.Air == null) continue;
|
|
|
|
if (uniqueMixHash.TryGetValue(tile.Air, out var index))
|
|
{
|
|
tiles[indices] = index;
|
|
continue;
|
|
}
|
|
|
|
uniqueMixes.Add(tile.Air);
|
|
var newIndex = uniqueMixes.Count - 1;
|
|
uniqueMixHash[tile.Air] = newIndex;
|
|
tiles[indices] = newIndex;
|
|
}
|
|
|
|
if (uniqueMixes.Count == 0) uniqueMixes = null;
|
|
if (tiles.Count == 0) tiles = null;
|
|
|
|
UniqueMixes = uniqueMixes;
|
|
TilesUniqueMixes = tiles;
|
|
}
|
|
}
|
|
}
|