001 package net.minecraft.src; 002 003 import net.minecraftforge.common.ForgeHooks; 004 import cpw.mods.fml.common.Side; 005 import cpw.mods.fml.common.asm.SideOnly; 006 007 public class ItemTool extends Item 008 { 009 /** Array of blocks the tool has extra effect against. */ 010 private Block[] blocksEffectiveAgainst; 011 public float efficiencyOnProperMaterial = 4.0F; 012 013 /** Damage versus entities. */ 014 public int damageVsEntity; 015 016 /** The material this tool is made from. */ 017 protected EnumToolMaterial toolMaterial; 018 019 protected ItemTool(int par1, int par2, EnumToolMaterial par3EnumToolMaterial, Block[] par4ArrayOfBlock) 020 { 021 super(par1); 022 this.toolMaterial = par3EnumToolMaterial; 023 this.blocksEffectiveAgainst = par4ArrayOfBlock; 024 this.maxStackSize = 1; 025 this.setMaxDamage(par3EnumToolMaterial.getMaxUses()); 026 this.efficiencyOnProperMaterial = par3EnumToolMaterial.getEfficiencyOnProperMaterial(); 027 this.damageVsEntity = par2 + par3EnumToolMaterial.getDamageVsEntity(); 028 this.setCreativeTab(CreativeTabs.tabTools); 029 } 030 031 /** 032 * Returns the strength of the stack against a given block. 1.0F base, (Quality+1)*2 if correct blocktype, 1.5F if 033 * sword 034 */ 035 public float getStrVsBlock(ItemStack par1ItemStack, Block par2Block) 036 { 037 Block[] var3 = this.blocksEffectiveAgainst; 038 int var4 = var3.length; 039 040 for (int var5 = 0; var5 < var4; ++var5) 041 { 042 Block var6 = var3[var5]; 043 044 if (var6 == 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 public String func_77861_e() 100 { 101 return this.toolMaterial.toString(); 102 } 103 104 public boolean func_82789_a(ItemStack par1ItemStack, ItemStack par2ItemStack) 105 { 106 return this.toolMaterial.func_82844_f() == par2ItemStack.itemID ? true : super.func_82789_a(par1ItemStack, par2ItemStack); 107 } 108 109 /** FORGE: Overridden to allow custom tool effectiveness */ 110 @Override 111 public float getStrVsBlock(ItemStack stack, Block block, int meta) 112 { 113 if (ForgeHooks.isToolEffective(stack, block, meta)) 114 { 115 return efficiencyOnProperMaterial; 116 } 117 return getStrVsBlock(stack, block); 118 } 119 }