/// <summary>
        ///     Updates a scrubber's appearance and ambience state.
        /// </summary>
        private void UpdateState(EntityUid uid, GasVentScrubberComponent scrubber,
                                 AppearanceComponent?appearance = null)
        {
            if (!Resolve(uid, ref appearance, false))
            {
                return;
            }

            _ambientSoundSystem.SetAmbience(uid, true);
            if (!scrubber.Enabled)
            {
                _ambientSoundSystem.SetAmbience(uid, false);
                appearance.SetData(ScrubberVisuals.State, ScrubberState.Off);
            }
            else if (scrubber.PumpDirection == ScrubberPumpDirection.Scrubbing)
            {
                appearance.SetData(ScrubberVisuals.State, scrubber.WideNet ? ScrubberState.WideScrub : ScrubberState.Scrub);
            }
            else if (scrubber.PumpDirection == ScrubberPumpDirection.Siphoning)
            {
                appearance.SetData(ScrubberVisuals.State, ScrubberState.Siphon);
            }
            else if (scrubber.Welded)
            {
                _ambientSoundSystem.SetAmbience(uid, false);
                appearance.SetData(ScrubberVisuals.State, ScrubberState.Welded);
            }
        }
Esempio n. 2
0
 private void OnVentScrubberLeaveAtmosphere(EntityUid uid, GasVentScrubberComponent component, AtmosDeviceDisabledEvent args)
 {
     if (ComponentManager.TryGetComponent(uid, out AppearanceComponent? appearance))
     {
         appearance.SetData(ScrubberVisuals.State, ScrubberState.Off);
     }
 }
Esempio n. 3
0
        private void Scrub(float timeDelta, GasVentScrubberComponent scrubber, GasMixture?tile, PipeNode outlet)
        {
            // Cannot scrub if tile is null or air-blocked.
            if (tile == null ||
                outlet.Air.Pressure >= 50 * Atmospherics.OneAtmosphere)    // Cannot scrub if pressure too high.
            {
                return;
            }

            // Take a gas sample.
            var ratio   = MathF.Min(1f, timeDelta * scrubber.TransferRate / tile.Volume);
            var removed = tile.RemoveRatio(ratio);

            // Nothing left to remove from the tile.
            if (MathHelper.CloseToPercent(removed.TotalMoles, 0f))
            {
                return;
            }

            if (scrubber.PumpDirection == ScrubberPumpDirection.Scrubbing)
            {
                _atmosphereSystem.ScrubInto(removed, outlet.Air, scrubber.FilterGases);

                // Remix the gases.
                _atmosphereSystem.Merge(tile, removed);
            }
            else if (scrubber.PumpDirection == ScrubberPumpDirection.Siphoning)
            {
                _atmosphereSystem.Merge(outlet.Air, removed);
            }
        }
Esempio n. 4
0
        private void OnVentScrubberUpdated(EntityUid uid, GasVentScrubberComponent scrubber, AtmosDeviceUpdateEvent args)
        {
            var appearance = scrubber.Owner.GetComponentOrNull <AppearanceComponent>();

            if (scrubber.Welded)
            {
                appearance?.SetData(ScrubberVisuals.State, ScrubberState.Welded);
                return;
            }

            if (!scrubber.Enabled ||
                !ComponentManager.TryGetComponent(uid, out NodeContainerComponent? nodeContainer) ||
                !nodeContainer.TryGetNode(scrubber.OutletName, out PipeNode? outlet))
            {
                appearance?.SetData(ScrubberVisuals.State, ScrubberState.Off);
                return;
            }

            var environment = _atmosphereSystem.GetTileMixture(scrubber.Owner.Transform.Coordinates, true);

            Scrub(_atmosphereSystem, scrubber, appearance, environment, outlet);

            if (!scrubber.WideNet)
            {
                return;
            }

            // Scrub adjacent tiles too.
            foreach (var adjacent in _atmosphereSystem.GetAdjacentTileMixtures(scrubber.Owner.Transform.Coordinates, false, true))
            {
                Scrub(_atmosphereSystem, scrubber, null, adjacent, outlet);
            }
        }
