From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Fri, 22 Dec 2023 04:19:12 +0000 (-0500) Subject: Fix a collection enumeration modification exception in ArrivalsSystem (#22839) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=ce5875f29d3e54bae3c4068b2e813e031bbcbd31;p=space-station-14.git Fix a collection enumeration modification exception in ArrivalsSystem (#22839) Fix collection enumeration --- diff --git a/Content.Server/Shuttles/Systems/ArrivalsSystem.cs b/Content.Server/Shuttles/Systems/ArrivalsSystem.cs index 53f44b355a..64bc99f1bb 100644 --- a/Content.Server/Shuttles/Systems/ArrivalsSystem.cs +++ b/Content.Server/Shuttles/Systems/ArrivalsSystem.cs @@ -56,6 +56,10 @@ public sealed class ArrivalsSystem : EntitySystem [Dependency] private readonly StationSpawningSystem _stationSpawning = default!; [Dependency] private readonly StationSystem _station = default!; + private EntityQuery _pendingQuery; + private EntityQuery _blacklistQuery; + private EntityQuery _mobQuery; + /// /// If enabled then spawns players on an alternate map so they can take a shuttle to the station. /// @@ -88,6 +92,10 @@ public sealed class ArrivalsSystem : EntitySystem SubscribeLocalEvent(OnArrivalsFTL); SubscribeLocalEvent(OnArrivalsDocked); + _pendingQuery = GetEntityQuery(); + _blacklistQuery = GetEntityQuery(); + _mobQuery = GetEntityQuery(); + // Don't invoke immediately as it will get set in the natural course of things. Enabled = _cfgManager.GetCVar(CCVars.ArrivalsShuttles); _cfgManager.OnValueChanged(CCVars.ArrivalsShuttles, SetArrivals); @@ -228,13 +236,7 @@ public sealed class ArrivalsSystem : EntitySystem // Any mob then yeet them off the shuttle. if (!_cfgManager.GetCVar(CCVars.ArrivalsReturns) && args.FromMapUid != null) - { - var pendingEntQuery = GetEntityQuery(); - var arrivalsBlacklistQuery = GetEntityQuery(); - var mobQuery = GetEntityQuery(); - var xformQuery = GetEntityQuery(); - DumpChildren(shuttleUid, ref args, pendingEntQuery, arrivalsBlacklistQuery, mobQuery, xformQuery); - } + DumpChildren(shuttleUid, ref args); var pendingQuery = AllEntityQuery(); @@ -279,30 +281,35 @@ public sealed class ArrivalsSystem : EntitySystem } } - private void DumpChildren(EntityUid uid, - ref FTLStartedEvent args, - EntityQuery pendingEntQuery, - EntityQuery arrivalsBlacklistQuery, - EntityQuery mobQuery, - EntityQuery xformQuery) + private void DumpChildren(EntityUid uid, ref FTLStartedEvent args) { - if (pendingEntQuery.HasComponent(uid)) + var toDump = new List>(); + DumpChildren(uid, ref args, toDump); + foreach (var (ent, xform) in toDump) + { + var rotation = xform.LocalRotation; + _transform.SetCoordinates(ent, new EntityCoordinates(args.FromMapUid!.Value, args.FTLFrom.Transform(xform.LocalPosition))); + _transform.SetWorldRotation(ent, args.FromRotation + rotation); + } + } + + private void DumpChildren(EntityUid uid, ref FTLStartedEvent args, List> toDump) + { + if (_pendingQuery.HasComponent(uid)) return; - var xform = xformQuery.GetComponent(uid); + var xform = Transform(uid); - if (mobQuery.HasComponent(uid) || arrivalsBlacklistQuery.HasComponent(uid)) + if (_mobQuery.HasComponent(uid) || _blacklistQuery.HasComponent(uid)) { - var rotation = xform.LocalRotation; - _transform.SetCoordinates(uid, new EntityCoordinates(args.FromMapUid!.Value, args.FTLFrom.Transform(xform.LocalPosition))); - _transform.SetWorldRotation(uid, args.FromRotation + rotation); + toDump.Add((uid, xform)); return; } var children = xform.ChildEnumerator; while (children.MoveNext(out var child)) { - DumpChildren(child, ref args, pendingEntQuery, arrivalsBlacklistQuery, mobQuery, xformQuery); + DumpChildren(child, ref args, toDump); } }