package net.minecraft.item;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.ai.attributes.AttributeModifier;
import net.minecraft.entity.ai.attributes.IAttribute;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityPotion;
import net.minecraft.init.Items;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.potion.PotionHelper;
import net.minecraft.stats.StatList;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
public class ItemPotion extends Item
{
/**
* Contains a map from integers to the list of potion effects that potions with that damage value confer (to prevent
* recalculating it).
*/
private Map effectCache = Maps.newHashMap();
private static final Map field_77835_b = Maps.newLinkedHashMap();
private static final String __OBFID = "CL_00000055";
public ItemPotion()
{
this.setMaxStackSize(1);
this.setHasSubtypes(true);
this.setMaxDamage(0);
this.setCreativeTab(CreativeTabs.tabBrewing);
}
/**
* Returns a list of potion effects for the specified itemstack.
*/
public List getEffects(ItemStack p_77832_1_)
{
if (p_77832_1_.hasTagCompound() && p_77832_1_.getTagCompound().hasKey("CustomPotionEffects", 9))
{
ArrayList var7 = Lists.newArrayList();
NBTTagList var3 = p_77832_1_.getTagCompound().getTagList("CustomPotionEffects", 10);
for (int var4 = 0; var4 < var3.tagCount(); ++var4)
{
NBTTagCompound var5 = var3.getCompoundTagAt(var4);
PotionEffect var6 = PotionEffect.readCustomPotionEffectFromNBT(var5);
if (var6 != null)
{
var7.add(var6);
}
}
return var7;
}
else
{
List var2 = (List)this.effectCache.get(Integer.valueOf(p_77832_1_.getMetadata()));
if (var2 == null)
{
var2 = PotionHelper.getPotionEffects(p_77832_1_.getMetadata(), false);
this.effectCache.put(Integer.valueOf(p_77832_1_.getMetadata()), var2);
}
return var2;
}
}
/**
* Returns a list of effects for the specified potion damage value.
*/
public List getEffects(int p_77834_1_)
{
List var2 = (List)this.effectCache.get(Integer.valueOf(p_77834_1_));
if (var2 == null)
{
var2 = PotionHelper.getPotionEffects(p_77834_1_, false);
this.effectCache.put(Integer.valueOf(p_77834_1_), var2);
}
return var2;
}
/**
* Called when the player finishes using this Item (E.g. finishes eating.). Not called when the player stops using
* the Item before the action is complete.
*/
public ItemStack onItemUseFinish(ItemStack stack, World worldIn, EntityPlayer playerIn)
{
if (!playerIn.capabilities.isCreativeMode)
{
--stack.stackSize;
}
if (!worldIn.isRemote)
{
List var4 = this.getEffects(stack);
if (var4 != null)
{
Iterator var5 = var4.iterator();
while (var5.hasNext())
{
PotionEffect var6 = (PotionEffect)var5.next();
playerIn.addPotionEffect(new PotionEffect(var6));
}
}
}
playerIn.triggerAchievement(StatList.objectUseStats[Item.getIdFromItem(this)]);
if (!playerIn.capabilities.isCreativeMode)
{
if (stack.stackSize <= 0)
{
return new ItemStack(Items.glass_bottle);
}
playerIn.inventory.addItemStackToInventory(new ItemStack(Items.glass_bottle));
}
return stack;
}
/**
* How long it takes to use or consume an item
*/
public int getMaxItemUseDuration(ItemStack stack)
{
return 32;
}
/**
* returns the action that specifies what animation to play when the items is being used
*/
public EnumAction getItemUseAction(ItemStack stack)
{
return EnumAction.DRINK;
}
/**
* 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)
{
if (isSplash(itemStackIn.getMetadata()))
{
if (!playerIn.capabilities.isCreativeMode)
{
--itemStackIn.stackSize;
}
worldIn.playSoundAtEntity(playerIn, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
if (!worldIn.isRemote)
{
worldIn.spawnEntityInWorld(new EntityPotion(worldIn, playerIn, itemStackIn));
}
playerIn.triggerAchievement(StatList.objectUseStats[Item.getIdFromItem(this)]);
return itemStackIn;
}
else
{
playerIn.setItemInUse(itemStackIn, this.getMaxItemUseDuration(itemStackIn));
return itemStackIn;
}
}
/**
* returns wether or not a potion is a throwable splash potion based on damage value
*/
public static boolean isSplash(int p_77831_0_)
{
return (p_77831_0_ & 16384) != 0;
}
public int getColorFromDamage(int p_77620_1_)
{
return PotionHelper.func_77915_a(p_77620_1_, false);
}
public int getColorFromItemStack(ItemStack stack, int renderPass)
{
return renderPass > 0 ? 16777215 : this.getColorFromDamage(stack.getMetadata());
}
public boolean isEffectInstant(int p_77833_1_)
{
List var2 = this.getEffects(p_77833_1_);
if (var2 != null && !var2.isEmpty())
{
Iterator var3 = var2.iterator();
PotionEffect var4;
do
{
if (!var3.hasNext())
{
return false;
}
var4 = (PotionEffect)var3.next();
}
while (!Potion.potionTypes[var4.getPotionID()].isInstant());
return true;
}
else
{
return false;
}
}
public String getItemStackDisplayName(ItemStack stack)
{
if (stack.getMetadata() == 0)
{
return StatCollector.translateToLocal("item.emptyPotion.name").trim();
}
else
{
String var2 = "";
if (isSplash(stack.getMetadata()))
{
var2 = StatCollector.translateToLocal("potion.prefix.grenade").trim() + " ";
}
List var3 = Items.potionitem.getEffects(stack);
String var4;
if (var3 != null && !var3.isEmpty())
{
var4 = ((PotionEffect)var3.get(0)).getEffectName();
var4 = var4 + ".postfix";
return var2 + StatCollector.translateToLocal(var4).trim();
}
else
{
var4 = PotionHelper.func_77905_c(stack.getMetadata());
return StatCollector.translateToLocal(var4).trim() + " " + super.getItemStackDisplayName(stack);
}
}
}
/**
* allows items to add custom lines of information to the mouseover description
*
* @param tooltip All lines to display in the Item's tooltip. This is a List of Strings.
* @param advanced Whether the setting "Advanced tooltips" is enabled
*/
public void addInformation(ItemStack stack, EntityPlayer playerIn, List tooltip, boolean advanced)
{
if (stack.getMetadata() != 0)
{
List var5 = Items.potionitem.getEffects(stack);
HashMultimap var6 = HashMultimap.create();
Iterator var16;
if (var5 != null && !var5.isEmpty())
{
var16 = var5.iterator();
while (var16.hasNext())
{
PotionEffect var8 = (PotionEffect)var16.next();
String var9 = StatCollector.translateToLocal(var8.getEffectName()).trim();
Potion var10 = Potion.potionTypes[var8.getPotionID()];
Map var11 = var10.func_111186_k();
if (var11 != null && var11.size() > 0)
{
Iterator var12 = var11.entrySet().iterator();
while (var12.hasNext())
{
Entry var13 = (Entry)var12.next();
AttributeModifier var14 = (AttributeModifier)var13.getValue();
AttributeModifier var15 = new AttributeModifier(var14.getName(), var10.func_111183_a(var8.getAmplifier(), var14), var14.getOperation());
var6.put(((IAttribute)var13.getKey()).getAttributeUnlocalizedName(), var15);
}
}
if (var8.getAmplifier() > 0)
{
var9 = var9 + " " + StatCollector.translateToLocal("potion.potency." + var8.getAmplifier()).trim();
}
if (var8.getDuration() > 20)
{
var9 = var9 + " (" + Potion.getDurationString(var8) + ")";
}
if (var10.isBadEffect())
{
tooltip.add(EnumChatFormatting.RED + var9);
}
else
{
tooltip.add(EnumChatFormatting.GRAY + var9);
}
}
}
else
{
String var7 = StatCollector.translateToLocal("potion.empty").trim();
tooltip.add(EnumChatFormatting.GRAY + var7);
}
if (!var6.isEmpty())
{
tooltip.add("");
tooltip.add(EnumChatFormatting.DARK_PURPLE + StatCollector.translateToLocal("potion.effects.whenDrank"));
var16 = var6.entries().iterator();
while (var16.hasNext())
{
Entry var17 = (Entry)var16.next();
AttributeModifier var18 = (AttributeModifier)var17.getValue();
double var19 = var18.getAmount();
double var20;
if (var18.getOperation() != 1 && var18.getOperation() != 2)
{
var20 = var18.getAmount();
}
else
{
var20 = var18.getAmount() * 100.0D;
}
if (var19 > 0.0D)
{
tooltip.add(EnumChatFormatting.BLUE + StatCollector.translateToLocalFormatted("attribute.modifier.plus." + var18.getOperation(), new Object[] {ItemStack.DECIMALFORMAT.format(var20), StatCollector.translateToLocal("attribute.name." + (String)var17.getKey())}));
}
else if (var19 < 0.0D)
{
var20 *= -1.0D;
tooltip.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted("attribute.modifier.take." + var18.getOperation(), new Object[] {ItemStack.DECIMALFORMAT.format(var20), StatCollector.translateToLocal("attribute.name." + (String)var17.getKey())}));
}
}
}
}
}
public boolean hasEffect(ItemStack stack)
{
List var2 = this.getEffects(stack);
return var2 != null && !var2.isEmpty();
}
/**
* returns a list of items with the same ID, but different meta (eg: dye returns 16 items)
*
* @param subItems The List of sub-items. This is a List of ItemStacks.
*/
public void getSubItems(Item itemIn, CreativeTabs tab, List subItems)
{
super.getSubItems(itemIn, tab, subItems);
int var5;
if (field_77835_b.isEmpty())
{
for (int var4 = 0; var4 <= 15; ++var4)
{
for (var5 = 0; var5 <= 1; ++var5)
{
int var6;
if (var5 == 0)
{
var6 = var4 | 8192;
}
else
{
var6 = var4 | 16384;
}
for (int var7 = 0; var7 <= 2; ++var7)
{
int var8 = var6;
if (var7 != 0)
{
if (var7 == 1)
{
var8 = var6 | 32;
}
else if (var7 == 2)
{
var8 = var6 | 64;
}
}
List var9 = PotionHelper.getPotionEffects(var8, false);
if (var9 != null && !var9.isEmpty())
{
field_77835_b.put(var9, Integer.valueOf(var8));
}
}
}
}
}
Iterator var10 = field_77835_b.values().iterator();
while (var10.hasNext())
{
var5 = ((Integer)var10.next()).intValue();
subItems.add(new ItemStack(itemIn, 1, var5));
}
}
}