001 package net.minecraft.item;
002
003 import java.util.ArrayList;
004 import java.util.Random;
005
006 import net.minecraft.block.Block;
007 import net.minecraft.creativetab.CreativeTabs;
008 import net.minecraft.enchantment.Enchantment;
009 import net.minecraft.enchantment.EnchantmentHelper;
010 import net.minecraft.entity.EntityLiving;
011 import net.minecraft.entity.item.EntityItem;
012 import net.minecraft.entity.player.EntityPlayer;
013 import net.minecraft.stats.StatList;
014 import net.minecraft.world.World;
015
016 import net.minecraftforge.common.IShearable;
017
018 public 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 }