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 }