Fix trees double-loading for biomes (#14056)

* Fix trees double-loading for biomes

Forgot to cherry-pick the anchoring change.

* a
This commit is contained in:
metalgearsloth
2023-02-12 22:48:57 +11:00
committed by GitHub
parent a6ea8f5d3b
commit 0fcd50b65b

View File

@@ -25,6 +25,9 @@ public sealed class BiomeSystem : SharedBiomeSystem
private float _loadRange = DefaultLoadRange; private float _loadRange = DefaultLoadRange;
private Box2 _loadArea = new(-DefaultLoadRange, -DefaultLoadRange, DefaultLoadRange, DefaultLoadRange); private Box2 _loadArea = new(-DefaultLoadRange, -DefaultLoadRange, DefaultLoadRange, DefaultLoadRange);
/// <summary>
/// Stores the chunks active for this tick temporarily.
/// </summary>
private readonly Dictionary<BiomeComponent, HashSet<Vector2i>> _activeChunks = new(); private readonly Dictionary<BiomeComponent, HashSet<Vector2i>> _activeChunks = new();
public override void Initialize() public override void Initialize()
@@ -98,7 +101,7 @@ public sealed class BiomeSystem : SharedBiomeSystem
var gridUid = grid.Owner; var gridUid = grid.Owner;
// Load new chunks // Load new chunks
LoadChunks(biome, gridUid, grid, noise); LoadChunks(biome, gridUid, grid, noise, xformQuery);
// Unload old chunks // Unload old chunks
UnloadChunks(biome, gridUid, grid, noise); UnloadChunks(biome, gridUid, grid, noise);
} }
@@ -113,11 +116,16 @@ public sealed class BiomeSystem : SharedBiomeSystem
while (enumerator.MoveNext(out var chunkOrigin)) while (enumerator.MoveNext(out var chunkOrigin))
{ {
_activeChunks[biome].Add(chunkOrigin.Value); _activeChunks[biome].Add(chunkOrigin.Value * ChunkSize);
} }
} }
private void LoadChunks(BiomeComponent component, EntityUid gridUid, MapGridComponent grid, FastNoise noise) private void LoadChunks(
BiomeComponent component,
EntityUid gridUid,
MapGridComponent grid,
FastNoise noise,
EntityQuery<TransformComponent> xformQuery)
{ {
var active = _activeChunks[component]; var active = _activeChunks[component];
var prototype = ProtoManager.Index<BiomePrototype>(component.BiomePrototype); var prototype = ProtoManager.Index<BiomePrototype>(component.BiomePrototype);
@@ -130,11 +138,19 @@ public sealed class BiomeSystem : SharedBiomeSystem
tiles ??= new List<(Vector2i, Tile)>(ChunkSize * ChunkSize); tiles ??= new List<(Vector2i, Tile)>(ChunkSize * ChunkSize);
// Load NOW! // Load NOW!
LoadChunk(component, gridUid, grid, chunk * ChunkSize, noise, prototype, tiles); LoadChunk(component, gridUid, grid, chunk, noise, prototype, tiles, xformQuery);
} }
} }
private void LoadChunk(BiomeComponent component, EntityUid gridUid, MapGridComponent grid, Vector2i chunk, FastNoise noise, BiomePrototype prototype, List<(Vector2i, Tile)> tiles) private void LoadChunk(
BiomeComponent component,
EntityUid gridUid,
MapGridComponent grid,
Vector2i chunk,
FastNoise noise,
BiomePrototype prototype,
List<(Vector2i, Tile)> tiles,
EntityQuery<TransformComponent> xformQuery)
{ {
component.ModifiedTiles.TryGetValue(chunk, out var modified); component.ModifiedTiles.TryGetValue(chunk, out var modified);
modified ??= new HashSet<Vector2i>(); modified ??= new HashSet<Vector2i>();
@@ -186,6 +202,13 @@ public sealed class BiomeSystem : SharedBiomeSystem
// TODO: Fix non-anchored ents spawning. // TODO: Fix non-anchored ents spawning.
// Just track loaded chunks for now. // Just track loaded chunks for now.
var ent = Spawn(entPrototype, grid.GridTileToLocal(indices)); var ent = Spawn(entPrototype, grid.GridTileToLocal(indices));
// At least for now unless we do lookups or smth, only work with anchoring.
if (xformQuery.TryGetComponent(ent, out var xform) && !xform.Anchored)
{
_transform.AnchorEntity(xform, grid, indices);
}
loadedEntities.Add(ent); loadedEntities.Add(ent);
} }
} }
@@ -241,7 +264,7 @@ public sealed class BiomeSystem : SharedBiomeSystem
// Unload NOW! // Unload NOW!
tiles ??= new List<(Vector2i, Tile)>(ChunkSize * ChunkSize); tiles ??= new List<(Vector2i, Tile)>(ChunkSize * ChunkSize);
UnloadChunk(component, gridUid, grid, chunk * ChunkSize, noise, tiles); UnloadChunk(component, gridUid, grid, chunk, noise, tiles);
} }
} }
@@ -313,5 +336,9 @@ public sealed class BiomeSystem : SharedBiomeSystem
{ {
component.ModifiedTiles.Remove(chunk); component.ModifiedTiles.Remove(chunk);
} }
else
{
component.ModifiedTiles[chunk] = modified;
}
} }
} }