SharedAtmosMonitoringConsoleSystem.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using Content.Shared.Atmos.Components;
  2. using Robust.Shared.GameStates;
  3. using Robust.Shared.Serialization;
  4. namespace Content.Shared.Atmos.Consoles;
  5. public abstract class SharedAtmosMonitoringConsoleSystem : EntitySystem
  6. {
  7. public override void Initialize()
  8. {
  9. base.Initialize();
  10. SubscribeLocalEvent<AtmosMonitoringConsoleComponent, ComponentGetState>(OnGetState);
  11. }
  12. private void OnGetState(EntityUid uid, AtmosMonitoringConsoleComponent component, ref ComponentGetState args)
  13. {
  14. Dictionary<Vector2i, Dictionary<(int, string), ulong>> chunks;
  15. // Should this be a full component state or a delta-state?
  16. if (args.FromTick <= component.CreationTick || component.ForceFullUpdate)
  17. {
  18. component.ForceFullUpdate = false;
  19. // Full state
  20. chunks = new(component.AtmosPipeChunks.Count);
  21. foreach (var (origin, chunk) in component.AtmosPipeChunks)
  22. {
  23. chunks.Add(origin, chunk.AtmosPipeData);
  24. }
  25. args.State = new AtmosMonitoringConsoleState(chunks, component.AtmosDevices);
  26. return;
  27. }
  28. chunks = new();
  29. foreach (var (origin, chunk) in component.AtmosPipeChunks)
  30. {
  31. if (chunk.LastUpdate < args.FromTick)
  32. continue;
  33. chunks.Add(origin, chunk.AtmosPipeData);
  34. }
  35. args.State = new AtmosMonitoringConsoleDeltaState(chunks, component.AtmosDevices, new(component.AtmosPipeChunks.Keys));
  36. }
  37. #region: System messages
  38. [Serializable, NetSerializable]
  39. protected sealed class AtmosMonitoringConsoleState(
  40. Dictionary<Vector2i, Dictionary<(int, string), ulong>> chunks,
  41. Dictionary<NetEntity, AtmosDeviceNavMapData> atmosDevices)
  42. : ComponentState
  43. {
  44. public Dictionary<Vector2i, Dictionary<(int, string), ulong>> Chunks = chunks;
  45. public Dictionary<NetEntity, AtmosDeviceNavMapData> AtmosDevices = atmosDevices;
  46. }
  47. [Serializable, NetSerializable]
  48. protected sealed class AtmosMonitoringConsoleDeltaState(
  49. Dictionary<Vector2i, Dictionary<(int, string), ulong>> modifiedChunks,
  50. Dictionary<NetEntity, AtmosDeviceNavMapData> atmosDevices,
  51. HashSet<Vector2i> allChunks)
  52. : ComponentState, IComponentDeltaState<AtmosMonitoringConsoleState>
  53. {
  54. public Dictionary<Vector2i, Dictionary<(int, string), ulong>> ModifiedChunks = modifiedChunks;
  55. public Dictionary<NetEntity, AtmosDeviceNavMapData> AtmosDevices = atmosDevices;
  56. public HashSet<Vector2i> AllChunks = allChunks;
  57. public void ApplyToFullState(AtmosMonitoringConsoleState state)
  58. {
  59. foreach (var key in state.Chunks.Keys)
  60. {
  61. if (!AllChunks!.Contains(key))
  62. state.Chunks.Remove(key);
  63. }
  64. foreach (var (index, data) in ModifiedChunks)
  65. {
  66. state.Chunks[index] = new Dictionary<(int, string), ulong>(data);
  67. }
  68. state.AtmosDevices.Clear();
  69. foreach (var (nuid, atmosDevice) in AtmosDevices)
  70. {
  71. state.AtmosDevices.Add(nuid, atmosDevice);
  72. }
  73. }
  74. public AtmosMonitoringConsoleState CreateNewFullState(AtmosMonitoringConsoleState state)
  75. {
  76. var chunks = new Dictionary<Vector2i, Dictionary<(int, string), ulong>>(state.Chunks.Count);
  77. foreach (var (index, data) in state.Chunks)
  78. {
  79. if (!AllChunks!.Contains(index))
  80. continue;
  81. if (ModifiedChunks.ContainsKey(index))
  82. chunks[index] = new Dictionary<(int, string), ulong>(ModifiedChunks[index]);
  83. else
  84. chunks[index] = new Dictionary<(int, string), ulong>(state.Chunks[index]);
  85. }
  86. return new AtmosMonitoringConsoleState(chunks, new(AtmosDevices));
  87. }
  88. }
  89. #endregion
  90. }