    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.HashMap;
    007    import java.util.Iterator;
    008    import java.util.LinkedHashMap;
    009    import java.util.List;
    010    import java.util.Map;
    011
    012    public class ItemPotion extends Item
    013    {
    014        /** maps potion damage values to lists of effect names */
    015        private HashMap effectCache = new HashMap();
    016        private static final Map field_77835_b = new LinkedHashMap();
    017
    018        public ItemPotion(int par1)
    019        {
    020            super(par1);
    021            this.setMaxStackSize(1);
    022            this.setHasSubtypes(true);
    023            this.setMaxDamage(0);
    024            this.setCreativeTab(CreativeTabs.tabBrewing);
    025        }
    026
    027        /**
    028         * Returns a list of potion effects for the specified itemstack.
    029         */
    030        public List getEffects(ItemStack par1ItemStack)
    031        {
    032            if (par1ItemStack.hasTagCompound() && par1ItemStack.getTagCompound().hasKey("CustomPotionEffects"))
    033            {
    034                ArrayList var6 = new ArrayList();
    035                NBTTagList var3 = par1ItemStack.getTagCompound().getTagList("CustomPotionEffects");
    036
    037                for (int var4 = 0; var4 < var3.tagCount(); ++var4)
    038                {
    039                    NBTTagCompound var5 = (NBTTagCompound)var3.tagAt(var4);
    040                    var6.add(PotionEffect.readCustomPotionEffectFromNBT(var5));
    041                }
    042
    043                return var6;
    044            }
    045            else
    046            {
    047                List var2 = (List)this.effectCache.get(Integer.valueOf(par1ItemStack.getItemDamage()));
    048
    049                if (var2 == null)
    050                {
    051                    var2 = PotionHelper.getPotionEffects(par1ItemStack.getItemDamage(), false);
    052                    this.effectCache.put(Integer.valueOf(par1ItemStack.getItemDamage()), var2);
    053                }
    054
    055                return var2;
    056            }
    057        }
    058
    059        /**
    060         * Returns a list of effects for the specified potion damage value.
    061         */
    062        public List getEffects(int par1)
    063        {
    064            List var2 = (List)this.effectCache.get(Integer.valueOf(par1));
    065
    066            if (var2 == null)
    067            {
    068                var2 = PotionHelper.getPotionEffects(par1, false);
    069                this.effectCache.put(Integer.valueOf(par1), var2);
    070            }
    071
    072            return var2;
    073        }
    074
    075        public ItemStack onFoodEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
    076        {
    077            if (!par3EntityPlayer.capabilities.isCreativeMode)
    078            {
    079                --par1ItemStack.stackSize;
    080            }
    081
    082            if (!par2World.isRemote)
    083            {
    084                List var4 = this.getEffects(par1ItemStack);
    085
    086                if (var4 != null)
    087                {
    088                    Iterator var5 = var4.iterator();
    089
    090                    while (var5.hasNext())
    091                    {
    092                        PotionEffect var6 = (PotionEffect)var5.next();
    093                        par3EntityPlayer.addPotionEffect(new PotionEffect(var6));
    094                    }
    095                }
    096            }
    097
    098            if (!par3EntityPlayer.capabilities.isCreativeMode)
    099            {
    100                if (par1ItemStack.stackSize <= 0)
    101                {
    102                    return new ItemStack(Item.glassBottle);
    103                }
    104
    105                par3EntityPlayer.inventory.addItemStackToInventory(new ItemStack(Item.glassBottle));
    106            }
    107
    108            return par1ItemStack;
    109        }
    110
    111        /**
    112         * How long it takes to use or consume an item
    113         */
    114        public int getMaxItemUseDuration(ItemStack par1ItemStack)
    115        {
    116            return 32;
    117        }
    118
    119        /**
    120         * returns the action that specifies what animation to play when the items is being used
    121         */
    122        public EnumAction getItemUseAction(ItemStack par1ItemStack)
    123        {
    124            return EnumAction.drink;
    125        }
    126
    127        /**
    128         * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer
    129         */
    130        public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
    131        {
    132            if (isSplash(par1ItemStack.getItemDamage()))
    133            {
    134                if (!par3EntityPlayer.capabilities.isCreativeMode)
    135                {
    136                    --par1ItemStack.stackSize;
    137                }
    138
    139                par2World.playSoundAtEntity(par3EntityPlayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
    140
    141                if (!par2World.isRemote)
    142                {
    143                    par2World.spawnEntityInWorld(new EntityPotion(par2World, par3EntityPlayer, par1ItemStack));
    144                }
    145
    146                return par1ItemStack;
    147            }
    148            else
    149            {
    150                par3EntityPlayer.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack));
    151                return par1ItemStack;
    152            }
    153        }
    154
    155        /**
    156         * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return
    157         * True if something happen and false if it don't. This is for ITEMS, not BLOCKS
    158         */
    159        public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10)
    160        {
    161            return false;
    162        }
    163
    164        @SideOnly(Side.CLIENT)
    165
    166        /**
    167         * Gets an icon index based on an item's damage value
    168         */
    169        public int getIconFromDamage(int par1)
    170        {
    171            return isSplash(par1) ? 154 : 140;
    172        }
    173
    174        @SideOnly(Side.CLIENT)
    175
    176        /**
    177         * Gets an icon index based on an item's damage value and the given render pass
    178         */
    179        public int getIconFromDamageForRenderPass(int par1, int par2)
    180        {
    181            return par2 == 0 ? 141 : super.getIconFromDamageForRenderPass(par1, par2);
    182        }
    183
    184        /**
    185         * returns wether or not a potion is a throwable splash potion based on damage value
    186         */
    187        public static boolean isSplash(int par0)
    188        {
    189            return (par0 & 16384) != 0;
    190        }
    191
    192        @SideOnly(Side.CLIENT)
    193        public int getColorFromDamage(int par1)
    194        {
    195            return PotionHelper.func_77915_a(par1, false);
    196        }
    197
    198        @SideOnly(Side.CLIENT)
    199        public int getColorFromItemStack(ItemStack par1ItemStack, int par2)
    200        {
    201            return par2 > 0 ? 16777215 : this.getColorFromDamage(par1ItemStack.getItemDamage());
    202        }
    203
    204        @SideOnly(Side.CLIENT)
    205        public boolean requiresMultipleRenderPasses()
    206        {
    207            return true;
    208        }
    209
    210        @SideOnly(Side.CLIENT)
    211        public boolean isEffectInstant(int par1)
    212        {
    213            List var2 = this.getEffects(par1);
    214
    215            if (var2 != null && !var2.isEmpty())
    216            {
    217                Iterator var3 = var2.iterator();
    218                PotionEffect var4;
    219
    220                do
    221                {
    222                    if (!var3.hasNext())
    223                    {
    224                        return false;
    225                    }
    226
    227                    var4 = (PotionEffect)var3.next();
    228                }
    229                while (!Potion.potionTypes[var4.getPotionID()].isInstant());
    230
    231                return true;
    232            }
    233            else
    234            {
    235                return false;
    236            }
    237        }
    238
    239        public String getItemDisplayName(ItemStack par1ItemStack)
    240        {
    241            if (par1ItemStack.getItemDamage() == 0)
    242            {
    243                return StatCollector.translateToLocal("item.emptyPotion.name").trim();
    244            }
    245            else
    246            {
    247                String var2 = "";
    248
    249                if (isSplash(par1ItemStack.getItemDamage()))
    250                {
    251                    var2 = StatCollector.translateToLocal("potion.prefix.grenade").trim() + " ";
    252                }
    253
    254                List var3 = Item.potion.getEffects(par1ItemStack);
    255                String var4;
    256
    257                if (var3 != null && !var3.isEmpty())
    258                {
    259                    var4 = ((PotionEffect)var3.get(0)).getEffectName();
    260                    var4 = var4 + ".postfix";
    261                    return var2 + StatCollector.translateToLocal(var4).trim();
    262                }
    263                else
    264                {
    265                    var4 = PotionHelper.func_77905_c(par1ItemStack.getItemDamage());
    266                    return StatCollector.translateToLocal(var4).trim() + " " + super.getItemDisplayName(par1ItemStack);
    267                }
    268            }
    269        }
    270
    271        @SideOnly(Side.CLIENT)
    272
    273        /**
    274         * allows items to add custom lines of information to the mouseover description
    275         */
    276        public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4)
    277        {
    278            if (par1ItemStack.getItemDamage() != 0)
    279            {
    280                List var5 = Item.potion.getEffects(par1ItemStack);
    281
    282                if (var5 != null && !var5.isEmpty())
    283                {
    284                    Iterator var9 = var5.iterator();
    285
    286                    while (var9.hasNext())
    287                    {
    288                        PotionEffect var7 = (PotionEffect)var9.next();
    289                        String var8 = StatCollector.translateToLocal(var7.getEffectName()).trim();
    290
    291                        if (var7.getAmplifier() > 0)
    292                        {
    293                            var8 = var8 + " " + StatCollector.translateToLocal("potion.potency." + var7.getAmplifier()).trim();
    294                        }
    295
    296                        if (var7.getDuration() > 20)
    297                        {
    298                            var8 = var8 + " (" + Potion.getDurationString(var7) + ")";
    299                        }
    300
    301                        if (Potion.potionTypes[var7.getPotionID()].isBadEffect())
    302                        {
    303                            par3List.add("\u00a7c" + var8);
    304                        }
    305                        else
    306                        {
    307                            par3List.add("\u00a77" + var8);
    308                        }
    309                    }
    310                }
    311                else
    312                {
    313                    String var6 = StatCollector.translateToLocal("potion.empty").trim();
    314                    par3List.add("\u00a77" + var6);
    315                }
    316            }
    317        }
    318
    319        @SideOnly(Side.CLIENT)
    320        public boolean hasEffect(ItemStack par1ItemStack)
    321        {
    322            List var2 = this.getEffects(par1ItemStack);
    323            return var2 != null && !var2.isEmpty();
    324        }
    325
    326        @SideOnly(Side.CLIENT)
    327
    328        /**
    329         * returns a list of items with the same ID, but different meta (eg: dye returns 16 items)
    330         */
    331        public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List)
    332        {
    333            super.getSubItems(par1, par2CreativeTabs, par3List);
    334
    335            if (field_77835_b.isEmpty())
    336            {
    337                for (int var4 = 0; var4 <= 32767; ++var4)
    338                {
    339                    List var5 = PotionHelper.getPotionEffects(var4, false);
    340
    341                    if (var5 != null && !var5.isEmpty())
    342                    {
    343                        field_77835_b.put(var5, Integer.valueOf(var4));
    344                    }
    345                }
    346            }
    347
    348            Iterator var6 = field_77835_b.values().iterator();
    349
    350            while (var6.hasNext())
    351            {
    352                int var7 = ((Integer)var6.next()).intValue();
    353                par3List.add(new ItemStack(par1, 1, var7));
    354            }
    355        }
    356    }