package net.minecraft.item; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityPotion; 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.util.EnumChatFormatting; import net.minecraft.util.Icon; import net.minecraft.util.StatCollector; import net.minecraft.world.World; public class ItemPotion extends Item { /** maps potion damage values to lists of effect names */ private HashMap effectCache = new HashMap(); private static final Map field_77835_b = new LinkedHashMap(); @SideOnly(Side.CLIENT) private Icon field_94591_c; @SideOnly(Side.CLIENT) private Icon field_94590_d; @SideOnly(Side.CLIENT) private Icon field_94592_ct; public ItemPotion(int par1) { super(par1); 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 par1ItemStack) { if (par1ItemStack.hasTagCompound() && par1ItemStack.getTagCompound().hasKey("CustomPotionEffects")) { ArrayList arraylist = new ArrayList(); NBTTagList nbttaglist = par1ItemStack.getTagCompound().getTagList("CustomPotionEffects"); for (int i = 0; i < nbttaglist.tagCount(); ++i) { NBTTagCompound nbttagcompound = (NBTTagCompound)nbttaglist.tagAt(i); arraylist.add(PotionEffect.readCustomPotionEffectFromNBT(nbttagcompound)); } return arraylist; } else { List list = (List)this.effectCache.get(Integer.valueOf(par1ItemStack.getItemDamage())); if (list == null) { list = PotionHelper.getPotionEffects(par1ItemStack.getItemDamage(), false); this.effectCache.put(Integer.valueOf(par1ItemStack.getItemDamage()), list); } return list; } } /** * Returns a list of effects for the specified potion damage value. */ public List getEffects(int par1) { List list = (List)this.effectCache.get(Integer.valueOf(par1)); if (list == null) { list = PotionHelper.getPotionEffects(par1, false); this.effectCache.put(Integer.valueOf(par1), list); } return list; } public ItemStack onEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { if (!par3EntityPlayer.capabilities.isCreativeMode) { --par1ItemStack.stackSize; } if (!par2World.isRemote) { List list = this.getEffects(par1ItemStack); if (list != null) { Iterator iterator = list.iterator(); while (iterator.hasNext()) { PotionEffect potioneffect = (PotionEffect)iterator.next(); par3EntityPlayer.addPotionEffect(new PotionEffect(potioneffect)); } } } if (!par3EntityPlayer.capabilities.isCreativeMode) { if (par1ItemStack.stackSize <= 0) { return new ItemStack(Item.glassBottle); } par3EntityPlayer.inventory.addItemStackToInventory(new ItemStack(Item.glassBottle)); } return par1ItemStack; } /** * How long it takes to use or consume an item */ public int getMaxItemUseDuration(ItemStack par1ItemStack) { return 32; } /** * returns the action that specifies what animation to play when the items is being used */ public EnumAction getItemUseAction(ItemStack par1ItemStack) { return EnumAction.drink; } /** * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer */ public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { if (isSplash(par1ItemStack.getItemDamage())) { if (!par3EntityPlayer.capabilities.isCreativeMode) { --par1ItemStack.stackSize; } par2World.playSoundAtEntity(par3EntityPlayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); if (!par2World.isRemote) { par2World.spawnEntityInWorld(new EntityPotion(par2World, par3EntityPlayer, par1ItemStack)); } return par1ItemStack; } else { par3EntityPlayer.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack)); return par1ItemStack; } } /** * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return * True if something happen and false if it don't. This is for ITEMS, not BLOCKS */ public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) { return false; } @SideOnly(Side.CLIENT) /** * Gets an icon index based on an item's damage value */ public Icon getIconFromDamage(int par1) { return isSplash(par1) ? this.field_94591_c : this.field_94590_d; } @SideOnly(Side.CLIENT) /** * Gets an icon index based on an item's damage value and the given render pass */ public Icon getIconFromDamageForRenderPass(int par1, int par2) { return par2 == 0 ? this.field_94592_ct : super.getIconFromDamageForRenderPass(par1, par2); } /** * returns wether or not a potion is a throwable splash potion based on damage value */ public static boolean isSplash(int par0) { return (par0 & 16384) != 0; } @SideOnly(Side.CLIENT) public int getColorFromDamage(int par1) { return PotionHelper.func_77915_a(par1, false); } @SideOnly(Side.CLIENT) public int getColorFromItemStack(ItemStack par1ItemStack, int par2) { return par2 > 0 ? 16777215 : this.getColorFromDamage(par1ItemStack.getItemDamage()); } @SideOnly(Side.CLIENT) public boolean requiresMultipleRenderPasses() { return true; } @SideOnly(Side.CLIENT) public boolean isEffectInstant(int par1) { List list = this.getEffects(par1); if (list != null && !list.isEmpty()) { Iterator iterator = list.iterator(); PotionEffect potioneffect; do { if (!iterator.hasNext()) { return false; } potioneffect = (PotionEffect)iterator.next(); } while (!Potion.potionTypes[potioneffect.getPotionID()].isInstant()); return true; } else { return false; } } public String getItemDisplayName(ItemStack par1ItemStack) { if (par1ItemStack.getItemDamage() == 0) { return StatCollector.translateToLocal("item.emptyPotion.name").trim(); } else { String s = ""; if (isSplash(par1ItemStack.getItemDamage())) { s = StatCollector.translateToLocal("potion.prefix.grenade").trim() + " "; } List list = Item.potion.getEffects(par1ItemStack); String s1; if (list != null && !list.isEmpty()) { s1 = ((PotionEffect)list.get(0)).getEffectName(); s1 = s1 + ".postfix"; return s + StatCollector.translateToLocal(s1).trim(); } else { s1 = PotionHelper.func_77905_c(par1ItemStack.getItemDamage()); return StatCollector.translateToLocal(s1).trim() + " " + super.getItemDisplayName(par1ItemStack); } } } @SideOnly(Side.CLIENT) /** * allows items to add custom lines of information to the mouseover description */ public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { if (par1ItemStack.getItemDamage() != 0) { List list1 = Item.potion.getEffects(par1ItemStack); if (list1 != null && !list1.isEmpty()) { Iterator iterator = list1.iterator(); while (iterator.hasNext()) { PotionEffect potioneffect = (PotionEffect)iterator.next(); String s = StatCollector.translateToLocal(potioneffect.getEffectName()).trim(); if (potioneffect.getAmplifier() > 0) { s = s + " " + StatCollector.translateToLocal("potion.potency." + potioneffect.getAmplifier()).trim(); } if (potioneffect.getDuration() > 20) { s = s + " (" + Potion.getDurationString(potioneffect) + ")"; } if (Potion.potionTypes[potioneffect.getPotionID()].isBadEffect()) { par3List.add(EnumChatFormatting.RED + s); } else { par3List.add(EnumChatFormatting.GRAY + s); } } } else { String s1 = StatCollector.translateToLocal("potion.empty").trim(); par3List.add(EnumChatFormatting.GRAY + s1); } } } @SideOnly(Side.CLIENT) public boolean hasEffect(ItemStack par1ItemStack) { List list = this.getEffects(par1ItemStack); return list != null && !list.isEmpty(); } @SideOnly(Side.CLIENT) /** * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) */ public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List) { super.getSubItems(par1, par2CreativeTabs, par3List); int j; if (field_77835_b.isEmpty()) { for (int k = 0; k <= 15; ++k) { for (j = 0; j <= 1; ++j) { int l; if (j == 0) { l = k | 8192; } else { l = k | 16384; } for (int i1 = 0; i1 <= 2; ++i1) { int j1 = l; if (i1 != 0) { if (i1 == 1) { j1 = l | 32; } else if (i1 == 2) { j1 = l | 64; } } List list1 = PotionHelper.getPotionEffects(j1, false); if (list1 != null && !list1.isEmpty()) { field_77835_b.put(list1, Integer.valueOf(j1)); } } } } } Iterator iterator = field_77835_b.values().iterator(); while (iterator.hasNext()) { j = ((Integer)iterator.next()).intValue(); par3List.add(new ItemStack(par1, 1, j)); } } @SideOnly(Side.CLIENT) public void registerIcons(IconRegister par1IconRegister) { this.field_94590_d = par1IconRegister.registerIcon("potion"); this.field_94591_c = par1IconRegister.registerIcon("potion_splash"); this.field_94592_ct = par1IconRegister.registerIcon("potion_contents"); } @SideOnly(Side.CLIENT) public static Icon func_94589_d(String par0Str) { return par0Str == "potion" ? Item.potion.field_94590_d : (par0Str == "potion_splash" ? Item.potion.field_94591_c : (par0Str == "potion_contents" ? Item.potion.field_94592_ct : null)); } }