package mods.eln.node.transparent;
import mods.eln.Eln;
import mods.eln.cable.CableRenderDescriptor;
import mods.eln.misc.Coordonate;
import mods.eln.misc.Direction;
import mods.eln.misc.FakeSideInventory;
import mods.eln.misc.LRDU;
import mods.eln.node.Node;
import mods.eln.node.NodeBlockEntity;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
public class TransparentNodeEntity extends NodeBlockEntity implements ISidedInventory { // boolean[] syncronizedSideEnable = new boolean[6];
TransparentNodeElementRender elementRender = null;
short elementRenderId;
@Override
public CableRenderDescriptor getCableRender(Direction side, LRDU lrdu) {
if (elementRender == null) return null;
return elementRender.getCableRender(side, lrdu);
}
@Override
public void serverPublishUnserialize(DataInputStream stream) {
super.serverPublishUnserialize(stream);
try {
Short id = stream.readShort();
if (id == 0) {
elementRenderId = (byte) 0;
elementRender = null;
} else {
if (id != elementRenderId) {
elementRenderId = id;
TransparentNodeDescriptor descriptor = Eln.transparentNodeItem.getDescriptor(id);
elementRender = (TransparentNodeElementRender) descriptor.RenderClass.getConstructor(TransparentNodeEntity.class, TransparentNodeDescriptor.class).newInstance(this, descriptor);
}
elementRender.networkUnserialize(stream);
}
} catch (IOException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
}
public Container newContainer(Direction side, EntityPlayer player) {
TransparentNode n = (TransparentNode) getNode();
if (n == null) return null;
return n.newContainer(side, player);
}
public GuiScreen newGuiDraw(Direction side, EntityPlayer player) {
return elementRender.newGuiDraw(side, player);
}
public void preparePacketForServer(DataOutputStream stream) {
try {
super.preparePacketForServer(stream);
stream.writeShort(elementRenderId);
} catch (IOException e) {
e.printStackTrace();
}
}
public void sendPacketToServer(ByteArrayOutputStream bos) {
super.sendPacketToServer(bos);
}
public boolean cameraDrawOptimisation() {
if (elementRender == null) return super.cameraDrawOptimisation();
return elementRender.cameraDrawOptimisation();
}
public int getDamageValue(World world, int x, int y, int z) {
if (world.isRemote) {
return elementRenderId;
}
return 0;
}
@Override
public void tileEntityNeighborSpawn() {
if (elementRender != null) elementRender.notifyNeighborSpawn();
}
public void addCollisionBoxesToList(AxisAlignedBB par5AxisAlignedBB, List list, Coordonate blockCoord) {
TransparentNodeDescriptor desc = null;
if (worldObj.isRemote) {
desc = elementRender == null ? null : elementRender.transparentNodedescriptor;
} else {
TransparentNode node = (TransparentNode) getNode();
desc = node == null ? null : node.element.transparentNodeDescriptor;
}
int x, y, z;
if (blockCoord != null) {
x = blockCoord.x;
y = blockCoord.y;
z = blockCoord.z;
} else {
x = xCoord;
y = yCoord;
z = zCoord;
}
if (desc == null) {
AxisAlignedBB bb = Blocks.stone.getCollisionBoundingBoxFromPool(worldObj, x, y, z);
if (par5AxisAlignedBB.intersectsWith(bb)) list.add(bb);
} else {
desc.addCollisionBoxesToList(par5AxisAlignedBB, list, worldObj, x, y, z);
}
}
public void serverPacketUnserialize(DataInputStream stream) {
super.serverPacketUnserialize(stream);
if (elementRender != null)
elementRender.serverPacketUnserialize(stream);
}
@Override
public String getNodeUuid() {
return Eln.transparentNodeBlock.getNodeUuid();
}
@Override
public void destructor() {
if (elementRender != null)
elementRender.destructor();
super.destructor();
}
@Override
public void clientRefresh(float deltaT) {
if (elementRender != null) {
elementRender.refresh(deltaT);
}
}
@Override
public int isProvidingWeakPower(Direction side) {
return 0;
}
ISidedInventory getSidedInventory() {
if (worldObj.isRemote) {
if (elementRender == null) return FakeSideInventory.getInstance();
IInventory i = elementRender.getInventory();
if (i != null && i instanceof ISidedInventory) {
return (ISidedInventory) i;
}
} else {
Node node = getNode();
if (node != null && node instanceof TransparentNode) {
TransparentNode tn = (TransparentNode) node;
IInventory i = tn.getInventory(null);
;
if (i != null && i instanceof ISidedInventory) {
return (ISidedInventory) i;
}
}
}
return FakeSideInventory.getInstance();
}
@Override
public int getSizeInventory() {
return getSidedInventory().getSizeInventory();
}
@Override
public ItemStack getStackInSlot(int var1) {
return getSidedInventory().getStackInSlot(var1);
}
@Override
public ItemStack decrStackSize(int var1, int var2) {
return getSidedInventory().decrStackSize(var1, var2);
}
@Override
public ItemStack getStackInSlotOnClosing(int var1) {
return getSidedInventory().getStackInSlotOnClosing(var1);
}
@Override
public void setInventorySlotContents(int var1, ItemStack var2) {
getSidedInventory().setInventorySlotContents(var1, var2);
}
@Override
public String getInventoryName() {
return getSidedInventory().getInventoryName();
}
@Override
public boolean hasCustomInventoryName() {
return getSidedInventory().hasCustomInventoryName();
}
@Override
public int getInventoryStackLimit() {
return getSidedInventory().getInventoryStackLimit();
}
@Override
public boolean isUseableByPlayer(EntityPlayer var1) {
return getSidedInventory().isUseableByPlayer(var1);
}
@Override
public void openInventory() {
getSidedInventory().openInventory();
}
@Override
public void closeInventory() {
getSidedInventory().closeInventory();
}
@Override
public boolean isItemValidForSlot(int var1, ItemStack var2) {
return getSidedInventory().isItemValidForSlot(var1, var2);
}
@Override
public int[] getAccessibleSlotsFromSide(int var1) {
return getSidedInventory().getAccessibleSlotsFromSide(var1);
}
@Override
public boolean canInsertItem(int var1, ItemStack var2, int var3) {
return getSidedInventory().canInsertItem(var1, var2, var3);
}
@Override
public boolean canExtractItem(int var1, ItemStack var2, int var3) {
return getSidedInventory().canExtractItem(var1, var2, var3);
}
}