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 }