Temperature refactor (#20662)

Co-authored-by: deltanedas <@deltanedas:kde.org>
This commit is contained in:
deltanedas
2023-10-02 15:44:05 +01:00
committed by GitHub
parent f0bd861fc8
commit c988f21d25
3 changed files with 385 additions and 396 deletions

View File

@@ -3,11 +3,9 @@
[RegisterComponent] [RegisterComponent]
public sealed partial class ContainerTemperatureDamageThresholdsComponent: Component public sealed partial class ContainerTemperatureDamageThresholdsComponent: Component
{ {
[DataField("heatDamageThreshold")] [DataField, ViewVariables(VVAccess.ReadWrite)]
[ViewVariables(VVAccess.ReadWrite)]
public float? HeatDamageThreshold; public float? HeatDamageThreshold;
[DataField("coldDamageThreshold")] [DataField, ViewVariables(VVAccess.ReadWrite)]
[ViewVariables(VVAccess.ReadWrite)]
public float? ColdDamageThreshold; public float? ColdDamageThreshold;
} }

View File

@@ -4,8 +4,8 @@ using Content.Shared.FixedPoint;
using Robust.Shared.Physics; using Robust.Shared.Physics;
using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Components;
namespace Content.Server.Temperature.Components namespace Content.Server.Temperature.Components;
{
/// <summary> /// <summary>
/// Handles changing temperature, /// Handles changing temperature,
/// informing others of the current temperature, /// informing others of the current temperature,
@@ -14,39 +14,37 @@ namespace Content.Server.Temperature.Components
[RegisterComponent] [RegisterComponent]
public sealed partial class TemperatureComponent : Component public sealed partial class TemperatureComponent : Component
{ {
[ViewVariables(VVAccess.ReadWrite)] [DataField, ViewVariables(VVAccess.ReadWrite)]
[DataField("currentTemperature")] public float CurrentTemperature = Atmospherics.T20C;
public float CurrentTemperature { get; set; } = Atmospherics.T20C;
[DataField("heatDamageThreshold")] [DataField, ViewVariables(VVAccess.ReadWrite)]
[ViewVariables(VVAccess.ReadWrite)]
public float HeatDamageThreshold = 360f; public float HeatDamageThreshold = 360f;
[DataField("coldDamageThreshold")] [DataField, ViewVariables(VVAccess.ReadWrite)]
[ViewVariables(VVAccess.ReadWrite)]
public float ColdDamageThreshold = 260f; public float ColdDamageThreshold = 260f;
/// <summary> /// <summary>
/// Overrides HeatDamageThreshold if the entity's within a parent with the TemperatureDamageThresholdsComponent component. /// Overrides HeatDamageThreshold if the entity's within a parent with the TemperatureDamageThresholdsComponent component.
/// </summary> /// </summary>
[ViewVariables(VVAccess.ReadWrite)] [DataField, ViewVariables(VVAccess.ReadWrite)]
public float? ParentHeatDamageThreshold; public float? ParentHeatDamageThreshold;
/// <summary> /// <summary>
/// Overrides ColdDamageThreshold if the entity's within a parent with the TemperatureDamageThresholdsComponent component. /// Overrides ColdDamageThreshold if the entity's within a parent with the TemperatureDamageThresholdsComponent component.
/// </summary> /// </summary>
[ViewVariables(VVAccess.ReadWrite)] [DataField, ViewVariables(VVAccess.ReadWrite)]
public float? ParentColdDamageThreshold; public float? ParentColdDamageThreshold;
[DataField("specificHeat")] /// <summary>
[ViewVariables(VVAccess.ReadWrite)] /// Heat capacity per kg of mass.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
public float SpecificHeat = 50f; public float SpecificHeat = 50f;
/// <summary> /// <summary>
/// How well does the air surrounding you merge into your body temperature? /// How well does the air surrounding you merge into your body temperature?
/// </summary> /// </summary>
[DataField("atmosTemperatureTransferEfficiency")] [DataField, ViewVariables(VVAccess.ReadWrite)]
[ViewVariables(VVAccess.ReadWrite)]
public float AtmosTemperatureTransferEfficiency = 0.1f; public float AtmosTemperatureTransferEfficiency = 0.1f;
[ViewVariables] public float HeatCapacity [ViewVariables] public float HeatCapacity
@@ -62,26 +60,24 @@ namespace Content.Server.Temperature.Components
} }
} }
[DataField("coldDamage")] [DataField, ViewVariables(VVAccess.ReadWrite)]
[ViewVariables(VVAccess.ReadWrite)]
public DamageSpecifier ColdDamage = new(); public DamageSpecifier ColdDamage = new();
[DataField("heatDamage")] [DataField, ViewVariables(VVAccess.ReadWrite)]
[ViewVariables(VVAccess.ReadWrite)]
public DamageSpecifier HeatDamage = new(); public DamageSpecifier HeatDamage = new();
/// <summary> /// <summary>
/// Temperature won't do more than this amount of damage per second. /// Temperature won't do more than this amount of damage per second.
/// /// </summary>
/// <remarks>
/// Okay it genuinely reaches this basically immediately for a plasma fire. /// Okay it genuinely reaches this basically immediately for a plasma fire.
/// </summary> /// </summary>
[DataField("damageCap")] [DataField, ViewVariables(VVAccess.ReadWrite)]
[ViewVariables(VVAccess.ReadWrite)]
public FixedPoint2 DamageCap = FixedPoint2.New(8); public FixedPoint2 DamageCap = FixedPoint2.New(8);
/// <summary> /// <summary>
/// Used to keep track of when damage starts/stops. Useful for logs. /// Used to keep track of when damage starts/stops. Useful for logs.
/// </summary> /// </summary>
[DataField]
public bool TakingDamage = false; public bool TakingDamage = false;
} }
}

