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.block.material.Material;
007import net.minecraft.creativetab.CreativeTabs;
008import net.minecraft.entity.Entity;
009import net.minecraft.entity.EntityLiving;
010import net.minecraft.entity.player.EntityPlayer;
011import net.minecraft.world.World;
012
013public class ItemSword extends Item
014{
015    private int weaponDamage;
016    private final EnumToolMaterial toolMaterial;
017
018    public ItemSword(int par1, EnumToolMaterial par2EnumToolMaterial)
019    {
020        super(par1);
021        this.toolMaterial = par2EnumToolMaterial;
022        this.maxStackSize = 1;
023        this.setMaxDamage(par2EnumToolMaterial.getMaxUses());
024        this.setCreativeTab(CreativeTabs.tabCombat);
025        this.weaponDamage = 4 + par2EnumToolMaterial.getDamageVsEntity();
026    }
027
028    public int func_82803_g()
029    {
030        return this.toolMaterial.getDamageVsEntity();
031    }
032
033    /**
034     * Returns the strength of the stack against a given block. 1.0F base, (Quality+1)*2 if correct blocktype, 1.5F if
035     * sword
036     */
037    public float getStrVsBlock(ItemStack par1ItemStack, Block par2Block)
038    {
039        if (par2Block.blockID == Block.web.blockID)
040        {
041            return 15.0F;
042        }
043        else
044        {
045            Material var3 = par2Block.blockMaterial;
046            return var3 != Material.plants && var3 != Material.vine && var3 != Material.coral && var3 != Material.leaves && var3 != Material.pumpkin ? 1.0F : 1.5F;
047        }
048    }
049
050    /**
051     * Current implementations of this method in child classes do not use the entry argument beside ev. They just raise
052     * the damage on the stack.
053     */
054    public boolean hitEntity(ItemStack par1ItemStack, EntityLiving par2EntityLiving, EntityLiving par3EntityLiving)
055    {
056        par1ItemStack.damageItem(1, par3EntityLiving);
057        return true;
058    }
059
060    public boolean onBlockDestroyed(ItemStack par1ItemStack, World par2World, int par3, int par4, int par5, int par6, EntityLiving par7EntityLiving)
061    {
062        if ((double)Block.blocksList[par3].getBlockHardness(par2World, par4, par5, par6) != 0.0D)
063        {
064            par1ItemStack.damageItem(2, par7EntityLiving);
065        }
066
067        return true;
068    }
069
070    /**
071     * Returns the damage against a given entity.
072     */
073    public int getDamageVsEntity(Entity par1Entity)
074    {
075        return this.weaponDamage;
076    }
077
078    @SideOnly(Side.CLIENT)
079
080    /**
081     * Returns True is the item is renderer in full 3D when hold.
082     */
083    public boolean isFull3D()
084    {
085        return true;
086    }
087
088    /**
089     * returns the action that specifies what animation to play when the items is being used
090     */
091    public EnumAction getItemUseAction(ItemStack par1ItemStack)
092    {
093        return EnumAction.block;
094    }
095
096    /**
097     * How long it takes to use or consume an item
098     */
099    public int getMaxItemUseDuration(ItemStack par1ItemStack)
100    {
101        return 72000;
102    }
103
104    /**
105     * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer
106     */
107    public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
108    {
109        par3EntityPlayer.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack));
110        return par1ItemStack;
111    }
112
113    /**
114     * Returns if the item (tool) can harvest results from the block type.
115     */
116    public boolean canHarvestBlock(Block par1Block)
117    {
118        return par1Block.blockID == Block.web.blockID;
119    }
120
121    /**
122     * Return the enchantability factor of the item, most of the time is based on material.
123     */
124    public int getItemEnchantability()
125    {
126        return this.toolMaterial.getEnchantability();
127    }
128
129    /**
130     * Return the name for this tool's material.
131     */
132    public String getToolMaterialName()
133    {
134        return this.toolMaterial.toString();
135    }
136
137    /**
138     * Return whether this item is repairable in an anvil.
139     */
140    public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack)
141    {
142        return this.toolMaterial.getToolCraftingMaterial() == par2ItemStack.itemID ? true : super.getIsRepairable(par1ItemStack, par2ItemStack);
143    }
144}