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}