package net.minecraft.item;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.List;
import net.minecraft.block.BlockDispenser;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.command.IEntitySelector;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.dispenser.BehaviorDefaultDispenseItem;
import net.minecraft.dispenser.IBehaviorDispenseItem;
import net.minecraft.dispenser.IBlockSource;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
public class ItemArmor extends Item
{
/** Holds the 'base' maxDamage that each armorType have. */
private static final int[] maxDamageArray = new int[] {11, 16, 15, 13};
private static final String[] CLOTH_OVERLAY_NAMES = new String[] {"leather_helmet_overlay", "leather_chestplate_overlay", "leather_leggings_overlay", "leather_boots_overlay"};
public static final String[] EMPTY_SLOT_NAMES = new String[] {"empty_armor_slot_helmet", "empty_armor_slot_chestplate", "empty_armor_slot_leggings", "empty_armor_slot_boots"};
private static final IBehaviorDispenseItem dispenserBehavior = new BehaviorDefaultDispenseItem()
{
private static final String __OBFID = "CL_00001767";
/**
* Dispense the specified stack, play the dispense sound and spawn particles.
*/
protected ItemStack dispenseStack(IBlockSource source, ItemStack stack)
{
EnumFacing enumfacing = BlockDispenser.getFacingDirection(source.getBlockMetadata());
int i = source.getXInt() + enumfacing.getFrontOffsetX();
int j = source.getYInt() + enumfacing.getFrontOffsetY();
int k = source.getZInt() + enumfacing.getFrontOffsetZ();
AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox((double)i, (double)j, (double)k, (double)(i + 1), (double)(j + 1), (double)(k + 1));
List list = source.getWorld().selectEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb, new IEntitySelector.ArmoredMob(stack));
if (list.size() > 0)
{
EntityLivingBase entitylivingbase = (EntityLivingBase)list.get(0);
int l = entitylivingbase instanceof EntityPlayer ? 1 : 0;
int i1 = EntityLiving.getArmorPosition(stack);
ItemStack itemstack1 = stack.copy();
itemstack1.stackSize = 1;
entitylivingbase.setCurrentItemOrArmor(i1 - l, itemstack1);
if (entitylivingbase instanceof EntityLiving)
{
((EntityLiving)entitylivingbase).setEquipmentDropChance(i1, 2.0F);
}
--stack.stackSize;
return stack;
}
else
{
return super.dispenseStack(source, stack);
}
}
};
/** Stores the armor type: 0 is helmet, 1 is plate, 2 is legs and 3 is boots */
public final int armorType;
/** Holds the amount of damage that the armor reduces at full durability. */
public final int damageReduceAmount;
/**
* Used on RenderPlayer to select the correspondent armor to be rendered on the player: 0 is cloth, 1 is chain, 2 is
* iron, 3 is diamond and 4 is gold.
*/
public final int renderIndex;
/** The EnumArmorMaterial used for this ItemArmor */
private final ItemArmor.ArmorMaterial material;
@SideOnly(Side.CLIENT)
private IIcon overlayIcon;
@SideOnly(Side.CLIENT)
private IIcon emptySlotIcon;
private static final String __OBFID = "CL_00001766";
public ItemArmor(ItemArmor.ArmorMaterial p_i45325_1_, int p_i45325_2_, int p_i45325_3_)
{
this.material = p_i45325_1_;
this.armorType = p_i45325_3_;
this.renderIndex = p_i45325_2_;
this.damageReduceAmount = p_i45325_1_.getDamageReductionAmount(p_i45325_3_);
this.setMaxDurability(p_i45325_1_.getDurability(p_i45325_3_));
this.maxStackSize = 1;
this.setCreativeTab(CreativeTabs.tabCombat);
BlockDispenser.dispenseBehaviorRegistry.putObject(this, dispenserBehavior);
}
@SideOnly(Side.CLIENT)
public int getColorFromItemStack(ItemStack p_82790_1_, int p_82790_2_)
{
if (p_82790_2_ > 0)
{
return 16777215;
}
else
{
int j = this.getColor(p_82790_1_);
if (j < 0)
{
j = 16777215;
}
return j;
}
}
@SideOnly(Side.CLIENT)
public boolean requiresMultipleRenderPasses()
{
return this.material == ItemArmor.ArmorMaterial.CLOTH;
}
/**
* Return the enchantability factor of the item, most of the time is based on material.
*/
public int getItemEnchantability()
{
return this.material.getEnchantability();
}
/**
* Return the armor material for this armor item.
*/
public ItemArmor.ArmorMaterial getArmorMaterial()
{
return this.material;
}
/**
* Return whether the specified armor ItemStack has a color.
*/
public boolean hasColor(ItemStack p_82816_1_)
{
return this.material != ItemArmor.ArmorMaterial.CLOTH ? false : (!p_82816_1_.hasTagCompound() ? false : (!p_82816_1_.getTagCompound().hasKey("display", 10) ? false : p_82816_1_.getTagCompound().getCompoundTag("display").hasKey("color", 3)));
}
/**
* Return the color for the specified armor ItemStack.
*/
public int getColor(ItemStack p_82814_1_)
{
if (this.material != ItemArmor.ArmorMaterial.CLOTH)
{
return -1;
}
else
{
NBTTagCompound nbttagcompound = p_82814_1_.getTagCompound();
if (nbttagcompound == null)
{
return 10511680;
}
else
{
NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display");
return nbttagcompound1 == null ? 10511680 : (nbttagcompound1.hasKey("color", 3) ? nbttagcompound1.getInteger("color") : 10511680);
}
}
}
/**
* Gets an icon index based on an item's damage value and the given render pass
*/
@SideOnly(Side.CLIENT)
public IIcon getIconFromDamageForRenderPass(int p_77618_1_, int p_77618_2_)
{
return p_77618_2_ == 1 ? this.overlayIcon : super.getIconFromDamageForRenderPass(p_77618_1_, p_77618_2_);
}
/**
* Remove the color from the specified armor ItemStack.
*/
public void removeColor(ItemStack p_82815_1_)
{
if (this.material == ItemArmor.ArmorMaterial.CLOTH)
{
NBTTagCompound nbttagcompound = p_82815_1_.getTagCompound();
if (nbttagcompound != null)
{
NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display");
if (nbttagcompound1.hasKey("color"))
{
nbttagcompound1.removeTag("color");
}
}
}
}
public void func_82813_b(ItemStack p_82813_1_, int p_82813_2_)
{
if (this.material != ItemArmor.ArmorMaterial.CLOTH)
{
throw new UnsupportedOperationException("Can\'t dye non-leather!");
}
else
{
NBTTagCompound nbttagcompound = p_82813_1_.getTagCompound();
if (nbttagcompound == null)
{
nbttagcompound = new NBTTagCompound();
p_82813_1_.setTagCompound(nbttagcompound);
}
NBTTagCompound nbttagcompound1 = nbttagcompound.getCompoundTag("display");
if (!nbttagcompound.hasKey("display", 10))
{
nbttagcompound.setTag("display", nbttagcompound1);
}
nbttagcompound1.setInteger("color", p_82813_2_);
}
}
/**
* Return whether this item is repairable in an anvil.
*/
public boolean getIsRepairable(ItemStack p_82789_1_, ItemStack p_82789_2_)
{
return this.material.getBaseItemForRepair() == p_82789_2_.getItem() ? true : super.getIsRepairable(p_82789_1_, p_82789_2_);
}
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister register)
{
super.registerIcons(register);
if (this.material == ItemArmor.ArmorMaterial.CLOTH)
{
this.overlayIcon = register.registerIcon(CLOTH_OVERLAY_NAMES[this.armorType]);
}
this.emptySlotIcon = register.registerIcon(EMPTY_SLOT_NAMES[this.armorType]);
}
/**
* Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer
*/
public ItemStack onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPlayer player)
{
int i = EntityLiving.getArmorPosition(itemStackIn) - 1;
ItemStack itemstack1 = player.getCurrentArmor(i);
if (itemstack1 == null)
{
player.setCurrentItemOrArmor(i + 1, itemStackIn.copy()); //Forge: Vanilla bug fix associated with fixed setCurrentItemOrArmor indexs for players.
itemStackIn.stackSize = 0;
}
return itemStackIn;
}
/**
* Return the background icon of the Slot used to hold the armor item stack. Args : armorId (0 : helmet, 1 :
* chestplace, 2 : leggings, 3 : boots : other : null)
*/
@SideOnly(Side.CLIENT)
public static IIcon getBackgroundIcon(int p_94602_0_)
{
switch (p_94602_0_)
{
case 0:
return Items.diamond_helmet.emptySlotIcon;
case 1:
return Items.diamond_chestplate.emptySlotIcon;
case 2:
return Items.diamond_leggings.emptySlotIcon;
case 3:
return Items.diamond_boots.emptySlotIcon;
default:
return null;
}
}
public static enum ArmorMaterial
{
CLOTH(5, new int[]{1, 3, 2, 1}, 15),
CHAIN(15, new int[]{2, 5, 4, 1}, 12),
IRON(15, new int[]{2, 6, 5, 2}, 9),
GOLD(7, new int[]{2, 5, 3, 1}, 25),
DIAMOND(33, new int[]{3, 8, 6, 3}, 10);
/**
* Holds the maximum damage factor (each piece multiply this by it's own value) of the material, this is the
* item damage (how much can absorb before breaks)
*/
private int maxDamageFactor;
/**
* Holds the damage reduction (each 1 points is half a shield on gui) of each piece of armor (helmet, plate,
* legs and boots)
*/
private int[] damageReductionAmountArray;
/** Return the enchantability factor of the material */
private int enchantability;
private static final String __OBFID = "CL_00001768";
//Added by forge for custom Armor materials.
public Item customCraftingMaterial = null;
private ArmorMaterial(int p_i1827_3_, int[] p_i1827_4_, int p_i1827_5_)
{
this.maxDamageFactor = p_i1827_3_;
this.damageReductionAmountArray = p_i1827_4_;
this.enchantability = p_i1827_5_;
}
/**
* Returns the durability for a armor slot of for this type.
*/
public int getDurability(int p_78046_1_)
{
return ItemArmor.maxDamageArray[p_78046_1_] * this.maxDamageFactor;
}
/**
* Return the damage reduction (each 1 point is a half a shield on gui) of the piece index passed (0 = helmet, 1
* = plate, 2 = legs and 3 = boots)
*/
public int getDamageReductionAmount(int p_78044_1_)
{
return this.damageReductionAmountArray[p_78044_1_];
}
/**
* Return the enchantability factor of the material.
*/
public int getEnchantability()
{
return this.enchantability;
}
/**
* Get a main crafting component of this Armor Material (example is Items.iron_ingot)
*/
public Item getBaseItemForRepair()
{
return this == CLOTH ? Items.leather :
(this == CHAIN ? Items.iron_ingot :
(this == GOLD ? Items.gold_ingot :
(this == IRON ? Items.iron_ingot :
(this == DIAMOND ? Items.diamond :
customCraftingMaterial))));
}
}
}