private void OnTransferRateChangeMessage(EntityUid uid, GasFilterComponent filter, GasFilterChangeRateMessage args)
 {
     filter.TransferRate = Math.Clamp(args.Rate, 0f, Atmospherics.MaxTransferRate);
     _adminLogSystem.Add(LogType.AtmosVolumeChanged, LogImpact.Medium,
                         $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the transfer rate on {ToPrettyString(uid):device} to {args.Rate}");
     DirtyUI(uid, filter);
 }
 private void OnSelectGasMessage(EntityUid uid, GasFilterComponent filter, GasFilterSelectGasMessage args)
 {
     if (Enum.TryParse <Gas>(args.ID.ToString(), true, out var parsedGas))
     {
         filter.FilteredGas = parsedGas;
         DirtyUI(uid, filter);
     }
 }
        private void OnToggleStatusMessage(EntityUid uid, GasFilterComponent filter, GasFilterToggleStatusMessage args)
        {
            filter.Enabled = args.Enabled;
            _adminLogSystem.Add(LogType.AtmosPowerChanged, LogImpact.Medium,
                                $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}");

            DirtyUI(uid, filter);
        }
        private void OnFilterLeaveAtmosphere(EntityUid uid, GasFilterComponent filter, AtmosDeviceDisabledEvent args)
        {
            filter.Enabled = false;

            UpdateAppearance(uid, filter);
            _ambientSoundSystem.SetAmbience(filter.Owner, false);

            DirtyUI(uid, filter);
            _userInterfaceSystem.TryCloseAll(uid, GasFilterUiKey.Key);
        }
示例#5
0
        private void OnFilterUpdated(EntityUid uid, GasFilterComponent filter, AtmosDeviceUpdateEvent args)
        {
            var appearance = EntityManager.GetComponentOrNull <AppearanceComponent>(filter.Owner);

            if (!filter.Enabled ||
                !EntityManager.TryGetComponent(uid, out NodeContainerComponent? nodeContainer) ||
                !EntityManager.TryGetComponent(uid, out AtmosDeviceComponent? device) ||
                !nodeContainer.TryGetNode(filter.InletName, out PipeNode? inletNode) ||
                !nodeContainer.TryGetNode(filter.FilterName, out PipeNode? filterNode) ||
                !nodeContainer.TryGetNode(filter.OutletName, out PipeNode? outletNode) ||
                outletNode.Air.Pressure >= Atmospherics.MaxOutputPressure) // No need to transfer if target is full.
            {
                appearance?.SetData(FilterVisuals.Enabled, false);
                _ambientSoundSystem.SetAmbience(filter.Owner, false);
                return;
            }

            // We multiply the transfer rate in L/s by the seconds passed since the last process to get the liters.
            var transferRatio = (float)(filter.TransferRate * (_gameTiming.CurTime - device.LastProcess).TotalSeconds) / inletNode.Air.Volume;

            if (transferRatio <= 0)
            {
                appearance?.SetData(FilterVisuals.Enabled, false);
                _ambientSoundSystem.SetAmbience(filter.Owner, false);
                return;
            }

            var removed = inletNode.Air.RemoveRatio(transferRatio);

            if (filter.FilteredGas.HasValue)
            {
                appearance?.SetData(FilterVisuals.Enabled, true);

                var filteredOut = new GasMixture()
                {
                    Temperature = removed.Temperature
                };

                filteredOut.SetMoles(filter.FilteredGas.Value, removed.GetMoles(filter.FilteredGas.Value));
                removed.SetMoles(filter.FilteredGas.Value, 0f);

                var target = filterNode.Air.Pressure < Atmospherics.MaxOutputPressure ? filterNode : inletNode;
                _atmosphereSystem.Merge(target.Air, filteredOut);
                if (filteredOut.Pressure != 0f)
                {
                    _ambientSoundSystem.SetAmbience(filter.Owner, true);
                }
                else
                {
                    _ambientSoundSystem.SetAmbience(filter.Owner, false);
                }
            }

            _atmosphereSystem.Merge(outletNode.Air, removed);
        }
        private void OnFilterUpdated(EntityUid uid, GasFilterComponent filter, AtmosDeviceUpdateEvent args)
        {
            if (!filter.Enabled)
            {
                return;
            }

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

            if (!ComponentManager.TryGetComponent(uid, out AtmosDeviceComponent? device))
            {
                return;
            }

            if (!nodeContainer.TryGetNode(filter.InletName, out PipeNode? inletNode) ||
                !nodeContainer.TryGetNode(filter.FilterName, out PipeNode? filterNode) ||
                !nodeContainer.TryGetNode(filter.OutletName, out PipeNode? outletNode))
            {
                return;
            }

            if (outletNode.Air.Pressure >= Atmospherics.MaxOutputPressure)
            {
                return; // No need to transfer if target is full.
            }
            // We multiply the transfer rate in L/s by the seconds passed since the last process to get the liters.
            var transferRatio = (float)(filter.TransferRate * (_gameTiming.CurTime - device.LastProcess).TotalSeconds) / inletNode.Air.Volume;

            if (transferRatio <= 0)
            {
                return;
            }

            var removed = inletNode.Air.RemoveRatio(transferRatio);

            if (filter.FilteredGas.HasValue)
            {
                var filteredOut = new GasMixture()
                {
                    Temperature = removed.Temperature
                };

                filteredOut.SetMoles(filter.FilteredGas.Value, removed.GetMoles(filter.FilteredGas.Value));
                removed.SetMoles(filter.FilteredGas.Value, 0f);

                var target = filterNode.Air.Pressure < Atmospherics.MaxOutputPressure ? filterNode : inletNode;
                target.AssumeAir(filteredOut);
            }

            outletNode.AssumeAir(removed);
        }
        private void OnAnchorChanged(EntityUid uid, GasFilterComponent component, ref AnchorStateChangedEvent args)
        {
            if (args.Anchored)
            {
                return;
            }

            component.Enabled = false;
            if (TryComp(uid, out AppearanceComponent? appearance))
            {
                appearance.SetData(FilterVisuals.Enabled, false);
            }

            DirtyUI(uid, component);
            _userInterfaceSystem.TryCloseAll(uid, GasFilterUiKey.Key);
        }
        private void OnFilterInteractHand(EntityUid uid, GasFilterComponent component, InteractHandEvent args)
        {
            if (!EntityManager.TryGetComponent(args.User, out ActorComponent? actor))
            {
                return;
            }

            if (EntityManager.GetComponent <TransformComponent>(component.Owner).Anchored)
            {
                _userInterfaceSystem.TryOpen(uid, GasFilterUiKey.Key, actor.PlayerSession);
                DirtyUI(uid, component);
            }
            else
            {
                args.User.PopupMessageCursor(Loc.GetString("comp-gas-filter-ui-needs-anchor"));
            }

            args.Handled = true;
        }
 private void OnTransferRateChangeMessage(EntityUid uid, GasFilterComponent filter, GasFilterChangeRateMessage args)
 {
     filter.TransferRate = Math.Clamp(args.Rate, 0f, Atmospherics.MaxTransferRate);
     DirtyUI(uid, filter);
 }
 private void OnToggleStatusMessage(EntityUid uid, GasFilterComponent filter, GasFilterToggleStatusMessage args)
 {
     filter.Enabled = args.Enabled;
     DirtyUI(uid, filter);
 }
 private void OnInit(EntityUid uid, GasFilterComponent filter, ComponentInit args)
 {
     UpdateAppearance(uid, filter);
 }