diff --git a/Content.Server/Atmos/Components/AirtightComponent.cs b/Content.Server/Atmos/Components/AirtightComponent.cs
index ca107eafbe8a31..69488a71307ee7 100644
--- a/Content.Server/Atmos/Components/AirtightComponent.cs
+++ b/Content.Server/Atmos/Components/AirtightComponent.cs
@@ -9,27 +9,53 @@ public sealed partial class AirtightComponent : Component
{
public (EntityUid Grid, Vector2i Tile) LastPosition { get; set; }
+ ///
+ /// The directions in which this entity should block airflow, relative to its own reference frame.
+ ///
[DataField("airBlockedDirection", customTypeSerializer: typeof(FlagSerializer))]
public int InitialAirBlockedDirection { get; set; } = (int) AtmosDirection.All;
+ ///
+ /// The directions in which the entity is currently blocking airflow, relative to the grid that the entity is on.
+ /// I.e., this is a variant of that takes into account the entity's
+ /// current rotation.
+ ///
[ViewVariables]
public int CurrentAirBlockedDirection;
- [DataField("airBlocked")]
+ ///
+ /// Whether the airtight entity is currently blocking airflow.
+ ///
+ [DataField]
public bool AirBlocked { get; set; } = true;
- [DataField("fixVacuum")]
+ ///
+ /// If true, entities on this tile will attempt to draw air from surrounding tiles when they become unblocked
+ /// and currently have no air. This is generally only required when is
+ /// true, or if the entity is likely to occupy the same tile as another no-air airtight entity.
+ ///
+ [DataField]
public bool FixVacuum { get; set; } = true;
+ // I think fixvacuum exists to ensure that repeatedly closing/opening air-blocking doors doesn't end up
+ // depressurizing a room. However it can also effectively be used as a means of generating gasses for free
+ // TODO ATMOS Mass conservation. Make it actually push/pull air from adjacent tiles instead of destroying & creating,
+
+ // TODO ATMOS Do we need these two fields?
[DataField("rotateAirBlocked")]
public bool RotateAirBlocked { get; set; } = true;
+ // TODO ATMOS remove this? What is this even for??
[DataField("fixAirBlockedDirectionInitialize")]
public bool FixAirBlockedDirectionInitialize { get; set; } = true;
- [DataField("noAirWhenFullyAirBlocked")]
+ ///
+ /// If true, then the tile that this entity is on will have no air at all if all directions are blocked.
+ ///
+ [DataField]
public bool NoAirWhenFullyAirBlocked { get; set; } = true;
+ ///
[Access(Other = AccessPermissions.ReadWriteExecute)]
public AtmosDirection AirBlockedDirection => (AtmosDirection)CurrentAirBlockedDirection;
}
diff --git a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs
index 548d6a36926b76..152fba8fc4d8fc 100644
--- a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs
+++ b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs
@@ -85,8 +85,6 @@ private void OnAirtightMoved(Entity airtight, ref MoveEvent e
private bool AirtightMove(Entity ent, ref MoveEvent ev)
{
var (owner, airtight) = ent;
- if (!airtight.RotateAirBlocked || airtight.InitialAirBlockedDirection == (int)AtmosDirection.Invalid)
- return false;
airtight.CurrentAirBlockedDirection = (int) Rotate((AtmosDirection)airtight.InitialAirBlockedDirection, ev.NewRotation);
var pos = airtight.LastPosition;
diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs
index d43cc81b0f8be9..beddef4be7e1b6 100644
--- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs
+++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs
@@ -399,10 +399,7 @@ private void GridIsHotspotActive(EntityUid uid, GridAtmosphereComponent componen
args.Handled = true;
}
- private void GridFixTileVacuum(
- Entity ent,
- TileAtmosphere tile,
- float volume)
+ private void GridFixTileVacuum(TileAtmosphere tile)
{
DebugTools.AssertNotNull(tile.Air);
DebugTools.Assert(tile.Air?.Immutable == false );
@@ -416,6 +413,9 @@ private void GridFixTileVacuum(
count++;
}
+ if (count == 0)
+ return;
+
var ratio = 1f / count;
var totalTemperature = 0f;
diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs
index 1f3ca2145b9716..eba398c182104a 100644
--- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs
+++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs
@@ -272,7 +272,7 @@ private void UpdateTileAir(
tile.Air = new GasMixture(volume){Temperature = Atmospherics.T20C};
if (data.FixVacuum)
- GridFixTileVacuum(ent, tile, volume);
+ GridFixTileVacuum(tile);
}
private void QueueRunTiles(
diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs
index 9b0d0d9670d4a3..67c6d5998dd544 100644
--- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs
+++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs
@@ -78,12 +78,13 @@ private AirtightData GetAirtightData(EntityUid uid, MapGridComponent grid, Vecto
if (!_airtightQuery.TryGetComponent(ent, out var airtight))
continue;
+ fixVacuum |= airtight.FixVacuum;
+
if(!airtight.AirBlocked)
continue;
blockedDirs |= airtight.AirBlockedDirection;
noAirWhenBlocked |= airtight.NoAirWhenFullyAirBlocked;
- fixVacuum |= airtight.FixVacuum;
if (blockedDirs == AtmosDirection.All && noAirWhenBlocked && fixVacuum)
break;
diff --git a/Content.Server/Atmos/GasMixture.cs b/Content.Server/Atmos/GasMixture.cs
index 77fd7018333b03..3d73a4d0b1636f 100644
--- a/Content.Server/Atmos/GasMixture.cs
+++ b/Content.Server/Atmos/GasMixture.cs
@@ -62,9 +62,9 @@ public float Temperature
get => _temperature;
set
{
- DebugTools.Assert(!float.IsNaN(_temperature));
- if (Immutable) return;
- _temperature = MathF.Min(MathF.Max(value, Atmospherics.TCMB), Atmospherics.Tmax);
+ DebugTools.Assert(!float.IsNaN(value));
+ if (!Immutable)
+ _temperature = MathF.Min(MathF.Max(value, Atmospherics.TCMB), Atmospherics.Tmax);
}
}
@@ -91,6 +91,7 @@ public GasMixture(float[] moles, float temp, float volume = Atmospherics.CellVol
if (volume < 0)
volume = 0;
+ DebugTools.Assert(!float.IsNaN(temp));
_temperature = temp;
Moles = moles;
Volume = volume;
diff --git a/Content.Server/Atmos/TileAtmosphere.cs b/Content.Server/Atmos/TileAtmosphere.cs
index 0dd35a29e76276..0026dbbf4f043e 100644
--- a/Content.Server/Atmos/TileAtmosphere.cs
+++ b/Content.Server/Atmos/TileAtmosphere.cs
@@ -28,6 +28,9 @@ public sealed class TileAtmosphere : IGasMixtureHolder
[ViewVariables]
public TileAtmosphere? PressureSpecificTarget { get; set; }
+ ///
+ /// This is either the pressure difference, or the quantity of moles transferred if monstermos is enabled.
+ ///
[ViewVariables]
public float PressureDifference { get; set; }
diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml
index 5fca0819984247..53a32e0f6fa5d4 100644
--- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml
+++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml
@@ -104,7 +104,6 @@
- key: enum.WiresUiKey.Key
type: WiresBoundUserInterface
- type: Airtight
- fixVacuum: true
noAirWhenFullyAirBlocked: false
- type: RadiationBlocker
resistance: 3
diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml
index 60ee2203ca5069..a26226c957899d 100644
--- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml
+++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml
@@ -80,7 +80,6 @@
- key: enum.WiresUiKey.Key
type: WiresBoundUserInterface
- type: Airtight
- fixVacuum: true
- type: Occluder
- type: Damageable
damageContainer: StructuralInorganic
diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml
index 21d485be0c89de..9771f633888b6f 100644
--- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml
+++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml
@@ -57,7 +57,6 @@
denySound:
path: /Audio/Machines/airlock_deny.ogg
- type: Airtight
- fixVacuum: true
noAirWhenFullyAirBlocked: false
- type: Tag
tags:
diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml
index dccc76e96c1a10..e677ef185be6b0 100644
--- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml
+++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml
@@ -93,7 +93,6 @@
- type: Physics
canCollide: false
- type: Airtight
- fixVacuum: true
airBlocked: false
noAirWhenFullyAirBlocked: true
- type: RadiationBlocker
@@ -158,7 +157,6 @@
sprite: Structures/Doors/edge_door_hazard.rsi
snapCardinals: false
- type: Airtight
- fixVacuum: true
airBlocked: false
noAirWhenFullyAirBlocked: false
airBlockedDirection:
diff --git a/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml b/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml
index 4b6f72de934b17..8dfe2f62a51a2d 100644
--- a/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml
+++ b/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml
@@ -40,7 +40,6 @@
path: /Audio/Effects/stonedoor_openclose.ogg
- type: Appearance
- type: Airtight
- fixVacuum: true
- type: Damageable
damageContainer: Inorganic
damageModifierSet: Metallic
diff --git a/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml b/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml
index 2c54d3cd41875e..d6c087af0a5e3a 100644
--- a/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml
+++ b/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml
@@ -38,7 +38,6 @@
- type: Weldable
time: 2
- type: Airtight
- fixVacuum: true
- type: Damageable
damageContainer: Inorganic
damageModifierSet: Metallic
diff --git a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml
index e38ba1fd6674a8..1819c9d0ef2964 100644
--- a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml
+++ b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml
@@ -59,7 +59,6 @@
- key: enum.WiresUiKey.Key
type: WiresBoundUserInterface
- type: Airtight
- fixVacuum: true
- type: RadiationBlocker
resistance: 2
- type: Damageable
diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml
index 56167c178e2e28..d03765d4fc9e52 100644
--- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml
+++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml
@@ -130,7 +130,6 @@
- type: Appearance
- type: WiresVisuals
- type: Airtight
- fixVacuum: true
noAirWhenFullyAirBlocked: false
airBlockedDirection:
- South
diff --git a/Resources/Prototypes/Entities/Structures/plastic_flaps.yml b/Resources/Prototypes/Entities/Structures/plastic_flaps.yml
index 8c53daf3b60db5..bf49eb1be35a8b 100644
--- a/Resources/Prototypes/Entities/Structures/plastic_flaps.yml
+++ b/Resources/Prototypes/Entities/Structures/plastic_flaps.yml
@@ -83,7 +83,6 @@
- !type:DoActsBehavior
acts: ["Destruction"]
- type: Airtight
- fixVacuum: true
- type: entity
id: PlasticFlapsAirtightOpaque
@@ -101,4 +100,3 @@
- !type:DoActsBehavior
acts: ["Destruction"]
- type: Airtight
- fixVacuum: true