ApcNet code improvements (#2876)

* Removes per-frame setting of PowerReceiverComponent.Powered

* PowerReceiver.SetLoad

Co-authored-by: py01 <pyronetics01@gmail.com>
This commit is contained in:
py01
2021-01-01 11:21:18 -06:00
committed by GitHub
parent 4316e2f554
commit 135a65f030
3 changed files with 135 additions and 63 deletions

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using Content.Server.GameObjects.Components.NodeContainer.NodeGroups;
@@ -18,7 +18,11 @@ namespace Content.Server.GameObjects.Components.Power.ApcNetComponents
void RemoveReceiver(PowerReceiverComponent receiver);
void UpdateReceiverLoad(int oldLoad, int newLoad);
public IEntity ProviderOwner { get; }
public bool HasApcPower { get; }
}
[RegisterComponent]
@@ -28,6 +32,9 @@ namespace Content.Server.GameObjects.Components.Power.ApcNetComponents
public IEntity ProviderOwner => Owner;
[ViewVariables]
public bool HasApcPower => Net.Powered;
/// <summary>
/// The max distance this can transmit power to <see cref="PowerReceiverComponent"/>s from.
/// </summary>
@@ -49,14 +56,23 @@ namespace Content.Server.GameObjects.Components.Power.ApcNetComponents
public void AddReceiver(PowerReceiverComponent receiver)
{
var oldLoad = GetTotalLoad();
_linkedReceivers.Add(receiver);
Net.UpdatePowerProviderReceivers(this);
var newLoad = oldLoad + receiver.Load;
Net.UpdatePowerProviderReceivers(this, oldLoad, newLoad);
}
public void RemoveReceiver(PowerReceiverComponent receiver)
{
var oldLoad = GetTotalLoad();
_linkedReceivers.Remove(receiver);
Net.UpdatePowerProviderReceivers(this);
var newLoad = oldLoad - receiver.Load;
Net.UpdatePowerProviderReceivers(this, oldLoad, newLoad);
}
public void UpdateReceiverLoad(int oldLoad, int newLoad)
{
Net.UpdatePowerProviderReceivers(this, oldLoad, newLoad);
}
public override void ExposeData(ObjectSerializer serializer)
@@ -82,8 +98,6 @@ namespace Content.Server.GameObjects.Components.Power.ApcNetComponents
{
receiver.ClearProvider();
}
_linkedReceivers = new List<PowerReceiverComponent>();
Net.UpdatePowerProviderReceivers(this);
foreach (var receiver in receivers)
{
receiver.TryFindAndSetProvider();
@@ -115,19 +129,37 @@ namespace Content.Server.GameObjects.Components.Power.ApcNetComponents
private void SetPowerTransferRange(int newPowerTransferRange)
{
var oldLoad = GetTotalLoad();
foreach (var receiver in _linkedReceivers.ToArray())
{
receiver.ClearProvider();
}
_powerTransferRange = newPowerTransferRange;
_linkedReceivers = FindAvailableReceivers();
Net.UpdatePowerProviderReceivers(this);
var newLoad = GetTotalLoad();
Net.UpdatePowerProviderReceivers(this, oldLoad, newLoad);
}
private int GetTotalLoad()
{
var load = 0;
foreach (var receiver in _linkedReceivers)
{
load += receiver.Load;
}
return load;
}
private class NullPowerProvider : IPowerProvider
{
/// <summary>
/// It is important that this returns false, so <see cref="PowerReceiverComponent"/>s with a <see cref="NullPowerProvider"/> have no power.
/// </summary>
public bool HasApcPower => false;
public void AddReceiver(PowerReceiverComponent receiver) { }
public void RemoveReceiver(PowerReceiverComponent receiver) { }
public void UpdateReceiverLoad(int oldLoad, int newLoad) { }
public IEntity ProviderOwner => default;
}
}