using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; namespace Content.Shared.Atmos.Components; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] public sealed partial class GasTankComponent : Component, IGasMixtureHolder { public const float MaxExplosionRange = 26f; private const float DefaultLowPressure = 0f; private const float DefaultOutputPressure = Atmospherics.OneAtmosphere; public int Integrity = 3; public bool IsLowPressure => Air.Pressure <= TankLowPressure; [DataField] public SoundSpecifier RuptureSound = new SoundPathSpecifier("/Audio/Effects/spray.ogg"); [DataField] public SoundSpecifier? ConnectSound = new SoundPathSpecifier("/Audio/Effects/internals.ogg") { Params = AudioParams.Default.WithVolume(5f), }; [DataField] public SoundSpecifier? DisconnectSound; // Cancel toggles sounds if we re-toggle again. public EntityUid? ConnectStream; public EntityUid? DisconnectStream; [DataField] public GasMixture Air { get; set; } = new(); /// /// Pressure at which tank should be considered 'low' such as for internals. /// [DataField] public float TankLowPressure = DefaultLowPressure; /// /// Distributed pressure. /// [DataField, AutoNetworkedField] public float OutputPressure = DefaultOutputPressure; /// /// The maximum allowed output pressure. /// [DataField] public float MaxOutputPressure = 3 * DefaultOutputPressure; /// /// Tank is connected to internals. /// [ViewVariables] public bool IsConnected => User != null; [DataField, AutoNetworkedField] 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] public float TankLeakPressure = 30 * Atmospherics.OneAtmosphere; /// /// Pressure at which tank spills all contents into atmosphere. /// [DataField] public float TankRupturePressure = 40 * Atmospherics.OneAtmosphere; /// /// Base 3x3 explosion. /// [DataField] public float TankFragmentPressure = 50 * Atmospherics.OneAtmosphere; /// /// Increases explosion for each scale kPa above threshold. /// [DataField] public float TankFragmentScale = 2.25f * Atmospherics.OneAtmosphere; [DataField] public EntProtoId ToggleAction = "ActionToggleInternals"; [DataField, AutoNetworkedField] public EntityUid? ToggleActionEntity; /// /// Valve to release gas from tank /// [DataField, AutoNetworkedField] public bool IsValveOpen; /// /// Gas release rate in L/s /// [DataField, AutoNetworkedField] public float ValveOutputRate = 100f; [DataField] public SoundSpecifier ValveSound = new SoundCollectionSpecifier("valveSqueak") { Params = AudioParams.Default.WithVolume(-5f), }; }