package mekanism.common.item;
import java.util.List;
import mekanism.api.EnumColor;
import mekanism.api.MekanismAPI;
import mekanism.common.MekanismBlocks;
import mekanism.common.block.BlockCardboardBox.BlockData;
import mekanism.common.tile.TileEntityCardboardBox;
import mekanism.common.util.ItemDataUtils;
import mekanism.common.util.LangUtils;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class ItemBlockCardboardBox extends ItemBlock
{
private static boolean isMonitoring;
public Block metaBlock;
public ItemBlockCardboardBox(Block block)
{
super(block);
setMaxStackSize(1);
metaBlock = block;
MinecraftForge.EVENT_BUS.register(this);
}
@Override
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack itemstack, EntityPlayer entityplayer, List<String> list, boolean flag)
{
list.add(EnumColor.INDIGO + LangUtils.localize("tooltip.blockData") + ": " + LangUtils.transYesNo(getBlockData(itemstack) != null));
BlockData data = getBlockData(itemstack);
if(data != null)
{
try {
list.add(LangUtils.localize("tooltip.block") + ": " + new ItemStack(data.block, data.meta).getDisplayName());
list.add(LangUtils.localize("tooltip.meta") + ": " + data.meta);
if(data.tileTag != null)
{
list.add(LangUtils.localize("tooltip.tile") + ": " + data.tileTag.getString("id"));
}
} catch(Exception e) {}
}
}
@Override
public int getMetadata(int i)
{
return i;
}
@Override
public EnumActionResult onItemUseFirst(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, EnumHand hand)
{
if(!player.isSneaking() && !world.isAirBlock(pos) && stack.getItemDamage() == 0)
{
IBlockState state = world.getBlockState(pos);
Block block = state.getBlock();
int meta = block.getMetaFromState(state);
if(!world.isRemote && MekanismAPI.isBlockCompatible(Item.getItemFromBlock(block), meta) && state.getBlockHardness(world, pos) != -1)
{
BlockData data = new BlockData();
data.block = block;
data.meta = meta;
isMonitoring = true;
if(world.getTileEntity(pos) != null)
{
TileEntity tile = world.getTileEntity(pos);
NBTTagCompound tag = new NBTTagCompound();
tile.writeToNBT(tag);
data.tileTag = tag;
}
if(!player.capabilities.isCreativeMode)
{
stack.stackSize--;
}
world.setBlockState(pos, MekanismBlocks.CardboardBox.getStateFromMeta(1), 3);
isMonitoring = false;
TileEntityCardboardBox tileEntity = (TileEntityCardboardBox)world.getTileEntity(pos);
if(tileEntity != null)
{
tileEntity.storedData = data;
}
return EnumActionResult.SUCCESS;
}
}
return EnumActionResult.PASS;
}
@Override
public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, IBlockState state)
{
if(world.isRemote)
{
return true;
}
boolean place = super.placeBlockAt(stack, player, world, pos, side, hitX, hitY, hitZ, state);
if(place)
{
TileEntityCardboardBox tileEntity = (TileEntityCardboardBox)world.getTileEntity(pos);
if(tileEntity != null)
{
tileEntity.storedData = getBlockData(stack);
}
}
return place;
}
public void setBlockData(ItemStack itemstack, BlockData data)
{
ItemDataUtils.setCompound(itemstack, "blockData", data.write(new NBTTagCompound()));
}
public BlockData getBlockData(ItemStack itemstack)
{
if(!ItemDataUtils.hasData(itemstack, "blockData"))
{
return null;
}
return BlockData.read(ItemDataUtils.getCompound(itemstack, "blockData"));
}
@SubscribeEvent
public void onEntitySpawn(EntityJoinWorldEvent event)
{
if(event.getEntity() instanceof EntityItem && isMonitoring)
{
event.setCanceled(true);
}
}
}