001package net.minecraft.item;
002
003import java.util.ArrayList;
004import java.util.Random;
005
006import net.minecraft.block.Block;
007import net.minecraft.creativetab.CreativeTabs;
008import net.minecraft.enchantment.Enchantment;
009import net.minecraft.enchantment.EnchantmentHelper;
010import net.minecraft.entity.EntityLiving;
011import net.minecraft.entity.item.EntityItem;
012import net.minecraft.entity.player.EntityPlayer;
013import net.minecraft.stats.StatList;
014import net.minecraft.world.World;
015
016import net.minecraftforge.common.IShearable;
017
018public class ItemShears extends Item
019{
020    public ItemShears(int par1)
021    {
022        super(par1);
023        this.setMaxStackSize(1);
024        this.setMaxDamage(238);
025        this.setCreativeTab(CreativeTabs.tabTools);
026    }
027
028    public boolean onBlockDestroyed(ItemStack par1ItemStack, World par2World, int par3, int par4, int par5, int par6, EntityLiving par7EntityLiving)
029    {
030        if (par3 != Block.leaves.blockID && par3 != Block.web.blockID && par3 != Block.tallGrass.blockID && par3 != Block.vine.blockID && par3 != Block.tripWire.blockID && !(Block.blocksList[par3] instanceof IShearable))
031        {
032            return super.onBlockDestroyed(par1ItemStack, par2World, par3, par4, par5, par6, par7EntityLiving);
033        }
034        else
035        {
036            return true;
037        }
038    }
039
040    /**
041     * Returns if the item (tool) can harvest results from the block type.
042     */
043    public boolean canHarvestBlock(Block par1Block)
044    {
045        return par1Block.blockID == Block.web.blockID || par1Block.blockID == Block.redstoneWire.blockID || par1Block.blockID == Block.tripWire.blockID;
046    }
047
048    /**
049     * Returns the strength of the stack against a given block. 1.0F base, (Quality+1)*2 if correct blocktype, 1.5F if
050     * sword
051     */
052    public float getStrVsBlock(ItemStack par1ItemStack, Block par2Block)
053    {
054        return par2Block.blockID != Block.web.blockID && par2Block.blockID != Block.leaves.blockID ? (par2Block.blockID == Block.cloth.blockID ? 5.0F : super.getStrVsBlock(par1ItemStack, par2Block)) : 15.0F;
055    }
056    
057    @Override
058    public boolean itemInteractionForEntity(ItemStack itemstack, EntityLiving entity)
059    {
060        if (entity.worldObj.isRemote)
061        {
062            return false;
063        }
064        if (entity instanceof IShearable)
065        {
066            IShearable target = (IShearable)entity;
067            if (target.isShearable(itemstack, entity.worldObj, (int)entity.posX, (int)entity.posY, (int)entity.posZ))
068            {
069                ArrayList<ItemStack> drops = target.onSheared(itemstack, entity.worldObj, (int)entity.posX, (int)entity.posY, (int)entity.posZ,
070                        EnchantmentHelper.getEnchantmentLevel(Enchantment.fortune.effectId, itemstack));
071
072                Random rand = new Random();
073                for(ItemStack stack : drops)
074                {
075                    EntityItem ent = entity.entityDropItem(stack, 1.0F);
076                    ent.motionY += rand.nextFloat() * 0.05F;
077                    ent.motionX += (rand.nextFloat() - rand.nextFloat()) * 0.1F;
078                    ent.motionZ += (rand.nextFloat() - rand.nextFloat()) * 0.1F;
079                }
080                itemstack.damageItem(1, entity);
081            }
082            return true;
083        }
084        return false;
085    }
086    
087    @Override
088    public boolean onBlockStartBreak(ItemStack itemstack, int x, int y, int z, EntityPlayer player) 
089    {
090        if (player.worldObj.isRemote)
091        {
092            return false;
093        }
094        int id = player.worldObj.getBlockId(x, y, z);
095        if (Block.blocksList[id] instanceof IShearable)
096        {
097            IShearable target = (IShearable)Block.blocksList[id];
098            if (target.isShearable(itemstack, player.worldObj, x, y, z))
099            {
100                ArrayList<ItemStack> drops = target.onSheared(itemstack, player.worldObj, x, y, z,
101                        EnchantmentHelper.getEnchantmentLevel(Enchantment.fortune.effectId, itemstack));
102                Random rand = new Random();
103
104                for(ItemStack stack : drops)
105                {
106                    float f = 0.7F;
107                    double d  = (double)(rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D;
108                    double d1 = (double)(rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D;
109                    double d2 = (double)(rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D;
110                    EntityItem entityitem = new EntityItem(player.worldObj, (double)x + d, (double)y + d1, (double)z + d2, stack);
111                    entityitem.delayBeforeCanPickup = 10;
112                    player.worldObj.spawnEntityInWorld(entityitem);
113                }
114
115                itemstack.damageItem(1, player);
116                player.addStat(StatList.mineBlockStatArray[id], 1);
117            }
118        }
119        return false;
120    }
121}