mirror of
https://github.com/space-wizards/space-station-14.git
synced 2026-02-15 03:31:30 +01:00
* Add CryoPodWindow (placeholder) * Change HealthAnalyzerWindow: split off reusable HealthAnalyzerControl for cryo pod UI * Improve CryoPodWindow: add health analyzer * Improve CryoPodWindow: add eject button This wasn't requested in the issue but I implemented it as practice with the UI system. * Rewrote GasAnalyzerWindow, split off reusable gas mix viewer for cryo pod * Change GasAnalyzerWindow: change back to three columns With two rows you get a layouting bug when there's a lot of different gases, which looks somewhat bad. I didn't feel like fixing the layouting bug (it's an engine issue) so we're going back to three columns. That way you don't ever get two rows in practice. * Change GasAnalyzerWindow: simplify by disabling Resizable I added a lot of complexity to make resizable work nicely with a derived max & min size, but it's not necessary. * Change GasAnalyzerWindow: file-wide namespace * Change GasAnalyzerSystem: add GenerateGasMixEntry * Split HealthAnalyzerUiState from HealthAnalyzerScannedUserMessage * Rewrote CryoPodWindow, add atmos info * Improve CryoPodWindow: add loading placeholder * Improve CryoPodWindow: add internationalization support * Fix GasAnalyzerControl: add missing translation * Improve CryoPodWindow: add beaker info, high temperature warning * Improve CryoPodWindow/System: inject button in window + necessary system changes * Fix CryoPodWindow: Entering cryopod now closes window This way you can't heal yourself with a cryopod. * Change CryoPodWindow: add & update comments * Change HealthAnalyzerComponent: remove `uiKey` property (no longer necessary) * Tiny fixes * Improve CryoPodUiMessage: replace string with enum * Change GasAnalyzerWindow: simplify Measure code * Change CryoPodComponent: rename Injecting to InjectionBuffer * Change CryoPodBUI: tiny code simplification * Fix HealthAnalyzerComponent: Removed stray import * Improve CryoPodWindow: Prettier, concise atmos * Improve CryoPodWindow: Chemicals bar chart * Improve CryoPodWindow: Add Ruler to reagents * Change CryoPodWindow: More horizontal layout * Improve CryoPodWindow: Reduce height jiggling The health analyzer's height changes a lot, which can be annoying with the buttons (for example when the oxygen damage label is popping in and out) * Improve CryoPodWindow: Add setup checklist This is mostly here to fill vertical space in the new horizontal layout. * Improve CryoPodWindow: Eject beaker button * Improve CryoPodWindow: Localization * Improve CryoPodWindow: Add BeakerBarChart An animated version of the chemicals chart * Fix CryoPodSystem: Ejecting beaker no longer clears injection buffer * Improve BeakerBarChart: Not animated on first frame * Fix CryoPodWindow: Fix broken translation * Improve CryoPodWindow: Reorder sections * Fix BeakerBarChart: Tooltips now show up * Change BeakerBarChart: Reorder functions * Change CryoPodWindow: Reorder sections, change margins * Change CryoPodWindow: Edit flavor text * Revert changes to GasAnalyzerWindow Since GasAnalyzerControl is no longer used in CryoPodWindow, these changes are no longer relevant to this PR. * Tidy CryoPodWindow: Remove old workarounds These are old layouting bug workarounds from the older version of CryoPodWindow that had a ScrollContainer in it. They're no longer necessary. Less ScrollContainers less problems. * Tidy up: Remove unused imports * Remove LabelledSplitBar It was replaced by BeakerBarChart, which is a lot fancier. * Tidy up: Tiny code style fix * Change CryoPodSystem: Move code from server to shared This is still without adding UI prediction * move a ton of stuff to shared. * one last thing * Improve BeakerBarChart: Keep visual entry width when swapping beakers * Improve BeakerBarChart: Respect beaker order of reagents * Improve CryoPodWindow: Ensure space for injection buffer We need to keep space on the chart for the injection buffer after swapping to a full beaker. * Improve CryoPodWindow: Prettier ejection error * Improve CryoPodWindow: Add "Cooling patient" status * BeakerBarChart: Fix UI scale bug * BeakerBarChart: Fix bluespace beaker ugliness * BeakerBarChart: Add more pod status strings * HealthAnalyzerControl: Filewide namespace, sort imports * Style fix: Replace `bool x = y` with `var x = y` * CryoPodUiMessage: Split off separate class for inject * SharedCryoPodSystem: Move message-related code into Subs.BuiEvents --------- Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>
100 lines
3.8 KiB
C#
100 lines
3.8 KiB
C#
using Content.Server.Atmos.EntitySystems;
|
|
using Content.Server.Atmos.Piping.Components;
|
|
using Content.Server.Atmos.Piping.Unary.EntitySystems;
|
|
using Content.Server.Medical.Components;
|
|
using Content.Server.NodeContainer.EntitySystems;
|
|
using Content.Server.NodeContainer.NodeGroups;
|
|
using Content.Server.NodeContainer.Nodes;
|
|
using Content.Shared.Atmos;
|
|
using Content.Shared.Medical.Cryogenics;
|
|
namespace Content.Server.Medical;
|
|
|
|
public sealed partial class CryoPodSystem : SharedCryoPodSystem
|
|
{
|
|
[Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!;
|
|
[Dependency] private readonly GasCanisterSystem _gasCanisterSystem = default!;
|
|
[Dependency] private readonly GasAnalyzerSystem _gasAnalyzerSystem = default!;
|
|
[Dependency] private readonly HealthAnalyzerSystem _healthAnalyzerSystem = default!;
|
|
[Dependency] private readonly NodeContainerSystem _nodeContainer = default!;
|
|
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
|
|
SubscribeLocalEvent<CryoPodComponent, AtmosDeviceUpdateEvent>(OnCryoPodUpdateAtmosphere);
|
|
SubscribeLocalEvent<CryoPodComponent, GasAnalyzerScanEvent>(OnGasAnalyzed);
|
|
}
|
|
|
|
public override void Update(float frameTime)
|
|
{
|
|
base.Update(frameTime);
|
|
|
|
var query = EntityQueryEnumerator<ActiveCryoPodComponent, CryoPodComponent>();
|
|
|
|
while (query.MoveNext(out var uid, out _, out var cryoPod))
|
|
{
|
|
if (Timing.CurTime < cryoPod.NextUiUpdateTime)
|
|
continue;
|
|
|
|
cryoPod.NextUiUpdateTime += cryoPod.UiUpdateInterval;
|
|
Dirty(uid, cryoPod);
|
|
UpdateUi((uid, cryoPod));
|
|
}
|
|
}
|
|
|
|
protected override void UpdateUi(Entity<CryoPodComponent> entity)
|
|
{
|
|
if (!UI.IsUiOpen(entity.Owner, CryoPodUiKey.Key)
|
|
|| !TryComp(entity, out CryoPodAirComponent? air))
|
|
return;
|
|
|
|
var patient = entity.Comp.BodyContainer.ContainedEntity;
|
|
var gasMix = _gasAnalyzerSystem.GenerateGasMixEntry("Cryo pod", air.Air);
|
|
var (beakerCapacity, beaker) = GetBeakerInfo(entity);
|
|
var injecting = GetInjectingReagents(entity);
|
|
var health = _healthAnalyzerSystem.GetHealthAnalyzerUiState(patient);
|
|
health.ScanMode = true;
|
|
|
|
UI.ServerSendUiMessage(
|
|
entity.Owner,
|
|
CryoPodUiKey.Key,
|
|
new CryoPodUserMessage(gasMix, health, beakerCapacity, beaker, injecting)
|
|
);
|
|
}
|
|
|
|
private void OnCryoPodUpdateAtmosphere(Entity<CryoPodComponent> entity, ref AtmosDeviceUpdateEvent args)
|
|
{
|
|
if (!_nodeContainer.TryGetNode(entity.Owner, entity.Comp.PortName, out PortablePipeNode? portNode))
|
|
return;
|
|
|
|
if (!TryComp(entity, out CryoPodAirComponent? cryoPodAir))
|
|
return;
|
|
|
|
_atmosphereSystem.React(cryoPodAir.Air, portNode);
|
|
|
|
if (portNode.NodeGroup is PipeNet { NodeCount: > 1 } net)
|
|
{
|
|
_gasCanisterSystem.MixContainerWithPipeNet(cryoPodAir.Air, net.Air);
|
|
}
|
|
}
|
|
|
|
private void OnGasAnalyzed(Entity<CryoPodComponent> entity, ref GasAnalyzerScanEvent args)
|
|
{
|
|
if (!TryComp(entity, out CryoPodAirComponent? cryoPodAir))
|
|
return;
|
|
|
|
args.GasMixtures ??= new List<(string, GasMixture?)>();
|
|
args.GasMixtures.Add((Name(entity.Owner), cryoPodAir.Air));
|
|
// If it's connected to a port, include the port side
|
|
// multiply by volume fraction to make sure to send only the gas inside the analyzed pipe element, not the whole pipe system
|
|
if (_nodeContainer.TryGetNode(entity.Owner, entity.Comp.PortName, out PipeNode? port) && port.Air.Volume != 0f)
|
|
{
|
|
var portAirLocal = port.Air.Clone();
|
|
portAirLocal.Multiply(port.Volume / port.Air.Volume);
|
|
portAirLocal.Volume = port.Volume;
|
|
args.GasMixtures.Add((entity.Comp.PortName, portAirLocal));
|
|
}
|
|
}
|
|
}
|