Add atmos.speedup which is effectively a atmos-only time compression CVar. This adjusts heat capacities and transfer rates to effectively globally speed up the time constants of atmos. This allows faster response to heating/cooling changes and faster cleanups (by buffing scrubbers, pumps, and everything else) that is tunable through one global time compression CVar. It also achieves this without any thermodynamic unsoundness.
83 lines
3.0 KiB
C#
83 lines
3.0 KiB
C#
using Content.Server.Atmos.EntitySystems;
|
|
using Content.Server.Atmos.Piping.Components;
|
|
using Content.Server.Atmos.Piping.Unary.Components;
|
|
using Content.Server.NodeContainer;
|
|
using Content.Server.NodeContainer.EntitySystems;
|
|
using Content.Server.NodeContainer.Nodes;
|
|
using Content.Shared.Atmos.Piping;
|
|
using Content.Shared.Interaction;
|
|
using JetBrains.Annotations;
|
|
|
|
namespace Content.Server.Atmos.Piping.Unary.EntitySystems
|
|
{
|
|
[UsedImplicitly]
|
|
public sealed class GasOutletInjectorSystem : EntitySystem
|
|
{
|
|
[Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!;
|
|
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
|
[Dependency] private readonly NodeContainerSystem _nodeContainer = default!;
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
|
|
SubscribeLocalEvent<GasOutletInjectorComponent, AtmosDeviceUpdateEvent>(OnOutletInjectorUpdated);
|
|
SubscribeLocalEvent<GasOutletInjectorComponent, ActivateInWorldEvent>(OnActivate);
|
|
SubscribeLocalEvent<GasOutletInjectorComponent, MapInitEvent>(OnMapInit);
|
|
}
|
|
|
|
private void OnMapInit(EntityUid uid, GasOutletInjectorComponent component, MapInitEvent args)
|
|
{
|
|
UpdateAppearance(uid, component);
|
|
}
|
|
|
|
private void OnActivate(EntityUid uid, GasOutletInjectorComponent component, ActivateInWorldEvent args)
|
|
{
|
|
component.Enabled = !component.Enabled;
|
|
UpdateAppearance(uid, component);
|
|
}
|
|
|
|
public void UpdateAppearance(EntityUid uid, GasOutletInjectorComponent component, AppearanceComponent? appearance = null)
|
|
{
|
|
if (!Resolve(uid, ref appearance, false))
|
|
return;
|
|
|
|
_appearance.SetData(uid, OutletInjectorVisuals.Enabled, component.Enabled, appearance);
|
|
}
|
|
|
|
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(nodeContainer, injector.InletName, out PipeNode? inlet))
|
|
return;
|
|
|
|
var environment = _atmosphereSystem.GetContainingMixture(uid, true, true);
|
|
|
|
if (environment == null)
|
|
return;
|
|
|
|
if (inlet.Air.Temperature < 0)
|
|
return;
|
|
|
|
if (environment.Pressure > injector.MaxPressure)
|
|
return;
|
|
|
|
var timeDelta = args.dt;
|
|
|
|
// TODO adjust ratio so that environment does not go above MaxPressure?
|
|
var ratio = MathF.Min(1f, timeDelta * injector.TransferRate * _atmosphereSystem.PumpSpeedup() / inlet.Air.Volume);
|
|
var removed = inlet.Air.RemoveRatio(ratio);
|
|
|
|
_atmosphereSystem.Merge(environment, removed);
|
|
}
|
|
}
|
|
}
|