* Moved GasMixture to shared * Temp Fix for sandbox violation, idk why Array.Resize isn't working properly. It's already sandboxed. * The most powerful webedit in history
35 lines
1.2 KiB
C#
35 lines
1.2 KiB
C#
using Content.Server.Atmos.EntitySystems;
|
|
using Content.Shared.Atmos;
|
|
using Content.Shared.Atmos.Reactions;
|
|
using JetBrains.Annotations;
|
|
|
|
namespace Content.Server.Atmos.Reactions;
|
|
|
|
[UsedImplicitly]
|
|
public sealed partial class AmmoniaOxygenReaction : IGasReactionEffect
|
|
{
|
|
public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, AtmosphereSystem atmosphereSystem, float heatScale)
|
|
{
|
|
var nAmmonia = mixture.GetMoles(Gas.Ammonia);
|
|
var nOxygen = mixture.GetMoles(Gas.Oxygen);
|
|
var nTotal = mixture.TotalMoles;
|
|
|
|
// Concentration-dependent reaction rate
|
|
var fAmmonia = nAmmonia/nTotal;
|
|
var fOxygen = nOxygen/nTotal;
|
|
var rate = MathF.Pow(fAmmonia, 2) * MathF.Pow(fOxygen, 2);
|
|
|
|
var deltaMoles = nAmmonia / Atmospherics.AmmoniaOxygenReactionRate * 2 * rate;
|
|
|
|
if (deltaMoles <= 0 || nAmmonia - deltaMoles < 0)
|
|
return ReactionResult.NoReaction;
|
|
|
|
mixture.AdjustMoles(Gas.Ammonia, -deltaMoles);
|
|
mixture.AdjustMoles(Gas.Oxygen, -deltaMoles);
|
|
mixture.AdjustMoles(Gas.NitrousOxide, deltaMoles / 2);
|
|
mixture.AdjustMoles(Gas.WaterVapor, deltaMoles * 1.5f);
|
|
|
|
return ReactionResult.Reacting;
|
|
}
|
|
}
|