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