using Content.Server.Administration.Logs; using Content.Server.Atmos.Components; using Content.Server.Fluids.EntitySystems; using Content.Server.NodeContainer.EntitySystems; using Content.Shared.Atmos.EntitySystems; using Content.Shared.Decals; using Content.Shared.Doors.Components; using Content.Shared.Maps; using JetBrains.Annotations; using Robust.Server.GameObjects; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.Map; using Robust.Shared.Physics.Systems; using Robust.Shared.Prototypes; using System.Linq; using Content.Shared.Damage; using Robust.Shared.Threading; namespace Content.Server.Atmos.EntitySystems; /// /// This is our SSAir equivalent, if you need to interact with or query atmos in any way, go through this. /// [UsedImplicitly] public sealed partial class AtmosphereSystem : SharedAtmosphereSystem { [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly ITileDefinitionManager _tileDefinitionManager = default!; [Dependency] private readonly IAdminLogManager _adminLog = default!; [Dependency] private readonly IParallelManager _parallel = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly SharedContainerSystem _containers = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly GasTileOverlaySystem _gasTileOverlaySystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedMapSystem _mapSystem = default!; [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly TileSystem _tile = default!; [Dependency] private readonly MapSystem _map = default!; [Dependency] public readonly PuddleSystem Puddle = default!; [Dependency] private readonly DamageableSystem _damage = default!; private const float ExposedUpdateDelay = 1f; private float _exposedTimer = 0f; private EntityQuery _atmosQuery; private EntityQuery _mapAtmosQuery; private EntityQuery _airtightQuery; private EntityQuery _firelockQuery; private HashSet _entSet = new(); private string[] _burntDecals = []; public override void Initialize() { base.Initialize(); UpdatesAfter.Add(typeof(NodeGroupSystem)); InitializeGases(); InitializeCommands(); InitializeCVars(); InitializeGridAtmosphere(); InitializeMap(); _mapAtmosQuery = GetEntityQuery(); _atmosQuery = GetEntityQuery(); _airtightQuery = GetEntityQuery(); _firelockQuery = GetEntityQuery(); SubscribeLocalEvent(OnTileChanged); SubscribeLocalEvent(OnPrototypesReloaded); CacheDecals(); } public override void Shutdown() { base.Shutdown(); ShutdownCommands(); } private void OnTileChanged(ref TileChangedEvent ev) { foreach (var change in ev.Changes) { InvalidateTile(ev.Entity.Owner, change.GridIndices); } } private void OnPrototypesReloaded(PrototypesReloadedEventArgs ev) { if (ev.WasModified()) CacheDecals(); } public override void Update(float frameTime) { base.Update(frameTime); UpdateProcessing(frameTime); UpdateHighPressure(frameTime); _exposedTimer += frameTime; if (_exposedTimer < ExposedUpdateDelay) return; var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out _, out var transform)) { var air = GetContainingMixture((uid, transform)); if (air == null) continue; var updateEvent = new AtmosExposedUpdateEvent(transform.Coordinates, air, transform); RaiseLocalEvent(uid, ref updateEvent); } _exposedTimer -= ExposedUpdateDelay; } private void CacheDecals() { _burntDecals = _protoMan.EnumeratePrototypes().Where(x => x.Tags.Contains("burnt")).Select(x => x.ID).ToArray(); } }