#nullable enable using System.Linq; using Content.Server.Atmos; using Content.Server.GameObjects.Components.NodeContainer; using Content.Server.GameObjects.Components.NodeContainer.Nodes; using Content.Shared.GameObjects.Components.Atmos; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Server.GameObjects; using Robust.Shared.GameObjects; using Robust.Shared.Log; using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components.Atmos.Piping.Pumps { /// /// Transfer gas from one to another. /// public abstract class BasePumpComponent : Component, IActivate { /// /// If the pump is currently pumping. /// [ViewVariables(VVAccess.ReadWrite)] public bool PumpEnabled { get => _pumpEnabled; set { _pumpEnabled = value; UpdateAppearance(); } } [DataField("pumpEnabled")] private bool _pumpEnabled; /// /// Needs to be same as that of a on this entity. /// [ViewVariables] [DataField("initialInletDirection", required: true)] private PipeDirection _initialInletDirection = PipeDirection.None; /// /// Needs to be same as that of a on this entity. /// [ViewVariables] [DataField("initialOutletDirection", required: true)] private PipeDirection _initialOutletDirection = PipeDirection.None; [ViewVariables] private PipeNode? _inletPipe; [ViewVariables] private PipeNode? _outletPipe; private AppearanceComponent? _appearance; public override void Initialize() { base.Initialize(); Owner.EnsureComponentWarn(); SetPipes(); Owner.TryGetComponent(out _appearance); UpdateAppearance(); } public override void HandleMessage(ComponentMessage message, IComponent? component) { base.HandleMessage(message, component); switch (message) { case PipeNetUpdateMessage: Update(); break; } } public void Update() { if (!PumpEnabled) return; if (_inletPipe == null || _outletPipe == null) return; PumpGas(_inletPipe.Air, _outletPipe.Air); } protected abstract void PumpGas(GasMixture inletGas, GasMixture outletGas); private void UpdateAppearance() { if (_inletPipe == null || _outletPipe == null) return; _appearance?.SetData(PumpVisuals.VisualState, new PumpVisualState(_initialInletDirection, _initialOutletDirection, PumpEnabled)); } void IActivate.Activate(ActivateEventArgs eventArgs) { PumpEnabled = !PumpEnabled; } private void SetPipes() { _inletPipe = null; _outletPipe = null; if (!Owner.TryGetComponent(out var container)) { Logger.Warning($"{nameof(BasePumpComponent)} on {Owner?.Prototype?.ID}, Uid {Owner?.Uid} did not have a {nameof(NodeContainerComponent)}."); return; } var pipeNodes = container.Nodes.OfType(); _inletPipe = pipeNodes.Where(pipe => pipe.PipeDirection == _initialInletDirection).FirstOrDefault(); _outletPipe = pipeNodes.Where(pipe => pipe.PipeDirection == _initialOutletDirection).FirstOrDefault(); if (_inletPipe == null || _outletPipe == null) { Logger.Warning($"{nameof(BasePumpComponent)} on {Owner?.Prototype?.ID}, Uid {Owner?.Uid} could not find compatible {nameof(PipeNode)}s on its {nameof(NodeContainerComponent)}."); return; } } } }