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.Atmos.Components;
using Content.Server.Atmos.EntitySystems;
using Content.Server.Body.Components;
using Content.Server.Temperature.Components;
using Content.Shared.Alert;
using Content.Shared.Atmos;
@@ -133,42 +134,58 @@ public sealed class TemperatureSystem : EntitySystem
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.
case <= 260:
_alerts.ShowAlert(uid, AlertType.Cold, 3);
_alerts.ClearAlertCategory(uid, AlertCategory.Temperature);
return;
}
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;
// Cold mild.
case <= 280 and > 260:
_alerts.ShowAlert(uid, AlertType.Cold, 2);
case <= 0.4f:
_alerts.ShowAlert(uid, type, 2);
break;
// Cold weak.
case <= 292 and > 280:
_alerts.ShowAlert(uid, AlertType.Cold, 1);
case <= 0.66f:
_alerts.ShowAlert(uid, type, 1);
break;
// Safe.
case <= 327 and > 292:
case > 0.66f:
_alerts.ClearAlertCategory(uid, AlertCategory.Temperature);
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;
}
}