1
0

DungeonJob.PostGenBiomeMarkerLayer.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using System.Threading.Tasks;
  2. using Content.Server.Parallax;
  3. using Content.Shared.Parallax.Biomes;
  4. using Content.Shared.Parallax.Biomes.Markers;
  5. using Content.Shared.Procedural;
  6. using Content.Shared.Procedural.PostGeneration;
  7. using Content.Shared.Random.Helpers;
  8. using Robust.Shared.Map;
  9. using Robust.Shared.Utility;
  10. namespace Content.Server.Procedural.DungeonJob;
  11. public sealed partial class DungeonJob
  12. {
  13. /// <summary>
  14. /// <see cref="BiomeMarkerLayerDunGen"/>
  15. /// </summary>
  16. private async Task PostGen(BiomeMarkerLayerDunGen dunGen, DungeonData data, Dungeon dungeon, HashSet<Vector2i> reservedTiles, Random random)
  17. {
  18. // If we're adding biome then disable it and just use for markers.
  19. if (_entManager.EnsureComponent(_gridUid, out BiomeComponent biomeComp))
  20. {
  21. biomeComp.Enabled = false;
  22. }
  23. var biomeSystem = _entManager.System<BiomeSystem>();
  24. var weightedRandom = _prototype.Index(dunGen.MarkerTemplate);
  25. var xformQuery = _entManager.GetEntityQuery<TransformComponent>();
  26. var templates = new Dictionary<string, int>();
  27. for (var i = 0; i < dunGen.Count; i++)
  28. {
  29. var template = weightedRandom.Pick(random);
  30. var count = templates.GetOrNew(template);
  31. count++;
  32. templates[template] = count;
  33. }
  34. foreach (var (template, count) in templates)
  35. {
  36. var markerTemplate = _prototype.Index<BiomeMarkerLayerPrototype>(template);
  37. var bounds = new Box2i();
  38. foreach (var tile in dungeon.RoomTiles)
  39. {
  40. bounds = bounds.UnionTile(tile);
  41. }
  42. await SuspendDungeon();
  43. if (!ValidateResume())
  44. return;
  45. biomeSystem.GetMarkerNodes(_gridUid, biomeComp, _grid, markerTemplate, true, bounds, count,
  46. random, out var spawnSet, out var existing, false);
  47. await SuspendDungeon();
  48. if (!ValidateResume())
  49. return;
  50. var checkTile = reservedTiles.Count > 0;
  51. foreach (var ent in existing)
  52. {
  53. if (checkTile && reservedTiles.Contains(_maps.LocalToTile(_gridUid, _grid, _xformQuery.GetComponent(ent).Coordinates)))
  54. {
  55. continue;
  56. }
  57. _entManager.DeleteEntity(ent);
  58. await SuspendDungeon();
  59. if (!ValidateResume())
  60. return;
  61. }
  62. foreach (var (node, mask) in spawnSet)
  63. {
  64. if (reservedTiles.Contains(node))
  65. continue;
  66. string? proto;
  67. if (mask != null && markerTemplate.EntityMask.TryGetValue(mask, out var maskedProto))
  68. {
  69. proto = maskedProto;
  70. }
  71. else
  72. {
  73. proto = markerTemplate.Prototype;
  74. }
  75. var ent = _entManager.SpawnAtPosition(proto, new EntityCoordinates(_gridUid, node + _grid.TileSizeHalfVector));
  76. var xform = xformQuery.Get(ent);
  77. if (!xform.Comp.Anchored)
  78. _transform.AnchorEntity(ent, xform);
  79. await SuspendDungeon();
  80. if (!ValidateResume())
  81. return;
  82. }
  83. }
  84. }
  85. }