Fix ApcPowerReceiverComponent deletion (#5031)

Co-authored-by: Julian Giebel <j.giebel@netrocks.info>
This commit is contained in:
Julian Giebel
2021-10-25 21:55:00 +02:00
committed by GitHub
parent 3bbe8f7652
commit d1a830cd74
3 changed files with 30 additions and 1 deletions

View File

@@ -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;
/// <summary>
/// When false, causes this to appear powered even if not receiving power from an Apc.
/// </summary>
@@ -68,6 +70,13 @@ namespace Content.Server.Power.Components
DesiredPower = 5
};
protected override void OnRemove()
{
Provider?.RemoveReceiver(this);
base.OnRemove();
}
public void ApcPowerChanged()
{
OnNewPowerState();

View File

@@ -79,7 +79,7 @@ namespace Content.Server.Power.EntitySystems
foreach (var entity in nearbyEntities)
{
if (entity.TryGetComponent<ExtensionCableReceiverComponent>(out var receiver) &&
if (EntityManager.TryGetComponent<ExtensionCableReceiverComponent>(entity.Uid, out var receiver) &&
receiver.Connectable &&
receiver.Provider == null &&
entity.Transform.Coordinates.TryDistance(owner.EntityManager, owner.Transform.Coordinates, out var distance) &&

View File

@@ -12,17 +12,37 @@ namespace Content.Server.Power.EntitySystems
SubscribeLocalEvent<ApcPowerReceiverComponent, ExtensionCableSystem.ProviderConnectedEvent>(OnProviderConnected);
SubscribeLocalEvent<ApcPowerReceiverComponent, ExtensionCableSystem.ProviderDisconnectedEvent>(OnProviderDisconnected);
SubscribeLocalEvent<ApcPowerProviderComponent, ComponentShutdown>(OnProviderShutdown);
SubscribeLocalEvent<ApcPowerProviderComponent, ExtensionCableSystem.ReceiverConnectedEvent>(OnReceiverConnected);
SubscribeLocalEvent<ApcPowerProviderComponent, ExtensionCableSystem.ReceiverDisconnectedEvent>(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<ApcPowerProviderComponent>(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);
}