コード例 #1
0
        public GasMixture RemoveAirVolume(GasTankComponent component, float volume)
        {
            if (component.Air == null)
            {
                return(new GasMixture(volume));
            }

            var tankPressure = component.Air.Pressure;

            if (tankPressure < component.OutputPressure)
            {
                component.OutputPressure = tankPressure;
                UpdateUserInterface(component);
            }

            var molesNeeded = component.OutputPressure * volume / (Atmospherics.R * component.Air.Temperature);

            var air = RemoveAir(component, molesNeeded);

            if (air != null)
            {
                air.Volume = volume;
            }
            else
            {
                return(new GasMixture(volume));
            }

            return(air);
        }
コード例 #2
0
        public void ConnectToInternals(GasTankComponent component)
        {
            if (!CanConnectToInternals(component))
            {
                return;
            }
            var internals = GetInternalsComponent(component);

            if (internals == null)
            {
                return;
            }
            component.IsConnected = _internals.TryConnectTank(internals, component.Owner);
            _actions.SetToggled(component.ToggleAction, component.IsConnected);

            // Couldn't toggle!
            if (!component.IsConnected)
            {
                return;
            }

            component.ConnectStream?.Stop();

            if (component.ConnectSound != null)
            {
                component.ConnectStream = SoundSystem.Play(component.ConnectSound.GetSound(), Filter.Pvs(component.Owner, entityManager: EntityManager), component.Owner, component.ConnectSound.Params);
            }

            UpdateUserInterface(component);
        }
コード例 #3
0
        public GasMixture?RemoveAir(GasTankComponent component, float amount)
        {
            var gas = component.Air?.Remove(amount);

            CheckStatus(component);
            return(gas);
        }
コード例 #4
0
        private void OnActionToggle(EntityUid uid, GasTankComponent component, ToggleActionEvent args)
        {
            if (args.Handled)
            {
                return;
            }

            ToggleInternals(component);
            args.Handled = true;
        }
コード例 #5
0
 private void ToggleInternals(GasTankComponent component)
 {
     if (component.IsConnected)
     {
         DisconnectFromInternals(component);
     }
     else
     {
         ConnectToInternals(component);
     }
 }
コード例 #6
0
        private void OnGasTankToggleInternals(EntityUid uid, GasTankComponent component, GasTankToggleInternalsMessage args)
        {
            if (args.Session is not IPlayerSession playerSession ||
                playerSession.AttachedEntity is not {
            } player)
            {
                return;
            }

            ToggleInternals(component);
        }
コード例 #7
0
 private void OnExamined(EntityUid uid, GasTankComponent component, ExaminedEvent args)
 {
     if (args.IsInDetailsRange)
     {
         args.PushMarkup(Loc.GetString("comp-gas-tank-examine", ("pressure", Math.Round(component.Air?.Pressure ?? 0))));
     }
     if (component.IsConnected)
     {
         args.PushMarkup(Loc.GetString("comp-gas-tank-connected"));
     }
 }
コード例 #8
0
        public void UpdateUserInterface(GasTankComponent component, bool initialUpdate = false)
        {
            var internals = GetInternalsComponent(component);

            _ui.GetUiOrNull(component.Owner, SharedGasTankUiKey.Key)?.SetState(
                new GasTankBoundUserInterfaceState
            {
                TankPressure        = component.Air?.Pressure ?? 0,
                OutputPressure      = initialUpdate ? component.OutputPressure : null,
                InternalsConnected  = component.IsConnected,
                CanConnectInternals = IsFunctional(component) && internals != null
            });
        }
コード例 #9
0
 private InternalsComponent?GetInternalsComponent(GasTankComponent component, EntityUid?owner = null)
 {
     if (Deleted(component.Owner))
     {
         return(null);
     }
     if (owner != null)
     {
         return(CompOrNull <InternalsComponent>(owner.Value));
     }
     return(_containers.TryGetContainingContainer(component.Owner, out var container)
         ? CompOrNull <InternalsComponent>(container.Owner)
         : null);
 }
コード例 #10
0
        private void AddOpenUIVerb(EntityUid uid, GasTankComponent component, GetActivationVerbsEvent args)
        {
            if (!args.CanAccess || !EntityManager.TryGetComponent <ActorComponent?>(args.User, out var actor))
            {
                return;
            }

            Verb verb = new();

            verb.Act  = () => component.OpenInterface(actor.PlayerSession);
            verb.Text = Loc.GetString("control-verb-open-control-panel-text");
            // TODO VERBS add "open UI" icon?
            args.Verbs.Add(verb);
        }
