package mods.eln.sixnode.energymeter;
import mods.eln.cable.CableRenderDescriptor;
import mods.eln.misc.Direction;
import mods.eln.misc.LRDU;
import mods.eln.misc.Utils;
import mods.eln.misc.UtilsClient;
import mods.eln.node.six.SixNodeDescriptor;
import mods.eln.node.six.SixNodeElementInventory;
import mods.eln.node.six.SixNodeElementRender;
import mods.eln.node.six.SixNodeEntity;
import mods.eln.sixnode.electricalcable.ElectricalCableDescriptor;
import mods.eln.sixnode.energymeter.EnergyMeterElement.Mod;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.entity.player.EntityPlayer;
import org.lwjgl.opengl.GL11;
import java.io.DataInputStream;
import java.io.IOException;
public class EnergyMeterRender extends SixNodeElementRender {
SixNodeElementInventory inventory = new SixNodeElementInventory(1, 64, this);
EnergyMeterDescriptor descriptor;
double timerCouter, energyStack;
boolean switchState;
String password;
Mod mod;
int energyUnit, timeUnit;
CableRenderDescriptor cableRender;
double power;
double error;
double serverPowerIdTimer = EnergyMeterElement.SlowProcess.publishTimeoutReset * 34;
public EnergyMeterRender(SixNodeEntity tileEntity, Direction side, SixNodeDescriptor descriptor) {
super(tileEntity, side, descriptor);
this.descriptor = (EnergyMeterDescriptor) descriptor;
/*for (int idx = 0; idx < energyRc.length; idx++) {
energyRc[idx] = new RcInterpolator(0.2f);
}*/
}
//RcInterpolator[] energyRc = new RcInterpolator[7];
@Override
public void draw() {
super.draw();
GL11.glPushMatrix();
float[] pinDistances = descriptor.pinDistance;
if (side.isY()) {
pinDistances = front.rotate4PinDistances(pinDistances);
front.left().glRotateOnX();
}
descriptor.draw(energyStack / Math.pow(10, energyUnit * 3 - 1), timerCouter / (timeUnit == 0 ? 360 : 8640),
energyUnit, timeUnit,
UtilsClient.distanceFromClientPlayer(tileEntity) < 20);
GL11.glPopMatrix();
GL11.glColor3f(0.9f, 0f, 0f);
drawPowerPinWhite(front, pinDistances);
GL11.glColor3f(0f, 0f, 0.9f);
drawPowerPinWhite(front.inverse(), pinDistances);
GL11.glColor3f(1f, 1f, 1f);
}
@Override
public void refresh(float deltaT) {
double errorComp = error * 1 * deltaT;
energyStack += power * deltaT + errorComp;
error -= errorComp;
/*double stack = energyStack;
for (int idx = 0; idx < energyRc.length; idx++) {
energyRc[idx].setTarget((float) ((stack) % 10));
energyRc[idx].step(deltaT);
stack /= 10.0;
}*/
timerCouter += deltaT * 72;
serverPowerIdTimer += deltaT;
}
@Override
public CableRenderDescriptor getCableRender(LRDU lrdu) {
return cableRender;
}
@Override
public void publishUnserialize(DataInputStream stream) {
super.publishUnserialize(stream);
try {
switchState = stream.readBoolean();
password = stream.readUTF();
mod = Mod.valueOf(stream.readUTF());
timerCouter = stream.readDouble();
// energyStack = stream.readDouble();
ElectricalCableDescriptor desc = (ElectricalCableDescriptor) ElectricalCableDescriptor.getDescriptor(Utils.unserialiseItemStack(stream), ElectricalCableDescriptor.class);
energyUnit = stream.readByte();
timeUnit = stream.readByte();
if (desc == null)
cableRender = null;
else
cableRender = desc.render;
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public GuiScreen newGuiDraw(Direction side, EntityPlayer player) {
return new EnergyMeterGui(player, inventory, this);
}
@Override
public void serverPacketUnserialize(DataInputStream stream) throws IOException {
super.serverPacketUnserialize(stream);
switch (stream.readByte()) {
case EnergyMeterElement.serverPowerId:
if (serverPowerIdTimer > EnergyMeterElement.SlowProcess.publishTimeoutReset * 3) {
energyStack = stream.readDouble();
error = 0;
} else {
error = stream.readDouble() - energyStack;
}
power = stream.readDouble();
serverPowerIdTimer = 0;
break;
default:
break;
}
}
}