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