package mods.eln.transparentnode.autominer; import mods.eln.Eln; import mods.eln.item.electricalitem.PortableOreScannerItem.RenderStorage; import mods.eln.misc.*; import mods.eln.node.transparent.TransparentNodeDescriptor; import mods.eln.node.transparent.TransparentNodeElementInventory; import mods.eln.node.transparent.TransparentNodeElementRender; import mods.eln.node.transparent.TransparentNodeEntity; import mods.eln.sound.LoopedSound; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.ISound; 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; import java.util.LinkedList; public class AutoMinerRender extends TransparentNodeElementRender { private final AutoMinerDescriptor descriptor; private final float[] buttonsState; private final boolean[] ledsAState; private final boolean[] ledsPState; private final RenderStorage render = new RenderStorage(Eln.instance.autominerRange, 130, 24, 24); private final PhysicalInterpolatorNoRebound pipeLengthInterpol = new PhysicalInterpolatorNoRebound(0.4f, 2f, 0.8f); private final RcInterpolator rotSpeed = new RcInterpolator(1); private float pipeAlpha = 0; private final LinkedList<String> logs = new LinkedList<String>(); private final int logSizeMax = 9; private boolean powerOk; private float recalcTimeout = 0; private final TransparentNodeElementInventory inventory = new TransparentNodeElementInventory(AutoMinerContainer.inventorySize, 64, this); private short pipeLength = 0; AutoMinerSlowProcess.jobType job; private boolean boot = true; public boolean silkTouch = false; public AutoMinerRender(TransparentNodeEntity tileEntity, TransparentNodeDescriptor descriptor) { super(tileEntity, descriptor); this.descriptor = (AutoMinerDescriptor) descriptor; buttonsState = new float[this.descriptor.buttonsCount]; for (int idx = 0; idx < this.descriptor.buttonsCount; idx++) { buttonsState[idx] = (float) Math.random(); } ledsAState = new boolean[this.descriptor.ledsACount]; for (int idx = 0; idx < this.descriptor.ledsACount; idx++) { ledsAState[idx] = Math.random() > 0.5; } ledsPState = new boolean[this.descriptor.ledsPCount]; for (int idx = 0; idx < this.descriptor.ledsPCount; idx++) { ledsPState[idx] = Math.random() > 0.5; } addLoopedSound(new LoopedSound("eln:autominer", coordonate(), ISound.AttenuationType.LINEAR) { @Override public float getVolume() { if (powerOk && (job == AutoMinerSlowProcess.jobType.ore || job == AutoMinerSlowProcess.jobType.pipeAdd || job == AutoMinerSlowProcess.jobType.pipeRemove)) return 2.13f; else return 0f; } }); } private void pushLog(String string) { logs.addFirst(string); if (logs.size() > logSizeMax) logs.removeLast(); } @Override public void draw() { GL11.glPushMatrix(); GL11.glRotatef(pipeAlpha, 0, -1, 0); GL11.glPushMatrix(); GL11.glScalef(0.99f, 0.99f, 0.99f); descriptor.pipe.draw(); GL11.glPopMatrix(); int len = (int) pipeLengthInterpol.get(); GL11.glTranslatef(0, -(pipeLengthInterpol.get() - len), 0); for (int idx = len + 2; idx != 0; idx--) { if (idx != 1) { descriptor.pipe.draw(); } else { descriptor.head.draw(); } GL11.glTranslatef(0, -1f, 0); } GL11.glPopMatrix(); for (int idx = 0; idx < this.descriptor.buttonsCount; idx++) { buttonsState[idx] = idx == job.ordinal() && powerOk ? 1 : 0; } front.glRotateXnRef(); boolean drawScreen = UtilsClient.clientDistanceTo(tileEntity) < 20 && powerOk; boolean drawRay = drawScreen && job != null; UtilsClient.disableCulling(); GL11.glPushMatrix(); GL11.glTranslatef(-1.57031f, 1.8125f - 1.5f - 0.02f, -0.3125f + 0.02f); GL11.glRotatef(90, 0, 1, 0); if (drawScreen) { UtilsClient.disableLight(); GL11.glPushMatrix(); GL11.glRotatef(180, 0, 1, 0); GL11.glScalef(1 / 128f, -1 / 128f, 1); int idx = 0; for (String log : logs) { Minecraft.getMinecraft().fontRenderer.drawString(idx == 0 ? Color.COLOR_BRIGHT_GREEN + "> " + log.substring(2) : Color.COLOR_DARK_GREEN + log, 80, 1 + idx, 0xFFD0D0D0 /*No effect...*/); idx += 8; } GL11.glPopMatrix(); UtilsClient.enableLight(); } if (drawRay) { float raySize = 0.625f - 0.02f * 2; float scale = 1f / render.resWidth * raySize; GL11.glTranslatef(-raySize, 0, 0); GL11.glScalef(scale, -scale, 1); render.draw(0.4f, 1.3f, 0.8f); } GL11.glPopMatrix(); UtilsClient.enableCulling(); descriptor.draw(false, buttonsState, ledsAState, ledsPState); } public void refresh(float deltaT) { super.refresh(deltaT); pipeAlpha += rotSpeed.get() * deltaT; if (pipeAlpha > 360) pipeAlpha -= 360; for (int idx = 0; idx < this.descriptor.ledsACount; idx++) { if (powerOk) { if (Math.random() < 0.2 * deltaT) ledsAState[idx] = !ledsAState[idx]; } else { ledsAState[idx] = true; } } for (int idx = 0; idx < this.descriptor.ledsPCount; idx++) { if (powerOk) { if (Math.random() < 0.2 * deltaT) ledsPState[idx] = !ledsPState[idx]; } else { ledsPState[idx] = true; } } if (powerOk) { recalcTimeout -= deltaT; if (recalcTimeout < 0) { recalcTimeout += 0.5; float camAlpha; switch (front) { default: case XN: camAlpha = (float) Math.PI; break; case XP: camAlpha = 0; break; case ZN: camAlpha = (float) (-Math.PI / 2); break; case ZP: camAlpha = (float) (Math.PI / 2); break; } render.generate(this.tileEntity.getWorldObj(), tileEntity.xCoord + 0.5, tileEntity.yCoord + 0.5 - (Math.max(0, pipeLength - 5)), tileEntity.zCoord + 0.5, -(float) (Math.PI * 1 / 2) + camAlpha, -(float) (Math.PI / 2)); } } pipeLengthInterpol.step(deltaT); if (pipeLengthInterpol.get() < 0) pipeLengthInterpol.setPos(0); rotSpeed.step(deltaT); } @Override public GuiScreen newGuiDraw(Direction side, EntityPlayer player) { return new AutoMinerGuiDraw(player, inventory, this); } @Override public void networkUnserialize(DataInputStream stream) { super.networkUnserialize(stream); try { if (pipeLength != (pipeLength = stream.readShort())) { recalcTimeout = 0; } if (job != (job = AutoMinerSlowProcess.jobType.values()[stream.readByte()])) { switch (job) { case ore: rotSpeed.setTarget(360); break; default: rotSpeed.setTarget(0); break; } } powerOk = stream.readBoolean(); silkTouch = stream.readBoolean(); if (!powerOk) { logs.clear(); pushLog("[i] Boot... Done."); pushLog("* Waiting opcode."); } if (boot) { boot = false; pipeLengthInterpol.setPos(pipeLength); } pipeLengthInterpol.setTarget(pipeLength); } catch (IOException e) { e.printStackTrace(); } } @Override public void serverPacketUnserialize(DataInputStream stream) { try { switch (stream.readByte()) { case AutoMinerElement.pushLogId: pushLog(stream.readUTF()); break; default: break; } } catch (IOException e) { e.printStackTrace(); } } @Override public boolean cameraDrawOptimisation() { return false; } }