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 }