diff --git a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs index 4a481f0195..50849a64b6 100644 --- a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs @@ -44,7 +44,15 @@ namespace Content.Server.Atmos.EntitySystems private void OnAirtightShutdown(EntityUid uid, AirtightComponent airtight, ComponentShutdown args) { - SetAirblocked(airtight, false); + var xform = Transform(uid); + + // If the grid is deleting no point updating atmos. + if (_mapManager.TryGetGrid(xform.GridID, out var grid)) + { + if (MetaData(grid.GridEntityId).EntityLifeStage > EntityLifeStage.MapInitialized) return; + } + + SetAirblocked(airtight, false, xform); InvalidatePosition(airtight.LastPosition.Item1, airtight.LastPosition.Item2, airtight.FixVacuum); RaiseLocalEvent(new AirtightChanged(airtight)); @@ -79,16 +87,18 @@ namespace Content.Server.Atmos.EntitySystems RaiseLocalEvent(uid, new AirtightChanged(airtight)); } - public void SetAirblocked(AirtightComponent airtight, bool airblocked) + public void SetAirblocked(AirtightComponent airtight, bool airblocked, TransformComponent? xform = null) { + if (!Resolve(airtight.Owner, ref xform)) return; + airtight.AirBlocked = airblocked; - UpdatePosition(airtight); - RaiseLocalEvent((airtight).Owner, new AirtightChanged(airtight)); + UpdatePosition(airtight, xform); + RaiseLocalEvent(airtight.Owner, new AirtightChanged(airtight)); } - public void UpdatePosition(AirtightComponent airtight) + public void UpdatePosition(AirtightComponent airtight, TransformComponent? xform = null) { - var xform = EntityManager.GetComponent(airtight.Owner); + if (!Resolve(airtight.Owner, ref xform)) return; if (!xform.Anchored || !xform.GridID.IsValid()) return; diff --git a/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs b/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs index 567bea92fd..9819f52ff2 100644 --- a/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs +++ b/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs @@ -4,12 +4,16 @@ using System.Diagnostics.CodeAnalysis; using Content.Server.Power.Components; using Robust.Shared.GameObjects; using Robust.Shared.IoC; +using Robust.Shared.Map; using Robust.Shared.Physics; namespace Content.Server.Power.EntitySystems { public sealed class ExtensionCableSystem : EntitySystem { + [Dependency] private readonly IEntityLookup _lookup = default!; + [Dependency] private readonly IMapManager _mapManager = default!; + public override void Initialize() { base.Initialize(); @@ -49,6 +53,14 @@ namespace Content.Server.Power.EntitySystems private void OnProviderShutdown(EntityUid uid, ExtensionCableProviderComponent provider, ComponentShutdown args) { + var xform = Transform(uid); + + // If grid deleting no need to update power. + if (_mapManager.TryGetGrid(xform.GridID, out var grid)) + { + if (MetaData(grid.GridEntityId).EntityLifeStage > EntityLifeStage.MapInitialized) return; + } + provider.Connectable = false; ResetReceivers(provider); } @@ -68,8 +80,7 @@ namespace Content.Server.Power.EntitySystems { // No point resetting what the receiver is doing if it's deleting, plus significant perf savings // in not doing needless lookups - if (EntityManager.GetComponent((receiver).Owner).EntityLifeStage > - EntityLifeStage.MapInitialized) continue; + if (MetaData(receiver.Owner).EntityLifeStage > EntityLifeStage.MapInitialized) continue; TryFindAndSetProvider(receiver); } @@ -77,15 +88,18 @@ namespace Content.Server.Power.EntitySystems private IEnumerable FindAvailableReceivers(EntityUid owner, float range) { - var nearbyEntities = IoCManager.Resolve() - .GetEntitiesInRange(owner, range); + var xform = Transform(owner); + var coordinates = xform.Coordinates; + + var nearbyEntities = _lookup.GetEntitiesInRange(coordinates, range); foreach (var entity in nearbyEntities) { - if (EntityManager.TryGetComponent(entity, out var receiver) && + if (entity != owner && + EntityManager.TryGetComponent(entity, out var receiver) && receiver.Connectable && receiver.Provider == null && - EntityManager.GetComponent(entity).Coordinates.TryDistance(EntityManager, EntityManager.GetComponent(owner).Coordinates, out var distance) && + Transform(entity).Coordinates.TryDistance(EntityManager, coordinates, out var distance) && distance < Math.Min(range, receiver.ReceptionRange)) { yield return receiver; @@ -162,9 +176,9 @@ namespace Content.Server.Power.EntitySystems } } - private void TryFindAndSetProvider(ExtensionCableReceiverComponent receiver) + private void TryFindAndSetProvider(ExtensionCableReceiverComponent receiver, TransformComponent? xform = null) { - if (!TryFindAvailableProvider(receiver.Owner, receiver.ReceptionRange, out var provider)) return; + if (!TryFindAvailableProvider(receiver.Owner, receiver.ReceptionRange, out var provider, xform)) return; receiver.Provider = provider; provider.LinkedReceivers.Add(receiver); @@ -172,18 +186,24 @@ namespace Content.Server.Power.EntitySystems RaiseLocalEvent(provider.Owner, new ReceiverConnectedEvent(receiver), broadcast: false); } - private bool TryFindAvailableProvider(EntityUid owner, float range, [NotNullWhen(true)] out ExtensionCableProviderComponent? foundProvider) + private bool TryFindAvailableProvider(EntityUid owner, float range, [NotNullWhen(true)] out ExtensionCableProviderComponent? foundProvider, TransformComponent? xform = null) { - var nearbyEntities = IoCManager.Resolve() - .GetEntitiesInRange(owner, range); + if (!Resolve(owner, ref xform)) + { + foundProvider = null; + return false; + } + + var coordinates = xform.Coordinates; + var nearbyEntities = _lookup.GetEntitiesInRange(coordinates, range); foreach (var entity in nearbyEntities) { - if (!EntityManager.TryGetComponent(entity, out var provider)) continue; + if (entity == owner || !EntityManager.TryGetComponent(entity, out var provider)) continue; if (!provider.Connectable) continue; - if (!EntityManager.GetComponent(entity).Coordinates.TryDistance(EntityManager, EntityManager.GetComponent(owner).Coordinates, out var distance)) continue; + if (!Transform(entity).Coordinates.TryDistance(EntityManager, coordinates, out var distance)) continue; if (!(distance < Math.Min(range, provider.TransferRange))) continue;