From 1bb491f4a887b680b7752ef10a35fdbc914dde3b Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Mon, 10 Jul 2023 17:16:10 +1000 Subject: [PATCH] Don't spawn obstructed exp objectives (#17921) --- .../Salvage/SpawnSalvageMissionJob.cs | 49 +++++++++++++------ 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/Content.Server/Salvage/SpawnSalvageMissionJob.cs b/Content.Server/Salvage/SpawnSalvageMissionJob.cs index 8af22532a5..db7bf9be2e 100644 --- a/Content.Server/Salvage/SpawnSalvageMissionJob.cs +++ b/Content.Server/Salvage/SpawnSalvageMissionJob.cs @@ -271,15 +271,33 @@ public sealed class SpawnSalvageMissionJob : Job var structureCount = _salvage.GetStructureCount(mission.Difficulty); var shaggy = faction.Configs["DefenseStructure"]; + var validSpawns = new List(); // Spawn the objectives for (var i = 0; i < structureCount; i++) { var structureRoom = availableRooms[random.Next(availableRooms.Count)]; - var spawnTile = structureRoom.Tiles.ElementAt(random.Next(structureRoom.Tiles.Count)); - var uid = _entManager.SpawnEntity(shaggy, grid.GridTileToLocal(spawnTile)); - _entManager.AddComponent(uid); - structureComp.Structures.Add(uid); + validSpawns.Clear(); + validSpawns.AddRange(structureRoom.Tiles); + random.Shuffle(validSpawns); + + while (validSpawns.Count > 0) + { + var spawnTile = validSpawns[^1]; + validSpawns.RemoveAt(validSpawns.Count - 1); + + if (!_anchorable.TileFree(grid, spawnTile, (int) CollisionGroup.MachineLayer, + (int) CollisionGroup.MachineLayer)) + { + continue; + } + + var spawnPosition = grid.GridTileToLocal(spawnTile); + var uid = _entManager.SpawnEntity(shaggy, spawnPosition); + _entManager.AddComponent(uid); + structureComp.Structures.Add(uid); + break; + } } } @@ -335,27 +353,28 @@ public sealed class SpawnSalvageMissionJob : Job validSpawns.AddRange(spawnRoom.Tiles); random.Shuffle(validSpawns); - while (validSpawns.Count > 0) + foreach (var entry in EntitySpawnCollection.GetSpawns(mobGroup.Entries, random)) { - var spawnTile = validSpawns[^1]; - - if (!_anchorable.TileFree(grid, spawnTile, (int) CollisionGroup.MachineLayer, (int) CollisionGroup.MachineLayer)) + while (validSpawns.Count > 0) { + var spawnTile = validSpawns[^1]; validSpawns.RemoveAt(validSpawns.Count - 1); - continue; - } - var spawnPosition = grid.GridTileToLocal(spawnTile); + if (!_anchorable.TileFree(grid, spawnTile, (int) CollisionGroup.MachineLayer, + (int) CollisionGroup.MachineLayer)) + { + continue; + } + + var spawnPosition = grid.GridTileToLocal(spawnTile); - foreach (var entry in EntitySpawnCollection.GetSpawns(mobGroup.Entries, random)) - { var uid = _entManager.CreateEntityUninitialized(entry, spawnPosition); _entManager.RemoveComponent(uid); _entManager.RemoveComponent(uid); _entManager.InitializeAndStartEntity(uid); - } - break; + break; + } } await SuspendIfOutOfTime();