package mods.eln.node.six;
import mods.eln.Eln;
import mods.eln.cable.CableRenderDescriptor;
import mods.eln.misc.Direction;
import mods.eln.misc.LRDU;
import mods.eln.misc.Utils;
import mods.eln.node.NodeBlockEntity;
import net.minecraft.block.Block;
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.world.World;
import net.minecraft.world.chunk.Chunk;
import java.io.DataInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
public class SixNodeEntity extends NodeBlockEntity {
//boolean[] syncronizedSideEnable = new boolean[6];
public SixNodeElementRender[] elementRenderList = new SixNodeElementRender[6];
short[] elementRenderIdList = new short[6];
public Block sixNodeCacheBlock = Blocks.air;
public byte sixNodeCacheBlockMeta = 0;
public SixNodeEntity() {
for (int idx = 0; idx < 6; idx++) {
elementRenderList[idx] = null;
elementRenderIdList[idx] = 0;
}
}
/* caca
public boolean onBlockActivated(EntityPlayer entityPlayer, Direction direction) {
//Utils.println("onBlockActivated " + direction);
return getNode().onBlockActivated(entityPlayer, direction);
}
*/
public static final int singleTargetId = 2;
@Override
public void serverPublishUnserialize(DataInputStream stream) {
Block sixNodeCacheBlockOld = sixNodeCacheBlock;
super.serverPublishUnserialize(stream);
try {
sixNodeCacheBlock = Block.getBlockById(stream.readInt());
sixNodeCacheBlockMeta = stream.readByte();
int idx;
for (idx = 0; idx < 6; idx++) {
short id = stream.readShort();
if (id == 0) {
elementRenderIdList[idx] = (short) 0;
elementRenderList[idx] = null;
} else {
if (id != elementRenderIdList[idx]) {
elementRenderIdList[idx] = id;
SixNodeDescriptor descriptor = Eln.sixNodeItem.getDescriptor(id);
elementRenderList[idx] = (SixNodeElementRender) descriptor.RenderClass.getConstructor(SixNodeEntity.class, Direction.class, SixNodeDescriptor.class).newInstance(this, Direction.fromInt(idx), descriptor);
}
elementRenderList[idx].publishUnserialize(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();
}
// worldObj.setLightValue(EnumSkyBlock.Sky, xCoord,yCoord,zCoord,15);
if (sixNodeCacheBlock != sixNodeCacheBlockOld) {
Chunk chunk = worldObj.getChunkFromBlockCoords(xCoord, zCoord);
chunk.generateHeightMap();
Utils.updateSkylight(chunk);
chunk.generateSkylightMap();
Utils.updateAllLightTypes(worldObj, xCoord, yCoord, zCoord);
}
}
@Override
public void serverPacketUnserialize(DataInputStream stream) {
super.serverPacketUnserialize(stream);
try {
int side = stream.readByte();
int id = stream.readShort();
if (elementRenderIdList[side] == id) {
elementRenderList[side].serverPacketUnserialize(stream);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public boolean getSyncronizedSideEnable(Direction direction) {
return elementRenderList[direction.getInt()] != null;
}
public Container newContainer(Direction side, EntityPlayer player) {
SixNode n = ((SixNode) getNode());
if (n == null) return null;
return n.newContainer(side, player);
}
public GuiScreen newGuiDraw(Direction side, EntityPlayer player) {
return elementRenderList[side.getInt()].newGuiDraw(side, player);
}
public CableRenderDescriptor getCableRender(Direction side, LRDU lrdu) {
side = side.applyLRDU(lrdu);
if (elementRenderList[side.getInt()] == null)
return null;
return elementRenderList[side.getInt()].getCableRender(lrdu);
}
public int getCableDry(Direction side, LRDU lrdu) {
side = side.applyLRDU(lrdu);
if (elementRenderList[side.getInt()] == null)
return 0;
return elementRenderList[side.getInt()].getCableDry(lrdu);
}
@Override
public boolean cameraDrawOptimisation() {
for (SixNodeElementRender e : elementRenderList) {
if (e != null && !e.cameraDrawOptimisation())
return false;
}
return true;
}
@Override
public void destructor() {
for (SixNodeElementRender render : elementRenderList) {
if (render != null)
render.destructor();
}
super.destructor();
}
/*public float getBlockHardness(World world, int x, int y, int z) {
return 0;
}*/
public int getDamageValue(World world, int x, int y, int z) {
if (world.isRemote) {
for (int idx = 0; idx < 6; idx++) {
if (elementRenderList[idx] != null) {
return elementRenderIdList[idx];
}
}
}
return 0;
}
public boolean hasVolume(World world, int x, int y, int z) {
if (worldObj.isRemote) {
for (SixNodeElementRender e : elementRenderList) {
if (e != null && e.sixNodeDescriptor.hasVolume())
return true;
}
return false;
} else {
SixNode node = ((SixNode) getNode());
if (node == null)
return false;
return node.hasVolume();
}
}
@Override
public void tileEntityNeighborSpawn() {
for (SixNodeElementRender e : elementRenderList) {
if (e != null)
e.notifyNeighborSpawn();
}
}
@Override
public String getNodeUuid() {
return Eln.sixNodeBlock.getNodeUuid();
}
@Override
public void clientRefresh(float deltaT) {
for (SixNodeElementRender e : elementRenderList) {
if (e != null) {
e.refresh(deltaT);
}
}
}
@Override
public int isProvidingWeakPower(Direction side) {
if (worldObj.isRemote) {
int max = 0;
for (SixNodeElementRender r : elementRenderList) {
if (r == null) continue;
if (max < r.isProvidingWeakPower(side)) max = r.isProvidingWeakPower(side);
}
return max;
} else {
if (getNode() == null) return 0;
return getNode().isProvidingWeakPower(side);
}
}
}
// &&