diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs index 18b4c52433..66acde56c2 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs @@ -17,16 +17,19 @@ using Content.Shared.Interaction; using Content.Shared.Interaction.Helpers; using JetBrains.Annotations; using Robust.Server.GameObjects; +using Robust.Server.Player; using Robust.Shared.Containers; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Maths; +using Robust.Shared.Players; namespace Content.Server.Atmos.Piping.Unary.EntitySystems { [UsedImplicitly] public class GasCanisterSystem : EntitySystem { + [Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!; [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; public override void Initialize() @@ -40,14 +43,14 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems SubscribeLocalEvent(OnCanisterInteractUsing); SubscribeLocalEvent(OnCanisterContainerInserted); SubscribeLocalEvent(OnCanisterContainerRemoved); + // Bound UI subscriptions + SubscribeLocalEvent(OnHoldingTankEjectMessage); + SubscribeLocalEvent(OnCanisterChangeReleasePressure); + SubscribeLocalEvent(OnCanisterChangeReleaseValve); } private void OnCanisterStartup(EntityUid uid, GasCanisterComponent canister, ComponentStartup args) { - // TODO ATMOS: Don't use Owner to get the UI. - if(canister.Owner.GetUIOrNull(GasCanisterUiKey.Key) is {} ui) - ui.OnReceiveMessage += msg => OnCanisterUIMessage(uid, canister, msg); - // Ensure container manager. if (!ComponentManager.TryGetComponent(uid, out ContainerManagerComponent? containerManager)) { @@ -61,14 +64,22 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems } } + private bool CheckInteract(ICommonSession session) + { + if (session.AttachedEntity is not {} entity + || !Get().CanInteract(entity) + || !Get().CanUse(entity)) + return false; + + return true; + } + private void DirtyUI(EntityUid uid) { if (!ComponentManager.TryGetComponent(uid, out IMetaDataComponent? metadata) || !ComponentManager.TryGetComponent(uid, out GasCanisterComponent? canister) || !ComponentManager.TryGetComponent(uid, out NodeContainerComponent? nodeContainer) - || !nodeContainer.TryGetNode(canister.PortName, out PipeNode? portNode) - || !ComponentManager.TryGetComponent(uid, out ServerUserInterfaceComponent? userInterfaceComponent) - || !userInterfaceComponent.TryGetBoundUserInterface(GasCanisterUiKey.Key, out var ui)) + || !nodeContainer.TryGetNode(canister.PortName, out PipeNode? portNode)) return; string? tankLabel = null; @@ -84,45 +95,45 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems tankPressure = tankComponent.Air.Pressure; } - ui.SetState(new GasCanisterBoundUserInterfaceState(metadata.EntityName, canister.Air.Pressure, + _userInterfaceSystem.TrySetUiState(uid, GasCanisterUiKey.Key, new GasCanisterBoundUserInterfaceState(metadata.EntityName, canister.Air.Pressure, portNode.NodeGroup?.Nodes.Count > 1, tankLabel, tankPressure, canister.ReleasePressure, canister.ReleaseValve, canister.MinReleasePressure, canister.MaxReleasePressure)); } - private void OnCanisterUIMessage(EntityUid uid, GasCanisterComponent canister, ServerBoundUserInterfaceMessage msg) + private void OnHoldingTankEjectMessage(EntityUid uid, GasCanisterComponent canister, GasCanisterHoldingTankEjectMessage args) { - if (msg.Session.AttachedEntity is not {} entity - || !Get().CanInteract(entity) - || !Get().CanUse(entity)) + if (!CheckInteract(args.Session)) return; - if (!ComponentManager.TryGetComponent(uid, out ContainerManagerComponent? containerManager) - || !containerManager.TryGetContainer(canister.ContainerName, out var container)) + || !containerManager.TryGetContainer(canister.ContainerName, out var container)) return; - switch (msg.Message) - { - case GasCanisterHoldingTankEjectMessage: - if (container.ContainedEntities.Count == 0) - break; + if (container.ContainedEntities.Count == 0) + return; - container.Remove(container.ContainedEntities[0]); - break; + container.Remove(container.ContainedEntities[0]); + } - case GasCanisterChangeReleasePressureMessage changeReleasePressure: - var pressure = Math.Clamp(changeReleasePressure.Pressure, canister.MinReleasePressure, canister.MaxReleasePressure); + private void OnCanisterChangeReleasePressure(EntityUid uid, GasCanisterComponent canister, GasCanisterChangeReleasePressureMessage args) + { + if (!CheckInteract(args.Session)) + return; - canister.ReleasePressure = pressure; - DirtyUI(uid); - break; + var pressure = Math.Clamp(args.Pressure, canister.MinReleasePressure, canister.MaxReleasePressure); - case GasCanisterChangeReleaseValveMessage changeReleaseValve: - canister.ReleaseValve = changeReleaseValve.Valve; - DirtyUI(uid); - break; - } + canister.ReleasePressure = pressure; + DirtyUI(uid); + } + + private void OnCanisterChangeReleaseValve(EntityUid uid, GasCanisterComponent canister, GasCanisterChangeReleaseValveMessage args) + { + if (!CheckInteract(args.Session)) + return; + + canister.ReleaseValve = args.Valve; + DirtyUI(uid); } private void OnCanisterUpdated(EntityUid uid, GasCanisterComponent canister, AtmosDeviceUpdateEvent args)