Don't spawn obstructed exp objectives (#17921)
This commit is contained in:
@@ -271,15 +271,33 @@ public sealed class SpawnSalvageMissionJob : Job<bool>
|
|||||||
|
|
||||||
var structureCount = _salvage.GetStructureCount(mission.Difficulty);
|
var structureCount = _salvage.GetStructureCount(mission.Difficulty);
|
||||||
var shaggy = faction.Configs["DefenseStructure"];
|
var shaggy = faction.Configs["DefenseStructure"];
|
||||||
|
var validSpawns = new List<Vector2i>();
|
||||||
|
|
||||||
// Spawn the objectives
|
// Spawn the objectives
|
||||||
for (var i = 0; i < structureCount; i++)
|
for (var i = 0; i < structureCount; i++)
|
||||||
{
|
{
|
||||||
var structureRoom = availableRooms[random.Next(availableRooms.Count)];
|
var structureRoom = availableRooms[random.Next(availableRooms.Count)];
|
||||||
var spawnTile = structureRoom.Tiles.ElementAt(random.Next(structureRoom.Tiles.Count));
|
validSpawns.Clear();
|
||||||
var uid = _entManager.SpawnEntity(shaggy, grid.GridTileToLocal(spawnTile));
|
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<SalvageStructureComponent>(uid);
|
_entManager.AddComponent<SalvageStructureComponent>(uid);
|
||||||
structureComp.Structures.Add(uid);
|
structureComp.Structures.Add(uid);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -335,28 +353,29 @@ public sealed class SpawnSalvageMissionJob : Job<bool>
|
|||||||
validSpawns.AddRange(spawnRoom.Tiles);
|
validSpawns.AddRange(spawnRoom.Tiles);
|
||||||
random.Shuffle(validSpawns);
|
random.Shuffle(validSpawns);
|
||||||
|
|
||||||
|
foreach (var entry in EntitySpawnCollection.GetSpawns(mobGroup.Entries, random))
|
||||||
|
{
|
||||||
while (validSpawns.Count > 0)
|
while (validSpawns.Count > 0)
|
||||||
{
|
{
|
||||||
var spawnTile = validSpawns[^1];
|
var spawnTile = validSpawns[^1];
|
||||||
|
|
||||||
if (!_anchorable.TileFree(grid, spawnTile, (int) CollisionGroup.MachineLayer, (int) CollisionGroup.MachineLayer))
|
|
||||||
{
|
|
||||||
validSpawns.RemoveAt(validSpawns.Count - 1);
|
validSpawns.RemoveAt(validSpawns.Count - 1);
|
||||||
|
|
||||||
|
if (!_anchorable.TileFree(grid, spawnTile, (int) CollisionGroup.MachineLayer,
|
||||||
|
(int) CollisionGroup.MachineLayer))
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var spawnPosition = grid.GridTileToLocal(spawnTile);
|
var spawnPosition = grid.GridTileToLocal(spawnTile);
|
||||||
|
|
||||||
foreach (var entry in EntitySpawnCollection.GetSpawns(mobGroup.Entries, random))
|
|
||||||
{
|
|
||||||
var uid = _entManager.CreateEntityUninitialized(entry, spawnPosition);
|
var uid = _entManager.CreateEntityUninitialized(entry, spawnPosition);
|
||||||
_entManager.RemoveComponent<GhostTakeoverAvailableComponent>(uid);
|
_entManager.RemoveComponent<GhostTakeoverAvailableComponent>(uid);
|
||||||
_entManager.RemoveComponent<GhostRoleComponent>(uid);
|
_entManager.RemoveComponent<GhostRoleComponent>(uid);
|
||||||
_entManager.InitializeAndStartEntity(uid);
|
_entManager.InitializeAndStartEntity(uid);
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
await SuspendIfOutOfTime();
|
await SuspendIfOutOfTime();
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user