001 package net.minecraft.item;
002
003 import cpw.mods.fml.relauncher.Side;
004 import cpw.mods.fml.relauncher.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 }