CatStation/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs
TemporalOroboros 84b2f07157
The IMapManager is dead (#44002)
* Axes the easy IMapManager references

* Axes the references to unported (obsolete) IMapManager methods

* Converts salvageruler command to a LocalizedEntityCommand so it can use SharedMapSystem

* Removes IMapManager from GameTicker
This required axing the map nuke during restart, but that should be fine?
Maps are entities so EntityManager.FlushEntities should delete them all and that's the preceding line

* submodule update(?)

---------

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
2026-07-01 20:44:54 -07:00

130 lines
4.2 KiB
C#

using System.Linq;
using Content.Server.Administration.Logs;
using Content.Server.Atmos.Components;
using Content.Server.Atmos.Reactions;
using Content.Server.Fluids.EntitySystems;
using Content.Server.NodeContainer.EntitySystems;
using Content.Shared.Atmos;
using Content.Shared.Atmos.Components;
using Content.Shared.Atmos.EntitySystems;
using Content.Shared.Damage.Systems;
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 Robust.Shared.Threading;
namespace Content.Server.Atmos.EntitySystems;
/// <summary>
/// This is our SSAir equivalent, if you need to interact with or query atmos in any way, go through this.
/// </summary>
[UsedImplicitly]
public sealed partial class AtmosphereSystem : SharedAtmosphereSystem
{
[Dependency] private ITileDefinitionManager _tileDefinitionManager = default!;
[Dependency] private IAdminLogManager _adminLog = default!;
[Dependency] private IParallelManager _parallel = default!;
[Dependency] private EntityLookupSystem _lookup = default!;
[Dependency] private SharedContainerSystem _containers = default!;
[Dependency] private SharedPhysicsSystem _physics = default!;
[Dependency] private GasTileOverlaySystem _gasTileOverlaySystem = default!;
[Dependency] private SharedAudioSystem _audio = default!;
[Dependency] private SharedMapSystem _mapSystem = default!;
[Dependency] private TileSystem _tile = default!;
[Dependency] private MapSystem _map = default!;
[Dependency] public PuddleSystem Puddle = default!;
[Dependency] private DamageableSystem _damage = default!;
[Dependency] private EntityQuery<GridAtmosphereComponent> _gridAtmosQuery = default!;
[Dependency] private EntityQuery<MapAtmosphereComponent> _mapAtmosQuery = default!;
[Dependency] private EntityQuery<AirtightComponent> _airtightQuery = default!;
[Dependency] private EntityQuery<FirelockComponent> _firelockQuery = default!;
private const float ExposedUpdateDelay = 1f;
private float _exposedTimer = 0f;
private HashSet<EntityUid> _entSet = new();
private string[] _burntDecals = [];
public override void Initialize()
{
base.Initialize();
UpdatesAfter.Add(typeof(NodeGroupSystem));
InitializeGases();
InitializeCommands();
InitializeCVars();
InitializeGridAtmosphere();
InitializeMap();
SubscribeLocalEvent<TileChangedEvent>(OnTileChanged);
SubscribeLocalEvent<PrototypesReloadedEventArgs>(OnPrototypesReloaded);
CacheDecals();
CacheGases();
}
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<DecalPrototype>())
CacheDecals();
if (ev.WasModified<GasReactionPrototype>())
CacheGases();
}
public override void Update(float frameTime)
{
base.Update(frameTime);
UpdateProcessing(frameTime);
UpdateHighPressure(frameTime);
_exposedTimer += frameTime;
if (_exposedTimer < ExposedUpdateDelay)
return;
var query = EntityQueryEnumerator<AtmosExposedComponent, TransformComponent>();
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<DecalPrototype>().Where(x => x.Tags.Contains("burnt")).Select(x => x.ID).ToArray();
}
}