diff --git a/Content.Server/Shuttles/Systems/ArrivalsSystem.cs b/Content.Server/Shuttles/Systems/ArrivalsSystem.cs index 50b8d4f5b9..eeb9de8ad8 100644 --- a/Content.Server/Shuttles/Systems/ArrivalsSystem.cs +++ b/Content.Server/Shuttles/Systems/ArrivalsSystem.cs @@ -215,28 +215,33 @@ public sealed class ArrivalsSystem : EntitySystem if (!HasComp(ev.Station)) return; - var points = EntityQuery().ToList(); - _random.Shuffle(points); TryGetArrivals(out var arrivals); if (TryComp(arrivals, out var arrivalsXform)) { var mapId = arrivalsXform.MapID; - foreach (var (spawnPoint, xform) in points) + var points = EntityQueryEnumerator(); + var possiblePositions = new List(); + while ( points.MoveNext(out var uid, out var spawnPoint, out var xform)) { if (spawnPoint.SpawnType != SpawnPointType.LateJoin || xform.MapID != mapId) continue; + possiblePositions.Add(xform.Coordinates); + } + + if (possiblePositions.Count > 0) + { + var spawnLoc = _random.Pick(possiblePositions); ev.SpawnResult = _stationSpawning.SpawnPlayerMob( - xform.Coordinates, + spawnLoc, ev.Job, ev.HumanoidCharacterProfile, ev.Station); EnsureComp(ev.SpawnResult.Value); EnsureComp(ev.SpawnResult.Value); - return; } } } diff --git a/Content.Server/Spawners/EntitySystems/SpawnPointSystem.cs b/Content.Server/Spawners/EntitySystems/SpawnPointSystem.cs index 13753461af..595b432c8e 100644 --- a/Content.Server/Spawners/EntitySystems/SpawnPointSystem.cs +++ b/Content.Server/Spawners/EntitySystems/SpawnPointSystem.cs @@ -3,6 +3,7 @@ using Content.Server.GameTicking; using Content.Server.Shuttles.Components; using Content.Server.Spawners.Components; using Content.Server.Station.Systems; +using Robust.Shared.Map; using Robust.Shared.Random; namespace Content.Server.Spawners.EntitySystems; @@ -25,51 +26,49 @@ public sealed class SpawnPointSystem : EntitySystem return; // TODO: Cache all this if it ends up important. - var points = EntityQuery().ToList(); - _random.Shuffle(points); - foreach (var spawnPoint in points) + var points = EntityQueryEnumerator(); + var possiblePositions = new List(); + EntityCoordinates? firstLoc = null; + + while ( points.MoveNext(out var uid, out var spawnPoint, out var xform)) { - var xform = Transform(spawnPoint.Owner); - if (args.Station != null && _stationSystem.GetOwningStation(spawnPoint.Owner, xform) != args.Station) + if (args.Station != null && _stationSystem.GetOwningStation(uid, xform) != args.Station) continue; if (_gameTicker.RunLevel == GameRunLevel.InRound && spawnPoint.SpawnType == SpawnPointType.LateJoin) { - args.SpawnResult = _stationSpawning.SpawnPlayerMob( - xform.Coordinates, - args.Job, - args.HumanoidCharacterProfile, - args.Station); - - return; + possiblePositions.Add(xform.Coordinates); } if (_gameTicker.RunLevel != GameRunLevel.InRound && spawnPoint.SpawnType == SpawnPointType.Job && (args.Job == null || spawnPoint.Job?.ID == args.Job.Prototype.ID)) { - args.SpawnResult = _stationSpawning.SpawnPlayerMob( - xform.Coordinates, - args.Job, - args.HumanoidCharacterProfile, - args.Station); + possiblePositions.Add(xform.Coordinates); + } + } + if (possiblePositions.Count == 0) + { + // Ok we've still not returned, but we need to put them /somewhere/. + // TODO: Refactor gameticker spawning code so we don't have to do this! + var points2 = EntityQueryEnumerator(); + + if (points2.MoveNext(out var uid, out var spawnPoint, out var xform)) + { + possiblePositions.Add(xform.Coordinates); + } + else + { + Log.Error("No spawn points were available!"); return; } } - // Ok we've still not returned, but we need to put them /somewhere/. - // TODO: Refactor gameticker spawning code so we don't have to do this! - foreach (var spawnPoint in points) - { - var xform = Transform(spawnPoint.Owner); - args.SpawnResult = _stationSpawning.SpawnPlayerMob( - xform.Coordinates, - args.Job, - args.HumanoidCharacterProfile, - args.Station); + var spawnLoc = _random.Pick(possiblePositions); - return; - } - - Logger.ErrorS("spawning", "No spawn points were available!"); + args.SpawnResult = _stationSpawning.SpawnPlayerMob( + spawnLoc, + args.Job, + args.HumanoidCharacterProfile, + args.Station); } }