    001package net.minecraft.item;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import net.minecraft.block.BlockDispenser;
    006import net.minecraft.client.renderer.texture.IconRegister;
    007import net.minecraft.creativetab.CreativeTabs;
    008import net.minecraft.dispenser.IBehaviorDispenseItem;
    009import net.minecraft.entity.EntityLiving;
    010import net.minecraft.entity.player.EntityPlayer;
    011import net.minecraft.nbt.NBTTagCompound;
    012import net.minecraft.util.Icon;
    013import net.minecraft.world.World;
    014
    015public class ItemArmor extends Item
    016{
    017    /** Holds the 'base' maxDamage that each armorType have. */
    018    private static final int[] maxDamageArray = new int[] {11, 16, 15, 13};
    019    private static final String[] field_94606_cu = new String[] {"helmetCloth_overlay", "chestplateCloth_overlay", "leggingsCloth_overlay", "bootsCloth_overlay"};
    020    public static final String[] field_94603_a = new String[] {"slot_empty_helmet", "slot_empty_chestplate", "slot_empty_leggings", "slot_empty_boots"};
    021    private static final IBehaviorDispenseItem field_96605_cw = new BehaviorDispenseArmor();
    022
    023    /**
    024     * Stores the armor type: 0 is helmet, 1 is plate, 2 is legs and 3 is boots
    025     */
    026    public final int armorType;
    027
    028    /** Holds the amount of damage that the armor reduces at full durability. */
    029    public final int damageReduceAmount;
    030
    031    /**
    032     * Used on RenderPlayer to select the correspondent armor to be rendered on the player: 0 is cloth, 1 is chain, 2 is
    033     * iron, 3 is diamond and 4 is gold.
    034     */
    035    public final int renderIndex;
    036
    037    /** The EnumArmorMaterial used for this ItemArmor */
    038    private final EnumArmorMaterial material;
    039    @SideOnly(Side.CLIENT)
    040    private Icon field_94605_cw;
    041    @SideOnly(Side.CLIENT)
    042    private Icon field_94604_cx;
    043
    044    public ItemArmor(int par1, EnumArmorMaterial par2EnumArmorMaterial, int par3, int par4)
    045    {
    046        super(par1);
    047        this.material = par2EnumArmorMaterial;
    048        this.armorType = par4;
    049        this.renderIndex = par3;
    050        this.damageReduceAmount = par2EnumArmorMaterial.getDamageReductionAmount(par4);
    051        this.setMaxDamage(par2EnumArmorMaterial.getDurability(par4));
    052        this.maxStackSize = 1;
    053        this.setCreativeTab(CreativeTabs.tabCombat);
    054        BlockDispenser.dispenseBehaviorRegistry.putObject(this, field_96605_cw);
    055    }
    056
    057    @SideOnly(Side.CLIENT)
    058    public int getColorFromItemStack(ItemStack par1ItemStack, int par2)
    059    {
    060        if (par2 > 0)
    061        {
    062            return 16777215;
    063        }
    064        else
    065        {
    066            int j = this.getColor(par1ItemStack);
    067
    068            if (j < 0)
    069            {
    070                j = 16777215;
    071            }
    072
    073            return j;
    074        }
    075    }
    076
    077    @SideOnly(Side.CLIENT)
    078    public boolean requiresMultipleRenderPasses()
    079    {
    080        return this.material == EnumArmorMaterial.CLOTH;
    081    }
    082
    083    /**
    084     * Return the enchantability factor of the item, most of the time is based on material.
    085     */
    086    public int getItemEnchantability()
    087    {
    088        return this.material.getEnchantability();
    089    }
    090
    091    /**
    092     * Return the armor material for this armor item.
    093     */
    094    public EnumArmorMaterial getArmorMaterial()
    095    {
    096        return this.material;
    097    }
    098
    099    /**
    100     * Return whether the specified armor ItemStack has a color.
    101     */
    102    public boolean hasColor(ItemStack par1ItemStack)
    103    {
    104        return this.material != EnumArmorMaterial.CLOTH ? false : (!par1ItemStack.hasTagCompound() ? false : (!par1ItemStack.getTagCompound().hasKey("display") ? false : par1ItemStack.getTagCompound().getCompoundTag("display").hasKey("color")));
    105    }
    106
    107    /**
    108     * Return the color for the specified armor ItemStack.
    109     */
    110    public int getColor(ItemStack par1ItemStack)
    111    {
    112        if (this.material != EnumArmorMaterial.CLOTH)
    113        {
    114            return -1;
    115        }
    116        else
    117        {
    118            NBTTagCompound nbttagcompound = par1ItemStack.getTagCompound();
    119
    120            if (nbttagcompound == null)
    121            {
    122                return 10511680;
    123            }
    124            else
    125            {
    126                NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display");
    127                return nbttagcompound1 == null ? 10511680 : (nbttagcompound1.hasKey("color") ? nbttagcompound1.getInteger("color") : 10511680);
    128            }
    129        }
    130    }
    131
    132    @SideOnly(Side.CLIENT)
    133
    134    /**
    135     * Gets an icon index based on an item's damage value and the given render pass
    136     */
    137    public Icon getIconFromDamageForRenderPass(int par1, int par2)
    138    {
    139        return par2 == 1 ? this.field_94605_cw : super.getIconFromDamageForRenderPass(par1, par2);
    140    }
    141
    142    /**
    143     * Remove the color from the specified armor ItemStack.
    144     */
    145    public void removeColor(ItemStack par1ItemStack)
    146    {
    147        if (this.material == EnumArmorMaterial.CLOTH)
    148        {
    149            NBTTagCompound nbttagcompound = par1ItemStack.getTagCompound();
    150
    151            if (nbttagcompound != null)
    152            {
    153                NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display");
    154
    155                if (nbttagcompound1.hasKey("color"))
    156                {
    157                    nbttagcompound1.removeTag("color");
    158                }
    159            }
    160        }
    161    }
    162
    163    public void func_82813_b(ItemStack par1ItemStack, int par2)
    164    {
    165        if (this.material != EnumArmorMaterial.CLOTH)
    166        {
    167            throw new UnsupportedOperationException("Can\'t dye non-leather!");
    168        }
    169        else
    170        {
    171            NBTTagCompound nbttagcompound = par1ItemStack.getTagCompound();
    172
    173            if (nbttagcompound == null)
    174            {
    175                nbttagcompound = new NBTTagCompound();
    176                par1ItemStack.setTagCompound(nbttagcompound);
    177            }
    178
    179            NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display");
    180
    181            if (!nbttagcompound.hasKey("display"))
    182            {
    183                nbttagcompound.setCompoundTag("display", nbttagcompound1);
    184            }
    185
    186            nbttagcompound1.setInteger("color", par2);
    187        }
    188    }
    189
    190    /**
    191     * Return whether this item is repairable in an anvil.
    192     */
    193    public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack)
    194    {
    195        return this.material.getArmorCraftingMaterial() == par2ItemStack.itemID ? true : super.getIsRepairable(par1ItemStack, par2ItemStack);
    196    }
    197
    198    @SideOnly(Side.CLIENT)
    199    public void func_94581_a(IconRegister par1IconRegister)
    200    {
    201        super.func_94581_a(par1IconRegister);
    202
    203        if (this.material == EnumArmorMaterial.CLOTH)
    204        {
    205            this.field_94605_cw = par1IconRegister.func_94245_a(field_94606_cu[this.armorType]);
    206        }
    207
    208        this.field_94604_cx = par1IconRegister.func_94245_a(field_94603_a[this.armorType]);
    209    }
    210
    211    /**
    212     * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer
    213     */
    214    public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
    215    {
    216        int i = EntityLiving.func_82159_b(par1ItemStack) - 1;
    217        ItemStack itemstack1 = par3EntityPlayer.getCurrentArmor(i);
    218
    219        if (itemstack1 == null)
    220        {
    221            par3EntityPlayer.setCurrentItemOrArmor(i + 1, par1ItemStack.copy()); //Forge: Vanilla bug fix associated with fixed setCurrentItemOrArmor indexs for players.
    222            par1ItemStack.stackSize = 0;
    223        }
    224
    225        return par1ItemStack;
    226    }
    227
    228    @SideOnly(Side.CLIENT)
    229    public static Icon func_94602_b(int par0)
    230    {
    231        switch (par0)
    232        {
    233            case 0:
    234                return Item.helmetDiamond.field_94604_cx;
    235            case 1:
    236                return Item.plateDiamond.field_94604_cx;
    237            case 2:
    238                return Item.legsDiamond.field_94604_cx;
    239            case 3:
    240                return Item.bootsDiamond.field_94604_cx;
    241            default:
    242                return null;
    243        }
    244    }
    245
    246    /**
    247     * Returns the 'max damage' factor array for the armor, each piece of armor have a durability factor (that gets
    248     * multiplied by armor material factor)
    249     */
    250    static int[] getMaxDamageArray()
    251    {
    252        return maxDamageArray;
    253    }
    254}