* fix borg (#719)
* Automatic changelog update
* Переводы снаряжения и прочей мелочи в стартовом меню (#720)
* Сумки, мешки и прочее
* Перевод снаряжения
* перевод черт персонажа
* Добавлено ничего
* Automatic changelog update
* Фикс отображения потери мастера для импланта подчинения (#721)
* фикс отображения
* brain damage is real
* я блять запустил райдер ради рефактора одного ифа
* а лучше даже так
* Automatic changelog update
* add coderabbitai config (#722)
* fix (#723)
* Шприц теперь является оружием массового поражения (#724)
* Automatic changelog update
* Пиздец (#725)
Я на это потратил 2 недели
* Automatic changelog update
* Honk FM (#136) (#726)
* Fix Cosmic Temperance и новые песенки в jukebox
* Новая музыка в jucebox x2
Co-authored-by: Vorge7 <vorge228@gmail.com>
* Automatic changelog update
* Флаф (fluff) мне (big_zi_348) (#727)
* Заработал
* brain damage
* fuck (#729)
* Automatic changelog update
* FUCKERS (#732)
* Удаление ненужных суффиксов (#731)
* Перевод захардкукоженной строки (#728)
* Пластырь поможет
* очапятка
* Перевод ревенанта
* Карповый перекат
* Create shakeable-component.ftl
* Криогеника
* Хранилища скафандров
* Update autotranslate-14.ftl
* Update Cyborgs.xml
* Комоды
* Кредиты
* Удалил дубликат
* Информация
* Пластырь миму и клоуну
* Переводы всего
* Перевод аплинка
* Удалил ненужные суффиксы
* Revert "Удалил ненужные суффиксы"
This reverts commit d82f05f30c37ec2c11e5736b91239fe9dd1a4d17.
* Удаление ненужных суффиксов
* Перевод реагентовых слизней
* Перевод аномалий
* Перевод маяков
* Перевод различной мелочи
* Automatic changelog update
* Переводы и правки Гайдов (#730)
* Automatic changelog update
* aaaaa (#733)
* Правка локализации (#737)
* Update ThirstSystem.cs (#736)
* AccessConfiguratorForBorgs (#735)
* Automatic changelog update
* Починил бесконечную сварку (#734)
* Automatic changelog update
* ShowManifestFeature (#738)
* Automatic changelog update
* I LOVE OPENSOURCE
* Изменение размеров милишек (#739)
* Фикс размеров
* Заготовку биты тоже
* Правка
* Automatic changelog update
* Время после взрыва нюки (#740)
* More Fun
* Автоформатирование
* Подкрутка
* Automatic changelog update
* Скальпель в армейские ботинки (#741)
* Automatic changelog update
* DoHeavyAttack stamina check (#742)
* Automatic changelog update
* aaaaaaaaaaaaaaaaaaaaaaaaaaaaa (#743)
* fix retarded code (#744)
* Automatic changelog update
* Локализация (#746)
* Правка мелочей
* Имя клоуну
* Перевод оповещений для РНД
* перевод занавесок
* перевод столов
* Automatic changelog update
* Перевод и обновление кода гипоспрея для боргов (#745)
* Я только хотел перевести...
* refactor
* ещё перевод
* Revert "refactor"
This reverts commit 355c2724c4ed9cd1357661e3ba889a88bdf17db7.
* инверсия условия для проверки наличия прототипа
* Automatic changelog update
* Больше вещей в пояса охраны (#748)
* Подкрутки и докрутки (#749)
* Automatic changelog update
* Добавил отображение защиты от горения и подправил описание защиты от взрывов (#747)
* Добавил отображение защиты от горения
* Update Content.Shared/Clothing/EntitySystems/FireProtectionSystem.cs
Co-authored-by: ThereDrD <88589686+ThereDrD0@users.noreply.github.com>
* Update Resources/Locale/ru-RU/_white/info/fire-protection.ftl
Co-authored-by: ThereDrD <88589686+ThereDrD0@users.noreply.github.com>
* Правки
* негативный ноль с плавающей точкой
---------
Co-authored-by: ThereDrD <88589686+ThereDrD0@users.noreply.github.com>
* Automatic changelog update
* Фикс текстурок внешних шлюзов (#751)
* Микромелочь
* Ещё одна мелочь
* Починка прозрачности
* Automatic changelog update
* the fuck (#752)
* the fuck
* more logs
* avoooo (#753)
* nyaUpdate (#754)
* Merge pull request #756
* nya v1.2
* ahhhh ** всех закопает (#758)
* Ребаланс РНД (#750)
* Третий тир больше нас не остановит
* More less
* Ребаланс
* правочки подправочки
* СКОРАЯ!!! ПОМОГИТЕ!!!
* Automatic changelog update
* Конфета или жизнь (#757)
* Конфета или жизнь
* gremlins invasion
* Я ДОБАВИЛ БОЛЬШЕ МУСОРА НА СТАНЦИЮ!!!
* Переводы (много) (#755)
* Перевод технологий РНД
* Перевод действий поглаживающего характера
* Целая куча мелочей
* Ещё больше мелочей
* Слишком много мелочей
* маленькая мелочь
* unshit some ftl shit
* Automatic changelog update
* [Tweak] Random updates (#760)
* Security random updates
* Engineering random updates
* ERT random updates
* Really random
* Important random update
* Automatic changelog update
* Мелочёчки (#761)
* Automatic changelog update
* optimized network stack (#763)
* [Add] Pouches (#762)
* Add: Pouches base and sprites
* Add: Micro-resprite, pouches in secdrobe
* Minus suffix
* Automatic changelog update
* aaaaa (#765)
* Я как всегда кучу хуйни в один пакет сую (#766)
* Automatic changelog update
* а (#767)
* Automatic changelog update
* fix (#768)
* optimizaaaaaations (#769)
* Переводы (#770)
* Мелочёчки
* А когда ты будешь делать что-то полезное, кроме переводов?
* Я удалил НаноТрейзен
* Automatic changelog update
* fixed dumb shit that nobody cares (#772)
* Automatic changelog update
* Фикс взрывной ручки (#771)
* Automatic changelog update
* угу (#775)
* fix yaica (#773)
* Automatic changelog update
* Revert "fix yaica (#773)" (#776)
This reverts commit 9739d41607.
* fix retard (#777)
* fuck (#780)
* ВНИМАНИЕ!!! ОБНАРУЖЕНЫ УЛИТКИ!!! (#774)
* Automatic changelog update
* Локализация + ЕБУЧИЙ ПИКСЕЛЬ (#778)
* Перевод №1
* Перевод №2
* Пиксель
* сейфы
* сканер аномалий
* Перевод пИИ
* Перевод №3
* Перевод сканера здоровья
* Дионы
* Перевод экспедиций
* Automatic changelog update
* Фиксики работают сверхурочно (#781)
* Automatic changelog update
* Это заняло больше времени, чем я думал (#782)
* Automatic changelog update
---------
Co-authored-by: Jabak <163307958+Jabaks@users.noreply.github.com>
Co-authored-by: RavmorganButOnCocaine <valtos@nextmail.ru>
Co-authored-by: ThereDrD <88589686+ThereDrD0@users.noreply.github.com>
Co-authored-by: Vorge7 <vorge228@gmail.com>
Co-authored-by: Valtos <valtos@spaces.ru>
Co-authored-by: haiwwkes <49613070+rhailrake@users.noreply.github.com>
Co-authored-by: keslik <114428094+keslik1313@users.noreply.github.com>
415 lines
18 KiB
C#
415 lines
18 KiB
C#
using Content.Server.Power.Components;
|
|
using Content.Server.Medical.Components;
|
|
using Content.Shared.DeviceLinking.Events;
|
|
using Content.Shared._White.Medical.BodyScanner;
|
|
using Robust.Server.GameObjects;
|
|
using Robust.Shared.Timing;
|
|
using Content.Shared.Mobs.Components;
|
|
using Content.Server.Temperature.Components;
|
|
using Content.Server.Body.Components;
|
|
using Content.Server.Forensics;
|
|
using Content.Server.Paper;
|
|
using Content.Shared.Popups;
|
|
using Content.Shared.Damage;
|
|
using Content.Shared.Nutrition.Components;
|
|
using Content.Shared.Damage.Components;
|
|
using System.Text;
|
|
using Content.Shared.FixedPoint;
|
|
using Robust.Shared.Prototypes;
|
|
using Content.Shared.Damage.Prototypes;
|
|
using Content.Shared.Mind.Components;
|
|
using Robust.Shared.Audio.Systems;
|
|
|
|
namespace Content.Server._White.Medical.BodyScanner
|
|
{
|
|
public sealed class BodyScannerConsoleSystem : EntitySystem
|
|
{
|
|
[Dependency] private readonly IGameTiming _timing = default!;
|
|
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
|
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
|
|
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
|
[Dependency] private readonly PaperSystem _paper = default!;
|
|
[Dependency] private readonly MetaDataSystem _metaSystem = default!;
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
|
|
SubscribeLocalEvent<ActiveBodyScannerConsoleComponent, PowerChangedEvent>(OnPowerChanged);
|
|
|
|
SubscribeLocalEvent<BodyScannerConsoleComponent, MapInitEvent>(OnMapInit);
|
|
|
|
SubscribeLocalEvent<BodyScannerConsoleComponent, NewLinkEvent>(OnNewLink);
|
|
SubscribeLocalEvent<BodyScannerConsoleComponent, PortDisconnectedEvent>(OnPortDisconnected);
|
|
|
|
SubscribeLocalEvent<BodyScannerConsoleComponent, BodyScannerStartScanningMessage>(OnStartScanning);
|
|
SubscribeLocalEvent<BodyScannerConsoleComponent, BodyScannerStartPrintingMessage>(OnStartPrinting);
|
|
}
|
|
|
|
public override void Update(float frameTime)
|
|
{
|
|
base.Update(frameTime);
|
|
|
|
var queryActiveBodyScanner = EntityQueryEnumerator<ActiveBodyScannerConsoleComponent, BodyScannerConsoleComponent>();
|
|
while (queryActiveBodyScanner.MoveNext(out var uid, out var active, out var scan))
|
|
{
|
|
UpdateUserInterface(scan.Owner, scan, active);
|
|
|
|
if (_timing.CurTime - active.StartTime < scan.ScanDuration)
|
|
continue;
|
|
|
|
FinishScan(uid, scan, active);
|
|
}
|
|
|
|
var queryBodyInScanner = EntityQueryEnumerator<BodyInScannerBodyScannerConsoleComponent, BodyScannerConsoleComponent>();
|
|
while (queryBodyInScanner.MoveNext(out var uid, out var bodyInScanner, out var scan))
|
|
{
|
|
if (bodyInScanner.MedicalCannerComponent?.BodyContainer.ContainedEntity == null)
|
|
{
|
|
RemComp<BodyInScannerBodyScannerConsoleComponent>(uid);
|
|
UpdateUserInterface(scan.Owner, scan);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void UpdateUserInterface(
|
|
EntityUid uid,
|
|
BodyScannerConsoleComponent? scanComponent = null,
|
|
ActiveBodyScannerConsoleComponent? activeScanComponent = null)
|
|
{
|
|
if (!Resolve(uid, ref scanComponent))
|
|
return;
|
|
|
|
var state = GetUserInterfaceState(scanComponent, activeScanComponent);
|
|
scanComponent.LastScannedState = state;
|
|
|
|
_uiSystem.SetUiState(uid, BodyScannerConsoleUIKey.Key, state);
|
|
}
|
|
|
|
private BodyScannerConsoleBoundUserInterfaceState GetUserInterfaceState(
|
|
BodyScannerConsoleComponent consoleComponent,
|
|
ActiveBodyScannerConsoleComponent? activeScanComponent = null)
|
|
{
|
|
BodyScannerConsoleBoundUserInterfaceState state = new();
|
|
|
|
if (consoleComponent?.GeneticScanner != null && TryComp<MedicalScannerComponent>(consoleComponent.GeneticScanner, out var scanner))
|
|
{
|
|
state.ScannerConnected = consoleComponent.GeneticScanner != null;
|
|
state.GeneticScannerInRange = consoleComponent.GeneticScannerInRange;
|
|
|
|
state.CanScan = true;
|
|
|
|
if (state.ScannerConnected && state.GeneticScannerInRange && activeScanComponent != null)
|
|
{
|
|
state.CanScan = false;
|
|
state.CanPrint = false;
|
|
|
|
state.Scanning = true;
|
|
state.ScanTotalTime = consoleComponent.ScanDuration;
|
|
state.ScanTimeRemaining = consoleComponent.ScanDuration - (_timing.CurTime - activeScanComponent.StartTime);
|
|
|
|
return state;
|
|
}
|
|
|
|
var scanBody = scanner.BodyContainer.ContainedEntity;
|
|
|
|
if (scanBody != null)
|
|
{
|
|
state.CanPrint = true;
|
|
|
|
state.TargetEntityUid = GetNetEntity(scanBody);
|
|
state.EntityName = MetaData(scanBody.Value).EntityName;
|
|
|
|
if (TryComp<BloodstreamComponent>(scanBody, out var bloodstream))
|
|
{
|
|
state.BleedAmount = bloodstream.BleedAmount;
|
|
state.BloodMaxVolume = bloodstream.BloodMaxVolume;
|
|
state.BloodReagent = bloodstream.BloodReagent;
|
|
state.BloodSolution.MaxVolume = bloodstream.BloodMaxVolume;
|
|
state.ChemicalMaxVolume = bloodstream.ChemicalMaxVolume;
|
|
state.ChemicalSolution.MaxVolume = bloodstream.ChemicalMaxVolume;
|
|
if (bloodstream.BloodSolution != null)
|
|
state.BloodSolution = bloodstream.BloodSolution.Value.Comp.Solution.Clone();
|
|
if (bloodstream.ChemicalSolution != null)
|
|
state.ChemicalSolution = bloodstream.ChemicalSolution.Value.Comp.Solution.Clone();
|
|
}
|
|
|
|
if (TryComp<DnaComponent>(scanBody, out var dna))
|
|
{
|
|
state.DNA = dna.DNA;
|
|
}
|
|
|
|
if (TryComp<FingerprintComponent>(scanBody, out var fingerprint))
|
|
{
|
|
state.Fingerprint = fingerprint.Fingerprint ?? "";
|
|
}
|
|
|
|
if (TryComp<MindContainerComponent>(scanBody, out var mind))
|
|
{
|
|
state.HasMind = mind.HasMind;
|
|
}
|
|
|
|
if (TryComp<RespiratorComponent>(scanBody, out var respirator))
|
|
{
|
|
state.MaxSaturation = respirator.MaxSaturation;
|
|
state.MinSaturation = respirator.MinSaturation;
|
|
state.Saturation = respirator.Saturation;
|
|
}
|
|
|
|
if (TryComp<TemperatureComponent>(scanBody, out var temp))
|
|
{
|
|
state.HeatDamageThreshold = temp.HeatDamageThreshold;
|
|
state.ColdDamageThreshold = temp.ColdDamageThreshold;
|
|
state.CurrentTemperature = temp.CurrentTemperature;
|
|
}
|
|
|
|
if (TryComp<ThirstComponent>(scanBody, out var thirst))
|
|
{
|
|
state.CurrentThirst = thirst.CurrentThirst;
|
|
state.CurrentThirstThreshold = (byte) thirst.CurrentThirstThreshold;
|
|
}
|
|
|
|
if (TryComp<DamageableComponent>(scanBody, out var damageable))
|
|
{
|
|
state.TotalDamage = damageable.TotalDamage;
|
|
state.DamageDict = new(damageable.Damage.DamageDict);
|
|
state.DamagePerGroup = new(damageable.DamagePerGroup);
|
|
}
|
|
|
|
if (TryComp<HungerComponent>(scanBody, out var hunger))
|
|
{
|
|
state.CurrentHunger = hunger.CurrentHunger;
|
|
state.CurrentHungerThreshold = (byte) hunger.CurrentThreshold;
|
|
}
|
|
|
|
if (TryComp<MobStateComponent>(scanBody, out var mobState))
|
|
{
|
|
state.CurrentState = mobState.CurrentState;
|
|
}
|
|
|
|
if (TryComp<MobThresholdsComponent>(scanBody, out var mobThresholds))
|
|
{
|
|
foreach (var pair in mobThresholds.Thresholds)
|
|
{
|
|
if (pair.Value == Shared.Mobs.MobState.Dead)
|
|
{
|
|
state.DeadThreshold = pair.Key;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (TryComp<StaminaComponent>(scanBody, out var stamina))
|
|
{
|
|
state.StaminaCritThreshold = stamina.CritThreshold;
|
|
state.StaminaDamage = stamina.StaminaDamage;
|
|
}
|
|
}
|
|
}
|
|
|
|
return state;
|
|
}
|
|
|
|
public void FinishScan(EntityUid uid, BodyScannerConsoleComponent? component = null, ActiveBodyScannerConsoleComponent? active = null)
|
|
{
|
|
if (!Resolve(uid, ref component, ref active))
|
|
return;
|
|
|
|
_audio.PlayPvs(component.ScanFinishedSound, uid);
|
|
|
|
RemComp<ActiveBodyScannerConsoleComponent>(uid);
|
|
|
|
if (component?.GeneticScanner != null && TryComp<MedicalScannerComponent>(component.GeneticScanner, out var scanner))
|
|
{
|
|
EnsureComp<BodyInScannerBodyScannerConsoleComponent>(uid).MedicalCannerComponent = scanner;
|
|
}
|
|
|
|
UpdateUserInterface(uid, component);
|
|
}
|
|
|
|
public void OnMapInit(EntityUid uid, BodyScannerConsoleComponent component, MapInitEvent args)
|
|
{
|
|
if (!_uiSystem.HasUi(uid, BodyScannerConsoleUIKey.Key))
|
|
return;
|
|
|
|
UpdateUserInterface(uid, component);
|
|
}
|
|
|
|
private void OnNewLink(EntityUid uid, BodyScannerConsoleComponent component, NewLinkEvent args)
|
|
{
|
|
if (TryComp<MedicalScannerComponent>(args.Sink, out var scanner) && args.SinkPort == BodyScannerConsoleComponent.ScannerPort)
|
|
{
|
|
component.GeneticScanner = args.Sink;
|
|
scanner.ConnectedConsole = uid;
|
|
}
|
|
}
|
|
|
|
private void OnPortDisconnected(EntityUid uid, BodyScannerConsoleComponent component, PortDisconnectedEvent args)
|
|
{
|
|
if (args.Port != BodyScannerConsoleComponent.ScannerPort)
|
|
return;
|
|
|
|
if (TryComp<MedicalScannerComponent>(component.GeneticScanner, out var scanner))
|
|
scanner.ConnectedConsole = null;
|
|
|
|
component.GeneticScanner = null;
|
|
|
|
FinishScan(uid, component);
|
|
}
|
|
|
|
private void OnStartScanning(EntityUid uid, BodyScannerConsoleComponent component, BodyScannerStartScanningMessage msg)
|
|
{
|
|
if (component.GeneticScanner == null)
|
|
return;
|
|
|
|
if (!TryComp<MedicalScannerComponent>(component.GeneticScanner, out var scanner))
|
|
return;
|
|
|
|
if (scanner.BodyContainer.ContainedEntity == null)
|
|
return;
|
|
|
|
var activeComp = EnsureComp<ActiveBodyScannerConsoleComponent>(uid);
|
|
activeComp.StartTime = _timing.CurTime;
|
|
}
|
|
|
|
private void OnStartPrinting(EntityUid uid, BodyScannerConsoleComponent component, BodyScannerStartPrintingMessage args)
|
|
{
|
|
var state = component.LastScannedState;
|
|
if (state == null)
|
|
return;
|
|
|
|
state.CanPrint = false;
|
|
|
|
_uiSystem.SetUiState(uid, BodyScannerConsoleUIKey.Key, state);
|
|
|
|
var report = Spawn(component.ReportEntityId, Transform(uid).Coordinates);
|
|
_metaSystem.SetEntityName(report,
|
|
Loc.GetString("body-scanner-console-report-title", ("name", state.EntityName)));
|
|
|
|
StringBuilder text = new();
|
|
text.AppendLine(state.EntityName);
|
|
text.AppendLine();
|
|
text.AppendLine(Loc.GetString("body-scanner-console-report-temperature",
|
|
("amount", $"{state.CurrentTemperature - 273f:F1}")));
|
|
text.AppendLine(Loc.GetString("body-scanner-console-report-blood-level",
|
|
("amount", $"{state.BloodSolution.FillFraction * 100:F1}")));
|
|
text.AppendLine(Loc.GetString("body-scanner-console-report-total-damage",
|
|
("amount", state.TotalDamage.ToString())));
|
|
text.AppendLine();
|
|
|
|
HashSet<string> shownTypes = new();
|
|
|
|
var protos = IoCManager.Resolve<IPrototypeManager>();
|
|
|
|
IReadOnlyDictionary<string, FixedPoint2> damagePerGroup = state.DamagePerGroup;
|
|
IReadOnlyDictionary<string, FixedPoint2> damagePerType = state.DamageDict;
|
|
|
|
foreach (var (damageGroupId, damageAmount) in damagePerGroup)
|
|
{
|
|
text.AppendLine(Loc.GetString("health-analyzer-window-damage-group-" + damageGroupId,
|
|
("amount", damageAmount)));
|
|
|
|
var group = protos.Index<DamageGroupPrototype>(damageGroupId);
|
|
|
|
foreach (var type in group.DamageTypes)
|
|
{
|
|
if (damagePerType.TryGetValue(type, out var typeAmount))
|
|
{
|
|
// If damage types are allowed to belong to more than one damage group, they may appear twice here. Mark them as duplicate.
|
|
if (!shownTypes.Contains(type))
|
|
{
|
|
shownTypes.Add(type);
|
|
|
|
text.Append(" - ");
|
|
text.AppendLine(Loc.GetString("health-analyzer-window-damage-type-" + type,
|
|
("amount", typeAmount)));
|
|
}
|
|
}
|
|
}
|
|
|
|
text.AppendLine();
|
|
}
|
|
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-temperature-group-text"));
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-temperature-current-temperature-text",
|
|
("amount", $"{state.CurrentTemperature - 273:f1}")));
|
|
text.AppendLine(Loc.GetString(
|
|
"body-scanner-console-window-temperature-heat-damage-threshold-temperature-text",
|
|
("amount", $"{state.HeatDamageThreshold - 273:f1}")));
|
|
text.AppendLine(Loc.GetString(
|
|
"body-scanner-console-window-temperature-cold-damage-threshold-temperature-text",
|
|
("amount", $"{state.ColdDamageThreshold - 273:f1}")));
|
|
text.AppendLine();
|
|
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-saturation-group-text"));
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-saturation-current-saturation-text",
|
|
("amount", $"{state.Saturation:f1}")));
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-saturation-maximum-saturation-text",
|
|
("amount", $"{state.MinSaturation:f1}")));
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-saturation-minimum-saturation-text",
|
|
("amount", $"{state.MaxSaturation:f1}")));
|
|
text.AppendLine();
|
|
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-thirst-group-text"));
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-thirst-current-thirst-text",
|
|
("amount", $"{state.CurrentThirst:f1}")));
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-thirst-current-thirst-status-text",
|
|
("status",
|
|
Loc.GetString("body-scanner-console-window-thirst-current-thirst-status-" +
|
|
state.CurrentThirstThreshold))));
|
|
text.AppendLine();
|
|
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-hunger-group-text"));
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-hunger-current-hunger-text",
|
|
("amount", $"{state.CurrentHunger:f1}")));
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-hunger-current-hunger-status-text",
|
|
("status",
|
|
Loc.GetString("body-scanner-console-window-hunger-current-hunger-status-" +
|
|
state.CurrentHungerThreshold))));
|
|
text.AppendLine();
|
|
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-blood-solutions-group-text"));
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-blood-solutions-volume-group-text",
|
|
("amount", $"{state.BloodSolution.Volume.Float():f1}"),
|
|
("maxAmount", $"{state.BloodSolution.MaxVolume.Float():f1}"),
|
|
("temperature", $"{state.BloodSolution.Temperature - 271:f1}")));
|
|
state.BloodSolution.Contents.ForEach(x =>
|
|
{
|
|
text.Append(" - ");
|
|
text.AppendLine($"{x.Reagent.Prototype}: {x.Quantity}");
|
|
});
|
|
text.AppendLine();
|
|
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-chemical-solutions-group-text"));
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-chemical-solutions-volume-group-text",
|
|
("amount", $"{state.ChemicalSolution.Volume.Float():f1}"),
|
|
("maxAmount", $"{state.ChemicalSolution.MaxVolume.Float():f1}"),
|
|
("temperature", $"{state.ChemicalSolution.Temperature - 271:f1}")));
|
|
state.ChemicalSolution.Contents.ForEach(x =>
|
|
{
|
|
text.Append(" - ");
|
|
text.AppendLine($"{x.Reagent.Prototype}: {x.Quantity}");
|
|
});
|
|
text.AppendLine();
|
|
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-dna-text",
|
|
("value", state.DNA)));
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-fingerprint-text",
|
|
("value", $"{state.Fingerprint}")));
|
|
text.AppendLine(Loc.GetString("body-scanner-console-window-mind-text",
|
|
("value", $"{state.HasMind}")));
|
|
|
|
_audio.PlayPvs(component.PrintSound, uid);
|
|
_popup.PopupEntity(Loc.GetString("body-scanner-console-print-popup"), uid);
|
|
_paper.SetContent(report, text.ToString());
|
|
}
|
|
|
|
private void OnPowerChanged(EntityUid uid, ActiveBodyScannerConsoleComponent component, ref PowerChangedEvent args)
|
|
{
|
|
if (args.Powered)
|
|
return;
|
|
|
|
RemComp<ActiveBodyScannerConsoleComponent>(uid);
|
|
}
|
|
}
|
|
}
|