Optimise air + cable shutdowns for grid deletion (#5847)

Co-authored-by: Vera Aguilera Puerto <6766154+Zumorica@users.noreply.github.com>
This commit is contained in:
metalgearsloth
2021-12-21 17:17:21 +11:00
committed by GitHub
parent 7d041db06d
commit caf28d09b3
2 changed files with 49 additions and 19 deletions

View File

@@ -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<TransformComponent>(airtight.Owner);
if (!Resolve(airtight.Owner, ref xform)) return;
if (!xform.Anchored || !xform.GridID.IsValid())
return;

View File

@@ -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<MetaDataComponent>((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<ExtensionCableReceiverComponent> FindAvailableReceivers(EntityUid owner, float range)
{
var nearbyEntities = IoCManager.Resolve<IEntityLookup>()
.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<ExtensionCableReceiverComponent>(entity, out var receiver) &&
if (entity != owner &&
EntityManager.TryGetComponent<ExtensionCableReceiverComponent>(entity, out var receiver) &&
receiver.Connectable &&
receiver.Provider == null &&
EntityManager.GetComponent<TransformComponent>(entity).Coordinates.TryDistance(EntityManager, EntityManager.GetComponent<TransformComponent>(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<IEntityLookup>()
.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<ExtensionCableProviderComponent?>(entity, out var provider)) continue;
if (entity == owner || !EntityManager.TryGetComponent<ExtensionCableProviderComponent?>(entity, out var provider)) continue;
if (!provider.Connectable) continue;
if (!EntityManager.GetComponent<TransformComponent>(entity).Coordinates.TryDistance(EntityManager, EntityManager.GetComponent<TransformComponent>(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;