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.Collection;
007 import java.util.HashMap;
008 import java.util.Iterator;
009 import java.util.List;
010
011 public class PotionHelper
012 {
013 public static final String field_77924_a = null;
014 public static final String sugarEffect;
015 public static final String ghastTearEffect = "+0-1-2-3&4-4+13";
016 public static final String spiderEyeEffect;
017 public static final String fermentedSpiderEyeEffect;
018 public static final String speckledMelonEffect;
019 public static final String blazePowderEffect;
020 public static final String magmaCreamEffect;
021 public static final String redstoneEffect;
022 public static final String glowstoneEffect;
023 public static final String gunpowderEffect;
024 private static final HashMap potionRequirements = new HashMap();
025 private static final HashMap field_77928_m = new HashMap();
026 private static final HashMap field_77925_n;
027
028 /** An array of possible potion prefix names, as translation IDs. */
029 private static final String[] potionPrefixes;
030
031 /**
032 * Is the bit given set to 1?
033 */
034 public static boolean checkFlag(int par0, int par1)
035 {
036 return (par0 & 1 << par1) != 0;
037 }
038
039 /**
040 * Returns 1 if the flag is set, 0 if it is not set.
041 */
042 private static int isFlagSet(int par0, int par1)
043 {
044 return checkFlag(par0, par1) ? 1 : 0;
045 }
046
047 /**
048 * Returns 0 if the flag is set, 1 if it is not set.
049 */
050 private static int isFlagUnset(int par0, int par1)
051 {
052 return checkFlag(par0, par1) ? 0 : 1;
053 }
054
055 @SideOnly(Side.CLIENT)
056 public static int func_77909_a(int par0)
057 {
058 return func_77908_a(par0, 5, 4, 3, 2, 1);
059 }
060
061 /**
062 * Given a {@link Collection}<{@link PotionEffect}> will return an Integer color.
063 */
064 public static int calcPotionLiquidColor(Collection par0Collection)
065 {
066 int var1 = 3694022;
067
068 if (par0Collection != null && !par0Collection.isEmpty())
069 {
070 float var2 = 0.0F;
071 float var3 = 0.0F;
072 float var4 = 0.0F;
073 float var5 = 0.0F;
074 Iterator var6 = par0Collection.iterator();
075
076 while (var6.hasNext())
077 {
078 PotionEffect var7 = (PotionEffect)var6.next();
079 int var8 = Potion.potionTypes[var7.getPotionID()].getLiquidColor();
080
081 for (int var9 = 0; var9 <= var7.getAmplifier(); ++var9)
082 {
083 var2 += (float)(var8 >> 16 & 255) / 255.0F;
084 var3 += (float)(var8 >> 8 & 255) / 255.0F;
085 var4 += (float)(var8 >> 0 & 255) / 255.0F;
086 ++var5;
087 }
088 }
089
090 var2 = var2 / var5 * 255.0F;
091 var3 = var3 / var5 * 255.0F;
092 var4 = var4 / var5 * 255.0F;
093 return (int)var2 << 16 | (int)var3 << 8 | (int)var4;
094 }
095 else
096 {
097 return var1;
098 }
099 }
100
101 @SideOnly(Side.CLIENT)
102 public static int func_77915_a(int par0, boolean par1)
103 {
104 if (!par1)
105 {
106 if (field_77925_n.containsKey(Integer.valueOf(par0)))
107 {
108 return ((Integer)field_77925_n.get(Integer.valueOf(par0))).intValue();
109 }
110 else
111 {
112 int var2 = calcPotionLiquidColor(getPotionEffects(par0, false));
113 field_77925_n.put(Integer.valueOf(par0), Integer.valueOf(var2));
114 return var2;
115 }
116 }
117 else
118 {
119 return calcPotionLiquidColor(getPotionEffects(par0, par1));
120 }
121 }
122
123 private static int func_77904_a(boolean par0, boolean par1, boolean par2, int par3, int par4, int par5, int par6)
124 {
125 int var7 = 0;
126
127 if (par0)
128 {
129 var7 = isFlagUnset(par6, par4);
130 }
131 else if (par3 != -1)
132 {
133 if (par3 == 0 && countSetFlags(par6) == par4)
134 {
135 var7 = 1;
136 }
137 else if (par3 == 1 && countSetFlags(par6) > par4)
138 {
139 var7 = 1;
140 }
141 else if (par3 == 2 && countSetFlags(par6) < par4)
142 {
143 var7 = 1;
144 }
145 }
146 else
147 {
148 var7 = isFlagSet(par6, par4);
149 }
150
151 if (par1)
152 {
153 var7 *= par5;
154 }
155
156 if (par2)
157 {
158 var7 *= -1;
159 }
160
161 return var7;
162 }
163
164 @SideOnly(Side.CLIENT)
165 public static String func_77905_c(int par0)
166 {
167 int var1 = func_77909_a(par0);
168 return potionPrefixes[var1];
169 }
170
171 /**
172 * Count the number of bits in an integer set to ON.
173 */
174 private static int countSetFlags(int par0)
175 {
176 int var1;
177
178 for (var1 = 0; par0 > 0; ++var1)
179 {
180 par0 &= par0 - 1;
181 }
182
183 return var1;
184 }
185
186 private static int parsePotionEffects(String par0Str, int par1, int par2, int par3)
187 {
188 if (par1 < par0Str.length() && par2 >= 0 && par1 < par2)
189 {
190 int var4 = par0Str.indexOf(124, par1);
191 int var5;
192 int var17;
193
194 if (var4 >= 0 && var4 < par2)
195 {
196 var5 = parsePotionEffects(par0Str, par1, var4 - 1, par3);
197
198 if (var5 > 0)
199 {
200 return var5;
201 }
202 else
203 {
204 var17 = parsePotionEffects(par0Str, var4 + 1, par2, par3);
205 return var17 > 0 ? var17 : 0;
206 }
207 }
208 else
209 {
210 var5 = par0Str.indexOf(38, par1);
211
212 if (var5 >= 0 && var5 < par2)
213 {
214 var17 = parsePotionEffects(par0Str, par1, var5 - 1, par3);
215
216 if (var17 <= 0)
217 {
218 return 0;
219 }
220 else
221 {
222 int var18 = parsePotionEffects(par0Str, var5 + 1, par2, par3);
223 return var18 <= 0 ? 0 : (var17 > var18 ? var17 : var18);
224 }
225 }
226 else
227 {
228 boolean var6 = false;
229 boolean var7 = false;
230 boolean var8 = false;
231 boolean var9 = false;
232 boolean var10 = false;
233 byte var11 = -1;
234 int var12 = 0;
235 int var13 = 0;
236 int var14 = 0;
237
238 for (int var15 = par1; var15 < par2; ++var15)
239 {
240 char var16 = par0Str.charAt(var15);
241
242 if (var16 >= 48 && var16 <= 57)
243 {
244 if (var6)
245 {
246 var13 = var16 - 48;
247 var7 = true;
248 }
249 else
250 {
251 var12 *= 10;
252 var12 += var16 - 48;
253 var8 = true;
254 }
255 }
256 else if (var16 == 42)
257 {
258 var6 = true;
259 }
260 else if (var16 == 33)
261 {
262 if (var8)
263 {
264 var14 += func_77904_a(var9, var7, var10, var11, var12, var13, par3);
265 var9 = false;
266 var10 = false;
267 var6 = false;
268 var7 = false;
269 var8 = false;
270 var13 = 0;
271 var12 = 0;
272 var11 = -1;
273 }
274
275 var9 = true;
276 }
277 else if (var16 == 45)
278 {
279 if (var8)
280 {
281 var14 += func_77904_a(var9, var7, var10, var11, var12, var13, par3);
282 var9 = false;
283 var10 = false;
284 var6 = false;
285 var7 = false;
286 var8 = false;
287 var13 = 0;
288 var12 = 0;
289 var11 = -1;
290 }
291
292 var10 = true;
293 }
294 else if (var16 != 61 && var16 != 60 && var16 != 62)
295 {
296 if (var16 == 43 && var8)
297 {
298 var14 += func_77904_a(var9, var7, var10, var11, var12, var13, par3);
299 var9 = false;
300 var10 = false;
301 var6 = false;
302 var7 = false;
303 var8 = false;
304 var13 = 0;
305 var12 = 0;
306 var11 = -1;
307 }
308 }
309 else
310 {
311 if (var8)
312 {
313 var14 += func_77904_a(var9, var7, var10, var11, var12, var13, par3);
314 var9 = false;
315 var10 = false;
316 var6 = false;
317 var7 = false;
318 var8 = false;
319 var13 = 0;
320 var12 = 0;
321 var11 = -1;
322 }
323
324 if (var16 == 61)
325 {
326 var11 = 0;
327 }
328 else if (var16 == 60)
329 {
330 var11 = 2;
331 }
332 else if (var16 == 62)
333 {
334 var11 = 1;
335 }
336 }
337 }
338
339 if (var8)
340 {
341 var14 += func_77904_a(var9, var7, var10, var11, var12, var13, par3);
342 }
343
344 return var14;
345 }
346 }
347 }
348 else
349 {
350 return 0;
351 }
352 }
353
354 /**
355 * Returns a list of effects for the specified potion damage value.
356 */
357 public static List getPotionEffects(int par0, boolean par1)
358 {
359 ArrayList var2 = null;
360 Potion[] var3 = Potion.potionTypes;
361 int var4 = var3.length;
362
363 for (int var5 = 0; var5 < var4; ++var5)
364 {
365 Potion var6 = var3[var5];
366
367 if (var6 != null && (!var6.isUsable() || par1))
368 {
369 String var7 = (String)potionRequirements.get(Integer.valueOf(var6.getId()));
370
371 if (var7 != null)
372 {
373 int var8 = parsePotionEffects(var7, 0, var7.length(), par0);
374
375 if (var8 > 0)
376 {
377 int var9 = 0;
378 String var10 = (String)field_77928_m.get(Integer.valueOf(var6.getId()));
379
380 if (var10 != null)
381 {
382 var9 = parsePotionEffects(var10, 0, var10.length(), par0);
383
384 if (var9 < 0)
385 {
386 var9 = 0;
387 }
388 }
389
390 if (var6.isInstant())
391 {
392 var8 = 1;
393 }
394 else
395 {
396 var8 = 1200 * (var8 * 3 + (var8 - 1) * 2);
397 var8 >>= var9;
398 var8 = (int)Math.round((double)var8 * var6.getEffectiveness());
399
400 if ((par0 & 16384) != 0)
401 {
402 var8 = (int)Math.round((double)var8 * 0.75D + 0.5D);
403 }
404 }
405
406 if (var2 == null)
407 {
408 var2 = new ArrayList();
409 }
410
411 var2.add(new PotionEffect(var6.getId(), var8, var9));
412 }
413 }
414 }
415 }
416
417 return var2;
418 }
419
420 /**
421 * Does bit operations for brewPotionData, given data, the index of the bit being operated upon, whether the bit
422 * will be removed, whether the bit will be toggled (NOT), or whether the data field will be set to 0 if the bit is
423 * not present.
424 */
425 private static int brewBitOperations(int par0, int par1, boolean par2, boolean par3, boolean par4)
426 {
427 if (par4)
428 {
429 if (!checkFlag(par0, par1))
430 {
431 return 0;
432 }
433 }
434 else if (par2)
435 {
436 par0 &= ~(1 << par1);
437 }
438 else if (par3)
439 {
440 if ((par0 & 1 << par1) == 0)
441 {
442 par0 |= 1 << par1;
443 }
444 else
445 {
446 par0 &= ~(1 << par1);
447 }
448 }
449 else
450 {
451 par0 |= 1 << par1;
452 }
453
454 return par0;
455 }
456
457 /**
458 * Generate a data value for a potion, given its previous data value and the encoded string of new effects it will
459 * receive
460 */
461 public static int applyIngredient(int par0, String par1Str)
462 {
463 byte var2 = 0;
464 int var3 = par1Str.length();
465 boolean var4 = false;
466 boolean var5 = false;
467 boolean var6 = false;
468 boolean var7 = false;
469 int var8 = 0;
470
471 for (int var9 = var2; var9 < var3; ++var9)
472 {
473 char var10 = par1Str.charAt(var9);
474
475 if (var10 >= 48 && var10 <= 57)
476 {
477 var8 *= 10;
478 var8 += var10 - 48;
479 var4 = true;
480 }
481 else if (var10 == 33)
482 {
483 if (var4)
484 {
485 par0 = brewBitOperations(par0, var8, var6, var5, var7);
486 var7 = false;
487 var5 = false;
488 var6 = false;
489 var4 = false;
490 var8 = 0;
491 }
492
493 var5 = true;
494 }
495 else if (var10 == 45)
496 {
497 if (var4)
498 {
499 par0 = brewBitOperations(par0, var8, var6, var5, var7);
500 var7 = false;
501 var5 = false;
502 var6 = false;
503 var4 = false;
504 var8 = 0;
505 }
506
507 var6 = true;
508 }
509 else if (var10 == 43)
510 {
511 if (var4)
512 {
513 par0 = brewBitOperations(par0, var8, var6, var5, var7);
514 var7 = false;
515 var5 = false;
516 var6 = false;
517 var4 = false;
518 var8 = 0;
519 }
520 }
521 else if (var10 == 38)
522 {
523 if (var4)
524 {
525 par0 = brewBitOperations(par0, var8, var6, var5, var7);
526 var7 = false;
527 var5 = false;
528 var6 = false;
529 var4 = false;
530 var8 = 0;
531 }
532
533 var7 = true;
534 }
535 }
536
537 if (var4)
538 {
539 par0 = brewBitOperations(par0, var8, var6, var5, var7);
540 }
541
542 return par0 & 32767;
543 }
544
545 @SideOnly(Side.CLIENT)
546 public static int func_77908_a(int par0, int par1, int par2, int par3, int par4, int par5)
547 {
548 return (checkFlag(par0, par1) ? 16 : 0) | (checkFlag(par0, par2) ? 8 : 0) | (checkFlag(par0, par3) ? 4 : 0) | (checkFlag(par0, par4) ? 2 : 0) | (checkFlag(par0, par5) ? 1 : 0);
549 }
550
551 static
552 {
553 potionRequirements.put(Integer.valueOf(Potion.regeneration.getId()), "0 & !1 & !2 & !3 & 0+6");
554 sugarEffect = "-0+1-2-3&4-4+13";
555 potionRequirements.put(Integer.valueOf(Potion.moveSpeed.getId()), "!0 & 1 & !2 & !3 & 1+6");
556 magmaCreamEffect = "+0+1-2-3&4-4+13";
557 potionRequirements.put(Integer.valueOf(Potion.fireResistance.getId()), "0 & 1 & !2 & !3 & 0+6");
558 speckledMelonEffect = "+0-1+2-3&4-4+13";
559 potionRequirements.put(Integer.valueOf(Potion.heal.getId()), "0 & !1 & 2 & !3");
560 spiderEyeEffect = "-0-1+2-3&4-4+13";
561 potionRequirements.put(Integer.valueOf(Potion.poison.getId()), "!0 & !1 & 2 & !3 & 2+6");
562 fermentedSpiderEyeEffect = "-0+3-4+13";
563 potionRequirements.put(Integer.valueOf(Potion.weakness.getId()), "!0 & !1 & !2 & 3 & 3+6");
564 potionRequirements.put(Integer.valueOf(Potion.harm.getId()), "!0 & !1 & 2 & 3");
565 potionRequirements.put(Integer.valueOf(Potion.moveSlowdown.getId()), "!0 & 1 & !2 & 3 & 3+6");
566 blazePowderEffect = "+0-1-2+3&4-4+13";
567 potionRequirements.put(Integer.valueOf(Potion.damageBoost.getId()), "0 & !1 & !2 & 3 & 3+6");
568 glowstoneEffect = "+5-6-7";
569 field_77928_m.put(Integer.valueOf(Potion.moveSpeed.getId()), "5");
570 field_77928_m.put(Integer.valueOf(Potion.digSpeed.getId()), "5");
571 field_77928_m.put(Integer.valueOf(Potion.damageBoost.getId()), "5");
572 field_77928_m.put(Integer.valueOf(Potion.regeneration.getId()), "5");
573 field_77928_m.put(Integer.valueOf(Potion.harm.getId()), "5");
574 field_77928_m.put(Integer.valueOf(Potion.heal.getId()), "5");
575 field_77928_m.put(Integer.valueOf(Potion.resistance.getId()), "5");
576 field_77928_m.put(Integer.valueOf(Potion.poison.getId()), "5");
577 redstoneEffect = "-5+6-7";
578 gunpowderEffect = "+14&13-13";
579 field_77925_n = new HashMap();
580 potionPrefixes = new String[] {"potion.prefix.mundane", "potion.prefix.uninteresting", "potion.prefix.bland", "potion.prefix.clear", "potion.prefix.milky", "potion.prefix.diffuse", "potion.prefix.artless", "potion.prefix.thin", "potion.prefix.awkward", "potion.prefix.flat", "potion.prefix.bulky", "potion.prefix.bungling", "potion.prefix.buttered", "potion.prefix.smooth", "potion.prefix.suave", "potion.prefix.debonair", "potion.prefix.thick", "potion.prefix.elegant", "potion.prefix.fancy", "potion.prefix.charming", "potion.prefix.dashing", "potion.prefix.refined", "potion.prefix.cordial", "potion.prefix.sparkling", "potion.prefix.potent", "potion.prefix.foul", "potion.prefix.odorless", "potion.prefix.rank", "potion.prefix.harsh", "potion.prefix.acrid", "potion.prefix.gross", "potion.prefix.stinky"};
581 }
582 }