Exemple #1
0
 private void OnGasVentPumpLeaveAtmosphere(EntityUid uid, GasVentPumpComponent component, AtmosDeviceDisabledEvent args)
 {
     if (ComponentManager.TryGetComponent(uid, out AppearanceComponent? appearance))
     {
         appearance.SetData(VentPumpVisuals.State, VentPumpState.Off);
     }
 }
Exemple #2
0
        private void UpdateState(EntityUid uid, GasVentPumpComponent vent, AppearanceComponent?appearance = null)
        {
            if (!Resolve(uid, ref appearance, false))
            {
                return;
            }

            _ambientSoundSystem.SetAmbience(uid, true);
            if (!vent.Enabled)
            {
                _ambientSoundSystem.SetAmbience(uid, false);
                appearance.SetData(VentPumpVisuals.State, VentPumpState.Off);
            }
            else if (vent.PumpDirection == VentPumpDirection.Releasing)
            {
                appearance.SetData(VentPumpVisuals.State, VentPumpState.Out);
            }
            else if (vent.PumpDirection == VentPumpDirection.Siphoning)
            {
                appearance.SetData(VentPumpVisuals.State, VentPumpState.In);
            }
            else if (vent.Welded)
            {
                _ambientSoundSystem.SetAmbience(uid, false);
                appearance.SetData(VentPumpVisuals.State, VentPumpState.Welded);
            }
        }
Exemple #3
0
 private void OnInit(EntityUid uid, GasVentPumpComponent component, ComponentInit args)
 {
     if (component.CanLink)
     {
         _signalSystem.EnsureReceiverPorts(uid, component.PressurizePort, component.DepressurizePort);
     }
 }
 private void OnAtmosAlarm(EntityUid uid, GasVentPumpComponent component, AtmosMonitorAlarmEvent args)
 {
     if (args.HighestNetworkType == AtmosMonitorAlarmType.Danger)
     {
         component.Enabled = false;
     }
     else if (args.HighestNetworkType == AtmosMonitorAlarmType.Normal)
     {
         component.Enabled = true;
     }
 }
Exemple #5
0
 private void OnExamine(EntityUid uid, GasVentPumpComponent component, ExaminedEvent args)
 {
     if (!TryComp <GasVentPumpComponent>(uid, out var pumpComponent))
     {
         return;
     }
     if (args.IsInDetailsRange)
     {
         if (pumpComponent.UnderPressureLockout)
         {
             args.PushMarkup(Loc.GetString("gas-vent-pump-uvlo"));
         }
     }
 }
Exemple #6
0
        private void OnSignalReceived(EntityUid uid, GasVentPumpComponent component, SignalReceivedEvent args)
        {
            if (!component.CanLink)
            {
                return;
            }

            if (args.Port == component.PressurizePort)
            {
                component.PumpDirection         = VentPumpDirection.Releasing;
                component.ExternalPressureBound = component.PressurizePressure;
                component.PressureChecks        = VentPressureBound.ExternalBound;
                UpdateState(uid, component);
            }
            else if (args.Port == component.DepressurizePort)
            {
                component.PumpDirection         = VentPumpDirection.Siphoning;
                component.ExternalPressureBound = component.DepressurizePressure;
                component.PressureChecks        = VentPressureBound.ExternalBound;
                UpdateState(uid, component);
            }
        }
