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