package mods.eln.transparentnode.transformer;
import mods.eln.cable.CableRenderDescriptor;
import mods.eln.cable.CableRenderType;
import mods.eln.item.FerromagneticCoreDescriptor;
import mods.eln.misc.*;
import mods.eln.misc.Obj3D.Obj3DPart;
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.sixnode.electricalcable.ElectricalCableDescriptor;
import mods.eln.sound.LoopedSound;
import net.minecraft.client.audio.ISound;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import org.lwjgl.opengl.GL11;
import java.io.DataInputStream;
import java.io.IOException;
public class TransformerRender extends TransparentNodeElementRender {
private final TransparentNodeElementInventory inventory = new TransparentNodeElementInventory(4, 64, this);
private final TransformerDescriptor descriptor;
private SlewLimiter load = new SlewLimiter(0.5f);
public TransformerRender(TransparentNodeEntity tileEntity, TransparentNodeDescriptor descriptor) {
super(tileEntity, descriptor);
this.descriptor = (TransformerDescriptor) descriptor;
addLoopedSound(new LoopedSound("eln:Transformer", coordonate(), ISound.AttenuationType.LINEAR) {
@Override
public float getVolume() {
if (load.getPosition() > TransformerRender.this.descriptor.minimalLoadToHum)
return 0.1f * (load.getPosition() - TransformerRender.this.descriptor.minimalLoadToHum) /
(1 - TransformerRender.this.descriptor.minimalLoadToHum);
else
return 0f;
}
});
coordinate = new Coordonate(tileEntity);
doorOpen = new PhysicalInterpolator(0.4f, 4.0f, 0.9f, 0.05f);
}
@Override
public void draw() {
GL11.glPushMatrix();
front.glRotateXnRef();
descriptor.draw(feroPart, primaryStackSize, secondaryStackSize, hasCasing, doorOpen.get());
GL11.glPopMatrix();
cableRenderType = drawCable(front.down(), priRender, priConn, cableRenderType);
cableRenderType = drawCable(front.down(), secRender, secConn, cableRenderType);
}
@Override
public GuiScreen newGuiDraw(Direction side, EntityPlayer player) {
return new TransformerGuiDraw(player, inventory, this);
}
private byte primaryStackSize;
private byte secondaryStackSize;
private CableRenderDescriptor priRender;
private CableRenderDescriptor secRender;
public boolean isIsolator;
private Obj3DPart feroPart;
private boolean hasCasing = false;
private final Coordonate coordinate;
private final PhysicalInterpolator doorOpen;
@Override
public void networkUnserialize(DataInputStream stream) {
super.networkUnserialize(stream);
try {
primaryStackSize = stream.readByte();
secondaryStackSize = stream.readByte();
ItemStack feroStack = Utils.unserialiseItemStack(stream);
FerromagneticCoreDescriptor feroDesc = (FerromagneticCoreDescriptor) FerromagneticCoreDescriptor.getDescriptor(feroStack, FerromagneticCoreDescriptor.class);
if (feroDesc == null)
feroPart = null;
else
feroPart = feroDesc.feroPart;
ItemStack priStack = Utils.unserialiseItemStack(stream);
ElectricalCableDescriptor priDesc = (ElectricalCableDescriptor) ElectricalCableDescriptor.getDescriptor(priStack, ElectricalCableDescriptor.class);
if (priDesc == null)
priRender = null;
else
priRender = priDesc.render;
ItemStack secStack = Utils.unserialiseItemStack(stream);
ElectricalCableDescriptor secDesc = (ElectricalCableDescriptor) ElectricalCableDescriptor.getDescriptor(secStack, ElectricalCableDescriptor.class);
if (secDesc == null)
secRender = null;
else
secRender = secDesc.render;
eConn.deserialize(stream);
priConn.mask = 0;
secConn.mask = 0;
for (LRDU lrdu : LRDU.values()) {
if (!eConn.get(lrdu) || front.down().applyLRDU(lrdu) == front.left() || front.down().applyLRDU(lrdu) == front.right())
continue;
CableRenderDescriptor render = getCableRender(front.down().applyLRDU(lrdu), LRDU.Down);
if (render == priRender) priConn.set(lrdu, true);
if (render == secRender) secConn.set(lrdu, true);
}
cableRenderType = null;
isIsolator = stream.readBoolean();
load.setTarget(stream.readFloat());
hasCasing = stream.readBoolean();
} catch (IOException e) {
e.printStackTrace();
}
}
private final LRDUMask priConn = new LRDUMask();
private final LRDUMask secConn = new LRDUMask();
private final LRDUMask eConn = new LRDUMask();
private CableRenderType cableRenderType;
@Override
public CableRenderDescriptor getCableRender(Direction side, LRDU lrdu) {
if (lrdu == LRDU.Down) {
if (side == front.left()) return priRender;
if (side == front.right()) return secRender;
if (side == front && !grounded) return priRender;
if (side == front.back() && !grounded) return secRender;
}
return null;
}
@Override
public void notifyNeighborSpawn() {
super.notifyNeighborSpawn();
cableRenderType = null;
}
@Override
public void refresh(float deltaT) {
super.refresh(deltaT);
load.step(deltaT);
if (hasCasing) {
if (!Utils.isPlayerAround(tileEntity.getWorldObj(), coordinate.moved(front).getAxisAlignedBB(0)))
doorOpen.setTarget(0f);
else
doorOpen.setTarget(1f);
doorOpen.step(deltaT);
}
}
}