using Content.Server.Atmos; using Content.Server.Atmos.EntitySystems; using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; using Content.Server.Xenoarchaeology.XenoArtifacts.Events; using Content.Shared.Atmos; using Robust.Server.GameObjects; namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; public sealed class TemperatureArtifactSystem : EntitySystem { [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; [Dependency] private readonly TransformSystem _transformSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnActivate); } private void OnActivate(EntityUid uid, TemperatureArtifactComponent component, ArtifactActivatedEvent args) { var transform = Transform(uid); var center = _atmosphereSystem.GetContainingMixture(uid, false, true); if (center == null) return; UpdateTileTemperature(component, center); if (component.AffectAdjacentTiles && transform.GridUid != null) { var enumerator = _atmosphereSystem.GetAdjacentTileMixtures(transform.GridUid.Value, _transformSystem.GetGridOrMapTilePosition(uid, transform), excite: true); while (enumerator.MoveNext(out var mixture)) { UpdateTileTemperature(component, mixture); } } } private void UpdateTileTemperature(TemperatureArtifactComponent component, GasMixture environment) { var dif = component.TargetTemperature - environment.Temperature; var absDif = Math.Abs(dif); var step = Math.Min(absDif, component.SpawnTemperature); environment.Temperature += dif > 0 ? step : -step; } }