001package net.minecraft.item;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005import net.minecraft.block.Block;
006import net.minecraft.creativetab.CreativeTabs;
007import net.minecraft.entity.Entity;
008import net.minecraft.entity.EntityLiving;
009import net.minecraft.world.World;
010import net.minecraftforge.common.ForgeHooks;
011
012public 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 i = 0; i < this.blocksEffectiveAgainst.length; ++i)
043        {
044            if (this.blocksEffectiveAgainst[i] == 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}