Accurate temperature alerts (#19913)

This commit is contained in:
Errant
2023-10-18 20:05:15 +02:00
committed by GitHub
parent 8adbd50cf9
commit 064cb8797e

View File

@@ -1,6 +1,7 @@
using Content.Server.Administration.Logs; using Content.Server.Administration.Logs;
using Content.Server.Atmos.Components; using Content.Server.Atmos.Components;
using Content.Server.Atmos.EntitySystems; using Content.Server.Atmos.EntitySystems;
using Content.Server.Body.Components;
using Content.Server.Temperature.Components; using Content.Server.Temperature.Components;
using Content.Shared.Alert; using Content.Shared.Alert;
using Content.Shared.Atmos; using Content.Shared.Atmos;
@@ -133,42 +134,58 @@ public sealed class TemperatureSystem : EntitySystem
private void ServerAlert(EntityUid uid, AlertsComponent status, OnTemperatureChangeEvent args) private void ServerAlert(EntityUid uid, AlertsComponent status, OnTemperatureChangeEvent args)
{ {
switch (args.CurrentTemperature) AlertType type;
float threshold;
float idealTemp;
if (!TryComp<TemperatureComponent>(uid, out var temperature))
{ {
// Cold strong. _alerts.ClearAlertCategory(uid, AlertCategory.Temperature);
case <= 260: return;
_alerts.ShowAlert(uid, AlertType.Cold, 3); }
if (TryComp<ThermalRegulatorComponent>(uid, out var regulator) &&
regulator.NormalBodyTemperature > temperature.ColdDamageThreshold &&
regulator.NormalBodyTemperature < temperature.HeatDamageThreshold)
{
idealTemp = regulator.NormalBodyTemperature;
}
else
{
idealTemp = (temperature.ColdDamageThreshold + temperature.HeatDamageThreshold) / 2;
}
if (args.CurrentTemperature <= idealTemp)
{
type = AlertType.Cold;
threshold = temperature.ColdDamageThreshold;
}
else
{
type = AlertType.Hot;
threshold = temperature.HeatDamageThreshold;
}
// Calculates a scale where 1.0 is the ideal temperature and 0.0 is where temperature damage begins
// The cold and hot scales will differ in their range if the ideal temperature is not exactly halfway between the thresholds
var tempScale = (args.CurrentTemperature - threshold) / (idealTemp - threshold);
switch (tempScale)
{
case <= 0f:
_alerts.ShowAlert(uid, type, 3);
break; break;
// Cold mild. case <= 0.4f:
case <= 280 and > 260: _alerts.ShowAlert(uid, type, 2);
_alerts.ShowAlert(uid, AlertType.Cold, 2);
break; break;
// Cold weak. case <= 0.66f:
case <= 292 and > 280: _alerts.ShowAlert(uid, type, 1);
_alerts.ShowAlert(uid, AlertType.Cold, 1);
break; break;
// Safe. case > 0.66f:
case <= 327 and > 292:
_alerts.ClearAlertCategory(uid, AlertCategory.Temperature); _alerts.ClearAlertCategory(uid, AlertCategory.Temperature);
break; break;
// Heat weak.
case <= 335 and > 327:
_alerts.ShowAlert(uid, AlertType.Hot, 1);
break;
// Heat mild.
case <= 360 and > 335:
_alerts.ShowAlert(uid, AlertType.Hot, 2);
break;
// Heat strong.
case > 360:
_alerts.ShowAlert(uid, AlertType.Hot, 3);
break;
} }
} }