diff --git a/Content.Server/Power/Components/ApcPowerReceiverComponent.cs b/Content.Server/Power/Components/ApcPowerReceiverComponent.cs
index 7f0cc03e1b..474c414ab7 100644
--- a/Content.Server/Power/Components/ApcPowerReceiverComponent.cs
+++ b/Content.Server/Power/Components/ApcPowerReceiverComponent.cs
@@ -35,6 +35,8 @@ namespace Content.Server.Power.Components
[DataField("powerLoad")]
public float Load { get => NetworkLoad.DesiredPower; set => NetworkLoad.DesiredPower = value; }
+ public ApcPowerProviderComponent? Provider = null;
+
///
/// When false, causes this to appear powered even if not receiving power from an Apc.
///
@@ -68,6 +70,13 @@ namespace Content.Server.Power.Components
DesiredPower = 5
};
+ protected override void OnRemove()
+ {
+ Provider?.RemoveReceiver(this);
+
+ base.OnRemove();
+ }
+
public void ApcPowerChanged()
{
OnNewPowerState();
diff --git a/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs b/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs
index 83847eff56..1bbce9041f 100644
--- a/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs
+++ b/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs
@@ -79,7 +79,7 @@ namespace Content.Server.Power.EntitySystems
foreach (var entity in nearbyEntities)
{
- if (entity.TryGetComponent(out var receiver) &&
+ if (EntityManager.TryGetComponent(entity.Uid, out var receiver) &&
receiver.Connectable &&
receiver.Provider == null &&
entity.Transform.Coordinates.TryDistance(owner.EntityManager, owner.Transform.Coordinates, out var distance) &&
diff --git a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs
index de39ec242d..8a77441cf0 100644
--- a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs
+++ b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs
@@ -12,17 +12,37 @@ namespace Content.Server.Power.EntitySystems
SubscribeLocalEvent(OnProviderConnected);
SubscribeLocalEvent(OnProviderDisconnected);
+ SubscribeLocalEvent(OnProviderShutdown);
SubscribeLocalEvent(OnReceiverConnected);
SubscribeLocalEvent(OnReceiverDisconnected);
}
+ private void OnProviderShutdown(EntityUid uid, ApcPowerProviderComponent component, ComponentShutdown args)
+ {
+ foreach (var receiver in component.LinkedReceivers)
+ {
+ receiver.NetworkLoad.LinkedNetwork = default;
+ component.Net?.QueueNetworkReconnect();
+ }
+
+ component.LinkedReceivers.Clear();
+ }
+
private void OnProviderConnected(EntityUid uid, ApcPowerReceiverComponent receiver, ExtensionCableSystem.ProviderConnectedEvent args)
{
+ var providerUid = args.Provider.Owner.Uid;
+ if (!EntityManager.TryGetComponent(providerUid, out var provider))
+ return;
+
+ receiver.Provider = provider;
+
ProviderChanged(receiver);
}
private void OnProviderDisconnected(EntityUid uid, ApcPowerReceiverComponent receiver, ExtensionCableSystem.ProviderDisconnectedEvent args)
{
+ receiver.Provider = null;
+
ProviderChanged(receiver);
}