From a1966d867183f2962d17ef5415dc89b3cde54253 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Tue, 12 Nov 2024 08:19:54 +0300 Subject: [PATCH] improve BiomeDunGen (#33113) * improve BiomeDunGen * forgot lol * Update DungeonJob.PostGenBiome.cs * Update DungeonJob.PostGenBiome.cs --- .../DungeonJob/DungeonJob.PostGenBiome.cs | 25 ++++++++++++------- .../Parallax/Biomes/SharedBiomeSystem.cs | 2 +- .../Procedural/PostGeneration/BiomeDunGen.cs | 7 ++++++ 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/Content.Server/Procedural/DungeonJob/DungeonJob.PostGenBiome.cs b/Content.Server/Procedural/DungeonJob/DungeonJob.PostGenBiome.cs index 65f6d2d14f..fdadcb7849 100644 --- a/Content.Server/Procedural/DungeonJob/DungeonJob.PostGenBiome.cs +++ b/Content.Server/Procedural/DungeonJob/DungeonJob.PostGenBiome.cs @@ -1,5 +1,6 @@ using System.Threading.Tasks; using Content.Server.Parallax; +using Content.Shared.Maps; using Content.Shared.Parallax.Biomes; using Content.Shared.Procedural; using Content.Shared.Procedural.PostGeneration; @@ -15,27 +16,35 @@ public sealed partial class DungeonJob /// private async Task PostGen(BiomeDunGen dunGen, DungeonData data, Dungeon dungeon, HashSet reservedTiles, Random random) { - if (_entManager.TryGetComponent(_gridUid, out BiomeComponent? biomeComp)) + if (!_prototype.TryIndex(dunGen.BiomeTemplate, out var indexedBiome)) return; - biomeComp = _entManager.AddComponent(_gridUid); var biomeSystem = _entManager.System(); - biomeSystem.SetTemplate(_gridUid, biomeComp, _prototype.Index(dunGen.BiomeTemplate)); + var seed = random.Next(); var xformQuery = _entManager.GetEntityQuery(); - foreach (var node in dungeon.RoomTiles) + var tiles = _maps.GetAllTilesEnumerator(_gridUid, _grid); + while (tiles.MoveNext(out var tileRef)) { + var node = tileRef.Value.GridIndices; + if (reservedTiles.Contains(node)) continue; + + if (dunGen.TileMask is not null) + { + if (!dunGen.TileMask.Contains(((ContentTileDefinition) _tileDefManager[tileRef.Value.Tile.TypeId]).ID)) + continue; + } // Need to set per-tile to override data. - if (biomeSystem.TryGetTile(node, biomeComp.Layers, seed, _grid, out var tile)) + if (biomeSystem.TryGetTile(node, indexedBiome.Layers, seed, _grid, out var tile)) { _maps.SetTile(_gridUid, _grid, node, tile.Value); } - if (biomeSystem.TryGetDecals(node, biomeComp.Layers, seed, _grid, out var decals)) + if (biomeSystem.TryGetDecals(node, indexedBiome.Layers, seed, _grid, out var decals)) { foreach (var decal in decals) { @@ -43,7 +52,7 @@ public sealed partial class DungeonJob } } - if (biomeSystem.TryGetEntity(node, biomeComp, _grid, out var entityProto)) + if (tile is not null && biomeSystem.TryGetEntity(node, indexedBiome.Layers, tile.Value, seed, _grid, out var entityProto)) { var ent = _entManager.SpawnEntity(entityProto, new EntityCoordinates(_gridUid, node + _grid.TileSizeHalfVector)); var xform = xformQuery.Get(ent); @@ -61,7 +70,5 @@ public sealed partial class DungeonJob if (!ValidateResume()) return; } - - biomeComp.Enabled = false; } } diff --git a/Content.Shared/Parallax/Biomes/SharedBiomeSystem.cs b/Content.Shared/Parallax/Biomes/SharedBiomeSystem.cs index b14baba981..250b0f70a5 100644 --- a/Content.Shared/Parallax/Biomes/SharedBiomeSystem.cs +++ b/Content.Shared/Parallax/Biomes/SharedBiomeSystem.cs @@ -183,7 +183,7 @@ public abstract class SharedBiomeSystem : EntitySystem } - private bool TryGetEntity(Vector2i indices, List layers, Tile tileRef, int seed, MapGridComponent grid, + public bool TryGetEntity(Vector2i indices, List layers, Tile tileRef, int seed, MapGridComponent grid, [NotNullWhen(true)] out string? entity) { var tileId = TileDefManager[tileRef.TypeId].ID; diff --git a/Content.Shared/Procedural/PostGeneration/BiomeDunGen.cs b/Content.Shared/Procedural/PostGeneration/BiomeDunGen.cs index 833cf2dec7..e21e582211 100644 --- a/Content.Shared/Procedural/PostGeneration/BiomeDunGen.cs +++ b/Content.Shared/Procedural/PostGeneration/BiomeDunGen.cs @@ -1,3 +1,4 @@ +using Content.Shared.Maps; using Content.Shared.Parallax.Biomes; using Robust.Shared.Prototypes; @@ -11,4 +12,10 @@ public sealed partial class BiomeDunGen : IDunGenLayer { [DataField(required: true)] public ProtoId BiomeTemplate; + + /// + /// creates a biome only on the specified tiles + /// + [DataField] + public HashSet>? TileMask; } -- 2.52.0