Fix concurrent access issues with ConnectedClients

Replaced direct access to GameMain.Server.ConnectedClients with array snapshots in multiple server-side classes to prevent concurrent modification issues during parallel updates. Also updated PhysicsBody and LevelTrigger to avoid static/shared state in parallel contexts, improving thread safety and reliability.
This commit is contained in:
Eero
2026-01-08 00:26:29 +08:00
parent f4a0d149ca
commit caec44c57d
13 changed files with 108 additions and 59 deletions
@@ -673,13 +673,17 @@ namespace Barotrauma
}
}
private static readonly List<Entity> triggerersToRemove = new List<Entity>();
public static void RemoveInActiveTriggerers(PhysicsBody physicsBody, HashSet<Entity> triggerers)
{
if (physicsBody == null) { return; }
triggerersToRemove.Clear();
foreach (var triggerer in triggerers)
// Use local list instead of static field to avoid concurrent access issues during parallel updates
var triggerersToRemove = new List<Entity>();
// Create snapshot to avoid concurrent modification during enumeration
var triggererSnapshot = triggerers.ToArray();
foreach (var triggerer in triggererSnapshot)
{
if (triggerer.Removed)
{