GasPressurePumpSystem.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using Content.Server.Atmos.EntitySystems;
  2. using Content.Server.Atmos.Piping.Components;
  3. using Content.Server.NodeContainer.EntitySystems;
  4. using Content.Server.NodeContainer.Nodes;
  5. using Content.Server.Power.Components;
  6. using Content.Shared.Atmos;
  7. using Content.Shared.Atmos.Components;
  8. using Content.Shared.Atmos.EntitySystems;
  9. using Content.Shared.Audio;
  10. using JetBrains.Annotations;
  11. namespace Content.Server.Atmos.Piping.Binary.EntitySystems;
  12. [UsedImplicitly]
  13. public sealed class GasPressurePumpSystem : SharedGasPressurePumpSystem
  14. {
  15. [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!;
  16. [Dependency] private readonly SharedAmbientSoundSystem _ambientSoundSystem = default!;
  17. [Dependency] private readonly NodeContainerSystem _nodeContainer = default!;
  18. public override void Initialize()
  19. {
  20. base.Initialize();
  21. SubscribeLocalEvent<GasPressurePumpComponent, AtmosDeviceUpdateEvent>(OnPumpUpdated);
  22. }
  23. private void OnPumpUpdated(EntityUid uid, GasPressurePumpComponent pump, ref AtmosDeviceUpdateEvent args)
  24. {
  25. if (!pump.Enabled
  26. || (TryComp<ApcPowerReceiverComponent>(uid, out var power) && !power.Powered)
  27. || !_nodeContainer.TryGetNodes(uid, pump.InletName, pump.OutletName, out PipeNode? inlet, out PipeNode? outlet))
  28. {
  29. _ambientSoundSystem.SetAmbience(uid, false);
  30. return;
  31. }
  32. var outputStartingPressure = outlet.Air.Pressure;
  33. if (outputStartingPressure >= pump.TargetPressure)
  34. {
  35. _ambientSoundSystem.SetAmbience(uid, false);
  36. return; // No need to pump gas if target has been reached.
  37. }
  38. if (inlet.Air.TotalMoles > 0 && inlet.Air.Temperature > 0)
  39. {
  40. // We calculate the necessary moles to transfer using our good ol' friend PV=nRT.
  41. var pressureDelta = pump.TargetPressure - outputStartingPressure;
  42. var transferMoles = (pressureDelta * outlet.Air.Volume) / (inlet.Air.Temperature * Atmospherics.R);
  43. var removed = inlet.Air.Remove(transferMoles);
  44. _atmosphereSystem.Merge(outlet.Air, removed);
  45. _ambientSoundSystem.SetAmbience(uid, removed.TotalMoles > 0f);
  46. }
  47. }
  48. }