package mods.eln.transparentnode.teleporter;
import mods.eln.Eln;
import mods.eln.misc.*;
import mods.eln.node.transparent.TransparentNodeDescriptor;
import mods.eln.node.transparent.TransparentNodeElementRender;
import mods.eln.node.transparent.TransparentNodeEntity;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import org.lwjgl.opengl.GL11;
import java.io.DataInputStream;
import java.io.IOException;
public class TeleporterRender extends TransparentNodeElementRender {
TeleporterDescriptor d;
Coordonate c;
public TeleporterRender(TransparentNodeEntity tileEntity,
TransparentNodeDescriptor descriptor) {
super(tileEntity, descriptor);
this.d = (TeleporterDescriptor) descriptor;
doorInterpolator.setMaxSpeed(0.3f);
c = new Coordonate(tileEntity);
}
public static final float doorAlphaOpen = -90;
boolean doorState;
PhysicalInterpolator doorInterpolator = new PhysicalInterpolator(0.2f, 8.0f, 5f, 0.0f);
RcInterpolator processRatioInterpolator = new RcInterpolator(1);
RcInterpolator blueInterpolator = new RcInterpolator(0.5f);
boolean[] ledState = new boolean[10];
float counter = 0, ledCounter;
boolean blink = false;
float gyroAlpha = 0;
@Override
public void draw() {
Coordonate lightCoordonate = new Coordonate(this.d.lightCoordonate);
lightCoordonate.applyTransformation(front, c);
boolean lightEnable = tileEntity.getWorldObj().getBlock(lightCoordonate.x, lightCoordonate.y, lightCoordonate.z) == Eln.lightBlock;
front.glRotateXnRef();
GL11.glTranslatef(-1, 0, 0);
GL11.glColor3f(1f, 1f, 1f);
if (!lightEnable) {
d.door_in.draw(doorInterpolator.get() * doorAlphaOpen, 0, 0, 1);
d.indoor_open.draw();
}
d.main.draw();
d.ext_control.draw();
d.ext_power.draw();
UtilsClient.disableCulling();
d.door_out.draw(doorInterpolator.get() * doorAlphaOpen, 0, 0, 1);
UtilsClient.enableCulling();
// d.outlampline0.draw();
GL11.glColor3f(1f, 1f, 1f);
if (doorState == true) {
UtilsClient.disableCulling();
d.gyro.draw(doorInterpolator.get() * doorAlphaOpen, 0, 0, 1, gyroAlpha, -0.11746f, 0.04275f, 0);
UtilsClient.enableCulling();
}
UtilsClient.disableLight();
GL11.glColor3f(1f, 0.5f, 0f);
if (doorState == false) {
UtilsClient.disableCulling();
d.gyro.draw(doorInterpolator.get() * doorAlphaOpen, 0, 0, 1, gyroAlpha, -0.11746f, 0.04275f, 0);
UtilsClient.enableCulling();
GL11.glColor4f(1f, 0.5f, 0f, 0.4f);
UtilsClient.enableBlend();
d.gyro_alpha.draw(doorInterpolator.get() * doorAlphaOpen, 0, 0, 1, gyroAlpha, -0.11746f, 0.04275f, 0);
UtilsClient.disableBlend();
}
GL11.glColor3f(1f, 1f, 1f);
if (lightEnable) {
d.door_in.draw(doorInterpolator.get() * doorAlphaOpen, 0, 0, 1);
d.indoor_open.draw();
}
if (voltage > 0.6f) {
GL11.glColor3f(1f, 0f, 0f);
d.leds[0].draw();
d.leds[1].draw();
GL11.glColor3f(0f, 1f, 0f);
for (int idx = 2; idx < 10; idx++) {
if (ledCounter == 0 && Math.random() < 0.3) {
ledState[idx] = !ledState[idx];
}
if (ledState[idx])
d.leds[idx].draw();
}
GL11.glColor4f(1f, 0.5f, 0.0f, 1f);
if ((voltage > 0.875f && voltage < 1.2f) || blink)
d.scr0_electrictity.draw();
d.scr1_cables.draw();
d.scr2_transporter.draw();
if (!tileEntity.getWorldObj().getEntitiesWithinAABB(Entity.class, d.getBB(c, front)).isEmpty())
d.scr3_userin.draw();
if (doorState)
d.scr5_dooropen.draw();
else
d.src4_doorclosed.draw();
}
if (processRatioInterpolator.get() > 0.005) {
UtilsClient.enableBlend();
GL11.glColor4f(1f, 1f, 1f, blueInterpolator.get());
d.indoor_closed.draw();
d.door_in_charge.draw(doorInterpolator.get() * doorAlphaOpen, 0, 0, 1);
//GL11.glColor4f(0f, 0.5f, 1f,blueInterpolator.get());
//d.outlampline0_alpha.draw();
d.whiteblur.draw(doorInterpolator.get() * doorAlphaOpen, 0, 0, 1);
GL11.glColor4f(1f, 1f, 1f, 1f);
UtilsClient.disableBlend();
}
UtilsClient.enableLight();
// GL11.glColor4f(1f, 1f, 1f,1f);
/*
door_in_charge = obj.getPart("door_in_charge");
door_in = obj.getPart("door_in");
indoor_closed = obj.getPart("indoor_closed");
indoor_open = obj.getPart("indoor_open");
*/
}
@Override
public void refresh(float deltaT) {
doorInterpolator.step(deltaT);
processRatioInterpolator.step(deltaT);
blueInterpolator.setTarget(processRatioInterpolator.get() > 0.1 && (!doorState) ? 1f : 0f);
blueInterpolator.step(deltaT);
counter += deltaT;
if (counter > 0.4) {
counter = 0;
blink = !blink;
}
ledCounter += deltaT;
if (ledCounter > 0.1) {
ledCounter = 0;
}
gyroAlpha += 360 * deltaT * (1.0f - doorInterpolator.get());
if (gyroAlpha >= 360) gyroAlpha -= 360;
}
float voltage;
String name, targetName;
float chargePower, chargePowerLast, energyHit, energyTarget;
boolean chargePowerNew;
byte state;
float processRatio;
@Override
public void networkUnserialize(DataInputStream stream) {
super.networkUnserialize(stream);
try {
name = stream.readUTF();
targetName = stream.readUTF();
chargePower = stream.readFloat();
state = stream.readByte();
byte b = stream.readByte();
doorState = (b & 1) != 0;
processRatio = stream.readFloat();
voltage = (float) (stream.readFloat() / d.cable.electricalNominalVoltage);
energyHit = stream.readFloat();
energyTarget = stream.readFloat();
} catch (IOException e) {
e.printStackTrace();
}
if (chargePower != chargePowerLast) {
chargePowerNew = true;
}
chargePowerLast = chargePower;
if (doorState)
doorInterpolator.setTarget(1f);
else
doorInterpolator.setTarget(0f);
/*
if(energyTarget == 0){
chargeRatio = 0;
}
else{
chargeRatio = Math.min(1.0f,energyHit / energyTarget);
}*/
processRatioInterpolator.setTarget(processRatio);
}
@Override
public GuiScreen newGuiDraw(Direction side, EntityPlayer player) {
return new TeleporterGui(player, this);
}
@Override
public void serverPacketUnserialize(DataInputStream stream) {
super.serverPacketUnserialize(stream);
try {
stream.readByte();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public boolean cameraDrawOptimisation() {
return false;
}
}