diff --git a/Content.Server/Atmos/TileAtmosphere.cs b/Content.Server/Atmos/TileAtmosphere.cs index ca463a5347..db1b89ee45 100644 --- a/Content.Server/Atmos/TileAtmosphere.cs +++ b/Content.Server/Atmos/TileAtmosphere.cs @@ -1101,7 +1101,7 @@ namespace Content.Server.Atmos reconsiderAdjacent |= firelock.EmergencyPressureStop(); } - foreach (var entity in other.GridIndices.GetEntitiesInTile(other.GridIndex)) + foreach (var entity in other.GridIndices.GetEntitiesInTileFast(other.GridIndex)) { if (!entity.TryGetComponent(out FirelockComponent firelock)) continue; reconsiderAdjacent |= firelock.EmergencyPressureStop(); diff --git a/Content.Server/GameObjects/Components/Atmos/AirtightComponent.cs b/Content.Server/GameObjects/Components/Atmos/AirtightComponent.cs index 5d1f52de4d..22c0783548 100644 --- a/Content.Server/GameObjects/Components/Atmos/AirtightComponent.cs +++ b/Content.Server/GameObjects/Components/Atmos/AirtightComponent.cs @@ -24,6 +24,7 @@ namespace Content.Server.GameObjects.Components.Atmos [Dependency] private readonly IEntityManager _entityManager = default!; private (GridId, MapIndices) _lastPosition; + private AtmosphereSystem _atmosphereSystem = default!; public override string Name => "Airtight"; @@ -79,6 +80,8 @@ namespace Content.Server.GameObjects.Components.Atmos { base.Initialize(); + _atmosphereSystem = EntitySystem.Get(); + // Using the SnapGrid is critical for performance, and thus if it is absent the component // will not be airtight. A warning is much easier to track down than the object magically // not being airtight, so log one if the SnapGrid component is missing. @@ -140,7 +143,7 @@ namespace Content.Server.GameObjects.Components.Atmos UpdatePosition(_lastPosition.Item1, _lastPosition.Item2); if (_fixVacuum) - EntitySystem.Get().GetGridAtmosphere(_lastPosition.Item1)?.FixVacuum(_lastPosition.Item2); + _atmosphereSystem.GetGridAtmosphere(_lastPosition.Item1)?.FixVacuum(_lastPosition.Item2); } private void OnTransformMove() @@ -162,7 +165,7 @@ namespace Content.Server.GameObjects.Components.Atmos private void UpdatePosition(GridId gridId, MapIndices pos) { - var gridAtmos = EntitySystem.Get().GetGridAtmosphere(gridId); + var gridAtmos = _atmosphereSystem.GetGridAtmosphere(gridId); if (gridAtmos == null) return; diff --git a/Content.Server/GameObjects/Components/Atmos/FirelockComponent.cs b/Content.Server/GameObjects/Components/Atmos/FirelockComponent.cs index b6c416ca97..6ef8768e37 100644 --- a/Content.Server/GameObjects/Components/Atmos/FirelockComponent.cs +++ b/Content.Server/GameObjects/Components/Atmos/FirelockComponent.cs @@ -6,6 +6,7 @@ using Content.Server.GameObjects.Components.Interactable; using Content.Server.Interfaces; using Content.Shared.GameObjects.Components.Doors; using Content.Shared.GameObjects.Components.Interactable; +using Content.Shared.Interfaces; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Components; @@ -17,8 +18,6 @@ namespace Content.Server.GameObjects.Components.Atmos [RegisterComponent] public class FirelockComponent : ServerDoorComponent, IInteractUsing, ICollideBehavior { - [Dependency] private IServerNotifyManager _notifyManager = default!; - public override string Name => "Firelock"; protected override TimeSpan CloseTimeOne => TimeSpan.FromSeconds(0.1f); @@ -87,7 +86,7 @@ namespace Content.Server.GameObjects.Components.Atmos if (State == DoorState.Closed) { if(holdingPressure) - _notifyManager.PopupMessage(Owner, eventArgs.User, "A gush of air blows in your face... Maybe you should reconsider."); + Owner.PopupMessage(eventArgs.User, "A gush of air blows in your face... Maybe you should reconsider."); } if (!await tool.UseTool(eventArgs.User, Owner, holdingPressure || holdingFire ? 1.5f : 0.25f, ToolQuality.Prying)) return false; diff --git a/Content.Server/GameObjects/Components/Atmos/GridAtmosphereComponent.cs b/Content.Server/GameObjects/Components/Atmos/GridAtmosphereComponent.cs index aa2b3e859f..b8a02bd904 100644 --- a/Content.Server/GameObjects/Components/Atmos/GridAtmosphereComponent.cs +++ b/Content.Server/GameObjects/Components/Atmos/GridAtmosphereComponent.cs @@ -16,6 +16,7 @@ using Robust.Shared.GameObjects.Components.Map; using Robust.Shared.GameObjects.Components.Transform; using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.Map; +using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Serialization; using Robust.Shared.Timing; @@ -34,6 +35,7 @@ namespace Content.Server.GameObjects.Components.Atmos [Robust.Shared.IoC.Dependency] private ITileDefinitionManager _tileDefinitionManager = default!; [Robust.Shared.IoC.Dependency] private IServerEntityManager _serverEntityManager = default!; + /// /// Check current execution time every n instances processed. /// diff --git a/Content.Server/Utility/GridTileLookupHelpers.cs b/Content.Server/Utility/GridTileLookupHelpers.cs index 7d5223fe6e..2494815d2f 100644 --- a/Content.Server/Utility/GridTileLookupHelpers.cs +++ b/Content.Server/Utility/GridTileLookupHelpers.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +#nullable enable +using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using Content.Shared.Maps; @@ -15,9 +16,9 @@ namespace Content.Server.Utility /// Helper that returns all entities in a turf very fast. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static IEnumerable GetEntitiesInTileFast(this TileRef turf) + public static IEnumerable GetEntitiesInTileFast(this TileRef turf, GridTileLookupSystem? gridTileLookup = null) { - var gridTileLookup = EntitySystem.Get(); + gridTileLookup ??= EntitySystem.Get(); return gridTileLookup.GetEntitiesIntersecting(turf.GridIndex, turf.GridIndices); } @@ -26,14 +27,14 @@ namespace Content.Server.Utility /// Helper that returns all entities in a turf. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static IEnumerable GetEntitiesInTileFast(this MapIndices indices, GridId gridId) + public static IEnumerable GetEntitiesInTileFast(this MapIndices indices, GridId gridId, GridTileLookupSystem? gridTileLookup = null) { var turf = indices.GetTileRef(gridId); if (turf == null) return Enumerable.Empty(); - return GetEntitiesInTileFast(turf.Value); + return GetEntitiesInTileFast(turf.Value, gridTileLookup); } } } diff --git a/Content.Shared/Maps/TurfHelpers.cs b/Content.Shared/Maps/TurfHelpers.cs index d059235264..7207647375 100644 --- a/Content.Shared/Maps/TurfHelpers.cs +++ b/Content.Shared/Maps/TurfHelpers.cs @@ -124,9 +124,9 @@ namespace Content.Shared.Maps /// Helper that returns all entities in a turf. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static IEnumerable GetEntitiesInTile(this TileRef turf, bool approximate = false) + public static IEnumerable GetEntitiesInTile(this TileRef turf, bool approximate = false, IEntityManager? entityManager = null) { - var entityManager = IoCManager.Resolve(); + entityManager ??= IoCManager.Resolve(); return entityManager.GetEntitiesIntersecting(turf.MapIndex, GetWorldTileBox(turf), approximate); } @@ -134,27 +134,27 @@ namespace Content.Shared.Maps /// /// Helper that returns all entities in a turf. /// - public static IEnumerable GetEntitiesInTile(this EntityCoordinates coordinates, bool approximate = false) + public static IEnumerable GetEntitiesInTile(this EntityCoordinates coordinates, bool approximate = false, IEntityManager? entityManager = null) { var turf = coordinates.GetTileRef(); if (turf == null) return Enumerable.Empty(); - return GetEntitiesInTile(turf.Value); + return GetEntitiesInTile(turf.Value, approximate, entityManager); } /// /// Helper that returns all entities in a turf. /// - public static IEnumerable GetEntitiesInTile(this MapIndices indices, GridId gridId, bool approximate = false) + public static IEnumerable GetEntitiesInTile(this MapIndices indices, GridId gridId, bool approximate = false, IEntityManager? entityManager = null) { var turf = indices.GetTileRef(gridId); if (turf == null) return Enumerable.Empty(); - return GetEntitiesInTile(turf.Value); + return GetEntitiesInTile(turf.Value, approximate, entityManager); } ///