Cleanup: ExtensionCableSystem (#36052)
* Use Entity<T> and avoid Owner * Use SharedMapSystem
This commit is contained in:
@@ -13,7 +13,7 @@ namespace Content.Server.Power.Components
|
|||||||
[DataField("transferRange")]
|
[DataField("transferRange")]
|
||||||
public int TransferRange { get; set; } = 3;
|
public int TransferRange { get; set; } = 3;
|
||||||
|
|
||||||
[ViewVariables] public List<ExtensionCableReceiverComponent> LinkedReceivers { get; } = new();
|
[ViewVariables] public List<Entity<ExtensionCableReceiverComponent>> LinkedReceivers { get; } = new();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// If <see cref="ExtensionCableReceiverComponent"/>s should consider connecting to this.
|
/// If <see cref="ExtensionCableReceiverComponent"/>s should consider connecting to this.
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ namespace Content.Server.Power.Components
|
|||||||
public sealed partial class ExtensionCableReceiverComponent : Component
|
public sealed partial class ExtensionCableReceiverComponent : Component
|
||||||
{
|
{
|
||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
public ExtensionCableProviderComponent? Provider { get; set; }
|
public Entity<ExtensionCableProviderComponent>? Provider { get; set; }
|
||||||
|
|
||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
public bool Connectable = false;
|
public bool Connectable = false;
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ namespace Content.Server.Power.EntitySystems
|
|||||||
{
|
{
|
||||||
public sealed class ExtensionCableSystem : EntitySystem
|
public sealed class ExtensionCableSystem : EntitySystem
|
||||||
{
|
{
|
||||||
|
[Dependency] private readonly SharedMapSystem _map = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
@@ -34,17 +36,17 @@ namespace Content.Server.Power.EntitySystems
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
provider.TransferRange = range;
|
provider.TransferRange = range;
|
||||||
ResetReceivers(provider);
|
ResetReceivers((uid, provider));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnProviderStarted(EntityUid uid, ExtensionCableProviderComponent provider, ComponentStartup args)
|
private void OnProviderStarted(Entity<ExtensionCableProviderComponent> provider, ref ComponentStartup args)
|
||||||
{
|
{
|
||||||
Connect(uid, provider);
|
Connect(provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnProviderShutdown(EntityUid uid, ExtensionCableProviderComponent provider, ComponentShutdown args)
|
private void OnProviderShutdown(Entity<ExtensionCableProviderComponent> provider, ref ComponentShutdown args)
|
||||||
{
|
{
|
||||||
var xform = Transform(uid);
|
var xform = Transform(provider);
|
||||||
|
|
||||||
// If grid deleting no need to update power.
|
// If grid deleting no need to update power.
|
||||||
if (HasComp<MapGridComponent>(xform.GridUid) &&
|
if (HasComp<MapGridComponent>(xform.GridUid) &&
|
||||||
@@ -53,54 +55,54 @@ namespace Content.Server.Power.EntitySystems
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Disconnect(uid, provider);
|
Disconnect(provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnProviderAnchorStateChanged(EntityUid uid, ExtensionCableProviderComponent provider, ref AnchorStateChangedEvent args)
|
private void OnProviderAnchorStateChanged(Entity<ExtensionCableProviderComponent> provider, ref AnchorStateChangedEvent args)
|
||||||
{
|
{
|
||||||
if (args.Anchored)
|
if (args.Anchored)
|
||||||
Connect(uid, provider);
|
Connect(provider);
|
||||||
else
|
else
|
||||||
Disconnect(uid, provider);
|
Disconnect(provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Connect(EntityUid uid, ExtensionCableProviderComponent provider)
|
private void Connect(Entity<ExtensionCableProviderComponent> provider)
|
||||||
{
|
{
|
||||||
provider.Connectable = true;
|
provider.Comp.Connectable = true;
|
||||||
|
|
||||||
foreach (var receiver in FindAvailableReceivers(uid, provider.TransferRange))
|
foreach (var receiver in FindAvailableReceivers(provider.Owner, provider.Comp.TransferRange))
|
||||||
{
|
{
|
||||||
receiver.Comp.Provider?.LinkedReceivers.Remove(receiver);
|
receiver.Comp.Provider?.Comp.LinkedReceivers.Remove(receiver);
|
||||||
receiver.Comp.Provider = provider;
|
receiver.Comp.Provider = provider;
|
||||||
provider.LinkedReceivers.Add(receiver);
|
provider.Comp.LinkedReceivers.Add(receiver);
|
||||||
RaiseLocalEvent(receiver, new ProviderConnectedEvent(provider), broadcast: false);
|
RaiseLocalEvent(receiver, new ProviderConnectedEvent(provider), broadcast: false);
|
||||||
RaiseLocalEvent(uid, new ReceiverConnectedEvent(receiver), broadcast: false);
|
RaiseLocalEvent(provider, new ReceiverConnectedEvent(receiver), broadcast: false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Disconnect(EntityUid uid, ExtensionCableProviderComponent provider)
|
private void Disconnect(Entity<ExtensionCableProviderComponent> provider)
|
||||||
{
|
{
|
||||||
// same as OnProviderShutdown
|
// same as OnProviderShutdown
|
||||||
provider.Connectable = false;
|
provider.Comp.Connectable = false;
|
||||||
ResetReceivers(provider);
|
ResetReceivers(provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnProviderReAnchor(EntityUid uid, ExtensionCableProviderComponent component, ref ReAnchorEvent args)
|
private void OnProviderReAnchor(Entity<ExtensionCableProviderComponent> provider, ref ReAnchorEvent args)
|
||||||
{
|
{
|
||||||
Disconnect(uid, component);
|
Disconnect(provider);
|
||||||
Connect(uid, component);
|
Connect(provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ResetReceivers(ExtensionCableProviderComponent provider)
|
private void ResetReceivers(Entity<ExtensionCableProviderComponent> provider)
|
||||||
{
|
{
|
||||||
var providerId = provider.Owner;
|
var providerId = provider.Owner;
|
||||||
var receivers = provider.LinkedReceivers.ToArray();
|
var receivers = provider.Comp.LinkedReceivers.ToArray();
|
||||||
provider.LinkedReceivers.Clear();
|
provider.Comp.LinkedReceivers.Clear();
|
||||||
|
|
||||||
foreach (var receiver in receivers)
|
foreach (var receiver in receivers)
|
||||||
{
|
{
|
||||||
var receiverId = receiver.Owner;
|
var receiverId = receiver.Owner;
|
||||||
receiver.Provider = null;
|
receiver.Comp.Provider = null;
|
||||||
RaiseLocalEvent(receiverId, new ProviderDisconnectedEvent(provider), broadcast: false);
|
RaiseLocalEvent(receiverId, new ProviderDisconnectedEvent(provider), broadcast: false);
|
||||||
RaiseLocalEvent(providerId, new ReceiverDisconnectedEvent((receiverId, receiver)), broadcast: false);
|
RaiseLocalEvent(providerId, new ReceiverDisconnectedEvent((receiverId, receiver)), broadcast: false);
|
||||||
}
|
}
|
||||||
@@ -126,7 +128,7 @@ namespace Content.Server.Power.EntitySystems
|
|||||||
if (!TryComp(xform.GridUid, out MapGridComponent? grid))
|
if (!TryComp(xform.GridUid, out MapGridComponent? grid))
|
||||||
yield break;
|
yield break;
|
||||||
|
|
||||||
var nearbyEntities = grid.GetCellsInSquareArea(coordinates, (int) Math.Ceiling(range / grid.TileSize));
|
var nearbyEntities = _map.GetCellsInSquareArea(xform.GridUid.Value, grid, coordinates, (int)Math.Ceiling(range / grid.TileSize));
|
||||||
|
|
||||||
foreach (var entity in nearbyEntities)
|
foreach (var entity in nearbyEntities)
|
||||||
{
|
{
|
||||||
@@ -162,88 +164,88 @@ namespace Content.Server.Power.EntitySystems
|
|||||||
|
|
||||||
if (provider != null)
|
if (provider != null)
|
||||||
{
|
{
|
||||||
RaiseLocalEvent(provider.Owner, new ReceiverDisconnectedEvent((uid, receiver)), broadcast: false);
|
RaiseLocalEvent(provider.Value, new ReceiverDisconnectedEvent((uid, receiver)), broadcast: false);
|
||||||
provider.LinkedReceivers.Remove(receiver);
|
provider.Value.Comp.LinkedReceivers.Remove((uid, receiver));
|
||||||
}
|
}
|
||||||
|
|
||||||
receiver.ReceptionRange = range;
|
receiver.ReceptionRange = range;
|
||||||
TryFindAndSetProvider(receiver);
|
TryFindAndSetProvider((uid, receiver));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnReceiverStarted(EntityUid uid, ExtensionCableReceiverComponent receiver, ComponentStartup args)
|
private void OnReceiverStarted(Entity<ExtensionCableReceiverComponent> receiver, ref ComponentStartup args)
|
||||||
{
|
{
|
||||||
if (EntityManager.TryGetComponent(receiver.Owner, out PhysicsComponent? physicsComponent))
|
if (EntityManager.TryGetComponent(receiver.Owner, out PhysicsComponent? physicsComponent))
|
||||||
{
|
{
|
||||||
receiver.Connectable = physicsComponent.BodyType == BodyType.Static;
|
receiver.Comp.Connectable = physicsComponent.BodyType == BodyType.Static;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (receiver.Provider == null)
|
if (receiver.Comp.Provider == null)
|
||||||
{
|
{
|
||||||
TryFindAndSetProvider(receiver);
|
TryFindAndSetProvider(receiver);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnReceiverShutdown(EntityUid uid, ExtensionCableReceiverComponent receiver, ComponentShutdown args)
|
private void OnReceiverShutdown(Entity<ExtensionCableReceiverComponent> receiver, ref ComponentShutdown args)
|
||||||
{
|
{
|
||||||
Disconnect(uid, receiver);
|
Disconnect(receiver);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnReceiverAnchorStateChanged(EntityUid uid, ExtensionCableReceiverComponent receiver, ref AnchorStateChangedEvent args)
|
private void OnReceiverAnchorStateChanged(Entity<ExtensionCableReceiverComponent> receiver, ref AnchorStateChangedEvent args)
|
||||||
{
|
{
|
||||||
if (args.Anchored)
|
if (args.Anchored)
|
||||||
{
|
{
|
||||||
Connect(uid, receiver);
|
Connect(receiver);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Disconnect(uid, receiver);
|
Disconnect(receiver);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnReceiverReAnchor(EntityUid uid, ExtensionCableReceiverComponent receiver, ref ReAnchorEvent args)
|
private void OnReceiverReAnchor(Entity<ExtensionCableReceiverComponent> receiver, ref ReAnchorEvent args)
|
||||||
{
|
{
|
||||||
Disconnect(uid, receiver);
|
Disconnect(receiver);
|
||||||
Connect(uid, receiver);
|
Connect(receiver);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Connect(EntityUid uid, ExtensionCableReceiverComponent receiver)
|
private void Connect(Entity<ExtensionCableReceiverComponent> receiver)
|
||||||
{
|
{
|
||||||
receiver.Connectable = true;
|
receiver.Comp.Connectable = true;
|
||||||
if (receiver.Provider == null)
|
if (receiver.Comp.Provider == null)
|
||||||
{
|
{
|
||||||
TryFindAndSetProvider(receiver);
|
TryFindAndSetProvider(receiver);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Disconnect(EntityUid uid, ExtensionCableReceiverComponent receiver)
|
private void Disconnect(Entity<ExtensionCableReceiverComponent> receiver)
|
||||||
{
|
{
|
||||||
receiver.Connectable = false;
|
receiver.Comp.Connectable = false;
|
||||||
RaiseLocalEvent(uid, new ProviderDisconnectedEvent(receiver.Provider), broadcast: false);
|
RaiseLocalEvent(receiver, new ProviderDisconnectedEvent(receiver.Comp.Provider), broadcast: false);
|
||||||
if (receiver.Provider != null)
|
if (receiver.Comp.Provider != null)
|
||||||
{
|
{
|
||||||
RaiseLocalEvent(receiver.Provider.Owner, new ReceiverDisconnectedEvent((uid, receiver)), broadcast: false);
|
RaiseLocalEvent(receiver.Comp.Provider.Value, new ReceiverDisconnectedEvent(receiver), broadcast: false);
|
||||||
receiver.Provider.LinkedReceivers.Remove(receiver);
|
receiver.Comp.Provider.Value.Comp.LinkedReceivers.Remove(receiver);
|
||||||
}
|
}
|
||||||
|
|
||||||
receiver.Provider = null;
|
receiver.Comp.Provider = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TryFindAndSetProvider(ExtensionCableReceiverComponent receiver, TransformComponent? xform = null)
|
private void TryFindAndSetProvider(Entity<ExtensionCableReceiverComponent> receiver, TransformComponent? xform = null)
|
||||||
{
|
{
|
||||||
var uid = receiver.Owner;
|
var uid = receiver.Owner;
|
||||||
if (!receiver.Connectable)
|
if (!receiver.Comp.Connectable)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!TryFindAvailableProvider(uid, receiver.ReceptionRange, out var provider, xform))
|
if (!TryFindAvailableProvider(uid, receiver.Comp.ReceptionRange, out var provider, xform))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
receiver.Provider = provider;
|
receiver.Comp.Provider = provider;
|
||||||
provider.LinkedReceivers.Add(receiver);
|
provider.Value.Comp.LinkedReceivers.Add(receiver);
|
||||||
RaiseLocalEvent(uid, new ProviderConnectedEvent(provider), broadcast: false);
|
RaiseLocalEvent(uid, new ProviderConnectedEvent(provider), broadcast: false);
|
||||||
RaiseLocalEvent(provider.Owner, new ReceiverConnectedEvent((uid, receiver)), broadcast: false);
|
RaiseLocalEvent(provider.Value, new ReceiverConnectedEvent((uid, receiver)), broadcast: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool TryFindAvailableProvider(EntityUid owner, float range, [NotNullWhen(true)] out ExtensionCableProviderComponent? foundProvider, TransformComponent? xform = null)
|
private bool TryFindAvailableProvider(EntityUid owner, float range, [NotNullWhen(true)] out Entity<ExtensionCableProviderComponent>? foundProvider, TransformComponent? xform = null)
|
||||||
{
|
{
|
||||||
if (!Resolve(owner, ref xform) || !TryComp(xform.GridUid, out MapGridComponent? grid))
|
if (!Resolve(owner, ref xform) || !TryComp(xform.GridUid, out MapGridComponent? grid))
|
||||||
{
|
{
|
||||||
@@ -252,12 +254,12 @@ namespace Content.Server.Power.EntitySystems
|
|||||||
}
|
}
|
||||||
|
|
||||||
var coordinates = xform.Coordinates;
|
var coordinates = xform.Coordinates;
|
||||||
var nearbyEntities = grid.GetCellsInSquareArea(coordinates, (int) Math.Ceiling(range / grid.TileSize));
|
var nearbyEntities = _map.GetCellsInSquareArea(xform.GridUid.Value, grid, coordinates, (int)Math.Ceiling(range / grid.TileSize));
|
||||||
var cableQuery = GetEntityQuery<ExtensionCableProviderComponent>();
|
var cableQuery = GetEntityQuery<ExtensionCableProviderComponent>();
|
||||||
var metaQuery = GetEntityQuery<MetaDataComponent>();
|
var metaQuery = GetEntityQuery<MetaDataComponent>();
|
||||||
var xformQuery = GetEntityQuery<TransformComponent>();
|
var xformQuery = GetEntityQuery<TransformComponent>();
|
||||||
|
|
||||||
ExtensionCableProviderComponent? closestCandidate = null;
|
Entity<ExtensionCableProviderComponent>? closestCandidate = null;
|
||||||
var closestDistanceFound = float.MaxValue;
|
var closestDistanceFound = float.MaxValue;
|
||||||
foreach (var entity in nearbyEntities)
|
foreach (var entity in nearbyEntities)
|
||||||
{
|
{
|
||||||
@@ -277,12 +279,12 @@ namespace Content.Server.Power.EntitySystems
|
|||||||
if (distance >= closestDistanceFound)
|
if (distance >= closestDistanceFound)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
closestCandidate = provider;
|
closestCandidate = (entity, provider);
|
||||||
closestDistanceFound = distance;
|
closestDistanceFound = distance;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make sure the provider is in range before claiming success
|
// Make sure the provider is in range before claiming success
|
||||||
if (closestCandidate != null && closestDistanceFound <= Math.Min(range, closestCandidate.TransferRange))
|
if (closestCandidate != null && closestDistanceFound <= Math.Min(range, closestCandidate.Value.Comp.TransferRange))
|
||||||
{
|
{
|
||||||
foundProvider = closestCandidate;
|
foundProvider = closestCandidate;
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Reference in New Issue
Block a user