1
0

DungeonJob.DunGenExterior.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using System.Threading.Tasks;
  2. using Content.Server.NPC.Pathfinding;
  3. using Content.Shared.Maps;
  4. using Content.Shared.NPC;
  5. using Content.Shared.Procedural;
  6. using Content.Shared.Procedural.DungeonGenerators;
  7. using Robust.Shared.Collections;
  8. using Robust.Shared.Random;
  9. using Robust.Shared.Utility;
  10. namespace Content.Server.Procedural.DungeonJob;
  11. public sealed partial class DungeonJob
  12. {
  13. /// <summary>
  14. /// <see cref="ExteriorDunGen"/>
  15. /// </summary>
  16. private async Task<List<Dungeon>> GenerateExteriorDungen(Vector2i position, ExteriorDunGen dungen, HashSet<Vector2i> reservedTiles, Random random)
  17. {
  18. DebugTools.Assert(_grid.ChunkCount > 0);
  19. var aabb = new Box2i(_grid.LocalAABB.BottomLeft.Floored(), _grid.LocalAABB.TopRight.Floored());
  20. var angle = random.NextAngle();
  21. var distance = Math.Max(aabb.Width / 2f + 1f, aabb.Height / 2f + 1f);
  22. var startTile = new Vector2i(0, (int) distance).Rotate(angle);
  23. Vector2i? dungeonSpawn = null;
  24. var pathfinder = _entManager.System<PathfindingSystem>();
  25. // Gridcast
  26. SharedPathfindingSystem.GridCast(startTile, position, tile =>
  27. {
  28. if (!_maps.TryGetTileRef(_gridUid, _grid, tile, out var tileRef) ||
  29. tileRef.Tile.IsSpace(_tileDefManager))
  30. {
  31. return true;
  32. }
  33. dungeonSpawn = tile;
  34. return false;
  35. });
  36. if (dungeonSpawn == null)
  37. {
  38. return new List<Dungeon>()
  39. {
  40. Dungeon.Empty
  41. };
  42. }
  43. var config = _prototype.Index(dungen.Proto);
  44. var nextSeed = random.Next();
  45. var dungeons = await GetDungeons(dungeonSpawn.Value, config, config.Data, config.Layers, reservedTiles, nextSeed, new Random(nextSeed));
  46. return dungeons;
  47. }
  48. }