001 package net.minecraft.item;
002
003 import cpw.mods.fml.relauncher.Side;
004 import cpw.mods.fml.relauncher.SideOnly;
005 import net.minecraft.block.Block;
006 import net.minecraft.creativetab.CreativeTabs;
007 import net.minecraft.entity.Entity;
008 import net.minecraft.entity.EntityLiving;
009 import net.minecraft.world.World;
010 import net.minecraftforge.common.ForgeHooks;
011
012 public class ItemTool extends Item
013 {
014 /** Array of blocks the tool has extra effect against. */
015 private Block[] blocksEffectiveAgainst;
016 public float efficiencyOnProperMaterial = 4.0F;
017
018 /** Damage versus entities. */
019 public int damageVsEntity;
020
021 /** The material this tool is made from. */
022 protected EnumToolMaterial toolMaterial;
023
024 protected ItemTool(int par1, int par2, EnumToolMaterial par3EnumToolMaterial, Block[] par4ArrayOfBlock)
025 {
026 super(par1);
027 this.toolMaterial = par3EnumToolMaterial;
028 this.blocksEffectiveAgainst = par4ArrayOfBlock;
029 this.maxStackSize = 1;
030 this.setMaxDamage(par3EnumToolMaterial.getMaxUses());
031 this.efficiencyOnProperMaterial = par3EnumToolMaterial.getEfficiencyOnProperMaterial();
032 this.damageVsEntity = par2 + par3EnumToolMaterial.getDamageVsEntity();
033 this.setCreativeTab(CreativeTabs.tabTools);
034 }
035
036 /**
037 * Returns the strength of the stack against a given block. 1.0F base, (Quality+1)*2 if correct blocktype, 1.5F if
038 * sword
039 */
040 public float getStrVsBlock(ItemStack par1ItemStack, Block par2Block)
041 {
042 for (int var3 = 0; var3 < this.blocksEffectiveAgainst.length; ++var3)
043 {
044 if (this.blocksEffectiveAgainst[var3] == par2Block)
045 {
046 return this.efficiencyOnProperMaterial;
047 }
048 }
049
050 return 1.0F;
051 }
052
053 /**
054 * Current implementations of this method in child classes do not use the entry argument beside ev. They just raise
055 * the damage on the stack.
056 */
057 public boolean hitEntity(ItemStack par1ItemStack, EntityLiving par2EntityLiving, EntityLiving par3EntityLiving)
058 {
059 par1ItemStack.damageItem(2, par3EntityLiving);
060 return true;
061 }
062
063 public boolean onBlockDestroyed(ItemStack par1ItemStack, World par2World, int par3, int par4, int par5, int par6, EntityLiving par7EntityLiving)
064 {
065 if ((double)Block.blocksList[par3].getBlockHardness(par2World, par4, par5, par6) != 0.0D)
066 {
067 par1ItemStack.damageItem(1, par7EntityLiving);
068 }
069
070 return true;
071 }
072
073 /**
074 * Returns the damage against a given entity.
075 */
076 public int getDamageVsEntity(Entity par1Entity)
077 {
078 return this.damageVsEntity;
079 }
080
081 @SideOnly(Side.CLIENT)
082
083 /**
084 * Returns True is the item is renderer in full 3D when hold.
085 */
086 public boolean isFull3D()
087 {
088 return true;
089 }
090
091 /**
092 * Return the enchantability factor of the item, most of the time is based on material.
093 */
094 public int getItemEnchantability()
095 {
096 return this.toolMaterial.getEnchantability();
097 }
098
099 /**
100 * Return the name for this tool's material.
101 */
102 public String getToolMaterialName()
103 {
104 return this.toolMaterial.toString();
105 }
106
107 /**
108 * Return whether this item is repairable in an anvil.
109 */
110 public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack)
111 {
112 return this.toolMaterial.getToolCraftingMaterial() == par2ItemStack.itemID ? true : super.getIsRepairable(par1ItemStack, par2ItemStack);
113 }
114
115 /** FORGE: Overridden to allow custom tool effectiveness */
116 @Override
117 public float getStrVsBlock(ItemStack stack, Block block, int meta)
118 {
119 if (ForgeHooks.isToolEffective(stack, block, meta))
120 {
121 return efficiencyOnProperMaterial;
122 }
123 return getStrVsBlock(stack, block);
124 }
125 }