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}