View File

@@ -1,6 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
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;
@@ -13,16 +10,17 @@ using Content.Shared.Inventory;
using Content.Shared.Rejuvenate; using Content.Shared.Rejuvenate;
using Content.Shared.Temperature; using Content.Shared.Temperature;
using Robust.Server.GameObjects; using Robust.Server.GameObjects;
using System.Linq;
namespace Content.Server.Temperature.Systems;
namespace Content.Server.Temperature.Systems
{
public sealed class TemperatureSystem : EntitySystem public sealed class TemperatureSystem : EntitySystem
{ {
[Dependency] private readonly TransformSystem _transformSystem = default!; [Dependency] private readonly AlertsSystem _alerts = default!;
[Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly AtmosphereSystem _atmosphere = default!;
[Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!;
[Dependency] private readonly AlertsSystem _alertsSystem = default!;
[Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!;
[Dependency] private readonly DamageableSystem _damageable = default!;
[Dependency] private readonly TransformSystem _transform = default!;
/// <summary> /// <summary>
/// All the components that will have their damage updated at the end of the tick. /// All the components that will have their damage updated at the end of the tick.
@@ -94,8 +92,9 @@ namespace Content.Server.Temperature.Systems
public void ChangeHeat(EntityUid uid, float heatAmount, bool ignoreHeatResistance = false, public void ChangeHeat(EntityUid uid, float heatAmount, bool ignoreHeatResistance = false,
TemperatureComponent? temperature = null) TemperatureComponent? temperature = null)
{ {
if (Resolve(uid, ref temperature)) if (!Resolve(uid, ref temperature))
{ return;
if (!ignoreHeatResistance) if (!ignoreHeatResistance)
{ {
var ev = new ModifyChangedTemperatureEvent(heatAmount); var ev = new ModifyChangedTemperatureEvent(heatAmount);
@@ -107,24 +106,21 @@ namespace Content.Server.Temperature.Systems
temperature.CurrentTemperature += heatAmount / temperature.HeatCapacity; temperature.CurrentTemperature += heatAmount / temperature.HeatCapacity;
float delta = temperature.CurrentTemperature - lastTemp; float delta = temperature.CurrentTemperature - lastTemp;
RaiseLocalEvent(uid, new OnTemperatureChangeEvent(temperature.CurrentTemperature, lastTemp, delta), RaiseLocalEvent(uid, new OnTemperatureChangeEvent(temperature.CurrentTemperature, lastTemp, delta), true);
true);
}
} }
private void OnAtmosExposedUpdate(EntityUid uid, TemperatureComponent temperature, private void OnAtmosExposedUpdate(EntityUid uid, TemperatureComponent temperature,
ref AtmosExposedUpdateEvent args) ref AtmosExposedUpdateEvent args)
{ {
var transform = args.Transform; var transform = args.Transform;
if (transform.MapUid == null) if (transform.MapUid == null)
return; return;
var position = _transformSystem.GetGridOrMapTilePosition(uid, transform); var position = _transform.GetGridOrMapTilePosition(uid, transform);
var temperatureDelta = args.GasMixture.Temperature - temperature.CurrentTemperature; var temperatureDelta = args.GasMixture.Temperature - temperature.CurrentTemperature;
var tileHeatCapacity = var tileHeatCapacity =
_atmosphereSystem.GetTileHeatCapacity(transform.GridUid, transform.MapUid.Value, position); _atmosphere.GetTileHeatCapacity(transform.GridUid, transform.MapUid.Value, position);
var heat = temperatureDelta * (tileHeatCapacity * temperature.HeatCapacity / var heat = temperatureDelta * (tileHeatCapacity * temperature.HeatCapacity /
(tileHeatCapacity + temperature.HeatCapacity)); (tileHeatCapacity + temperature.HeatCapacity));
ChangeHeat(uid, heat * temperature.AtmosTemperatureTransferEfficiency, temperature: temperature); ChangeHeat(uid, heat * temperature.AtmosTemperatureTransferEfficiency, temperature: temperature);
@@ -141,37 +137,37 @@ namespace Content.Server.Temperature.Systems
{ {
// Cold strong. // Cold strong.
case <= 260: case <= 260:
_alertsSystem.ShowAlert(uid, AlertType.Cold, 3); _alerts.ShowAlert(uid, AlertType.Cold, 3);
break; break;
// Cold mild. // Cold mild.
case <= 280 and > 260: case <= 280 and > 260:
_alertsSystem.ShowAlert(uid, AlertType.Cold, 2); _alerts.ShowAlert(uid, AlertType.Cold, 2);
break; break;
// Cold weak. // Cold weak.
case <= 292 and > 280: case <= 292 and > 280:
_alertsSystem.ShowAlert(uid, AlertType.Cold, 1); _alerts.ShowAlert(uid, AlertType.Cold, 1);
break; break;
// Safe. // Safe.
case <= 327 and > 292: case <= 327 and > 292:
_alertsSystem.ClearAlertCategory(uid, AlertCategory.Temperature); _alerts.ClearAlertCategory(uid, AlertCategory.Temperature);
break; break;
// Heat weak. // Heat weak.
case <= 335 and > 327: case <= 335 and > 327:
_alertsSystem.ShowAlert(uid, AlertType.Hot, 1); _alerts.ShowAlert(uid, AlertType.Hot, 1);
break; break;
// Heat mild. // Heat mild.
case <= 360 and > 335: case <= 360 and > 335:
_alertsSystem.ShowAlert(uid, AlertType.Hot, 2); _alerts.ShowAlert(uid, AlertType.Hot, 2);
break; break;
// Heat strong. // Heat strong.
case > 360: case > 360:
_alertsSystem.ShowAlert(uid, AlertType.Hot, 3); _alerts.ShowAlert(uid, AlertType.Hot, 3);
break; break;
} }
} }
@@ -207,7 +203,7 @@ namespace Content.Server.Temperature.Systems
var diff = Math.Abs(temperature.CurrentTemperature - heatDamageThreshold); var diff = Math.Abs(temperature.CurrentTemperature - heatDamageThreshold);
var tempDamage = c / (1 + a * Math.Pow(Math.E, -heatK * diff)) - y; var tempDamage = c / (1 + a * Math.Pow(Math.E, -heatK * diff)) - y;
_damageableSystem.TryChangeDamage(uid, temperature.HeatDamage * tempDamage, ignoreResistances: true, interruptsDoAfters: false); _damageable.TryChangeDamage(uid, temperature.HeatDamage * tempDamage, ignoreResistances: true, interruptsDoAfters: false);
} }
else if (temperature.CurrentTemperature <= coldDamageThreshold) else if (temperature.CurrentTemperature <= coldDamageThreshold)
{ {
@@ -220,7 +216,7 @@ namespace Content.Server.Temperature.Systems
var diff = Math.Abs(temperature.CurrentTemperature - coldDamageThreshold); var diff = Math.Abs(temperature.CurrentTemperature - coldDamageThreshold);
var tempDamage = var tempDamage =
Math.Sqrt(diff * (Math.Pow(temperature.DamageCap.Double(), 2) / coldDamageThreshold)); Math.Sqrt(diff * (Math.Pow(temperature.DamageCap.Double(), 2) / coldDamageThreshold));
_damageableSystem.TryChangeDamage(uid, temperature.ColdDamage * tempDamage, ignoreResistances: true, interruptsDoAfters: false); _damageable.TryChangeDamage(uid, temperature.ColdDamage * tempDamage, ignoreResistances: true, interruptsDoAfters: false);
} }
else if (temperature.TakingDamage) else if (temperature.TakingDamage)
{ {
@@ -360,4 +356,3 @@ namespace Content.Server.Temperature.Systems
TemperatureDelta = delta; TemperatureDelta = delta;
} }
} }
}