Build a leaner list during spawn selection (#18597)
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
This commit is contained in:
@@ -215,28 +215,33 @@ public sealed class ArrivalsSystem : EntitySystem
|
|||||||
if (!HasComp<StationArrivalsComponent>(ev.Station))
|
if (!HasComp<StationArrivalsComponent>(ev.Station))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var points = EntityQuery<SpawnPointComponent, TransformComponent>().ToList();
|
|
||||||
_random.Shuffle(points);
|
|
||||||
TryGetArrivals(out var arrivals);
|
TryGetArrivals(out var arrivals);
|
||||||
|
|
||||||
if (TryComp<TransformComponent>(arrivals, out var arrivalsXform))
|
if (TryComp<TransformComponent>(arrivals, out var arrivalsXform))
|
||||||
{
|
{
|
||||||
var mapId = arrivalsXform.MapID;
|
var mapId = arrivalsXform.MapID;
|
||||||
|
|
||||||
foreach (var (spawnPoint, xform) in points)
|
var points = EntityQueryEnumerator<SpawnPointComponent, TransformComponent>();
|
||||||
|
var possiblePositions = new List<EntityCoordinates>();
|
||||||
|
while ( points.MoveNext(out var uid, out var spawnPoint, out var xform))
|
||||||
{
|
{
|
||||||
if (spawnPoint.SpawnType != SpawnPointType.LateJoin || xform.MapID != mapId)
|
if (spawnPoint.SpawnType != SpawnPointType.LateJoin || xform.MapID != mapId)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
possiblePositions.Add(xform.Coordinates);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (possiblePositions.Count > 0)
|
||||||
|
{
|
||||||
|
var spawnLoc = _random.Pick(possiblePositions);
|
||||||
ev.SpawnResult = _stationSpawning.SpawnPlayerMob(
|
ev.SpawnResult = _stationSpawning.SpawnPlayerMob(
|
||||||
xform.Coordinates,
|
spawnLoc,
|
||||||
ev.Job,
|
ev.Job,
|
||||||
ev.HumanoidCharacterProfile,
|
ev.HumanoidCharacterProfile,
|
||||||
ev.Station);
|
ev.Station);
|
||||||
|
|
||||||
EnsureComp<PendingClockInComponent>(ev.SpawnResult.Value);
|
EnsureComp<PendingClockInComponent>(ev.SpawnResult.Value);
|
||||||
EnsureComp<AutoOrientComponent>(ev.SpawnResult.Value);
|
EnsureComp<AutoOrientComponent>(ev.SpawnResult.Value);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using Content.Server.GameTicking;
|
|||||||
using Content.Server.Shuttles.Components;
|
using Content.Server.Shuttles.Components;
|
||||||
using Content.Server.Spawners.Components;
|
using Content.Server.Spawners.Components;
|
||||||
using Content.Server.Station.Systems;
|
using Content.Server.Station.Systems;
|
||||||
|
using Robust.Shared.Map;
|
||||||
using Robust.Shared.Random;
|
using Robust.Shared.Random;
|
||||||
|
|
||||||
namespace Content.Server.Spawners.EntitySystems;
|
namespace Content.Server.Spawners.EntitySystems;
|
||||||
@@ -25,51 +26,49 @@ public sealed class SpawnPointSystem : EntitySystem
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// TODO: Cache all this if it ends up important.
|
// TODO: Cache all this if it ends up important.
|
||||||
var points = EntityQuery<SpawnPointComponent>().ToList();
|
var points = EntityQueryEnumerator<SpawnPointComponent, TransformComponent>();
|
||||||
_random.Shuffle(points);
|
var possiblePositions = new List<EntityCoordinates>();
|
||||||
foreach (var spawnPoint in points)
|
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(uid, xform) != args.Station)
|
||||||
if (args.Station != null && _stationSystem.GetOwningStation(spawnPoint.Owner, xform) != args.Station)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (_gameTicker.RunLevel == GameRunLevel.InRound && spawnPoint.SpawnType == SpawnPointType.LateJoin)
|
if (_gameTicker.RunLevel == GameRunLevel.InRound && spawnPoint.SpawnType == SpawnPointType.LateJoin)
|
||||||
{
|
{
|
||||||
args.SpawnResult = _stationSpawning.SpawnPlayerMob(
|
possiblePositions.Add(xform.Coordinates);
|
||||||
xform.Coordinates,
|
|
||||||
args.Job,
|
|
||||||
args.HumanoidCharacterProfile,
|
|
||||||
args.Station);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_gameTicker.RunLevel != GameRunLevel.InRound && spawnPoint.SpawnType == SpawnPointType.Job && (args.Job == null || spawnPoint.Job?.ID == args.Job.Prototype.ID))
|
if (_gameTicker.RunLevel != GameRunLevel.InRound && spawnPoint.SpawnType == SpawnPointType.Job && (args.Job == null || spawnPoint.Job?.ID == args.Job.Prototype.ID))
|
||||||
{
|
{
|
||||||
args.SpawnResult = _stationSpawning.SpawnPlayerMob(
|
possiblePositions.Add(xform.Coordinates);
|
||||||
xform.Coordinates,
|
}
|
||||||
args.Job,
|
}
|
||||||
args.HumanoidCharacterProfile,
|
|
||||||
args.Station);
|
|
||||||
|
|
||||||
|
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<SpawnPointComponent, TransformComponent>();
|
||||||
|
|
||||||
|
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;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ok we've still not returned, but we need to put them /somewhere/.
|
var spawnLoc = _random.Pick(possiblePositions);
|
||||||
// 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);
|
|
||||||
|
|
||||||
return;
|
args.SpawnResult = _stationSpawning.SpawnPlayerMob(
|
||||||
}
|
spawnLoc,
|
||||||
|
args.Job,
|
||||||
Logger.ErrorS("spawning", "No spawn points were available!");
|
args.HumanoidCharacterProfile,
|
||||||
|
args.Station);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user