Exemple #7
0
        private void OnPacketRecv(EntityUid uid, GasVentPumpComponent component, DeviceNetworkPacketEvent args)
        {
            if (!EntityManager.TryGetComponent(uid, out DeviceNetworkComponent? netConn) ||
                !EntityManager.TryGetComponent(uid, out AtmosAlarmableComponent? alarmable) ||
                !args.Data.TryGetValue(DeviceNetworkConstants.Command, out var cmd))
            {
                return;
            }

            var payload = new NetworkPayload();

            switch (cmd)
            {
            case AirAlarmSystem.AirAlarmSyncCmd:
                payload.Add(DeviceNetworkConstants.Command, AirAlarmSystem.AirAlarmSyncData);
                payload.Add(AirAlarmSystem.AirAlarmSyncData, component.ToAirAlarmData());

                _deviceNetSystem.QueuePacket(uid, args.SenderAddress, payload, device: netConn);

                return;

            case AirAlarmSystem.AirAlarmSetData:
                if (!args.Data.TryGetValue(AirAlarmSystem.AirAlarmSetData, out GasVentPumpData? setData))
                {
                    break;
                }

                component.FromAirAlarmData(setData);
                UpdateState(uid, component);
                alarmable.IgnoreAlarms = setData.IgnoreAlarms;
                payload.Add(DeviceNetworkConstants.Command, AirAlarmSystem.AirAlarmSetDataStatus);
                payload.Add(AirAlarmSystem.AirAlarmSetDataStatus, true);

                _deviceNetSystem.QueuePacket(uid, null, payload, device: netConn);

                return;
            }
        }
Exemple #8
0
        private void OnGasVentPumpUpdated(EntityUid uid, GasVentPumpComponent vent, AtmosDeviceUpdateEvent args)
        {
            var appearance = vent.Owner.GetComponentOrNull <AppearanceComponent>();

            if (vent.Welded)
            {
                appearance?.SetData(VentPumpVisuals.State, VentPumpState.Welded);
                return;
            }

            appearance?.SetData(VentPumpVisuals.State, VentPumpState.Off);

            if (!vent.Enabled)
            {
                return;
            }

            if (!ComponentManager.TryGetComponent(uid, out NodeContainerComponent? nodeContainer))
            {
                return;
            }

            if (!nodeContainer.TryGetNode(vent.InletName, out PipeNode? pipe))
            {
                return;
            }

            var environment = args.Atmosphere.GetTile(vent.Owner.Transform.Coordinates) !;

            // We're in an air-blocked tile... Do nothing.
            if (environment.Air == null)
            {
                return;
            }

            if (vent.PumpDirection == VentPumpDirection.Releasing)
            {
                appearance?.SetData(VentPumpVisuals.State, VentPumpState.Out);
                var pressureDelta = 10000f;

                if ((vent.PressureChecks & VentPressureBound.ExternalBound) != 0)
                {
                    pressureDelta = MathF.Min(pressureDelta, vent.ExternalPressureBound - environment.Air.Pressure);
                }

                if ((vent.PressureChecks & VentPressureBound.InternalBound) != 0)
                {
                    pressureDelta = MathF.Min(pressureDelta, pipe.Air.Pressure - vent.InternalPressureBound);
                }

                if (pressureDelta > 0 && pipe.Air.Temperature > 0)
                {
                    var transferMoles = pressureDelta * environment.Air.Volume / (pipe.Air.Temperature * Atmospherics.R);

                    environment.AssumeAir(pipe.Air.Remove(transferMoles));
                }
            }
            else if (vent.PumpDirection == VentPumpDirection.Siphoning && environment.Air.Pressure > 0)
            {
                appearance?.SetData(VentPumpVisuals.State, VentPumpState.In);
                var ourMultiplier = pipe.Air.Volume / (environment.Air.Temperature * Atmospherics.R);
                var molesDelta    = 10000f * ourMultiplier;

                if ((vent.PressureChecks & VentPressureBound.ExternalBound) != 0)
                {
                    molesDelta = MathF.Min(molesDelta,
                                           (environment.Air.Pressure - vent.ExternalPressureBound) * environment.Air.Volume /
                                           (environment.Air.Temperature * Atmospherics.R));
                }

                if ((vent.PressureChecks & VentPressureBound.InternalBound) != 0)
                {
                    molesDelta = MathF.Min(molesDelta, (vent.InternalPressureBound - pipe.Air.Pressure) * ourMultiplier);
                }

                if (molesDelta > 0)
                {
                    var removed = environment.Air.Remove(molesDelta);
                    pipe.AssumeAir(removed);
                    environment.Invalidate();
                }
            }
        }
