(482b2c640) Fixes relay component logic: previously the load was clamped to zero when traversing out from the power_in connection of a relay to check how much power is coming in (devices connected to power_in don't increase the load), but now the same is also done for the incoming power when traversing out from power_out. Fixes #329, #805 and #1350
This commit is contained in:
@@ -164,7 +164,11 @@ namespace Barotrauma.Items.Components
|
|||||||
pt.currPowerConsumption += (-fullPower - pt.currPowerConsumption) / inertia;
|
pt.currPowerConsumption += (-fullPower - pt.currPowerConsumption) / inertia;
|
||||||
|
|
||||||
float voltage = fullPower / Math.Max(fullLoad, 1.0f);
|
float voltage = fullPower / Math.Max(fullLoad, 1.0f);
|
||||||
if (this is RelayComponent) voltage = Math.Min(voltage, 1.0f);
|
if (this is RelayComponent)
|
||||||
|
{
|
||||||
|
pt.currPowerConsumption = Math.Max(-fullLoad, pt.currPowerConsumption);
|
||||||
|
voltage = Math.Min(voltage, 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
pt.Item.SendSignal(0, "", "power", null, voltage);
|
pt.Item.SendSignal(0, "", "power", null, voltage);
|
||||||
pt.Item.SendSignal(0, "", "power_out", null, voltage);
|
pt.Item.SendSignal(0, "", "power_out", null, voltage);
|
||||||
@@ -305,7 +309,7 @@ namespace Barotrauma.Items.Components
|
|||||||
|
|
||||||
//a recursive function that goes through all the junctions and adds up
|
//a recursive function that goes through all the junctions and adds up
|
||||||
//all the generated/consumed power of the constructions connected to the grid
|
//all the generated/consumed power of the constructions connected to the grid
|
||||||
private void CheckJunctions(float deltaTime, bool increaseUpdateCount = true, bool inputOnly = false)
|
private void CheckJunctions(float deltaTime, bool increaseUpdateCount = true, float clampPower = float.MaxValue, float clampLoad = float.MaxValue)
|
||||||
{
|
{
|
||||||
if (increaseUpdateCount)
|
if (increaseUpdateCount)
|
||||||
{
|
{
|
||||||
@@ -315,7 +319,13 @@ namespace Barotrauma.Items.Components
|
|||||||
|
|
||||||
ApplyStatusEffects(ActionType.OnActive, deltaTime, null);
|
ApplyStatusEffects(ActionType.OnActive, deltaTime, null);
|
||||||
|
|
||||||
float maxPower = this is RelayComponent relayComponent ? relayComponent.MaxPower : float.PositiveInfinity;
|
//float maxPower = this is RelayComponent relayComponent ? relayComponent.MaxPower : float.PositiveInfinity;
|
||||||
|
RelayComponent thisRelayComponent = this as RelayComponent;
|
||||||
|
if (thisRelayComponent != null)
|
||||||
|
{
|
||||||
|
clampPower = Math.Min(Math.Min(clampPower, thisRelayComponent.MaxPower), powerLoad);
|
||||||
|
clampLoad = Math.Min(clampLoad, thisRelayComponent.MaxPower);
|
||||||
|
}
|
||||||
|
|
||||||
foreach (Connection c in PowerConnections)
|
foreach (Connection c in PowerConnections)
|
||||||
{
|
{
|
||||||
@@ -334,29 +344,36 @@ namespace Barotrauma.Items.Components
|
|||||||
|
|
||||||
if (powered is PowerTransfer powerTransfer)
|
if (powered is PowerTransfer powerTransfer)
|
||||||
{
|
{
|
||||||
if (this is RelayComponent == powerTransfer is RelayComponent)
|
RelayComponent otherRelayComponent = powerTransfer as RelayComponent;
|
||||||
|
if ((thisRelayComponent == null) == (otherRelayComponent == null))
|
||||||
{
|
{
|
||||||
if (!powerTransfer.CanTransfer) continue;
|
if (!powerTransfer.CanTransfer) continue;
|
||||||
powerTransfer.CheckJunctions(deltaTime, increaseUpdateCount, inputOnly);
|
powerTransfer.CheckJunctions(deltaTime, increaseUpdateCount, clampPower, clampLoad);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!powerTransfer.CanTransfer) continue;
|
if (!powerTransfer.CanTransfer) continue;
|
||||||
powerTransfer.CheckJunctions(deltaTime, false, !c.IsOutput || inputOnly);
|
powerTransfer.CheckJunctions(
|
||||||
|
deltaTime,
|
||||||
|
false,
|
||||||
|
(thisRelayComponent != null && c.IsOutput) ? 0.0f : clampPower,
|
||||||
|
(thisRelayComponent != null && !c.IsOutput) ? 0.0f : clampLoad);
|
||||||
}
|
}
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float addLoad = 0.0f;
|
||||||
|
float addPower = 0.0f;
|
||||||
if (powered is PowerContainer powerContainer)
|
if (powered is PowerContainer powerContainer)
|
||||||
{
|
{
|
||||||
if (recipient.Name == "power_in")
|
if (recipient.Name == "power_in")
|
||||||
{
|
{
|
||||||
if (!inputOnly) fullLoad += powerContainer.CurrPowerConsumption;
|
addLoad = powerContainer.CurrPowerConsumption;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fullPower += Math.Min(powerContainer.CurrPowerOutput, maxPower);
|
addPower = powerContainer.CurrPowerOutput;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -365,16 +382,22 @@ namespace Barotrauma.Items.Components
|
|||||||
//positive power consumption = the construction requires power -> increase load
|
//positive power consumption = the construction requires power -> increase load
|
||||||
if (powered.CurrPowerConsumption > 0.0f)
|
if (powered.CurrPowerConsumption > 0.0f)
|
||||||
{
|
{
|
||||||
if (!inputOnly) fullLoad += powered.CurrPowerConsumption;
|
addLoad = powered.CurrPowerConsumption;
|
||||||
}
|
}
|
||||||
else if (powered.CurrPowerConsumption < 0.0f)
|
else if (powered.CurrPowerConsumption < 0.0f)
|
||||||
//negative power consumption = the construction is a
|
//negative power consumption = the construction is a
|
||||||
//generator/battery or another junction box
|
//generator/battery or another junction box
|
||||||
{
|
{
|
||||||
fullPower -= Math.Max(powered.CurrPowerConsumption, -maxPower);
|
addPower -= powered.CurrPowerConsumption;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
if (addPower + fullPower > clampPower) { addPower -= (addPower + fullPower) - clampPower; };
|
||||||
|
if (addPower > 0) { fullPower += addPower; }
|
||||||
|
|
||||||
|
if (addLoad + fullLoad > clampLoad) { addLoad -= (addLoad + fullLoad) - clampLoad; };
|
||||||
|
if (addLoad > 0) { fullLoad += addLoad; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user