1
0

NavMapSystem.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using System.Linq;
  2. using Content.Shared.Pinpointer;
  3. using Robust.Shared.GameStates;
  4. namespace Content.Client.Pinpointer;
  5. public sealed partial class NavMapSystem : SharedNavMapSystem
  6. {
  7. public override void Initialize()
  8. {
  9. base.Initialize();
  10. SubscribeLocalEvent<NavMapComponent, ComponentHandleState>(OnHandleState);
  11. }
  12. private void OnHandleState(EntityUid uid, NavMapComponent component, ref ComponentHandleState args)
  13. {
  14. Dictionary<Vector2i, int[]> modifiedChunks;
  15. Dictionary<NetEntity, NavMapBeacon> beacons;
  16. Dictionary<NetEntity, NavMapRegionProperties> regions;
  17. switch (args.Current)
  18. {
  19. case NavMapDeltaState delta:
  20. {
  21. modifiedChunks = delta.ModifiedChunks;
  22. beacons = delta.Beacons;
  23. regions = delta.Regions;
  24. foreach (var index in component.Chunks.Keys)
  25. {
  26. if (!delta.AllChunks!.Contains(index))
  27. component.Chunks.Remove(index);
  28. }
  29. break;
  30. }
  31. case NavMapState state:
  32. {
  33. modifiedChunks = state.Chunks;
  34. beacons = state.Beacons;
  35. regions = state.Regions;
  36. foreach (var index in component.Chunks.Keys)
  37. {
  38. if (!state.Chunks.ContainsKey(index))
  39. component.Chunks.Remove(index);
  40. }
  41. break;
  42. }
  43. default:
  44. return;
  45. }
  46. // Update region data and queue new regions for flooding
  47. var prevRegionOwners = component.RegionProperties.Keys.ToList();
  48. var validRegionOwners = new List<NetEntity>();
  49. component.RegionProperties.Clear();
  50. foreach (var (regionOwner, regionData) in regions)
  51. {
  52. if (!regionData.Seeds.Any())
  53. continue;
  54. component.RegionProperties[regionOwner] = regionData;
  55. validRegionOwners.Add(regionOwner);
  56. if (component.RegionOverlays.ContainsKey(regionOwner))
  57. continue;
  58. if (component.QueuedRegionsToFlood.Contains(regionOwner))
  59. continue;
  60. component.QueuedRegionsToFlood.Enqueue(regionOwner);
  61. }
  62. // Remove stale region owners
  63. var regionOwnersToRemove = prevRegionOwners.Except(validRegionOwners);
  64. foreach (var regionOwnerRemoved in regionOwnersToRemove)
  65. RemoveNavMapRegion(uid, component, regionOwnerRemoved);
  66. // Modify chunks
  67. foreach (var (origin, chunk) in modifiedChunks)
  68. {
  69. var newChunk = new NavMapChunk(origin);
  70. Array.Copy(chunk, newChunk.TileData, chunk.Length);
  71. component.Chunks[origin] = newChunk;
  72. // If the affected chunk intersects one or more regions, re-flood them
  73. if (!component.ChunkToRegionOwnerTable.TryGetValue(origin, out var affectedOwners))
  74. continue;
  75. foreach (var affectedOwner in affectedOwners)
  76. {
  77. if (!component.QueuedRegionsToFlood.Contains(affectedOwner))
  78. component.QueuedRegionsToFlood.Enqueue(affectedOwner);
  79. }
  80. }
  81. // Refresh beacons
  82. component.Beacons.Clear();
  83. foreach (var (nuid, beacon) in beacons)
  84. {
  85. component.Beacons[nuid] = beacon;
  86. }
  87. }
  88. }