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