Attempt to prevent pipes from tossing excess

This NEEDS extensive testing. I only have a vague idea how this code
works.

The original code was just tossing any power beyond what it could
handle, with no throttle on how much it was requesting from its
neighbors.

I think its working, more or less, but you'd probably have to hook it to
some TE Cells or something to know for sure.
This commit is contained in:
CovertJaguar 2013-06-12 03:36:22 -07:00
parent ff0e36a784
commit 7336dfd882
2 changed files with 22 additions and 19 deletions

View file

@ -13,7 +13,7 @@ import net.minecraftforge.common.ForgeDirection;
public interface IPipeTransportPowerHook {
public void receiveEnergy(ForgeDirection from, double val);
public double receiveEnergy(ForgeDirection from, double val);
public void requestEnergy(ForgeDirection from, int i);
}

View file

@ -20,6 +20,8 @@ import buildcraft.core.IMachine;
import buildcraft.core.proxy.CoreProxy;
import buildcraft.core.utils.Utils;
import buildcraft.transport.network.PacketPowerUpdate;
import buildcraft.transport.pipes.PipePowerCobblestone;
import java.util.Arrays;
public class PipeTransportPower extends PipeTransport {
@ -68,6 +70,9 @@ public class PipeTransportPower extends PipeTransport {
tiles[i] = tile;
} else {
tiles[i] = null;
internalPower[i] = 0;
internalNextPower[i] = 0;
displayPower[i] = 0;
}
}
}
@ -103,21 +108,20 @@ public class PipeTransportPower extends PipeTransport {
}
}
double totalWatt = internalPower[i];
if (totalWatt > highestPower) {
highestPower = totalWatt;
if (internalPower[i] > highestPower) {
highestPower = internalPower[i];
}
for (int j = 0; j < 6; ++j) {
if (j != i && powerQuery[j] > 0) {
double watts = (totalWatt / div * powerQuery[j]);
if (j != i && powerQuery[j] > 0 && internalPower[i] > 0) {
double watts = (internalPower[i] / div * powerQuery[j]);
if (tiles[j] instanceof TileGenericPipe) {
TileGenericPipe nearbyTile = (TileGenericPipe) tiles[j];
PipeTransportPower nearbyTransport = (PipeTransportPower) nearbyTile.pipe.transport;
nearbyTransport.receiveEnergy(ForgeDirection.VALID_DIRECTIONS[j].getOpposite(), watts);
watts = nearbyTransport.receiveEnergy(ForgeDirection.VALID_DIRECTIONS[j].getOpposite(), watts);
displayPower[j] = (displayPower[j] * (DISPLAY_SMOOTHING - 1.0) + watts) / DISPLAY_SMOOTHING;
displayPower[i] = (displayPower[i] * (DISPLAY_SMOOTHING - 1.0) + watts) / DISPLAY_SMOOTHING;
@ -169,6 +173,8 @@ public class PipeTransportPower extends PipeTransport {
transferQuery[i] += powerQuery[j];
}
}
transferQuery[i] = Math.min(transferQuery[i], maxPower);
}
// Transfer the requested energy to nearby pipes
@ -212,38 +218,35 @@ public class PipeTransportPower extends PipeTransport {
currentDate = worldObj.getWorldTime();
powerQuery = nextPowerQuery;
nextPowerQuery = new int[]{0, 0, 0, 0, 0, 0};
nextPowerQuery = new int[6];
internalPower = internalNextPower;
internalNextPower = new double[6];
for (int i = 0; i < nextPowerQuery.length; i++) {
if (powerQuery[i] == 0.0d && internalNextPower[i] > 0) {
internalNextPower[i] -= 1;
}
}
}
}
public void receiveEnergy(ForgeDirection from, double val) {
public double receiveEnergy(ForgeDirection from, double val) {
step();
if (this.container.pipe instanceof IPipeTransportPowerHook) {
((IPipeTransportPowerHook) this.container.pipe).receiveEnergy(from, val);
return ((IPipeTransportPowerHook) this.container.pipe).receiveEnergy(from, val);
} else {
internalNextPower[from.ordinal()] += val;
if (internalNextPower[from.ordinal()] >= maxPower) {
if (internalNextPower[from.ordinal()] > maxPower) {
val = internalNextPower[from.ordinal()] - maxPower;
internalNextPower[from.ordinal()] = maxPower;
}
}
return val;
}
public void requestEnergy(ForgeDirection from, int i) {
public void requestEnergy(ForgeDirection from, int amount) {
step();
if (this.container.pipe instanceof IPipeTransportPowerHook) {
((IPipeTransportPowerHook) this.container.pipe).requestEnergy(from, i);
((IPipeTransportPowerHook) this.container.pipe).requestEnergy(from, amount);
} else {
step();
nextPowerQuery[from.ordinal()] += i;
nextPowerQuery[from.ordinal()] += amount;
}
}