1
0

DungeonJob.DunGenFill.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using System.Numerics;
  2. using System.Threading.Tasks;
  3. using Content.Shared.Maps;
  4. using Content.Shared.Procedural;
  5. using Content.Shared.Procedural.DungeonGenerators;
  6. namespace Content.Server.Procedural.DungeonJob;
  7. public sealed partial class DungeonJob
  8. {
  9. /// <summary>
  10. /// <see cref="FillGridDunGen"/>
  11. /// </summary>
  12. private async Task<Dungeon> GenerateFillDunGen(FillGridDunGen fill, DungeonData data, HashSet<Vector2i> reservedTiles)
  13. {
  14. if (!data.Entities.TryGetValue(DungeonDataKey.Fill, out var fillEnt))
  15. {
  16. LogDataError(typeof(FillGridDunGen));
  17. return Dungeon.Empty;
  18. }
  19. var roomTiles = new HashSet<Vector2i>();
  20. var tiles = _maps.GetAllTilesEnumerator(_gridUid, _grid);
  21. while (tiles.MoveNext(out var tileRef))
  22. {
  23. var tile = tileRef.Value.GridIndices;
  24. if (reservedTiles.Contains(tile))
  25. continue;
  26. if (fill.AllowedTiles != null && !fill.AllowedTiles.Contains(((ContentTileDefinition) _tileDefManager[tileRef.Value.Tile.TypeId]).ID))
  27. continue;
  28. if (!_anchorable.TileFree(_grid, tile, DungeonSystem.CollisionLayer, DungeonSystem.CollisionMask))
  29. continue;
  30. var gridPos = _maps.GridTileToLocal(_gridUid, _grid, tile);
  31. _entManager.SpawnEntity(fillEnt, gridPos);
  32. roomTiles.Add(tile);
  33. await SuspendDungeon();
  34. if (!ValidateResume())
  35. break;
  36. }
  37. var dungeon = new Dungeon();
  38. var room = new DungeonRoom(roomTiles, Vector2.Zero, Box2i.Empty, new HashSet<Vector2i>());
  39. dungeon.AddRoom(room);
  40. return dungeon;
  41. }
  42. }