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 }