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:
@@ -44,7 +44,15 @@ namespace Content.Server.Atmos.EntitySystems
|
|||||||
|
|
||||||
private void OnAirtightShutdown(EntityUid uid, AirtightComponent airtight, ComponentShutdown args)
|
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);
|
InvalidatePosition(airtight.LastPosition.Item1, airtight.LastPosition.Item2, airtight.FixVacuum);
|
||||||
RaiseLocalEvent(new AirtightChanged(airtight));
|
RaiseLocalEvent(new AirtightChanged(airtight));
|
||||||
@@ -79,16 +87,18 @@ namespace Content.Server.Atmos.EntitySystems
|
|||||||
RaiseLocalEvent(uid, new AirtightChanged(airtight));
|
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;
|
airtight.AirBlocked = airblocked;
|
||||||
UpdatePosition(airtight);
|
UpdatePosition(airtight, xform);
|
||||||
RaiseLocalEvent((airtight).Owner, new AirtightChanged(airtight));
|
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())
|
if (!xform.Anchored || !xform.GridID.IsValid())
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -4,12 +4,16 @@ using System.Diagnostics.CodeAnalysis;
|
|||||||
using Content.Server.Power.Components;
|
using Content.Server.Power.Components;
|
||||||
using Robust.Shared.GameObjects;
|
using Robust.Shared.GameObjects;
|
||||||
using Robust.Shared.IoC;
|
using Robust.Shared.IoC;
|
||||||
|
using Robust.Shared.Map;
|
||||||
using Robust.Shared.Physics;
|
using Robust.Shared.Physics;
|
||||||
|
|
||||||
namespace Content.Server.Power.EntitySystems
|
namespace Content.Server.Power.EntitySystems
|
||||||
{
|
{
|
||||||
public sealed class ExtensionCableSystem : EntitySystem
|
public sealed class ExtensionCableSystem : EntitySystem
|
||||||
{
|
{
|
||||||
|
[Dependency] private readonly IEntityLookup _lookup = default!;
|
||||||
|
[Dependency] private readonly IMapManager _mapManager = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
@@ -49,6 +53,14 @@ namespace Content.Server.Power.EntitySystems
|
|||||||
|
|
||||||
private void OnProviderShutdown(EntityUid uid, ExtensionCableProviderComponent provider, ComponentShutdown args)
|
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;
|
provider.Connectable = false;
|
||||||
ResetReceivers(provider);
|
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
|
// No point resetting what the receiver is doing if it's deleting, plus significant perf savings
|
||||||
// in not doing needless lookups
|
// in not doing needless lookups
|
||||||
if (EntityManager.GetComponent<MetaDataComponent>((receiver).Owner).EntityLifeStage >
|
if (MetaData(receiver.Owner).EntityLifeStage > EntityLifeStage.MapInitialized) continue;
|
||||||
EntityLifeStage.MapInitialized) continue;
|
|
||||||
|
|
||||||
TryFindAndSetProvider(receiver);
|
TryFindAndSetProvider(receiver);
|
||||||
}
|
}
|
||||||
@@ -77,15 +88,18 @@ namespace Content.Server.Power.EntitySystems
|
|||||||
|
|
||||||
private IEnumerable<ExtensionCableReceiverComponent> FindAvailableReceivers(EntityUid owner, float range)
|
private IEnumerable<ExtensionCableReceiverComponent> FindAvailableReceivers(EntityUid owner, float range)
|
||||||
{
|
{
|
||||||
var nearbyEntities = IoCManager.Resolve<IEntityLookup>()
|
var xform = Transform(owner);
|
||||||
.GetEntitiesInRange(owner, range);
|
var coordinates = xform.Coordinates;
|
||||||
|
|
||||||
|
var nearbyEntities = _lookup.GetEntitiesInRange(coordinates, range);
|
||||||
|
|
||||||
foreach (var entity in nearbyEntities)
|
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.Connectable &&
|
||||||
receiver.Provider == null &&
|
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))
|
distance < Math.Min(range, receiver.ReceptionRange))
|
||||||
{
|
{
|
||||||
yield return receiver;
|
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;
|
receiver.Provider = provider;
|
||||||
provider.LinkedReceivers.Add(receiver);
|
provider.LinkedReceivers.Add(receiver);
|
||||||
@@ -172,18 +186,24 @@ namespace Content.Server.Power.EntitySystems
|
|||||||
RaiseLocalEvent(provider.Owner, new ReceiverConnectedEvent(receiver), broadcast: false);
|
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>()
|
if (!Resolve(owner, ref xform))
|
||||||
.GetEntitiesInRange(owner, range);
|
{
|
||||||
|
foundProvider = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var coordinates = xform.Coordinates;
|
||||||
|
var nearbyEntities = _lookup.GetEntitiesInRange(coordinates, range);
|
||||||
|
|
||||||
foreach (var entity in nearbyEntities)
|
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 (!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;
|
if (!(distance < Math.Min(range, provider.TransferRange))) continue;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user