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