Accurate temperature alerts (#19913)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user