TemperatureArtifactSystem.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using Content.Server.Atmos;
  2. using Content.Server.Atmos.EntitySystems;
  3. using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components;
  4. using Content.Server.Xenoarchaeology.XenoArtifacts.Events;
  5. using Content.Shared.Atmos;
  6. using Robust.Server.GameObjects;
  7. namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems;
  8. public sealed class TemperatureArtifactSystem : EntitySystem
  9. {
  10. [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!;
  11. [Dependency] private readonly TransformSystem _transformSystem = default!;
  12. public override void Initialize()
  13. {
  14. base.Initialize();
  15. SubscribeLocalEvent<TemperatureArtifactComponent, ArtifactActivatedEvent>(OnActivate);
  16. }
  17. private void OnActivate(EntityUid uid, TemperatureArtifactComponent component, ArtifactActivatedEvent args)
  18. {
  19. var transform = Transform(uid);
  20. var center = _atmosphereSystem.GetContainingMixture(uid, false, true);
  21. if (center == null)
  22. return;
  23. UpdateTileTemperature(component, center);
  24. if (component.AffectAdjacentTiles && transform.GridUid != null)
  25. {
  26. var enumerator = _atmosphereSystem.GetAdjacentTileMixtures(transform.GridUid.Value,
  27. _transformSystem.GetGridOrMapTilePosition(uid, transform), excite: true);
  28. while (enumerator.MoveNext(out var mixture))
  29. {
  30. UpdateTileTemperature(component, mixture);
  31. }
  32. }
  33. }
  34. private void UpdateTileTemperature(TemperatureArtifactComponent component, GasMixture environment)
  35. {
  36. var dif = component.TargetTemperature - environment.Temperature;
  37. var absDif = Math.Abs(dif);
  38. var step = Math.Min(absDif, component.SpawnTemperature);
  39. environment.Temperature += dif > 0 ? step : -step;
  40. }
  41. }