    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 material = par2Block.blockMaterial;
    046            return material != Material.plants && material != Material.vine && material != Material.coral && material != Material.leaves && material != 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}