diff --git a/Content.IntegrationTests/Tests/Atmos/GridJoinTest.cs b/Content.IntegrationTests/Tests/Atmos/GridJoinTest.cs new file mode 100644 index 000000000000..3a1ec7fd40eb --- /dev/null +++ b/Content.IntegrationTests/Tests/Atmos/GridJoinTest.cs @@ -0,0 +1,53 @@ +using Content.Server.Atmos.Components; +using Content.Server.Atmos.EntitySystems; +using Content.Server.Atmos.Piping.Components; +using Content.Server.Atmos.Piping.EntitySystems; +using Robust.Shared.GameObjects; + +namespace Content.IntegrationTests.Tests.Atmos; + +[TestFixture] +public sealed class GridJoinTest +{ + private const string CanisterProtoId = "AirCanister"; + + [Test] + public async Task TestGridJoinAtmosphere() + { + await using var pair = await PoolManager.GetServerClient(); + var server = pair.Server; + + var entMan = server.EntMan; + var protoMan = server.ProtoMan; + var atmosSystem = entMan.System(); + var atmosDeviceSystem = entMan.System(); + var transformSystem = entMan.System(); + + var testMap = await pair.CreateTestMap(); + + await server.WaitPost(() => + { + // Spawn an atmos device on the grid + var canister = entMan.Spawn(CanisterProtoId); + transformSystem.SetCoordinates(canister, testMap.GridCoords); + var deviceComp = entMan.GetComponent(canister); + var canisterEnt = (canister, deviceComp); + + // Make sure the canister is tracked as an off-grid device + Assert.That(atmosDeviceSystem.IsJoinedOffGrid(canisterEnt)); + + // Add an atmosphere to the grid + entMan.AddComponent(testMap.Grid); + + // Force AtmosDeviceSystem to update off-grid devices + // This means the canister is now considered on-grid, + // but it's still tracked as off-grid! + Assert.DoesNotThrow(() => atmosDeviceSystem.Update(atmosSystem.AtmosTime)); + + // Make sure that the canister is now properly tracked as on-grid + Assert.That(atmosDeviceSystem.IsJoinedOffGrid(canisterEnt), Is.False); + }); + + await pair.CleanReturnAsync(); + } +} diff --git a/Content.Server/Atmos/Piping/EntitySystems/AtmosDeviceSystem.cs b/Content.Server/Atmos/Piping/EntitySystems/AtmosDeviceSystem.cs index 3c73a8f64ee9..f932ef36208e 100644 --- a/Content.Server/Atmos/Piping/EntitySystems/AtmosDeviceSystem.cs +++ b/Content.Server/Atmos/Piping/EntitySystems/AtmosDeviceSystem.cs @@ -132,10 +132,19 @@ public override void Update(float frameTime) var ev = new AtmosDeviceUpdateEvent(_atmosphereSystem.AtmosTime, null, null); foreach (var device in _joinedDevices) { - DebugTools.Assert(!HasComp(Transform(device).GridUid)); + var deviceGrid = Transform(device).GridUid; + if (HasComp(deviceGrid)) + { + RejoinAtmosphere(device); + } RaiseLocalEvent(device, ref ev); device.Comp.LastProcess = time; } } + + public bool IsJoinedOffGrid(Entity device) + { + return _joinedDevices.Contains(device); + } } }