using Content.Shared.Actions.ActionTypes; using Content.Shared.Atmos; using Robust.Shared.Audio; namespace Content.Server.Atmos.Components { [RegisterComponent] public sealed partial class GasTankComponent : Component, IGasMixtureHolder { public const float MaxExplosionRange = 80f; private const float DefaultLowPressure = 0f; private const float DefaultOutputPressure = Atmospherics.OneAtmosphere; public int Integrity = 3; public bool IsLowPressure => (Air?.Pressure ?? 0F) <= TankLowPressure; [ViewVariables(VVAccess.ReadWrite), DataField("ruptureSound")] public SoundSpecifier RuptureSound = new SoundPathSpecifier("/Audio/Effects/spray.ogg"); [ViewVariables(VVAccess.ReadWrite), DataField("connectSound")] public SoundSpecifier? ConnectSound = new SoundPathSpecifier("/Audio/Effects/internals.ogg") { Params = AudioParams.Default.WithVolume(5f), }; [ViewVariables(VVAccess.ReadWrite), DataField("disconnectSound")] public SoundSpecifier? DisconnectSound; // Cancel toggles sounds if we re-toggle again. public IPlayingAudioStream? ConnectStream; public IPlayingAudioStream? DisconnectStream; [DataField("air"), ViewVariables(VVAccess.ReadWrite)] public GasMixture Air { get; set; } = new(); /// /// Pressure at which tank should be considered 'low' such as for internals. /// [DataField("tankLowPressure"), ViewVariables(VVAccess.ReadWrite)] public float TankLowPressure = DefaultLowPressure; /// /// Distributed pressure. /// [DataField("outputPressure"), ViewVariables(VVAccess.ReadWrite)] public float OutputPressure = DefaultOutputPressure; /// /// Tank is connected to internals. /// [ViewVariables] public bool IsConnected => User != null; [ViewVariables] public EntityUid? User; /// /// True if this entity was recently moved out of a container. This might have been a hand -> inventory /// transfer, or it might have been the user dropping the tank. This indicates the tank needs to be checked. /// [ViewVariables] public bool CheckUser; /// /// Pressure at which tanks start leaking. /// [DataField("tankLeakPressure"), ViewVariables(VVAccess.ReadWrite)] public float TankLeakPressure = 30 * Atmospherics.OneAtmosphere; /// /// Pressure at which tank spills all contents into atmosphere. /// [DataField("tankRupturePressure"), ViewVariables(VVAccess.ReadWrite)] public float TankRupturePressure = 40 * Atmospherics.OneAtmosphere; /// /// Base 3x3 explosion. /// [DataField("tankFragmentPressure"), ViewVariables(VVAccess.ReadWrite)] public float TankFragmentPressure = 50 * Atmospherics.OneAtmosphere; /// /// Increases explosion for each scale kPa above threshold. /// [DataField("tankFragmentScale"), ViewVariables(VVAccess.ReadWrite)] public float TankFragmentScale = 2 * Atmospherics.OneAtmosphere; [DataField("toggleAction", required: true)] public InstantAction ToggleAction = new(); /// /// Valve to release gas from tank /// [DataField("isValveOpen"), ViewVariables(VVAccess.ReadWrite)] public bool IsValveOpen = false; /// /// Gas release rate in L/s /// [DataField("valveOutputRate"), ViewVariables(VVAccess.ReadWrite)] public float ValveOutputRate = 100f; [DataField("valveSound"), ViewVariables(VVAccess.ReadWrite)] public SoundSpecifier ValveSound = new SoundCollectionSpecifier("valveSqueak") { Params = AudioParams.Default.WithVolume(-5f), }; } }