package com.jaquadro.minecraft.gardencore.block.tile;
import cpw.mods.fml.common.registry.GameData;
import net.minecraft.block.Block;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
public class TileEntityBlockMateralProxy extends TileEntity
{
private Block protoBlock;
private int protoMeta;
public Block getProtoBlock () {
return protoBlock;
}
public int getProtoMeta () {
return protoMeta;
}
public void setProtoBlock (Block block, int meta) {
protoBlock = block;
protoMeta = meta;
}
public int composeMetadata (Block block, int meta) {
int id = GameData.getBlockRegistry().getId(block);
return ((id & 0xFFF) << 4) | (meta & 0xF);
}
public Block getBlockFromComposedMetadata (int metadata) {
if (metadata >= 16)
return GameData.getBlockRegistry().getObjectById((metadata >> 4) & 0xFFF);
return getBlockFromStandardMetadata(metadata);
}
protected Block getBlockFromStandardMetadata (int metadata) {
return null;
}
public int getMetaFromComposedMetadata (int metadata) {
if (metadata >= 16)
return metadata & 0xF;
return getMetaFromStandardMetadata(metadata);
}
protected int getMetaFromStandardMetadata (int metadata) {
return metadata;
}
public void syncTileEntityWithData (World world, int x, int y, int z, int metadata) {
if (metadata < 16) {
world.removeTileEntity(x, y, z);
return;
}
TileEntityBlockMateralProxy te = (TileEntityBlockMateralProxy) world.getTileEntity(x, y, z);
if (te == null) {
te = createTileEntity();
world.setTileEntity(x, y, z, te);
}
Block block = getBlockFromComposedMetadata(metadata);
int protoMeta = getMetaFromComposedMetadata(metadata);
if (block != null)
te.setProtoBlock(block, protoMeta);
te.markDirty();
}
protected TileEntityBlockMateralProxy createTileEntity () {
return new TileEntityBlockMateralProxy();
}
@Override
public void writeToNBT (NBTTagCompound tag) {
super.writeToNBT(tag);
if (protoBlock != null) {
tag.setInteger("P", getUnifiedProtoData());
}
}
@Override
public void readFromNBT (NBTTagCompound tag) {
super.readFromNBT(tag);
if (tag.hasKey("P"))
unpackUnifiedProtoData(tag.getInteger("P"));
}
@Override
public Packet getDescriptionPacket () {
NBTTagCompound tag = new NBTTagCompound();
writeToNBT(tag);
return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 5, tag);
}
@Override
public void onDataPacket (NetworkManager net, S35PacketUpdateTileEntity pkt) {
readFromNBT(pkt.func_148857_g());
getWorldObj().func_147479_m(xCoord, yCoord, zCoord); // markBlockForRenderUpdate
}
private int getUnifiedProtoData () {
return (Block.getIdFromBlock(protoBlock) & 0xFFFF) | ((protoMeta & 0xFFFF) << 16);
}
private void unpackUnifiedProtoData (int protoData) {
protoBlock = Block.getBlockById(protoData & 0xFFFF);
protoMeta = (protoData >> 16) & 0xFFFF;
}
}