A better attempt

This commit is contained in:
CovertJaguar 2013-06-12 06:13:21 -07:00
parent 7336dfd882
commit 69df314c36
2 changed files with 50 additions and 26 deletions

View file

@ -20,18 +20,19 @@ 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 {
private static final short MAX_DISPLAY = 100;
private static final double DISPLAY_SMOOTHING = 5.0;
private static final int DISPLAY_SMOOTHING = 10;
private static final int OVERLOAD_TICKS = 60;
private boolean needsInit = true;
private TileEntity[] tiles = new TileEntity[6];
public double[] displayPower = new double[6];
public double[] prevDisplayPower = new double[6];
public short[] clientDisplayPower = new short[6];
public boolean overload;
public int overload;
public int[] powerQuery = new int[6];
public int[] nextPowerQuery = new int[6];
public long currentDate;
@ -95,58 +96,66 @@ public class PipeTransportPower extends PipeTransport {
// Send the power to nearby pipes who requested it
double highestPower = 0;
System.arraycopy(displayPower, 0, prevDisplayPower, 0, 6);
Arrays.fill(displayPower, 0.0);
for (int i = 0; i < 6; ++i) {
if (internalPower[i] > 0) {
double div = 0;
double totalPowerQuery = 0;
for (int j = 0; j < 6; ++j) {
if (j != i && powerQuery[j] > 0)
if (tiles[j] instanceof TileGenericPipe || tiles[j] instanceof IPowerReceptor) {
div += powerQuery[j];
totalPowerQuery += powerQuery[j];
}
}
if (internalPower[i] > highestPower) {
highestPower = internalPower[i];
}
for (int j = 0; j < 6; ++j) {
if (j != i && powerQuery[j] > 0 && internalPower[i] > 0) {
double watts = (internalPower[i] / div * powerQuery[j]);
if (j != i && powerQuery[j] > 0) {
double watts = 0.0;
if (tiles[j] instanceof TileGenericPipe) {
watts = (internalPower[i] / totalPowerQuery * powerQuery[j]);
TileGenericPipe nearbyTile = (TileGenericPipe) tiles[j];
PipeTransportPower nearbyTransport = (PipeTransportPower) nearbyTile.pipe.transport;
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;
internalPower[i] -= watts;
} else if (tiles[j] instanceof IPowerReceptor) {
watts = (internalPower[i] / totalPowerQuery * powerQuery[j]);
IPowerReceptor pow = (IPowerReceptor) tiles[j];
IPowerProvider prov = pow.getPowerProvider();
if (prov != null) {
prov.receiveEnergy((float) watts, ForgeDirection.VALID_DIRECTIONS[j].getOpposite());
displayPower[j] = (displayPower[j] * (DISPLAY_SMOOTHING - 1.0) + watts) / DISPLAY_SMOOTHING;
displayPower[i] = (displayPower[i] * (DISPLAY_SMOOTHING - 1.0) + watts) / DISPLAY_SMOOTHING;
internalPower[i] -= watts;
}
}
displayPower[j] += watts;
displayPower[i] += watts;
}
}
}
}
overload = highestPower > maxPower * 0.9;
double highestPower = 0;
for (int i = 0; i < 6; i++) {
displayPower[i] = (prevDisplayPower[i] * (DISPLAY_SMOOTHING - 1.0) + displayPower[i]) / DISPLAY_SMOOTHING;
if (displayPower[i] > highestPower) {
highestPower = displayPower[i];
}
}
overload += highestPower > maxPower * 0.95 ? 1 : -1;
if (overload < 0) {
overload = 0;
}
if (overload > OVERLOAD_TICKS) {
overload = OVERLOAD_TICKS;
}
// Compute the tiles requesting energy that are not pipes
@ -163,7 +172,7 @@ public class PipeTransportPower extends PipeTransport {
// Sum the amount of energy requested on each side
int transferQuery[] = {0, 0, 0, 0, 0, 0};
int[] transferQuery = new int[6];
for (int i = 0; i < 6; ++i) {
transferQuery[i] = 0;
@ -207,7 +216,7 @@ public class PipeTransportPower extends PipeTransport {
}
packet.displayPower = clientDisplayPower;
packet.overload = overload;
packet.overload = overload >= OVERLOAD_TICKS;
CoreProxy.proxy.sendToPlayers(packet.getPacket(), worldObj, xCoord, yCoord, zCoord, DefaultProps.PIPE_CONTENTS_RENDER_DIST);
}
@ -220,8 +229,23 @@ public class PipeTransportPower extends PipeTransport {
powerQuery = nextPowerQuery;
nextPowerQuery = new int[6];
double[] next = Arrays.copyOf(internalPower, 6);
internalPower = internalNextPower;
internalNextPower = new double[6];
internalNextPower = next;
for (int i = 0; i < powerQuery.length; i++) {
int sum = 0;
for (int j = 0; j < powerQuery.length; j++) {
if (i != j) {
sum += powerQuery[j];
}
}
if (sum == 0 && internalNextPower[i] > 0) {
internalNextPower[i] -= 1;
if (internalNextPower[i] < 0) {
internalNextPower[i] = 0;
}
}
}
}
}
@ -291,6 +315,6 @@ public class PipeTransportPower extends PipeTransport {
*/
public void handlePowerPacket(PacketPowerUpdate packetPower) {
clientDisplayPower = packetPower.displayPower;
overload = packetPower.overload;
overload = packetPower.overload ? OVERLOAD_TICKS : 0;
}
}

View file

@ -282,7 +282,7 @@ public class RenderPipe extends TileEntitySpecialRenderer {
bindTextureByName("/terrain.png");
int[] displayList = pow.overload ? displayPowerListOverload : displayPowerList;
int[] displayList = pow.overload > 0 ? displayPowerListOverload : displayPowerList;
for (int i = 0; i < 6; ++i) {
GL11.glPushMatrix();