HeatEmitterSystem.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using Content.Server.Atmos.EntitySystems;
  2. using Content.Server.Weather;
  3. using Content.Shared.Atmos;
  4. using Content.Shared.Light.Components;
  5. using Content.Server.Light.Components;
  6. using Robust.Shared.Map;
  7. using Robust.Shared.Map.Components;
  8. using Robust.Shared.Maths;
  9. using Robust.Shared.Timing;
  10. using Content.Server.Atmos.Components;
  11. using Robust.Server.GameObjects;
  12. using Content.Shared.Atmos.Components;
  13. namespace Content.Server.Weather;
  14. /// <summary>
  15. /// System responsible for emitting heat to nearby tiles when a light source is active.
  16. /// </summary>
  17. public sealed class HeatEmitterSystem : EntitySystem
  18. {
  19. [Dependency] private readonly IGameTiming _timing = default!;
  20. [Dependency] private readonly IMapManager _mapManager = default!;
  21. [Dependency] private readonly AtmosphereSystem _atmosphere = default!;
  22. private float _lastUpdateTime;
  23. public override void Initialize()
  24. {
  25. base.Initialize();
  26. _lastUpdateTime = (float)_timing.CurTime.TotalSeconds;
  27. }
  28. /// <summary>
  29. /// Updates the system every frame, applying heat to nearby tiles based on active light sources.
  30. /// </summary>
  31. public override void Update(float frameTime)
  32. {
  33. base.Update(frameTime);
  34. var currentTime = (float)_timing.CurTime.TotalSeconds;
  35. var deltaTime = currentTime - _lastUpdateTime;
  36. _lastUpdateTime = currentTime;
  37. var query = EntityQueryEnumerator<HeatEmitterComponent, TransformComponent>();
  38. while (query.MoveNext(out var uid, out var heater, out var transform))
  39. {
  40. if (!TryComp<PointLightComponent>(uid, out var pointLight) || !pointLight.Enabled)
  41. {
  42. continue;
  43. }
  44. var gridUid = transform.GridUid;
  45. if (gridUid == null || !TryComp<MapGridComponent>(gridUid.Value, out var grid))
  46. continue;
  47. var position = transform.Coordinates;
  48. var tileIndices = grid.WorldToTile(position.Position);
  49. var tileMixture = _atmosphere.GetContainingMixture(uid, true);
  50. if (tileMixture != null && tileMixture.Temperature != null)
  51. {
  52. var currentTemp = tileMixture.Temperature;
  53. // Apply heat only while temp is less than 30 celsius. Less load for the update (303.15 K)
  54. if (currentTemp < heater.MaxTemperature)
  55. {
  56. var heatCapacity = _atmosphere.GetHeatCapacity(tileMixture, true); // Heat capacity in J/K
  57. var deltaT = heater.HeatingRate * deltaTime;
  58. var dQ = heatCapacity * deltaT; // Heat in Joules
  59. _atmosphere.AddHeat(tileMixture, dQ);
  60. }
  61. }
  62. }
  63. }
  64. }