    001package net.minecraft.item;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import net.minecraft.creativetab.CreativeTabs;
    006import net.minecraft.nbt.NBTTagCompound;
    007
    008public class ItemArmor extends Item
    009{
    010    /** Holds the 'base' maxDamage that each armorType have. */
    011    private static final int[] maxDamageArray = new int[] {11, 16, 15, 13};
    012
    013    /**
    014     * Stores the armor type: 0 is helmet, 1 is plate, 2 is legs and 3 is boots
    015     */
    016    public final int armorType;
    017
    018    /** Holds the amount of damage that the armor reduces at full durability. */
    019    public final int damageReduceAmount;
    020
    021    /**
    022     * Used on RenderPlayer to select the correspondent armor to be rendered on the player: 0 is cloth, 1 is chain, 2 is
    023     * iron, 3 is diamond and 4 is gold.
    024     */
    025    public final int renderIndex;
    026
    027    /** The EnumArmorMaterial used for this ItemArmor */
    028    private final EnumArmorMaterial material;
    029
    030    public ItemArmor(int par1, EnumArmorMaterial par2EnumArmorMaterial, int par3, int par4)
    031    {
    032        super(par1);
    033        this.material = par2EnumArmorMaterial;
    034        this.armorType = par4;
    035        this.renderIndex = par3;
    036        this.damageReduceAmount = par2EnumArmorMaterial.getDamageReductionAmount(par4);
    037        this.setMaxDamage(par2EnumArmorMaterial.getDurability(par4));
    038        this.maxStackSize = 1;
    039        this.setCreativeTab(CreativeTabs.tabCombat);
    040    }
    041
    042    @SideOnly(Side.CLIENT)
    043    public int getColorFromItemStack(ItemStack par1ItemStack, int par2)
    044    {
    045        if (par2 > 0)
    046        {
    047            return 16777215;
    048        }
    049        else
    050        {
    051            int var3 = this.getColor(par1ItemStack);
    052
    053            if (var3 < 0)
    054            {
    055                var3 = 16777215;
    056            }
    057
    058            return var3;
    059        }
    060    }
    061
    062    @SideOnly(Side.CLIENT)
    063    public boolean requiresMultipleRenderPasses()
    064    {
    065        return this.material == EnumArmorMaterial.CLOTH;
    066    }
    067
    068    /**
    069     * Return the enchantability factor of the item, most of the time is based on material.
    070     */
    071    public int getItemEnchantability()
    072    {
    073        return this.material.getEnchantability();
    074    }
    075
    076    /**
    077     * Return the armor material for this armor item.
    078     */
    079    public EnumArmorMaterial getArmorMaterial()
    080    {
    081        return this.material;
    082    }
    083
    084    /**
    085     * Return whether the specified armor ItemStack has a color.
    086     */
    087    public boolean hasColor(ItemStack par1ItemStack)
    088    {
    089        return this.material != EnumArmorMaterial.CLOTH ? false : (!par1ItemStack.hasTagCompound() ? false : (!par1ItemStack.getTagCompound().hasKey("display") ? false : par1ItemStack.getTagCompound().getCompoundTag("display").hasKey("color")));
    090    }
    091
    092    /**
    093     * Return the color for the specified armor ItemStack.
    094     */
    095    public int getColor(ItemStack par1ItemStack)
    096    {
    097        if (this.material != EnumArmorMaterial.CLOTH)
    098        {
    099            return -1;
    100        }
    101        else
    102        {
    103            NBTTagCompound var2 = par1ItemStack.getTagCompound();
    104
    105            if (var2 == null)
    106            {
    107                return 10511680;
    108            }
    109            else
    110            {
    111                NBTTagCompound var3 = var2.getCompoundTag("display");
    112                return var3 == null ? 10511680 : (var3.hasKey("color") ? var3.getInteger("color") : 10511680);
    113            }
    114        }
    115    }
    116
    117    @SideOnly(Side.CLIENT)
    118
    119    /**
    120     * Gets an icon index based on an item's damage value and the given render pass
    121     */
    122    public int getIconFromDamageForRenderPass(int par1, int par2)
    123    {
    124        return par2 == 1 ? this.iconIndex + 144 : super.getIconFromDamageForRenderPass(par1, par2);
    125    }
    126
    127    /**
    128     * Remove the color from the specified armor ItemStack.
    129     */
    130    public void removeColor(ItemStack par1ItemStack)
    131    {
    132        if (this.material == EnumArmorMaterial.CLOTH)
    133        {
    134            NBTTagCompound var2 = par1ItemStack.getTagCompound();
    135
    136            if (var2 != null)
    137            {
    138                NBTTagCompound var3 = var2.getCompoundTag("display");
    139
    140                if (var3.hasKey("color"))
    141                {
    142                    var3.removeTag("color");
    143                }
    144            }
    145        }
    146    }
    147
    148    public void func_82813_b(ItemStack par1ItemStack, int par2)
    149    {
    150        if (this.material != EnumArmorMaterial.CLOTH)
    151        {
    152            throw new UnsupportedOperationException("Can\'t dye non-leather!");
    153        }
    154        else
    155        {
    156            NBTTagCompound var3 = par1ItemStack.getTagCompound();
    157
    158            if (var3 == null)
    159            {
    160                var3 = new NBTTagCompound();
    161                par1ItemStack.setTagCompound(var3);
    162            }
    163
    164            NBTTagCompound var4 = var3.getCompoundTag("display");
    165
    166            if (!var3.hasKey("display"))
    167            {
    168                var3.setCompoundTag("display", var4);
    169            }
    170
    171            var4.setInteger("color", par2);
    172        }
    173    }
    174
    175    /**
    176     * Return whether this item is repairable in an anvil.
    177     */
    178    public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack)
    179    {
    180        return this.material.getArmorCraftingMaterial() == par2ItemStack.itemID ? true : super.getIsRepairable(par1ItemStack, par2ItemStack);
    181    }
    182
    183    /**
    184     * Returns the 'max damage' factor array for the armor, each piece of armor have a durability factor (that gets
    185     * multiplied by armor material factor)
    186     */
    187    static int[] getMaxDamageArray()
    188    {
    189        return maxDamageArray;
    190    }
    191}