GasTileOverlaySystem.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using Content.Client.Atmos.Overlays;
  2. using Content.Shared.Atmos;
  3. using Content.Shared.Atmos.Components;
  4. using Content.Shared.Atmos.EntitySystems;
  5. using JetBrains.Annotations;
  6. using Robust.Client.GameObjects;
  7. using Robust.Client.Graphics;
  8. using Robust.Client.ResourceManagement;
  9. using Robust.Shared.GameStates;
  10. namespace Content.Client.Atmos.EntitySystems
  11. {
  12. [UsedImplicitly]
  13. public sealed class GasTileOverlaySystem : SharedGasTileOverlaySystem
  14. {
  15. [Dependency] private readonly IResourceCache _resourceCache = default!;
  16. [Dependency] private readonly IOverlayManager _overlayMan = default!;
  17. [Dependency] private readonly SpriteSystem _spriteSys = default!;
  18. [Dependency] private readonly SharedTransformSystem _xformSys = default!;
  19. private GasTileOverlay _overlay = default!;
  20. public override void Initialize()
  21. {
  22. base.Initialize();
  23. SubscribeNetworkEvent<GasOverlayUpdateEvent>(HandleGasOverlayUpdate);
  24. SubscribeLocalEvent<GasTileOverlayComponent, ComponentHandleState>(OnHandleState);
  25. _overlay = new GasTileOverlay(this, EntityManager, _resourceCache, ProtoMan, _spriteSys, _xformSys);
  26. _overlayMan.AddOverlay(_overlay);
  27. }
  28. public override void Shutdown()
  29. {
  30. base.Shutdown();
  31. _overlayMan.RemoveOverlay<GasTileOverlay>();
  32. }
  33. private void OnHandleState(EntityUid gridUid, GasTileOverlayComponent comp, ref ComponentHandleState args)
  34. {
  35. Dictionary<Vector2i, GasOverlayChunk> modifiedChunks;
  36. switch (args.Current)
  37. {
  38. // is this a delta or full state?
  39. case GasTileOverlayDeltaState delta:
  40. {
  41. modifiedChunks = delta.ModifiedChunks;
  42. foreach (var index in comp.Chunks.Keys)
  43. {
  44. if (!delta.AllChunks.Contains(index))
  45. comp.Chunks.Remove(index);
  46. }
  47. break;
  48. }
  49. case GasTileOverlayState state:
  50. {
  51. modifiedChunks = state.Chunks;
  52. foreach (var index in comp.Chunks.Keys)
  53. {
  54. if (!state.Chunks.ContainsKey(index))
  55. comp.Chunks.Remove(index);
  56. }
  57. break;
  58. }
  59. default:
  60. return;
  61. }
  62. foreach (var (index, data) in modifiedChunks)
  63. {
  64. comp.Chunks[index] = data;
  65. }
  66. }
  67. private void HandleGasOverlayUpdate(GasOverlayUpdateEvent ev)
  68. {
  69. foreach (var (nent, removedIndicies) in ev.RemovedChunks)
  70. {
  71. var grid = GetEntity(nent);
  72. if (!TryComp(grid, out GasTileOverlayComponent? comp))
  73. continue;
  74. foreach (var index in removedIndicies)
  75. {
  76. comp.Chunks.Remove(index);
  77. }
  78. }
  79. foreach (var (nent, gridData) in ev.UpdatedChunks)
  80. {
  81. var grid = GetEntity(nent);
  82. if (!TryComp(grid, out GasTileOverlayComponent? comp))
  83. continue;
  84. foreach (var chunkData in gridData)
  85. {
  86. comp.Chunks[chunkData.Index] = chunkData;
  87. }
  88. }
  89. }
  90. }
  91. }