package net.minecraft.item; import com.google.common.base.Predicates; import java.util.List; import net.minecraft.block.BlockDispenser; 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.BlockPos; 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}; public static final String[] EMPTY_SLOT_NAMES = new String[] {"minecraft:items/empty_armor_slot_helmet", "minecraft:items/empty_armor_slot_chestplate", "minecraft:items/empty_armor_slot_leggings", "minecraft:items/empty_armor_slot_boots"}; private static final IBehaviorDispenseItem dispenserBehavior = new BehaviorDefaultDispenseItem() { private static final String __OBFID = "CL_00001767"; protected ItemStack dispenseStack(IBlockSource source, ItemStack stack) { BlockPos var3 = source.getBlockPos().offset(BlockDispenser.getFacing(source.getBlockMetadata())); int var4 = var3.getX(); int var5 = var3.getY(); int var6 = var3.getZ(); AxisAlignedBB var7 = new AxisAlignedBB((double)var4, (double)var5, (double)var6, (double)(var4 + 1), (double)(var5 + 1), (double)(var6 + 1)); List var8 = source.getWorld().func_175647_a(EntityLivingBase.class, var7, Predicates.and(IEntitySelector.field_180132_d, new IEntitySelector.ArmoredMob(stack))); if (var8.size() > 0) { EntityLivingBase var9 = (EntityLivingBase)var8.get(0); int var10 = var9 instanceof EntityPlayer ? 1 : 0; int var11 = EntityLiving.getArmorPosition(stack); ItemStack var12 = stack.copy(); var12.stackSize = 1; var9.setCurrentItemOrArmor(var11 - var10, var12); if (var9 instanceof EntityLiving) { ((EntityLiving)var9).setEquipmentDropChance(var11, 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; 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.setMaxDamage(p_i45325_1_.getDurability(p_i45325_3_)); this.maxStackSize = 1; this.setCreativeTab(CreativeTabs.tabCombat); BlockDispenser.dispenseBehaviorRegistry.putObject(this, dispenserBehavior); } /** * 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.LEATHER ? 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.LEATHER) { return -1; } else { NBTTagCompound var2 = p_82814_1_.getTagCompound(); if (var2 != null) { NBTTagCompound var3 = var2.getCompoundTag("display"); if (var3 != null && var3.hasKey("color", 3)) { return var3.getInteger("color"); } } return 10511680; } } /** * Remove the color from the specified armor ItemStack. */ public void removeColor(ItemStack p_82815_1_) { if (this.material == ItemArmor.ArmorMaterial.LEATHER) { NBTTagCompound var2 = p_82815_1_.getTagCompound(); if (var2 != null) { NBTTagCompound var3 = var2.getCompoundTag("display"); if (var3.hasKey("color")) { var3.removeTag("color"); } } } } public void func_82813_b(ItemStack p_82813_1_, int p_82813_2_) { if (this.material != ItemArmor.ArmorMaterial.LEATHER) { throw new UnsupportedOperationException("Can\'t dye non-leather!"); } else { NBTTagCompound var3 = p_82813_1_.getTagCompound(); if (var3 == null) { var3 = new NBTTagCompound(); p_82813_1_.setTagCompound(var3); } NBTTagCompound var4 = var3.getCompoundTag("display"); if (!var3.hasKey("display", 10)) { var3.setTag("display", var4); } var4.setInteger("color", p_82813_2_); } } /** * Return whether this item is repairable in an anvil. * * @param toRepair The ItemStack to be repaired * @param repair The ItemStack that should repair this Item (leather for leather armor, etc.) */ public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) { return this.material.getBaseItemForRepair() == repair.getItem() ? true : super.getIsRepairable(toRepair, repair); } /** * 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 playerIn) { int var4 = EntityLiving.getArmorPosition(itemStackIn) - 1; ItemStack var5 = playerIn.getCurrentArmor(var4); if (var5 == null) { playerIn.setCurrentItemOrArmor(var4, itemStackIn.copy()); itemStackIn.stackSize = 0; } return itemStackIn; } public static enum ArmorMaterial { LEATHER("LEATHER", 0, "leather", 5, new int[]{1, 3, 2, 1}, 15), CHAIN("CHAIN", 1, "chainmail", 15, new int[]{2, 5, 4, 1}, 12), IRON("IRON", 2, "iron", 15, new int[]{2, 6, 5, 2}, 9), GOLD("GOLD", 3, "gold", 7, new int[]{2, 5, 3, 1}, 25), DIAMOND("DIAMOND", 4, "diamond", 33, new int[]{3, 8, 6, 3}, 10); private final String field_179243_f; private final int maxDamageFactor; private final int[] damageReductionAmountArray; private final int enchantability; private static final ItemArmor.ArmorMaterial[] $VALUES = new ItemArmor.ArmorMaterial[]{LEATHER, CHAIN, IRON, GOLD, DIAMOND}; private static final String __OBFID = "CL_00001768"; private ArmorMaterial(String p_i45789_1_, int p_i45789_2_, String p_i45789_3_, int p_i45789_4_, int[] p_i45789_5_, int p_i45789_6_) { this.field_179243_f = p_i45789_3_; this.maxDamageFactor = p_i45789_4_; this.damageReductionAmountArray = p_i45789_5_; this.enchantability = p_i45789_6_; } public int getDurability(int p_78046_1_) { return ItemArmor.maxDamageArray[p_78046_1_] * this.maxDamageFactor; } public int getDamageReductionAmount(int p_78044_1_) { return this.damageReductionAmountArray[p_78044_1_]; } public int getEnchantability() { return this.enchantability; } public Item getBaseItemForRepair() { return this == LEATHER ? Items.leather : (this == CHAIN ? Items.iron_ingot : (this == GOLD ? Items.gold_ingot : (this == IRON ? Items.iron_ingot : (this == DIAMOND ? Items.diamond : null)))); } } }