From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Tue, 26 Mar 2024 04:44:56 +0000 (+1100) Subject: Fix atmos NaN error (#26441) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=fdb4a61487db9fc67714c913832427063abdea42;p=space-station-14.git Fix atmos NaN error (#26441) * Fix atmos NAN error * Remove redundant yaml entries --- diff --git a/Content.Server/Atmos/Components/AirtightComponent.cs b/Content.Server/Atmos/Components/AirtightComponent.cs index ca107eafbe..69488a7130 100644 --- a/Content.Server/Atmos/Components/AirtightComponent.cs +++ b/Content.Server/Atmos/Components/AirtightComponent.cs @@ -9,27 +9,53 @@ namespace Content.Server.Atmos.Components { 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 548d6a3692..152fba8fc4 100644 --- a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs @@ -85,8 +85,6 @@ namespace Content.Server.Atmos.EntitySystems 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 d43cc81b0f..beddef4be7 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs @@ -399,10 +399,7 @@ public sealed partial class AtmosphereSystem 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 @@ public sealed partial class AtmosphereSystem 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 1f3ca2145b..eba398c182 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs @@ -272,7 +272,7 @@ namespace Content.Server.Atmos.EntitySystems 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 9b0d0d9670..67c6d5998d 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs @@ -78,12 +78,13 @@ public partial class AtmosphereSystem 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 77fd701833..3d73a4d0b1 100644 --- a/Content.Server/Atmos/GasMixture.cs +++ b/Content.Server/Atmos/GasMixture.cs @@ -62,9 +62,9 @@ namespace Content.Server.Atmos 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 @@ namespace Content.Server.Atmos 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 0dd35a29e7..0026dbbf4f 100644 --- a/Content.Server/Atmos/TileAtmosphere.cs +++ b/Content.Server/Atmos/TileAtmosphere.cs @@ -28,6 +28,9 @@ namespace Content.Server.Atmos [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 5fca081998..53a32e0f6f 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 60ee2203ca..a26226c957 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 21d485be0c..9771f63388 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 dccc76e96c..e677ef185b 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 4b6f72de93..8dfe2f62a5 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 2c54d3cd41..d6c087af0a 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 e38ba1fd66..1819c9d0ef 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 56167c178e..d03765d4fc 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 8c53daf3b6..bf49eb1be3 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