diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Gap.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Gap.cs index 5132d1418..75b051e2b 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Gap.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Gap.cs @@ -812,7 +812,7 @@ namespace Barotrauma if (outsideCollisionBlocker == null) { return false; } if (IsRoomToRoom || Submarine == null || open <= 0.0f || linkedTo.Count == 0 || linkedTo[0] is not Hull) { - outsideCollisionBlocker.Enabled = false; + outsideCollisionBlocker.AddToDisableQueue(); return false; } diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/MapEntity.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/MapEntity.cs index 7529d0633..1a5a78d7b 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/MapEntity.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/MapEntity.cs @@ -686,6 +686,7 @@ namespace Barotrauma gap.ResetWaterFlowThisFrame(); gap.Update(deltaTime, cam); }); + FarseerPhysics.Dynamics.Body.QueueDisable(); }, // Powered components update () => diff --git a/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs b/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs index c1a07a7d4..e737621b5 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs @@ -245,10 +245,10 @@ namespace Barotrauma Character.Controlled?.UpdateLocalCursor(cam); #elif SERVER - Parallel.Invoke(parallelOptions, - () => { if (Level.Loaded != null) Level.Loaded.Update((float)deltaTime, Camera.Instance); }, - () => Character.UpdateAll((float)deltaTime, Camera.Instance) - ); + + // Don't parallize these things here or the server may got stuck but why idk + if (Level.Loaded != null) { Level.Loaded.Update((float)deltaTime, Camera.Instance); } + Character.UpdateAll((float)deltaTime, Camera.Instance); //StatusEffect.UpdateAll is not thread-safe and must be executed on the main thread StatusEffect.UpdateAll((float)deltaTime); @@ -272,9 +272,7 @@ namespace Barotrauma #if CLIENT MapEntity.UpdateAll((float)deltaTime, cam, parallelOptions); #elif SERVER - MapEntity.UpdateAll((float)deltaTime, Camera.Instance, parallelOptions); - #endif #if CLIENT diff --git a/Libraries/Farseer Physics Engine 3.5/Dynamics/Body.cs b/Libraries/Farseer Physics Engine 3.5/Dynamics/Body.cs index a35808d92..ddd554c01 100644 --- a/Libraries/Farseer Physics Engine 3.5/Dynamics/Body.cs +++ b/Libraries/Farseer Physics Engine 3.5/Dynamics/Body.cs @@ -29,6 +29,7 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -349,6 +350,21 @@ namespace FarseerPhysics.Dynamics } } + private static ConcurrentQueue
DisableQueue = new ConcurrentQueue(); + + public static void QueueDisable() + { + while (DisableQueue.TryDequeue(out var pendingbody)) + { + pendingbody.Enabled = false; + } + } + + public void AddToDisableQueue() + { + DisableQueue.Enqueue(this); + } + ///