package mods.eln.node.simple;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import mods.eln.Eln;
import mods.eln.misc.Coordonate;
import mods.eln.misc.DescriptorManager;
import mods.eln.misc.Direction;
import mods.eln.misc.Utils;
import mods.eln.node.INodeEntity;
import mods.eln.node.NodeEntityClientSender;
import mods.eln.node.NodeManager;
import mods.eln.server.DelayedBlockRemove;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S3FPacketCustomPayload;
import net.minecraft.tileentity.TileEntity;
import java.io.DataInputStream;
import java.io.IOException;
public abstract class SimpleNodeEntity extends TileEntity implements INodeEntity {
private SimpleNode node;
public SimpleNode getNode() {
if (worldObj.isRemote) {
Utils.fatal();
return null;
}
if (this.worldObj == null) return null;
if (node == null) {
node = (SimpleNode) NodeManager.instance.getNodeFromCoordonate(new Coordonate(xCoord, yCoord, zCoord, this.worldObj));
if (node == null) {
DelayedBlockRemove.add(new Coordonate(xCoord, yCoord, zCoord, this.worldObj));
return null;
}
}
return node;
}
//***************** Wrapping **************************
/*
public void onBlockPlacedBy(Direction front, EntityLivingBase entityLiving, int metadata) {
}
*/
public void onBlockAdded() {
/*if (!worldObj.isRemote){
if (getNode() == null) {
worldObj.setBlockToAir(xCoord, yCoord, zCoord);
}
}*/
}
public void onBreakBlock() {
if (!worldObj.isRemote) {
if (getNode() == null) return;
getNode().onBreakBlock();
}
}
public void onChunkUnload() {
super.onChunkUnload();
if (worldObj.isRemote) {
destructor();
}
}
// client only
public void destructor() {
}
@Override
public void invalidate() {
if (worldObj.isRemote) {
destructor();
}
super.invalidate();
}
public boolean onBlockActivated(EntityPlayer entityPlayer, Direction side, float vx, float vy, float vz) {
if (!worldObj.isRemote) {
if (getNode() == null) return false;
getNode().onBlockActivated(entityPlayer, side, vx, vy, vz);
return true;
}
return true;
}
public void onNeighborBlockChange() {
if (!worldObj.isRemote) {
if (getNode() == null) return;
getNode().onNeighborBlockChange();
}
}
//***************** Descriptor **************************
public Object getDescriptor() {
SimpleNodeBlock b = (SimpleNodeBlock) getBlockType();
return DescriptorManager.get(b.descriptorKey);
}
//***************** Network **************************
public Direction front;
@Override
public void serverPublishUnserialize(DataInputStream stream) {
try {
if (front != (front = Direction.fromInt(stream.readByte()))) {
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void serverPacketUnserialize(DataInputStream stream) {
}
@Override
public Packet getDescriptionPacket() {
SimpleNode node = getNode();
if (node == null) {
Utils.println("ASSERT NULL NODE public Packet getDescriptionPacket() nodeblock entity");
return null;
}
return new S3FPacketCustomPayload(Eln.channelName, node.getPublishPacket().toByteArray());
}
public NodeEntityClientSender sender = new NodeEntityClientSender(this, getNodeUuid());
//*********************** GUI ***************************
@Override
public Container newContainer(Direction side, EntityPlayer player) {
return null;
}
@Override
@SideOnly(Side.CLIENT)
public GuiScreen newGuiDraw(Direction side, EntityPlayer player) {
return null;
}
}