AirAlarmModes.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. using Content.Server.Atmos.Monitor.Components;
  2. using Content.Server.Atmos.Monitor.Systems;
  3. using Content.Server.DeviceNetwork.Systems;
  4. using Content.Shared.Atmos;
  5. using Content.Shared.Atmos.Monitor.Components;
  6. using Content.Shared.Atmos.Piping.Unary.Components;
  7. namespace Content.Server.Atmos.Monitor;
  8. /// <summary>
  9. /// This is an interface that air alarm modes use
  10. /// in order to execute the defined modes.
  11. /// </summary>
  12. public interface IAirAlarmMode
  13. {
  14. // This is executed the moment the mode
  15. // is set. This is to ensure that 'dumb'
  16. // modes such as Filter/Panic are immediately
  17. // set.
  18. /// <summary>
  19. /// Executed the mode is set on an air alarm.
  20. /// This is to ensure that modes like Filter/Panic
  21. /// are immediately set.
  22. /// </summary>
  23. public void Execute(EntityUid uid);
  24. }
  25. // IAirAlarmModeUpdate
  26. //
  27. // This is an interface that AirAlarmSystem uses
  28. // in order to 'update' air alarm modes so that
  29. // modes like Replace can be implemented.
  30. /// <summary>
  31. /// An interface that AirAlarmSystem uses
  32. /// in order to update air alarm modes that
  33. /// need updating (e.g., Replace)
  34. /// </summary>
  35. public interface IAirAlarmModeUpdate
  36. {
  37. /// <summary>
  38. /// This is checked by AirAlarmSystem when
  39. /// a mode is updated. This should be set
  40. /// to a DeviceNetwork address, or some
  41. /// unique identifier that ID's the
  42. /// owner of the mode's executor.
  43. /// </summary>
  44. public string NetOwner { get; set; }
  45. /// <summary>
  46. /// This is executed every time the air alarm
  47. /// update loop is fully executed. This should
  48. /// be where all the logic goes.
  49. /// </summary>
  50. public void Update(EntityUid uid);
  51. }
  52. public sealed class AirAlarmModeFactory
  53. {
  54. private static IAirAlarmMode _filterMode = new AirAlarmFilterMode();
  55. private static IAirAlarmMode _wideFilterMode = new AirAlarmWideFilterMode();
  56. private static IAirAlarmMode _fillMode = new AirAlarmFillMode();
  57. private static IAirAlarmMode _panicMode = new AirAlarmPanicMode();
  58. private static IAirAlarmMode _noneMode = new AirAlarmNoneMode();
  59. // still not a fan since ReplaceMode must have an allocation
  60. // but it's whatever
  61. public static IAirAlarmMode? ModeToExecutor(AirAlarmMode mode)
  62. {
  63. return mode switch
  64. {
  65. AirAlarmMode.Filtering => _filterMode,
  66. AirAlarmMode.WideFiltering => _wideFilterMode,
  67. AirAlarmMode.Fill => _fillMode,
  68. AirAlarmMode.Panic => _panicMode,
  69. AirAlarmMode.None => _noneMode,
  70. _ => null
  71. };
  72. }
  73. }
  74. // like a tiny little EntitySystem
  75. public abstract class AirAlarmModeExecutor : IAirAlarmMode
  76. {
  77. [Dependency] public readonly IEntityManager EntityManager = default!;
  78. public readonly DeviceNetworkSystem DeviceNetworkSystem;
  79. public readonly AirAlarmSystem AirAlarmSystem;
  80. public abstract void Execute(EntityUid uid);
  81. public AirAlarmModeExecutor()
  82. {
  83. IoCManager.InjectDependencies(this);
  84. DeviceNetworkSystem = EntityManager.System<DeviceNetworkSystem>();
  85. AirAlarmSystem = EntityManager.System<AirAlarmSystem>();
  86. }
  87. }
  88. public sealed class AirAlarmNoneMode : AirAlarmModeExecutor
  89. {
  90. public override void Execute(EntityUid uid)
  91. {
  92. if (!EntityManager.TryGetComponent(uid, out AirAlarmComponent? alarm))
  93. return;
  94. foreach (var (addr, device) in alarm.VentData)
  95. {
  96. device.Enabled = false;
  97. AirAlarmSystem.SetData(uid, addr, device);
  98. }
  99. foreach (var (addr, device) in alarm.ScrubberData)
  100. {
  101. device.Enabled = false;
  102. AirAlarmSystem.SetData(uid, addr, device);
  103. }
  104. }
  105. }
  106. public sealed class AirAlarmFilterMode : AirAlarmModeExecutor
  107. {
  108. public override void Execute(EntityUid uid)
  109. {
  110. if (!EntityManager.TryGetComponent(uid, out AirAlarmComponent? alarm))
  111. return;
  112. foreach (var (addr, device) in alarm.VentData)
  113. {
  114. AirAlarmSystem.SetData(uid, addr, GasVentPumpData.FilterModePreset);
  115. }
  116. foreach (var (addr, device) in alarm.ScrubberData)
  117. {
  118. AirAlarmSystem.SetData(uid, addr, GasVentScrubberData.FilterModePreset);
  119. }
  120. }
  121. }
  122. public sealed class AirAlarmWideFilterMode : AirAlarmModeExecutor
  123. {
  124. public override void Execute(EntityUid uid)
  125. {
  126. if (!EntityManager.TryGetComponent(uid, out AirAlarmComponent? alarm))
  127. return;
  128. foreach (var (addr, device) in alarm.VentData)
  129. {
  130. AirAlarmSystem.SetData(uid, addr, GasVentPumpData.FilterModePreset);
  131. }
  132. foreach (var (addr, device) in alarm.ScrubberData)
  133. {
  134. AirAlarmSystem.SetData(uid, addr, GasVentScrubberData.WideFilterModePreset);
  135. }
  136. }
  137. }
  138. public sealed class AirAlarmPanicMode : AirAlarmModeExecutor
  139. {
  140. public override void Execute(EntityUid uid)
  141. {
  142. if (!EntityManager.TryGetComponent(uid, out AirAlarmComponent? alarm))
  143. return;
  144. foreach (var (addr, device) in alarm.VentData)
  145. {
  146. AirAlarmSystem.SetData(uid, addr, GasVentPumpData.PanicModePreset);
  147. }
  148. foreach (var (addr, device) in alarm.ScrubberData)
  149. {
  150. AirAlarmSystem.SetData(uid, addr, GasVentScrubberData.PanicModePreset);
  151. }
  152. }
  153. }
  154. public sealed class AirAlarmFillMode : AirAlarmModeExecutor
  155. {
  156. public override void Execute(EntityUid uid)
  157. {
  158. if (!EntityManager.TryGetComponent(uid, out AirAlarmComponent? alarm))
  159. return;
  160. foreach (var (addr, device) in alarm.VentData)
  161. {
  162. AirAlarmSystem.SetData(uid, addr, GasVentPumpData.FillModePreset);
  163. }
  164. foreach (var (addr, device) in alarm.ScrubberData)
  165. {
  166. AirAlarmSystem.SetData(uid, addr, GasVentScrubberData.FillModePreset);
  167. }
  168. }
  169. }