Some work on the mess that is this power code.
Jesus. Tons of fixes, refactors and other things. The powernet's code is still awful though.
This commit is contained in:
@@ -19,7 +19,7 @@ namespace Content.Server.GameObjects.Components.Power
|
||||
public override string Name => "PowerProvider";
|
||||
|
||||
/// <inheritdoc />
|
||||
public override DrawTypes Drawtype { get; protected set; } = DrawTypes.Node;
|
||||
public override DrawTypes DrawType { get; protected set; } = DrawTypes.Node;
|
||||
|
||||
/// <summary>
|
||||
/// Variable that determines the range that the power provider will try to supply power to
|
||||
@@ -29,12 +29,22 @@ namespace Content.Server.GameObjects.Components.Power
|
||||
/// <summary>
|
||||
/// List storing all the power devices that we are currently providing power to
|
||||
/// </summary>
|
||||
public SortedSet<PowerDeviceComponent> Deviceloadlist = new SortedSet<PowerDeviceComponent>(new Powernet.DevicePriorityCompare());
|
||||
public SortedSet<PowerDeviceComponent> DeviceLoadList = new SortedSet<PowerDeviceComponent>(new Powernet.DevicePriorityCompare());
|
||||
|
||||
public List<PowerDeviceComponent> DepoweredDevices = new List<PowerDeviceComponent>();
|
||||
|
||||
public override Powernet.Priority Priority { get; protected set; } = Powernet.Priority.Provider;
|
||||
|
||||
public override void OnRemove()
|
||||
{
|
||||
base.OnRemove();
|
||||
|
||||
foreach (var device in DeviceLoadList)
|
||||
{
|
||||
device.RemoveProvider(this);
|
||||
}
|
||||
}
|
||||
|
||||
public override void LoadParameters(YamlMappingNode mapping)
|
||||
{
|
||||
if (mapping.TryGetNode("Range", out YamlNode node))
|
||||
@@ -47,78 +57,71 @@ namespace Content.Server.GameObjects.Components.Power
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void SetPowered(bool value)
|
||||
internal override void ProcessInternalPower(float frametime)
|
||||
{
|
||||
//Let them set us true, we must now power all the devices that rely on us for energy
|
||||
if (value == true)
|
||||
// Right now let's just assume that APCs don't have a power demand themselves and as such they're always marked as powered.
|
||||
InternalPowered = true;
|
||||
if (!Owner.TryGetComponent<PowerStorageComponent>(out var storage))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (ExternalPowered)
|
||||
{
|
||||
PowerAllDevices();
|
||||
return;
|
||||
}
|
||||
|
||||
//A powernet has decided we will not be powered this tick, lets try to power ourselves
|
||||
if (value == false && Owner.TryGetComponent(out PowerStorageComponent storage))
|
||||
if (storage.CanDeductCharge(Load))
|
||||
{
|
||||
//Can the storage cover powering all our devices and us? If so power all
|
||||
if (storage.CanDeductCharge(Load))
|
||||
PowerAllDevices();
|
||||
storage.DeductCharge(Load);
|
||||
return;
|
||||
}
|
||||
|
||||
var remainingLoad = storage.AvailableCharge();
|
||||
var usedLoad = 0f;
|
||||
foreach (var device in DeviceLoadList)
|
||||
{
|
||||
if (device.Load > remainingLoad)
|
||||
{
|
||||
storage.DeductCharge(Load);
|
||||
_powered = true;
|
||||
return;
|
||||
device.ExternalPowered = false;
|
||||
DepoweredDevices.Add(device);
|
||||
}
|
||||
//Does the storage even have any power to give us? If so power as much as we can
|
||||
else if (storage.RequestAllCharge() != 0)
|
||||
else
|
||||
{
|
||||
var depowervalue = storage.RequestAllCharge() - Load;
|
||||
_powered = true;
|
||||
//See code in powernet for same functionality
|
||||
foreach (var device in Deviceloadlist)
|
||||
if (!device.ExternalPowered)
|
||||
{
|
||||
device.Powered = false;
|
||||
DepoweredDevices.Add(device);
|
||||
depowervalue -= device.Load;
|
||||
if (depowervalue < 0)
|
||||
break;
|
||||
device.ExternalPowered = true;
|
||||
DepoweredDevices.Remove(device);
|
||||
}
|
||||
return;
|
||||
}
|
||||
//Storage doesn't have anything, depower everything
|
||||
else if (storage.RequestAllCharge() == 0)
|
||||
{
|
||||
DepowerAllDevices();
|
||||
return;
|
||||
usedLoad += device.Load;
|
||||
remainingLoad -= device.Load;
|
||||
}
|
||||
}
|
||||
|
||||
//For some reason above we could not power ourselves, we depower ourselves and all devices
|
||||
DepowerAllDevices();
|
||||
return;
|
||||
storage.DeductCharge(usedLoad);
|
||||
}
|
||||
|
||||
private void PowerAllDevices()
|
||||
{
|
||||
_powered = true;
|
||||
foreach (var device in DepoweredDevices)
|
||||
{
|
||||
device.Powered = true;
|
||||
device.ExternalPowered = true;
|
||||
}
|
||||
DepoweredDevices.Clear();
|
||||
}
|
||||
|
||||
private void DepowerAllDevices()
|
||||
{
|
||||
_powered = false;
|
||||
foreach (var device in DepoweredDevices)
|
||||
foreach (var device in DeviceLoadList)
|
||||
{
|
||||
device.Powered = false;
|
||||
device.ExternalPowered = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void PowernetConnect(object sender, PowernetEventArgs eventarg)
|
||||
protected override void PowernetConnect(object sender, PowernetEventArgs eventarg)
|
||||
{
|
||||
eventarg.Powernet.AddDevice(this);
|
||||
Connected = DrawTypes.Node;
|
||||
base.PowernetConnect(sender, eventarg);
|
||||
|
||||
//Find devices within range to take under our control
|
||||
var _emanager = IoCManager.Resolve<IServerEntityManager>();
|
||||
@@ -132,25 +135,20 @@ namespace Content.Server.GameObjects.Components.Power
|
||||
var device = entity.GetComponent<PowerDeviceComponent>();
|
||||
|
||||
//Make sure the device can accept power providers to give it power
|
||||
if (device.Drawtype == DrawTypes.Provider || device.Drawtype == DrawTypes.Both)
|
||||
if (device.DrawType == DrawTypes.Provider || device.DrawType == DrawTypes.Both)
|
||||
{
|
||||
device.AddProvider(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void PowernetRegenerate(object sender, PowernetEventArgs eventarg)
|
||||
{
|
||||
eventarg.Powernet.AddDevice(this);
|
||||
}
|
||||
|
||||
private void PowernetDisconnect(object sender, PowernetEventArgs eventarg)
|
||||
protected override void PowernetDisconnect(object sender, PowernetEventArgs eventarg)
|
||||
{
|
||||
eventarg.Powernet.RemoveDevice(this);
|
||||
Connected = DrawTypes.None;
|
||||
base.PowernetDisconnect(sender, eventarg);
|
||||
|
||||
//We don't want to make the devices under us think we're still a valid provider if we have no powernet to connect to
|
||||
foreach (var device in Deviceloadlist)
|
||||
foreach (var device in DeviceLoadList.ToList())
|
||||
{
|
||||
device.RemoveProvider(this);
|
||||
}
|
||||
@@ -161,7 +159,7 @@ namespace Content.Server.GameObjects.Components.Power
|
||||
/// </summary>
|
||||
public void AddDevice(PowerDeviceComponent device)
|
||||
{
|
||||
Deviceloadlist.Add(device);
|
||||
DeviceLoadList.Add(device);
|
||||
Load += device.Load;
|
||||
if (!device.Powered)
|
||||
DepoweredDevices.Add(device);
|
||||
@@ -172,7 +170,7 @@ namespace Content.Server.GameObjects.Components.Power
|
||||
/// </summary>
|
||||
public void UpdateDevice(PowerDeviceComponent device, float oldLoad)
|
||||
{
|
||||
if (Deviceloadlist.Contains(device))
|
||||
if (DeviceLoadList.Contains(device))
|
||||
{
|
||||
Load -= oldLoad;
|
||||
Load += device.Load;
|
||||
@@ -184,10 +182,10 @@ namespace Content.Server.GameObjects.Components.Power
|
||||
/// </summary>
|
||||
public void RemoveDevice(PowerDeviceComponent device)
|
||||
{
|
||||
if (Deviceloadlist.Contains(device))
|
||||
if (DeviceLoadList.Contains(device))
|
||||
{
|
||||
Load -= device.Load;
|
||||
Deviceloadlist.Remove(device);
|
||||
DeviceLoadList.Remove(device);
|
||||
if (DepoweredDevices.Contains(device))
|
||||
DepoweredDevices.Remove(device);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user