From 30096873263fa843d120eb629fde07056bd8da11 Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Tue, 25 Jun 2024 02:28:48 -0400 Subject: [PATCH] Fix internals not auto-activating for entities spawned in space (#29213) * Add organs before trying to breathe * Add tests for auto-internals * EntMan to the rescue --- .../Tests/Internals/AutoInternalsTests.cs | 89 +++++++++++++++++++ Content.Shared/Clothing/LoadoutSystem.cs | 4 +- 2 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 Content.IntegrationTests/Tests/Internals/AutoInternalsTests.cs diff --git a/Content.IntegrationTests/Tests/Internals/AutoInternalsTests.cs b/Content.IntegrationTests/Tests/Internals/AutoInternalsTests.cs new file mode 100644 index 000000000000..dbd612c71012 --- /dev/null +++ b/Content.IntegrationTests/Tests/Internals/AutoInternalsTests.cs @@ -0,0 +1,89 @@ +using Content.Server.Atmos.EntitySystems; +using Content.Server.Body.Systems; +using Content.Server.Station.Systems; +using Content.Shared.Preferences; +using Content.Shared.Roles.Jobs; + +namespace Content.IntegrationTests.Tests.Internals; + +[TestFixture] +[TestOf(typeof(InternalsSystem))] +public sealed class AutoInternalsTests +{ + [Test] + public async Task TestInternalsAutoActivateInSpaceForStationSpawn() + { + await using var pair = await PoolManager.GetServerClient(); + var server = pair.Server; + + var testMap = await pair.CreateTestMap(); + + var stationSpawning = server.System(); + var atmos = server.System(); + var internals = server.System(); + + await server.WaitAssertion(() => + { + var profile = new HumanoidCharacterProfile(); + var dummy = stationSpawning.SpawnPlayerMob(testMap.GridCoords, new JobComponent() + { + Prototype = "TestInternalsDummy" + }, profile, station: null); + + Assert.That(atmos.HasAtmosphere(testMap.Grid), Is.False, "Test map has atmosphere - test needs adjustment!"); + Assert.That(internals.AreInternalsWorking(dummy), "Internals did not automatically connect!"); + + server.EntMan.DeleteEntity(dummy); + }); + + await pair.CleanReturnAsync(); + } + + [Test] + public async Task TestInternalsAutoActivateInSpaceForEntitySpawn() + { + await using var pair = await PoolManager.GetServerClient(); + var server = pair.Server; + + var testMap = await pair.CreateTestMap(); + + var atmos = server.System(); + var internals = server.System(); + + await server.WaitAssertion(() => + { + var dummy = server.EntMan.Spawn("TestInternalsDummyEntity", testMap.MapCoords); + + Assert.That(atmos.HasAtmosphere(testMap.Grid), Is.False, "Test map has atmosphere - test needs adjustment!"); + Assert.That(internals.AreInternalsWorking(dummy), "Internals did not automatically connect!"); + + server.EntMan.DeleteEntity(dummy); + }); + + await pair.CleanReturnAsync(); + } + + [TestPrototypes] + private const string Prototypes = @" +- type: playTimeTracker + id: PlayTimeInternalsDummy + +- type: startingGear + id: InternalsDummyGear + equipment: + mask: ClothingMaskBreath + suitstorage: OxygenTankFilled + +- type: job + id: TestInternalsDummy + playTimeTracker: PlayTimeInternalsDummy + startingGear: InternalsDummyGear + +- type: entity + id: TestInternalsDummyEntity + parent: MobHuman + components: + - type: Loadout + prototypes: [InternalsDummyGear] +"; +} diff --git a/Content.Shared/Clothing/LoadoutSystem.cs b/Content.Shared/Clothing/LoadoutSystem.cs index f1b1dc36d907..1bab86e90fdf 100644 --- a/Content.Shared/Clothing/LoadoutSystem.cs +++ b/Content.Shared/Clothing/LoadoutSystem.cs @@ -1,4 +1,5 @@ using System.Linq; +using Content.Shared.Body.Systems; using Content.Shared.Clothing.Components; using Content.Shared.Humanoid; using Content.Shared.Preferences; @@ -27,7 +28,8 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnMapInit); + // Wait until the character has all their organs before we give them their loadout + SubscribeLocalEvent(OnMapInit, after: [typeof(SharedBodySystem)]); } public static string GetJobPrototype(string? loadout)