コード例 #11
0
        public void DisconnectFromInternals(GasTankComponent component, EntityUid?owner = null)
        {
            if (!component.IsConnected)
            {
                return;
            }
            component.IsConnected = false;
            _actions.SetToggled(component.ToggleAction, false);

            _internals.DisconnectTank(GetInternalsComponent(component, owner));
            component.DisconnectStream?.Stop();

            if (component.DisconnectSound != null)
            {
                component.DisconnectStream = SoundSystem.Play(component.DisconnectSound.GetSound(), Filter.Pvs(component.Owner, entityManager: EntityManager), component.Owner, component.DisconnectSound.Params);
            }

            UpdateUserInterface(component);
        }
コード例 #12
0
        private void OnTankStartup(EntityUid uid, GasTankComponent tank, ComponentStartup args)
        {
            if (!ComponentManager.TryGetComponent(uid, out NodeContainerComponent? nodeContainer))
            {
                return;
            }

            if (!nodeContainer.TryGetNode(tank.TankName, out PipeNode? tankNode))
            {
                return;
            }

            // Create a pipenet if we don't have one already.
            tankNode.TryAssignGroupIfNeeded();
            tankNode.AssumeAir(tank.InitialMixture);
            tankNode.Volume          = tank.InitialMixture.Volume;
            tankNode.Air.Volume      = tank.InitialMixture.Volume;
            tankNode.Air.Temperature = tank.InitialMixture.Temperature;
        }
コード例 #13
0
 public bool CanConnectToInternals(GasTankComponent component)
 {
     return(!component.IsConnected && IsFunctional(component));
 }
コード例 #14
0
        public void CheckStatus(GasTankComponent component)
        {
            if (component.Air == null)
            {
                return;
            }

            var pressure = component.Air.Pressure;

            if (pressure > component.TankFragmentPressure)
            {
                // Give the gas a chance to build up more pressure.
                for (var i = 0; i < 3; i++)
                {
                    _atmosphereSystem.React(component.Air, component);
                }

                pressure = component.Air.Pressure;
                var range = (pressure - component.TankFragmentPressure) / component.TankFragmentScale;

                // Let's cap the explosion, yeah?
                // !1984
                if (range > GasTankComponent.MaxExplosionRange)
                {
                    range = GasTankComponent.MaxExplosionRange;
                }

                _explosions.TriggerExplosive(component.Owner, radius: range);

                return;
            }

            if (pressure > component.TankRupturePressure)
            {
                if (component.Integrity <= 0)
                {
                    var environment = _atmosphereSystem.GetContainingMixture(component.Owner, false, true);
                    if (environment != null)
                    {
                        _atmosphereSystem.Merge(environment, component.Air);
                    }

                    SoundSystem.Play(component.RuptureSound.GetSound(), Filter.Pvs(component.Owner), Transform(component.Owner).Coordinates, AudioHelpers.WithVariation(0.125f));

                    QueueDel(component.Owner);
                    return;
                }

                component.Integrity--;
                return;
            }

            if (pressure > component.TankLeakPressure)
            {
                if (component.Integrity <= 0)
                {
                    var environment = _atmosphereSystem.GetContainingMixture(component.Owner, false, true);
                    if (environment == null)
                    {
                        return;
                    }

                    var leakedGas = component.Air.RemoveRatio(0.25f);
                    _atmosphereSystem.Merge(environment, leakedGas);
                }
                else
                {
                    component.Integrity--;
                }

                return;
            }

            if (component.Integrity < 3)
            {
                component.Integrity++;
            }
        }
コード例 #15
0
 private void OnDropped(EntityUid uid, GasTankComponent component, DroppedEvent args)
 {
     DisconnectFromInternals(component, args.User);
 }
コード例 #16
0
 private void OnGetActions(EntityUid uid, GasTankComponent component, GetItemActionsEvent args)
 {
     args.Actions.Add(component.ToggleAction);
 }
コード例 #17
0
 private void BeforeUiOpen(EntityUid uid, GasTankComponent component, BeforeActivatableUIOpenEvent args)
 {
     // Only initial update includes output pressure information, to avoid overwriting client-input as the updates come in.
     UpdateUserInterface(component, true);
 }
コード例 #18
0
 public void AssumeAir(GasTankComponent component, GasMixture giver)
 {
     _atmosphereSystem.Merge(component.Air, giver);
     CheckStatus(component);
 }
コード例 #19
0
 private void OnGasTankSetPressure(EntityUid uid, GasTankComponent component, GasTankSetPressureMessage args)
 {
     component.OutputPressure = args.Pressure;
 }
コード例 #20
0
 private bool IsFunctional(GasTankComponent component)
 {
     return(GetInternalsComponent(component) != null);
 }
コード例 #21
0
 private void OnGasShutdown(EntityUid uid, GasTankComponent component, ComponentShutdown args)
 {
     DisconnectFromInternals(component);
 }