private void OnOutletInjectorUpdated(EntityUid uid, GasOutletInjectorComponent injector, AtmosDeviceUpdateEvent args)
        {
            injector.Injecting = false;

            if (!injector.Enabled)
            {
                return;
            }

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

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

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

            if (environment == null)
            {
                return;
            }

            if (inlet.Air.Temperature > 0)
            {
                var transferMoles = inlet.Air.Pressure * injector.VolumeRate / (inlet.Air.Temperature * Atmospherics.R);

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

                _atmosphereSystem.Merge(environment, removed);
            }
        }
예제 #2
0
        public void UpdateAppearance(GasOutletInjectorComponent component, AppearanceComponent?appearance = null)
        {
            if (!Resolve(component.Owner, ref appearance, false))
            {
                return;
            }

            appearance.SetData(OutletInjectorVisuals.Enabled, component.Enabled);
        }
예제 #3
0
        private void OnOutletInjectorUpdated(EntityUid uid, GasOutletInjectorComponent injector, AtmosDeviceUpdateEvent args)
        {
            if (!injector.Enabled)
            {
                return;
            }

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

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

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

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

            if (environment == null)
            {
                return;
            }

            if (inlet.Air.Temperature < 0)
            {
                return;
            }

            if (environment.Pressure > injector.MaxPressure)
            {
                return;
            }

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

            // TODO adjust ratio so that environment does not go above MaxPressure?
            var ratio   = MathF.Min(1f, timeDelta * injector.TransferRate / inlet.Air.Volume);
            var removed = inlet.Air.RemoveRatio(ratio);

            _atmosphereSystem.Merge(environment, removed);
        }
예제 #4
0
 private void OnActivate(EntityUid uid, GasOutletInjectorComponent component, ActivateInWorldEvent args)
 {
     component.Enabled = !component.Enabled;
     UpdateAppearance(component);
 }
예제 #5
0
 private void OnMapInit(EntityUid uid, GasOutletInjectorComponent component, MapInitEvent args)
 {
     UpdateAppearance(component);
 }