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); } ///