package mods.eln.node.transparent;
import mods.eln.Eln;
import mods.eln.misc.Direction;
import mods.eln.misc.LRDU;
import mods.eln.misc.Utils;
import mods.eln.node.Node;
import mods.eln.sim.ElectricalLoad;
import mods.eln.sim.ThermalLoad;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.fluids.IFluidHandler;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
public class TransparentNode extends Node {
public TransparentNodeElement element;
public int elementId;
public EntityPlayerMP removedByPlayer;
@Override
public boolean nodeAutoSave() {
return false;
}
@Override
public void onNeighborBlockChange() {
super.onNeighborBlockChange();
element.onNeighborBlockChange();
}
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt.getCompoundTag("node"));
elementId = nbt.getShort("eid");
try {
TransparentNodeDescriptor descriptor = Eln.transparentNodeItem.getDescriptor(elementId);
element = (TransparentNodeElement) descriptor.ElementClass.getConstructor(TransparentNode.class, TransparentNodeDescriptor.class).newInstance(this, descriptor);
} 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();
}
element.readFromNBT(nbt.getCompoundTag("element"));
}
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(Utils.newNbtTagCompund(nbt, "node"));
nbt.setShort("eid", (short) elementId);
element.writeToNBT(Utils.newNbtTagCompund(nbt, "element"));
}
@Override
public void onBreakBlock() {
element.onBreakElement();
super.onBreakBlock();
}
@Override
public ElectricalLoad getElectricalLoad(Direction side, LRDU lrdu) {
return element.getElectricalLoad(side, lrdu);
}
@Override
public ThermalLoad getThermalLoad(Direction side, LRDU lrdu) {
return element.getThermalLoad(side, lrdu);
}
@Override
public int getSideConnectionMask(Direction side, LRDU lrdu) {
return element.getConnectionMask(side, lrdu);
}
@Override
public String multiMeterString(Direction side) {
return element.multiMeterString(side);
}
@Override
public String thermoMeterString(Direction side) {
return element.thermoMeterString(side);
}
public IFluidHandler getFluidHandler() {
return element.getFluidHandler();
}
@Override
public void publishSerialize(DataOutputStream stream) {
super.publishSerialize(stream);
try {
stream.writeShort(this.elementId);
element.networkSerialize(stream);
} catch (IOException e) {
e.printStackTrace();
}
}
public enum FrontType {
BlockSide, PlayerView, PlayerViewHorizontal, BlockSideInv
}
;
@Override
public void initializeFromThat(Direction side, EntityLivingBase entityLiving, ItemStack itemStack) {
try {
// Direction front = null;
TransparentNodeDescriptor descriptor = Eln.transparentNodeItem.getDescriptor(itemStack);
/*
* switch(descriptor.getFrontType()) { case BlockSide: front = side; break; case PlayerView: front = Utils.entityLivingViewDirection(entityLiving).getInverse(); break; case PlayerViewHorizontal: front = Utils.entityLivingHorizontalViewDirection(entityLiving).getInverse(); break;
*
* }
*/
int metadata = itemStack.getItemDamage();
elementId = metadata;
element = (TransparentNodeElement) descriptor.ElementClass.getConstructor(TransparentNode.class, TransparentNodeDescriptor.class).newInstance(this, descriptor);
element.initializeFromThat(side, entityLiving, itemStack.getTagCompound());
} 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();
}
}
@Override
public void initializeFromNBT() {
element.initialize();
}
public boolean onBlockActivated(EntityPlayer entityPlayer, Direction side, float vx, float vy, float vz) {
if (element.onBlockActivated(entityPlayer, side, vx, vy, vz)) return true;
return super.onBlockActivated(entityPlayer, side, vx, vy, vz);
}
@Override
public boolean hasGui(Direction side) {
if (element == null) return false;
return element.hasGui();
}
public IInventory getInventory(Direction side) {
if (element == null) return null;
return element.getInventory();
}
public Container newContainer(Direction side, EntityPlayer player) {
if (element == null) return null;
return element.newContainer(side, player);
}
@Override
public int getBlockMetadata() {
return element.transparentNodeDescriptor.tileEntityMetaTag.meta;
}
@Override
public void networkUnserialize(DataInputStream stream, EntityPlayerMP player) {
super.networkUnserialize(stream, player);
Direction side;
try {
if (elementId == stream.readShort()) {
element.networkUnserialize(stream, player);
} else {
Utils.println("Transparent node unserialize miss");
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void connectJob() {
super.connectJob();
element.connectJob();
}
@Override
public void disconnectJob() {
super.disconnectJob();
element.disconnectJob();
}
@Override
public void checkCanStay(boolean onCreate) {
super.checkCanStay(onCreate);
element.checkCanStay(onCreate);
}
public void dropElement(EntityPlayerMP entityPlayer) {
if (element != null)
if (Utils.mustDropItem(entityPlayer))
dropItem(element.getDropItemStack());
}
@Override
public String getNodeUuid() {
return Eln.transparentNodeBlock.getNodeUuid();
}
@Override
public void unload() {
super.unload();
if (element != null)
element.unload();
}
}