    001    package net.minecraft.item;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.SideOnly;
    005    import net.minecraft.creativetab.CreativeTabs;
    006    import net.minecraft.nbt.NBTTagCompound;
    007
    008    public 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    }