diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs
index 36ac6e90de..ab23d98d57 100644
--- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs
+++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs
@@ -8,6 +8,30 @@ namespace Content.Server.Atmos.EntitySystems;
public partial class AtmosphereSystem
{
+ ///
+ /// Gets the particular price of an air mixture.
+ ///
+ public double GetPrice(GasMixture mixture)
+ {
+ float basePrice = 0; // moles of gas * price/mole
+ float totalMoles = 0; // total number of moles in can
+ float maxComponent = 0; // moles of the dominant gas
+ for (var i = 0; i < Atmospherics.TotalNumberOfGases; i++)
+ {
+ basePrice += mixture.Moles[i] * GetGas(i).PricePerMole;
+ totalMoles += mixture.Moles[i];
+ maxComponent = Math.Max(maxComponent, mixture.Moles[i]);
+ }
+
+ // Pay more for gas canisters that are more pure
+ float purity = 1;
+ if (totalMoles > 0) {
+ purity = maxComponent / totalMoles;
+ }
+
+ return basePrice * purity;
+ }
+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void InvalidateVisuals(EntityUid gridUid, Vector2i tile)
{
diff --git a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs
index b2e1df1d76..b10dc335b7 100644
--- a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs
+++ b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs
@@ -1,16 +1,15 @@
using Content.Server.Atmos.Components;
using Content.Server.Body.Components;
using Content.Server.Body.Systems;
+using Content.Server.Cargo.Systems;
using Content.Server.Explosion.EntitySystems;
using Content.Server.UserInterface;
using Content.Shared.Actions;
using Content.Shared.Atmos;
using Content.Shared.Atmos.Components;
using Content.Shared.Audio;
-using Content.Shared.Interaction.Events;
using Content.Shared.Toggleable;
using Content.Shared.Examine;
-using Content.Shared.Inventory;
using JetBrains.Annotations;
using Robust.Server.GameObjects;
using Robust.Server.Player;
@@ -45,6 +44,7 @@ namespace Content.Server.Atmos.EntitySystems
SubscribeLocalEvent(OnGasTankSetPressure);
SubscribeLocalEvent(OnGasTankToggleInternals);
SubscribeLocalEvent(OnAnalyzed);
+ SubscribeLocalEvent(OnGasTankPrice);
}
private void OnGasShutdown(EntityUid uid, GasTankComponent component, ComponentShutdown args)
@@ -332,5 +332,10 @@ namespace Content.Server.Atmos.EntitySystems
{
args.GasMixtures = new Dictionary { {Name(uid), component.Air} };
}
+
+ private void OnGasTankPrice(EntityUid uid, GasTankComponent component, ref PriceCalculationEvent args)
+ {
+ args.Price += _atmosphereSystem.GetPrice(component.Air);
+ }
}
}
diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs
index a9dd4ec1f8..bfeaf1f352 100644
--- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs
+++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs
@@ -298,22 +298,7 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems
private void CalculateCanisterPrice(EntityUid uid, GasCanisterComponent component, ref PriceCalculationEvent args)
{
- float basePrice = 0; // moles of gas * price/mole
- float totalMoles = 0; // total number of moles in can
- float maxComponent = 0; // moles of the dominant gas
- for (var i = 0; i < Atmospherics.TotalNumberOfGases; i++)
- {
- basePrice += component.Air.Moles[i] * _atmosphereSystem.GetGas(i).PricePerMole;
- totalMoles += component.Air.Moles[i];
- maxComponent = Math.Max(maxComponent, component.Air.Moles[i]);
- }
-
- // Pay more for gas canisters that are more pure
- float purity = 1;
- if (totalMoles > 0) {
- purity = maxComponent / totalMoles;
- }
- args.Price += basePrice * purity;
+ args.Price += _atmosphereSystem.GetPrice(component.Air);
}
///