1
0

DungeonJob.PostGenBiome.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System.Threading.Tasks;
  2. using Content.Server.Parallax;
  3. using Content.Shared.Maps;
  4. using Content.Shared.Parallax.Biomes;
  5. using Content.Shared.Procedural;
  6. using Content.Shared.Procedural.PostGeneration;
  7. using Robust.Shared.Map;
  8. using Robust.Shared.Utility;
  9. namespace Content.Server.Procedural.DungeonJob;
  10. public sealed partial class DungeonJob
  11. {
  12. /// <summary>
  13. /// <see cref="BiomeDunGen"/>
  14. /// </summary>
  15. private async Task PostGen(BiomeDunGen dunGen, DungeonData data, Dungeon dungeon, HashSet<Vector2i> reservedTiles, Random random)
  16. {
  17. if (!_prototype.TryIndex(dunGen.BiomeTemplate, out var indexedBiome))
  18. return;
  19. var biomeSystem = _entManager.System<BiomeSystem>();
  20. var seed = random.Next();
  21. var xformQuery = _entManager.GetEntityQuery<TransformComponent>();
  22. var tiles = _maps.GetAllTilesEnumerator(_gridUid, _grid);
  23. while (tiles.MoveNext(out var tileRef))
  24. {
  25. var node = tileRef.Value.GridIndices;
  26. if (reservedTiles.Contains(node))
  27. continue;
  28. if (dunGen.TileMask is not null)
  29. {
  30. if (!dunGen.TileMask.Contains(((ContentTileDefinition) _tileDefManager[tileRef.Value.Tile.TypeId]).ID))
  31. continue;
  32. }
  33. // Need to set per-tile to override data.
  34. if (biomeSystem.TryGetTile(node, indexedBiome.Layers, seed, _grid, out var tile))
  35. {
  36. _maps.SetTile(_gridUid, _grid, node, tile.Value);
  37. }
  38. if (biomeSystem.TryGetDecals(node, indexedBiome.Layers, seed, _grid, out var decals))
  39. {
  40. foreach (var decal in decals)
  41. {
  42. _decals.TryAddDecal(decal.ID, new EntityCoordinates(_gridUid, decal.Position), out _);
  43. }
  44. }
  45. if (biomeSystem.TryGetEntity(node, indexedBiome.Layers, tile ?? tileRef.Value.Tile, seed, _grid, out var entityProto))
  46. {
  47. var ent = _entManager.SpawnEntity(entityProto, new EntityCoordinates(_gridUid, node + _grid.TileSizeHalfVector));
  48. var xform = xformQuery.Get(ent);
  49. if (!xform.Comp.Anchored)
  50. {
  51. _transform.AnchorEntity(ent, xform);
  52. }
  53. // TODO: Engine bug with SpawnAtPosition
  54. DebugTools.Assert(xform.Comp.Anchored);
  55. }
  56. await SuspendDungeon();
  57. if (!ValidateResume())
  58. return;
  59. }
  60. }
  61. }