diff --git a/Content.Client/Atmos/Piping/Binary/Systems/GasValveSystem.cs b/Content.Client/Atmos/Piping/Binary/Systems/GasValveSystem.cs new file mode 100644 index 0000000000..61cb7d7eda --- /dev/null +++ b/Content.Client/Atmos/Piping/Binary/Systems/GasValveSystem.cs @@ -0,0 +1,8 @@ +using Content.Shared.Atmos.Piping.Binary.Systems; + +namespace Content.Client.Atmos.Piping.Binary.Systems; + +public sealed class GasValveSystem : SharedGasValveSystem +{ + +} diff --git a/Content.Server/Atmos/Piping/Binary/Components/GasValveComponent.cs b/Content.Server/Atmos/Piping/Binary/Components/GasValveComponent.cs deleted file mode 100644 index 1f09f07072..0000000000 --- a/Content.Server/Atmos/Piping/Binary/Components/GasValveComponent.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Robust.Shared.Audio; - -namespace Content.Server.Atmos.Piping.Binary.Components -{ - [RegisterComponent] - public sealed partial class GasValveComponent : Component - { - [DataField("open")] - public bool Open { get; set; } = true; - - [DataField("inlet")] - public string InletName { get; set; } = "inlet"; - - [DataField("outlet")] - public string OutletName { get; set; } = "outlet"; - - [DataField("valveSound")] - public SoundSpecifier ValveSound { get; private set; } = new SoundCollectionSpecifier("valveSqueak"); - } -} diff --git a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasValveSystem.cs b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasValveSystem.cs index 4aeba2f8fe..dc5e01b1c4 100644 --- a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasValveSystem.cs +++ b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasValveSystem.cs @@ -1,93 +1,34 @@ -using Content.Server.Atmos.Piping.Binary.Components; -using Content.Server.NodeContainer; using Content.Server.NodeContainer.EntitySystems; using Content.Server.NodeContainer.Nodes; -using Content.Shared.Atmos.Piping; +using Content.Shared.Atmos.Piping.Binary.Components; +using Content.Shared.Atmos.Piping.Binary.Systems; using Content.Shared.Audio; -using Content.Shared.Examine; -using Content.Shared.Interaction; -using JetBrains.Annotations; -using Robust.Shared.Audio; -using Robust.Shared.Audio.Systems; -using Robust.Shared.Player; -namespace Content.Server.Atmos.Piping.Binary.EntitySystems +namespace Content.Server.Atmos.Piping.Binary.EntitySystems; + +public sealed class GasValveSystem : SharedGasValveSystem { - [UsedImplicitly] - public sealed class GasValveSystem : EntitySystem + [Dependency] private readonly SharedAmbientSoundSystem _ambientSoundSystem = default!; + [Dependency] private readonly NodeContainerSystem _nodeContainer = default!; + + public override void Set(EntityUid uid, GasValveComponent component, bool value) { - [Dependency] private readonly SharedAmbientSoundSystem _ambientSoundSystem = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly NodeContainerSystem _nodeContainer = default!; + base.Set(uid, component, value); - public override void Initialize() + if (_nodeContainer.TryGetNodes(uid, component.InletName, component.OutletName, out PipeNode? inlet, out PipeNode? outlet)) { - base.Initialize(); - - SubscribeLocalEvent(OnStartup); - SubscribeLocalEvent(OnActivate); - SubscribeLocalEvent(OnExamined); - } - - private void OnExamined(Entity ent, ref ExaminedEvent args) - { - var valve = ent.Comp; - if (!Comp(ent).Anchored || !args.IsInDetailsRange) // Not anchored? Out of range? No status. - return; - - if (Loc.TryGetString("gas-valve-system-examined", out var str, - ("statusColor", valve.Open ? "green" : "orange"), - ("open", valve.Open))) + if (component.Open) { - args.PushMarkup(str); + inlet.AddAlwaysReachable(outlet); + outlet.AddAlwaysReachable(inlet); + _ambientSoundSystem.SetAmbience(uid, true); } - } - - private void OnStartup(EntityUid uid, GasValveComponent component, ComponentStartup args) - { - // We call set in startup so it sets the appearance, node state, etc. - Set(uid, component, component.Open); - } - - private void OnActivate(EntityUid uid, GasValveComponent component, ActivateInWorldEvent args) - { - if (args.Handled || !args.Complex) - return; - - Toggle(uid, component); - _audio.PlayPvs(component.ValveSound, uid, AudioParams.Default.WithVariation(0.25f)); - args.Handled = true; - } - - public void Set(EntityUid uid, GasValveComponent component, bool value) - { - component.Open = value; - - if (_nodeContainer.TryGetNodes(uid, component.InletName, component.OutletName, out PipeNode? inlet, out PipeNode? outlet)) + else { - if (TryComp(uid, out var appearance)) - { - _appearance.SetData(uid, FilterVisuals.Enabled, component.Open, appearance); - } - if (component.Open) - { - inlet.AddAlwaysReachable(outlet); - outlet.AddAlwaysReachable(inlet); - _ambientSoundSystem.SetAmbience(uid, true); - } - else - { - inlet.RemoveAlwaysReachable(outlet); - outlet.RemoveAlwaysReachable(inlet); - _ambientSoundSystem.SetAmbience(uid, false); - } + inlet.RemoveAlwaysReachable(outlet); + outlet.RemoveAlwaysReachable(inlet); + _ambientSoundSystem.SetAmbience(uid, false); } } - - public void Toggle(EntityUid uid, GasValveComponent component) - { - Set(uid, component, !component.Open); - } } } diff --git a/Content.Server/Atmos/Piping/Binary/EntitySystems/SignalControlledValveSystem.cs b/Content.Server/Atmos/Piping/Binary/EntitySystems/SignalControlledValveSystem.cs index f94785ac17..1f60ce1bbc 100644 --- a/Content.Server/Atmos/Piping/Binary/EntitySystems/SignalControlledValveSystem.cs +++ b/Content.Server/Atmos/Piping/Binary/EntitySystems/SignalControlledValveSystem.cs @@ -1,5 +1,6 @@ using Content.Server.Atmos.Piping.Binary.Components; using Content.Server.DeviceLinking.Systems; +using Content.Shared.Atmos.Piping.Binary.Components; using Content.Shared.DeviceLinking.Events; namespace Content.Server.Atmos.Piping.Binary.EntitySystems; diff --git a/Content.Server/Atmos/Piping/Unary/Components/GasOutletInjectorComponent.cs b/Content.Server/Atmos/Piping/Unary/Components/GasOutletInjectorComponent.cs index 3020b94d49..4a9cc15eba 100644 --- a/Content.Server/Atmos/Piping/Unary/Components/GasOutletInjectorComponent.cs +++ b/Content.Server/Atmos/Piping/Unary/Components/GasOutletInjectorComponent.cs @@ -11,7 +11,7 @@ namespace Content.Server.Atmos.Piping.Unary.Components { [ViewVariables(VVAccess.ReadWrite)] - public bool Enabled { get; set; } = true; + public bool Enabled = true; /// /// Target volume to transfer. If is enabled, actual transfer rate will be much higher. @@ -25,15 +25,14 @@ namespace Content.Server.Atmos.Piping.Unary.Components private float _transferRate = 50; - [ViewVariables(VVAccess.ReadWrite)] - [DataField("maxTransferRate")] + [DataField] public float MaxTransferRate = Atmospherics.MaxTransferRate; - [DataField("maxPressure")] + [DataField] [GuidebookData] - public float MaxPressure { get; set; } = GasVolumePumpComponent.DefaultHigherThreshold; + public float MaxPressure = GasVolumePumpComponent.DefaultHigherThreshold; [DataField("inlet")] - public string InletName { get; set; } = "pipe"; + public string InletName = "pipe"; } } diff --git a/Content.Shared/Atmos/Piping/Binary/Components/GasValveComponent.cs b/Content.Shared/Atmos/Piping/Binary/Components/GasValveComponent.cs new file mode 100644 index 0000000000..9ddebc97af --- /dev/null +++ b/Content.Shared/Atmos/Piping/Binary/Components/GasValveComponent.cs @@ -0,0 +1,36 @@ +using Content.Shared.Atmos.Piping.Binary.Systems; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; + +namespace Content.Shared.Atmos.Piping.Binary.Components; + +/// +/// Component for manual atmospherics pumps that can open or close to let gas through. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(SharedGasValveSystem))] +public sealed partial class GasValveComponent : Component +{ + /// + /// Whether the valve is currently open and letting gas through. + /// + [DataField, AutoNetworkedField, ViewVariables(VVAccess.ReadOnly)] + public bool Open = true; + + /// + /// Inlet for the nodecontainer. + /// + [DataField("inlet")] + public string InletName = "inlet"; + + /// + /// Outlet for the nodecontainer. + /// + [DataField("outlet")] + public string OutletName = "outlet"; + + /// + /// Sound when is toggled. + /// + [DataField] + public SoundSpecifier ValveSound = new SoundCollectionSpecifier("valveSqueak"); +} diff --git a/Content.Shared/Atmos/Piping/Binary/Systems/SharedGasValveSystem.cs b/Content.Shared/Atmos/Piping/Binary/Systems/SharedGasValveSystem.cs new file mode 100644 index 0000000000..1736c466e2 --- /dev/null +++ b/Content.Shared/Atmos/Piping/Binary/Systems/SharedGasValveSystem.cs @@ -0,0 +1,68 @@ +using Content.Shared.Atmos.Piping.Binary.Components; +using Content.Shared.Examine; +using Content.Shared.Interaction; +using Robust.Shared.Audio; +using Robust.Shared.Audio.Systems; + +namespace Content.Shared.Atmos.Piping.Binary.Systems; + +public abstract class SharedGasValveSystem : EntitySystem +{ + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnActivate); + SubscribeLocalEvent(OnExamined); + } + + private void OnStartup(Entity ent, ref ComponentStartup args) + { + // We call set in startup so it sets the appearance, node state, etc. + Set(ent.Owner, ent.Comp, ent.Comp.Open); + } + + public virtual void Set(EntityUid uid, GasValveComponent component, bool value) + { + component.Open = value; + Dirty(uid, component); + + if (TryComp(uid, out var appearance)) + { + _appearance.SetData(uid, FilterVisuals.Enabled, component.Open, appearance); + } + } + + public void Toggle(EntityUid uid, GasValveComponent component) + { + Set(uid, component, !component.Open); + } + + private void OnActivate(Entity ent, ref ActivateInWorldEvent args) + { + if (args.Handled || !args.Complex) + return; + + Toggle(ent.Owner, ent.Comp); + _audio.PlayPredicted(ent.Comp.ValveSound, ent.Owner, args.User, AudioParams.Default.WithVariation(0.25f)); + args.Handled = true; + } + + private void OnExamined(Entity ent, ref ExaminedEvent args) + { + var valve = ent.Comp; + if (!Transform(ent).Anchored) + return; + + if (Loc.TryGetString("gas-valve-system-examined", out var str, + ("statusColor", valve.Open ? "green" : "orange"), + ("open", valve.Open))) + { + args.PushMarkup(str); + } + } +}