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;
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);
- break;
+ _alerts.ClearAlertCategory(uid, AlertCategory.Temperature);
+ return;
+ }
- // Cold mild.
- case <= 280 and > 260:
- _alerts.ShowAlert(uid, AlertType.Cold, 2);
- break;
+ 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;
+ }
- // Cold weak.
- case <= 292 and > 280:
- _alerts.ShowAlert(uid, AlertType.Cold, 1);
- break;
+ if (args.CurrentTemperature <= idealTemp)
+ {
+ type = AlertType.Cold;
+ threshold = temperature.ColdDamageThreshold;
+ }
+ else
+ {
+ type = AlertType.Hot;
+ threshold = temperature.HeatDamageThreshold;
+ }
- // Safe.
- case <= 327 and > 292:
- _alerts.ClearAlertCategory(uid, AlertCategory.Temperature);
+ // 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;
- // Heat weak.
- case <= 335 and > 327:
- _alerts.ShowAlert(uid, AlertType.Hot, 1);
+ case <= 0.4f:
+ _alerts.ShowAlert(uid, type, 2);
break;
- // Heat mild.
- case <= 360 and > 335:
- _alerts.ShowAlert(uid, AlertType.Hot, 2);
+ case <= 0.66f:
+ _alerts.ShowAlert(uid, type, 1);
break;
- // Heat strong.
- case > 360:
- _alerts.ShowAlert(uid, AlertType.Hot, 3);
+ case > 0.66f:
+ _alerts.ClearAlertCategory(uid, AlertCategory.Temperature);
break;
}
}