using Content.Server.Atmos; using Content.Server.GameObjects.Components.NodeContainer; using Content.Server.GameObjects.Components.NodeContainer.Nodes; using Content.Server.GameObjects.EntitySystems; using Robust.Shared.GameObjects.Systems; using Robust.Shared.Log; using Robust.Shared.ViewVariables; using System.Linq; namespace Content.Server.GameObjects.Components.Atmos.Piping { /// /// Transfers gas from a to the tile it is on. /// public abstract class BaseVentComponent : PipeNetDeviceComponent { [ViewVariables] private PipeNode _ventInlet; private AtmosphereSystem _atmosSystem; public override void Initialize() { base.Initialize(); _atmosSystem = EntitySystem.Get(); if (!Owner.TryGetComponent(out var container)) { JoinedGridAtmos?.RemovePipeNetDevice(this); Logger.Error($"{typeof(BaseVentComponent)} on entity {Owner.Uid} did not have a {nameof(NodeContainerComponent)}."); return; } _ventInlet = container.Nodes.OfType().FirstOrDefault(); if (_ventInlet == null) { JoinedGridAtmos?.RemovePipeNetDevice(this); Logger.Error($"{typeof(BaseVentComponent)} on entity {Owner.Uid} could not find compatible {nameof(PipeNode)}s on its {nameof(NodeContainerComponent)}."); return; } } public override void Update() { var tileAtmos = AtmosHelpers.GetTileAtmosphere(Owner.Transform.GridPosition); if (tileAtmos == null) return; VentGas(_ventInlet.Air, tileAtmos.Air); _atmosSystem.GetGridAtmosphere(Owner.Transform.GridID).Invalidate(tileAtmos.GridIndices); } protected abstract void VentGas(GasMixture inletGas, GasMixture outletGas); } }