diff --git a/Content.IntegrationTests/Tests/SaveLoadSaveTest.cs b/Content.IntegrationTests/Tests/SaveLoadSaveTest.cs
index 85b95ef117..c85ca1952a 100644
--- a/Content.IntegrationTests/Tests/SaveLoadSaveTest.cs
+++ b/Content.IntegrationTests/Tests/SaveLoadSaveTest.cs
@@ -78,6 +78,8 @@ namespace Content.IntegrationTests.Tests
await pairTracker.CleanReturnAsync();
}
+ const string TestMap = "Maps/bagel.yml";
+
///
/// Loads the default map, runs it for 5 ticks, then assert that it did not change.
///
@@ -91,13 +93,13 @@ namespace Content.IntegrationTests.Tests
MapId mapId = default;
- // Load saltern.yml as uninitialized map, and save it to ensure it's up to date.
+ // Load bagel.yml as uninitialized map, and save it to ensure it's up to date.
server.Post(() =>
{
mapId = mapManager.CreateMap();
mapManager.AddUninitializedMap(mapId);
mapManager.SetMapPaused(mapId, true);
- mapLoader.LoadMap(mapId, "Maps/bagel.yml");
+ mapLoader.LoadMap(mapId, TestMap);
mapLoader.SaveMap(mapId, "load save ticks save 1.yml");
});
@@ -145,6 +147,78 @@ namespace Content.IntegrationTests.Tests
TestContext.Error.WriteLine(twoTmp);
}
});
+
+ await server.WaitPost(() => mapManager.DeleteMap(mapId));
+ await pairTracker.CleanReturnAsync();
+ }
+
+ ///
+ /// Loads the same uninitialized map at slightly different times, and then checks that they are the same
+ /// when getting saved.
+ ///
+ ///
+ /// Should ensure that entities do not perform randomization prior to initialization and should prevents
+ /// bugs like the one discussed in github.com/space-wizards/RobustToolbox/issues/3870. This test is somewhat
+ /// similar to and , but neither of these
+ /// caught the mentioned bug.
+ ///
+ [Test]
+ public async Task LoadTickLoadBagel()
+ {
+ await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings{NoClient = true});
+ var server = pairTracker.Pair.Server;
+
+ var mapLoader = server.ResolveDependency().GetEntitySystem();
+ var mapManager = server.ResolveDependency();
+ var userData = server.ResolveDependency().UserData;
+
+ MapId mapId = default;
+ const string fileA = "/load tick load a.yml";
+ const string fileB = "/load tick load b.yml";
+ string yamlA;
+ string yamlB;
+
+ // Load & save the first map
+ server.Post(() =>
+ {
+ mapId = mapManager.CreateMap();
+ mapManager.AddUninitializedMap(mapId);
+ mapManager.SetMapPaused(mapId, true);
+ mapLoader.LoadMap(mapId, TestMap);
+ mapLoader.SaveMap(mapId, fileA);
+ });
+
+ await server.WaitIdleAsync();
+ await using (var stream = userData.Open(new ResourcePath(fileA), FileMode.Open))
+ using (var reader = new StreamReader(stream))
+ {
+ yamlA = await reader.ReadToEndAsync();
+ }
+
+ server.RunTicks(5);
+
+ // Load & save the second map
+ server.Post(() =>
+ {
+ mapManager.DeleteMap(mapId);
+ mapManager.CreateMap(mapId);
+ mapManager.AddUninitializedMap(mapId);
+ mapManager.SetMapPaused(mapId, true);
+ mapLoader.LoadMap(mapId, TestMap);
+ mapLoader.SaveMap(mapId, fileB);
+ });
+
+ await server.WaitIdleAsync();
+
+ await using (var stream = userData.Open(new ResourcePath(fileB), FileMode.Open))
+ using (var reader = new StreamReader(stream))
+ {
+ yamlB = await reader.ReadToEndAsync();
+ }
+
+ Assert.That(yamlA, Is.EqualTo(yamlB));
+
+ await server.WaitPost(() => mapManager.DeleteMap(mapId));
await pairTracker.CleanReturnAsync();
}
}
diff --git a/Resources/Maps/bagel.yml b/Resources/Maps/bagel.yml
index 28768d89b9..71f31e9914 100644
--- a/Resources/Maps/bagel.yml
+++ b/Resources/Maps/bagel.yml
@@ -9373,9 +9373,6 @@ entities:
- nextUpdate: 8187.135845
type: GridPathfinding
- type: RadiationGridResistance
- - nextShake: 0
- shakeTimes: 10
- type: GravityShake
- type: GasTileOverlay
- uid: 61
type: GasVentScrubber