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    }