Exemple #9
0
        private void OnGasVentPumpUpdated(EntityUid uid, GasVentPumpComponent vent, AtmosDeviceUpdateEvent args)
        {
            //Bingo waz here
            if (vent.Welded)
            {
                return;
            }

            var nodeName = vent.PumpDirection switch
            {
                VentPumpDirection.Releasing => vent.Inlet,
                VentPumpDirection.Siphoning => vent.Outlet,
                _ => throw new ArgumentOutOfRangeException()
            };

            if (!vent.Enabled ||
                !TryComp(uid, out AtmosDeviceComponent? device) ||
                !TryComp(uid, out NodeContainerComponent? nodeContainer) ||
                !nodeContainer.TryGetNode(nodeName, out PipeNode? pipe))
            {
                return;
            }

            var environment = _atmosphereSystem.GetTileMixture(EntityManager.GetComponent <TransformComponent>(vent.Owner).Coordinates, true);

            // We're in an air-blocked tile... Do nothing.
            if (environment == null)
            {
                return;
            }

            var timeDelta     = (_gameTiming.CurTime - device.LastProcess).TotalSeconds;
            var pressureDelta = (float)timeDelta * vent.TargetPressureChange;

            if (vent.PumpDirection == VentPumpDirection.Releasing && pipe.Air.Pressure > 0)
            {
                if (environment.Pressure > vent.MaxPressure)
                {
                    return;
                }

                if ((vent.PressureChecks & VentPressureBound.ExternalBound) != 0)
                {
                    pressureDelta = MathF.Min(pressureDelta, vent.ExternalPressureBound - environment.Pressure);
                }

                if (pressureDelta <= 0)
                {
                    return;
                }

                // how many moles to transfer to change external pressure by pressureDelta
                // (ignoring temperature differences because I am lazy)
                var transferMoles = pressureDelta * environment.Volume / (pipe.Air.Temperature * Atmospherics.R);

                // limit transferMoles so the source doesn't go below its bound.
                if ((vent.PressureChecks & VentPressureBound.InternalBound) != 0)
                {
                    var internalDelta = pipe.Air.Pressure - vent.InternalPressureBound;

                    if (internalDelta <= 0)
                    {
                        return;
                    }

                    var maxTransfer = internalDelta * pipe.Air.Volume / (pipe.Air.Temperature * Atmospherics.R);
                    transferMoles = MathF.Min(transferMoles, maxTransfer);
                }

                _atmosphereSystem.Merge(environment, pipe.Air.Remove(transferMoles));
            }
            else if (vent.PumpDirection == VentPumpDirection.Siphoning && environment.Pressure > 0)
            {
                if (pipe.Air.Pressure > vent.MaxPressure)
                {
                    return;
                }

                if ((vent.PressureChecks & VentPressureBound.InternalBound) != 0)
                {
                    pressureDelta = MathF.Min(pressureDelta, vent.InternalPressureBound - pipe.Air.Pressure);
                }

                if (pressureDelta <= 0)
                {
                    return;
                }

                // how many moles to transfer to change internal pressure by pressureDelta
                // (ignoring temperature differences because I am lazy)
                var transferMoles = pressureDelta * pipe.Air.Volume / (environment.Temperature * Atmospherics.R);

                // limit transferMoles so the source doesn't go below its bound.
                if ((vent.PressureChecks & VentPressureBound.ExternalBound) != 0)
                {
                    var externalDelta = environment.Pressure - vent.ExternalPressureBound;

                    if (externalDelta <= 0)
                    {
                        return;
                    }

                    var maxTransfer = externalDelta * environment.Volume / (environment.Temperature * Atmospherics.R);

                    transferMoles = MathF.Min(transferMoles, maxTransfer);
                }

                _atmosphereSystem.Merge(pipe.Air, environment.Remove(transferMoles));
            }
        }
Exemple #10
0
 private void OnPowerChanged(EntityUid uid, GasVentPumpComponent component, PowerChangedEvent args)
 {
     component.Enabled = args.Powered;
     UpdateState(uid, component);
 }
Exemple #11
0
 private void OnGasVentPumpEnterAtmosphere(EntityUid uid, GasVentPumpComponent component, AtmosDeviceEnabledEvent args)
 {
     UpdateState(uid, component);
 }