Esempio n. 5
0
 private void OnAtmosAlarm(EntityUid uid, GasVentScrubberComponent component, AtmosMonitorAlarmEvent args)
 {
     if (args.HighestNetworkType == AtmosMonitorAlarmType.Danger)
     {
         component.Enabled = false;
     }
     else if (args.HighestNetworkType == AtmosMonitorAlarmType.Normal)
     {
         component.Enabled = true;
     }
 }
        private void OnVentScrubberUpdated(EntityUid uid, GasVentScrubberComponent scrubber, AtmosDeviceUpdateEvent args)
        {
            if (scrubber.Welded)
            {
                return;
            }

            if (!TryComp(uid, out AtmosDeviceComponent? device))
            {
                return;
            }

            var timeDelta = (float)(_gameTiming.CurTime - device.LastProcess).TotalSeconds;

            if (!scrubber.Enabled ||
                !EntityManager.TryGetComponent(uid, out NodeContainerComponent? nodeContainer) ||
                !nodeContainer.TryGetNode(scrubber.OutletName, out PipeNode? outlet))
            {
                return;
            }

            var xform = Transform(uid);

            if (xform.GridUid == null)
            {
                return;
            }

            var position = _transformSystem.GetGridOrMapTilePosition(uid, xform);

            var environment = _atmosphereSystem.GetTileMixture(xform.GridUid, xform.MapUid, position, true);

            Scrub(timeDelta, scrubber, environment, outlet);

            if (!scrubber.WideNet)
            {
                return;
            }

            // Scrub adjacent tiles too.
            foreach (var adjacent in _atmosphereSystem.GetAdjacentTileMixtures(xform.GridUid.Value, position, false, true))
            {
                Scrub(timeDelta, scrubber, adjacent, outlet);
            }
        }
        private void Scrub(GasVentScrubberComponent scrubber, AppearanceComponent?appearance, TileAtmosphere?tile, PipeNode outlet)
        {
            // Cannot scrub if tile is null or air-blocked.
            if (tile?.Air == null)
            {
                return;
            }

            // Cannot scrub if pressure too high.
            if (outlet.Air.Pressure >= 50 * Atmospherics.OneAtmosphere)
            {
                return;
            }

            if (scrubber.PumpDirection == ScrubberPumpDirection.Scrubbing)
            {
                appearance?.SetData(ScrubberVisuals.State, scrubber.WideNet ? ScrubberState.WideScrub : ScrubberState.Scrub);
                var transferMoles = MathF.Min(1f, (scrubber.VolumeRate / tile.Air.Volume) * tile.Air.TotalMoles);

                // Take a gas sample.
                var removed = tile.Air.Remove(transferMoles);

                // Nothing left to remove from the tile.
                if (MathHelper.CloseTo(removed.TotalMoles, 0f))
                {
                    return;
                }

                // TODO: Entity system dependency
                Get <AtmosphereSystem>().ScrubInto(removed, outlet.Air, scrubber.FilterGases);

                // Remix the gases.
                tile.AssumeAir(removed);
            }
            else if (scrubber.PumpDirection == ScrubberPumpDirection.Siphoning)
            {
                appearance?.SetData(ScrubberVisuals.State, ScrubberState.Siphon);
                var transferMoles = tile.Air.TotalMoles * (scrubber.VolumeRate / tile.Air.Volume);

                var removed = tile.Air.Remove(transferMoles);

                outlet.AssumeAir(removed);
                tile.Invalidate();
            }
        }
        private void OnVentScrubberUpdated(EntityUid uid, GasVentScrubberComponent scrubber, AtmosDeviceUpdateEvent args)
        {
            var appearance = scrubber.Owner.GetComponentOrNull <AppearanceComponent>();

            if (scrubber.Welded)
            {
                appearance?.SetData(ScrubberVisuals.State, ScrubberState.Welded);
                return;
            }

            appearance?.SetData(ScrubberVisuals.State, ScrubberState.Off);

            if (!scrubber.Enabled)
            {
                return;
            }

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

            if (!nodeContainer.TryGetNode(scrubber.OutletName, out PipeNode? outlet))
            {
                return;
            }

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

            Scrub(scrubber, appearance, environment, outlet);

            if (!scrubber.WideNet)
            {
                return;
            }

            // Scrub adjacent tiles too.
            foreach (var adjacent in environment.AdjacentTiles)
            {
                // Pass null appearance, we don't need to set it there.
                Scrub(scrubber, null, adjacent, outlet);
            }
        }
