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