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    }