Esempio n. 9
0
        private void OnVentScrubberUpdated(EntityUid uid, GasVentScrubberComponent scrubber, AtmosDeviceUpdateEvent args)
        {
            var appearance = EntityManager.GetComponentOrNull <AppearanceComponent>(scrubber.Owner);

            if (scrubber.Welded)
            {
                appearance?.SetData(ScrubberVisuals.State, ScrubberState.Welded);
                _ambientSoundSystem.SetAmbience(scrubber.Owner, false);
                return;
            }

            if (!TryComp(uid, out AtmosDeviceComponent? device))
            {
                return;
            }

            var timeDelta = (float)(_gameTiming.CurTime - device.LastProcess).TotalSeconds;

            if (!scrubber.Enabled ||
                !EntityManager.TryGetComponent(uid, out NodeContainerComponent? nodeContainer) ||
                !nodeContainer.TryGetNode(scrubber.OutletName, out PipeNode? outlet))
            {
                appearance?.SetData(ScrubberVisuals.State, ScrubberState.Off);
                _ambientSoundSystem.SetAmbience(scrubber.Owner, false);
                return;
            }
            _ambientSoundSystem.SetAmbience(scrubber.Owner, true);

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

            Scrub(timeDelta, scrubber, appearance, environment, outlet);

            if (!scrubber.WideNet)
            {
                return;
            }

            // Scrub adjacent tiles too.
            foreach (var adjacent in _atmosphereSystem.GetAdjacentTileMixtures(EntityManager.GetComponent <TransformComponent>(scrubber.Owner).Coordinates, false, true))
            {
                Scrub(timeDelta, scrubber, null, adjacent, outlet);
            }
        }
Esempio n. 10
0
        private void Scrub(AtmosphereSystem atmosphereSystem, GasVentScrubberComponent scrubber, AppearanceComponent?appearance, GasMixture?tile, PipeNode outlet)
        {
            // Cannot scrub if tile is null or air-blocked.
            if (tile == null ||
                outlet.Air.Pressure >= 50 * Atmospherics.OneAtmosphere)    // Cannot scrub if pressure too high.
            {
                appearance?.SetData(ScrubberVisuals.State, ScrubberState.Off);
                return;
            }

            if (scrubber.PumpDirection == ScrubberPumpDirection.Scrubbing)
            {
                appearance?.SetData(ScrubberVisuals.State, scrubber.WideNet ? ScrubberState.WideScrub : ScrubberState.Scrub);
                var transferMoles = MathF.Min(1f, (scrubber.VolumeRate / tile.Volume) * tile.TotalMoles);

                // Take a gas sample.
                var removed = tile.Remove(transferMoles);

                // Nothing left to remove from the tile.
                if (MathHelper.CloseTo(removed.TotalMoles, 0f))
                {
                    return;
                }

                atmosphereSystem.ScrubInto(removed, outlet.Air, scrubber.FilterGases);

                // Remix the gases.
                atmosphereSystem.Merge(tile, removed);
            }
            else if (scrubber.PumpDirection == ScrubberPumpDirection.Siphoning)
            {
                appearance?.SetData(ScrubberVisuals.State, ScrubberState.Siphon);
                var transferMoles = tile.TotalMoles * (scrubber.VolumeRate / tile.Volume);

                var removed = tile.Remove(transferMoles);

                outlet.AssumeAir(removed);
            }
        }
        private void OnPacketRecv(EntityUid uid, GasVentScrubberComponent 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 GasVentScrubberData? 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;
            }
        }
 private void Scrub(float timeDelta, GasVentScrubberComponent scrubber, GasMixture?tile, PipeNode outlet)
 {
     Scrub(timeDelta, scrubber.TransferRate, scrubber.PumpDirection, scrubber.FilterGases, tile, outlet.Air);
 }
 private void OnVentScrubberEnterAtmosphere(EntityUid uid, GasVentScrubberComponent component,
                                            AtmosDeviceEnabledEvent args) => UpdateState(uid, component);
 private void OnPowerChanged(EntityUid uid, GasVentScrubberComponent component, PowerChangedEvent args)
 {
     component.Enabled = args.Powered;
     UpdateState(uid, component);
 }
Esempio n. 15
0
 private void OnPowerChanged(EntityUid uid, GasVentScrubberComponent component, PowerChangedEvent args) =>
 component.Enabled = args.Powered;