001 package net.minecraft.src; 002 003 import cpw.mods.fml.common.Side; 004 import cpw.mods.fml.common.asm.SideOnly; 005 import java.util.ArrayList; 006 import java.util.HashMap; 007 import java.util.Iterator; 008 import java.util.LinkedHashMap; 009 import java.util.List; 010 import java.util.Map; 011 012 public class ItemPotion extends Item 013 { 014 /** maps potion damage values to lists of effect names */ 015 private HashMap effectCache = new HashMap(); 016 private static final Map field_77835_b = new LinkedHashMap(); 017 018 public ItemPotion(int par1) 019 { 020 super(par1); 021 this.setMaxStackSize(1); 022 this.setHasSubtypes(true); 023 this.setMaxDamage(0); 024 this.setCreativeTab(CreativeTabs.tabBrewing); 025 } 026 027 /** 028 * Returns a list of potion effects for the specified itemstack. 029 */ 030 public List getEffects(ItemStack par1ItemStack) 031 { 032 if (par1ItemStack.hasTagCompound() && par1ItemStack.getTagCompound().hasKey("CustomPotionEffects")) 033 { 034 ArrayList var6 = new ArrayList(); 035 NBTTagList var3 = par1ItemStack.getTagCompound().getTagList("CustomPotionEffects"); 036 037 for (int var4 = 0; var4 < var3.tagCount(); ++var4) 038 { 039 NBTTagCompound var5 = (NBTTagCompound)var3.tagAt(var4); 040 var6.add(PotionEffect.readCustomPotionEffectFromNBT(var5)); 041 } 042 043 return var6; 044 } 045 else 046 { 047 List var2 = (List)this.effectCache.get(Integer.valueOf(par1ItemStack.getItemDamage())); 048 049 if (var2 == null) 050 { 051 var2 = PotionHelper.getPotionEffects(par1ItemStack.getItemDamage(), false); 052 this.effectCache.put(Integer.valueOf(par1ItemStack.getItemDamage()), var2); 053 } 054 055 return var2; 056 } 057 } 058 059 /** 060 * Returns a list of effects for the specified potion damage value. 061 */ 062 public List getEffects(int par1) 063 { 064 List var2 = (List)this.effectCache.get(Integer.valueOf(par1)); 065 066 if (var2 == null) 067 { 068 var2 = PotionHelper.getPotionEffects(par1, false); 069 this.effectCache.put(Integer.valueOf(par1), var2); 070 } 071 072 return var2; 073 } 074 075 public ItemStack onFoodEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) 076 { 077 if (!par3EntityPlayer.capabilities.isCreativeMode) 078 { 079 --par1ItemStack.stackSize; 080 } 081 082 if (!par2World.isRemote) 083 { 084 List var4 = this.getEffects(par1ItemStack); 085 086 if (var4 != null) 087 { 088 Iterator var5 = var4.iterator(); 089 090 while (var5.hasNext()) 091 { 092 PotionEffect var6 = (PotionEffect)var5.next(); 093 par3EntityPlayer.addPotionEffect(new PotionEffect(var6)); 094 } 095 } 096 } 097 098 if (!par3EntityPlayer.capabilities.isCreativeMode) 099 { 100 if (par1ItemStack.stackSize <= 0) 101 { 102 return new ItemStack(Item.glassBottle); 103 } 104 105 par3EntityPlayer.inventory.addItemStackToInventory(new ItemStack(Item.glassBottle)); 106 } 107 108 return par1ItemStack; 109 } 110 111 /** 112 * How long it takes to use or consume an item 113 */ 114 public int getMaxItemUseDuration(ItemStack par1ItemStack) 115 { 116 return 32; 117 } 118 119 /** 120 * returns the action that specifies what animation to play when the items is being used 121 */ 122 public EnumAction getItemUseAction(ItemStack par1ItemStack) 123 { 124 return EnumAction.drink; 125 } 126 127 /** 128 * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer 129 */ 130 public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) 131 { 132 if (isSplash(par1ItemStack.getItemDamage())) 133 { 134 if (!par3EntityPlayer.capabilities.isCreativeMode) 135 { 136 --par1ItemStack.stackSize; 137 } 138 139 par2World.playSoundAtEntity(par3EntityPlayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); 140 141 if (!par2World.isRemote) 142 { 143 par2World.spawnEntityInWorld(new EntityPotion(par2World, par3EntityPlayer, par1ItemStack)); 144 } 145 146 return par1ItemStack; 147 } 148 else 149 { 150 par3EntityPlayer.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack)); 151 return par1ItemStack; 152 } 153 } 154 155 /** 156 * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return 157 * True if something happen and false if it don't. This is for ITEMS, not BLOCKS 158 */ 159 public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) 160 { 161 return false; 162 } 163 164 @SideOnly(Side.CLIENT) 165 166 /** 167 * Gets an icon index based on an item's damage value 168 */ 169 public int getIconFromDamage(int par1) 170 { 171 return isSplash(par1) ? 154 : 140; 172 } 173 174 @SideOnly(Side.CLIENT) 175 176 /** 177 * Gets an icon index based on an item's damage value and the given render pass 178 */ 179 public int getIconFromDamageForRenderPass(int par1, int par2) 180 { 181 return par2 == 0 ? 141 : super.getIconFromDamageForRenderPass(par1, par2); 182 } 183 184 /** 185 * returns wether or not a potion is a throwable splash potion based on damage value 186 */ 187 public static boolean isSplash(int par0) 188 { 189 return (par0 & 16384) != 0; 190 } 191 192 @SideOnly(Side.CLIENT) 193 public int getColorFromDamage(int par1) 194 { 195 return PotionHelper.func_77915_a(par1, false); 196 } 197 198 @SideOnly(Side.CLIENT) 199 public int getColorFromItemStack(ItemStack par1ItemStack, int par2) 200 { 201 return par2 > 0 ? 16777215 : this.getColorFromDamage(par1ItemStack.getItemDamage()); 202 } 203 204 @SideOnly(Side.CLIENT) 205 public boolean requiresMultipleRenderPasses() 206 { 207 return true; 208 } 209 210 @SideOnly(Side.CLIENT) 211 public boolean isEffectInstant(int par1) 212 { 213 List var2 = this.getEffects(par1); 214 215 if (var2 != null && !var2.isEmpty()) 216 { 217 Iterator var3 = var2.iterator(); 218 PotionEffect var4; 219 220 do 221 { 222 if (!var3.hasNext()) 223 { 224 return false; 225 } 226 227 var4 = (PotionEffect)var3.next(); 228 } 229 while (!Potion.potionTypes[var4.getPotionID()].isInstant()); 230 231 return true; 232 } 233 else 234 { 235 return false; 236 } 237 } 238 239 public String getItemDisplayName(ItemStack par1ItemStack) 240 { 241 if (par1ItemStack.getItemDamage() == 0) 242 { 243 return StatCollector.translateToLocal("item.emptyPotion.name").trim(); 244 } 245 else 246 { 247 String var2 = ""; 248 249 if (isSplash(par1ItemStack.getItemDamage())) 250 { 251 var2 = StatCollector.translateToLocal("potion.prefix.grenade").trim() + " "; 252 } 253 254 List var3 = Item.potion.getEffects(par1ItemStack); 255 String var4; 256 257 if (var3 != null && !var3.isEmpty()) 258 { 259 var4 = ((PotionEffect)var3.get(0)).getEffectName(); 260 var4 = var4 + ".postfix"; 261 return var2 + StatCollector.translateToLocal(var4).trim(); 262 } 263 else 264 { 265 var4 = PotionHelper.func_77905_c(par1ItemStack.getItemDamage()); 266 return StatCollector.translateToLocal(var4).trim() + " " + super.getItemDisplayName(par1ItemStack); 267 } 268 } 269 } 270 271 @SideOnly(Side.CLIENT) 272 273 /** 274 * allows items to add custom lines of information to the mouseover description 275 */ 276 public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) 277 { 278 if (par1ItemStack.getItemDamage() != 0) 279 { 280 List var5 = Item.potion.getEffects(par1ItemStack); 281 282 if (var5 != null && !var5.isEmpty()) 283 { 284 Iterator var9 = var5.iterator(); 285 286 while (var9.hasNext()) 287 { 288 PotionEffect var7 = (PotionEffect)var9.next(); 289 String var8 = StatCollector.translateToLocal(var7.getEffectName()).trim(); 290 291 if (var7.getAmplifier() > 0) 292 { 293 var8 = var8 + " " + StatCollector.translateToLocal("potion.potency." + var7.getAmplifier()).trim(); 294 } 295 296 if (var7.getDuration() > 20) 297 { 298 var8 = var8 + " (" + Potion.getDurationString(var7) + ")"; 299 } 300 301 if (Potion.potionTypes[var7.getPotionID()].isBadEffect()) 302 { 303 par3List.add("\u00a7c" + var8); 304 } 305 else 306 { 307 par3List.add("\u00a77" + var8); 308 } 309 } 310 } 311 else 312 { 313 String var6 = StatCollector.translateToLocal("potion.empty").trim(); 314 par3List.add("\u00a77" + var6); 315 } 316 } 317 } 318 319 @SideOnly(Side.CLIENT) 320 public boolean hasEffect(ItemStack par1ItemStack) 321 { 322 List var2 = this.getEffects(par1ItemStack); 323 return var2 != null && !var2.isEmpty(); 324 } 325 326 @SideOnly(Side.CLIENT) 327 328 /** 329 * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) 330 */ 331 public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List) 332 { 333 super.getSubItems(par1, par2CreativeTabs, par3List); 334 335 if (field_77835_b.isEmpty()) 336 { 337 for (int var4 = 0; var4 <= 32767; ++var4) 338 { 339 List var5 = PotionHelper.getPotionEffects(var4, false); 340 341 if (var5 != null && !var5.isEmpty()) 342 { 343 field_77835_b.put(var5, Integer.valueOf(var4)); 344 } 345 } 346 } 347 348 Iterator var6 = field_77835_b.values().iterator(); 349 350 while (var6.hasNext()) 351 { 352 int var7 = ((Integer)var6.next()).intValue(); 353 par3List.add(new ItemStack(par1, 1, var7)); 354 } 355 } 356 }