    001    package net.minecraft.potion;
    002
    003    import java.util.ArrayList;
    004    import java.util.List;
    005
    006    import net.minecraft.entity.EntityLiving;
    007    import net.minecraft.item.Item;
    008    import net.minecraft.item.ItemStack;
    009    import net.minecraft.nbt.NBTTagCompound;
    010
    011    public class PotionEffect
    012    {
    013        /** ID value of the potion this effect matches. */
    014        private int potionID;
    015
    016        /** The duration of the potion effect */
    017        private int duration;
    018
    019        /** The amplifier of the potion effect */
    020        private int amplifier;
    021        private boolean field_82723_d;
    022        private boolean field_82724_e;
    023
    024        /** List of ItemStack that can cure the potion effect **/
    025        private List<ItemStack> curativeItems;
    026
    027        public PotionEffect(int par1, int par2)
    028        {
    029            this(par1, par2, 0);
    030        }
    031
    032        public PotionEffect(int par1, int par2, int par3)
    033        {
    034            this(par1, par2, par3, false);
    035        }
    036
    037        public PotionEffect(int par1, int par2, int par3, boolean par4)
    038        {
    039            this.potionID = par1;
    040            this.duration = par2;
    041            this.amplifier = par3;
    042            this.field_82724_e = par4;
    043            this.curativeItems = new ArrayList<ItemStack>();
    044            this.curativeItems.add(new ItemStack(Item.bucketMilk));
    045        }
    046
    047        public PotionEffect(PotionEffect par1PotionEffect)
    048        {
    049            this.potionID = par1PotionEffect.potionID;
    050            this.duration = par1PotionEffect.duration;
    051            this.amplifier = par1PotionEffect.amplifier;
    052            this.curativeItems = par1PotionEffect.getCurativeItems();
    053        }
    054
    055        /**
    056         * merges the input PotionEffect into this one if this.amplifier <= tomerge.amplifier. The duration in the supplied
    057         * potion effect is assumed to be greater.
    058         */
    059        public void combine(PotionEffect par1PotionEffect)
    060        {
    061            if (this.potionID != par1PotionEffect.potionID)
    062            {
    063                System.err.println("This method should only be called for matching effects!");
    064            }
    065
    066            if (par1PotionEffect.amplifier > this.amplifier)
    067            {
    068                this.amplifier = par1PotionEffect.amplifier;
    069                this.duration = par1PotionEffect.duration;
    070            }
    071            else if (par1PotionEffect.amplifier == this.amplifier && this.duration < par1PotionEffect.duration)
    072            {
    073                this.duration = par1PotionEffect.duration;
    074            }
    075            else if (!par1PotionEffect.field_82724_e && this.field_82724_e)
    076            {
    077                this.field_82724_e = par1PotionEffect.field_82724_e;
    078            }
    079        }
    080
    081        /**
    082         * Retrieve the ID of the potion this effect matches.
    083         */
    084        public int getPotionID()
    085        {
    086            return this.potionID;
    087        }
    088
    089        public int getDuration()
    090        {
    091            return this.duration;
    092        }
    093
    094        public int getAmplifier()
    095        {
    096            return this.amplifier;
    097        }
    098
    099        /***
    100         * Returns a list of curative items for the potion effect
    101         * @return The list (ItemStack) of curative items for the potion effect
    102         */
    103        public List<ItemStack> getCurativeItems()
    104        {
    105            return this.curativeItems;
    106        }
    107
    108        /***
    109         * Checks the given ItemStack to see if it is in the list of curative items for the potion effect
    110         * @param stack The ItemStack being checked against the list of curative items for the potion effect
    111         * @return true if the given ItemStack is in the list of curative items for the potion effect, false otherwise
    112         */
    113        public boolean isCurativeItem(ItemStack stack)
    114        {
    115            boolean found = false;
    116            for (ItemStack curativeItem : this.curativeItems)
    117            {
    118                if (curativeItem.isItemEqual(stack))
    119                {
    120                    found = true;
    121                }
    122            }
    123
    124            return found;
    125        }
    126
    127        /***
    128         * Sets the array of curative items for the potion effect
    129         * @param curativeItems The list of ItemStacks being set to the potion effect
    130         */
    131        public void setCurativeItems(List<ItemStack> curativeItems)
    132        {
    133            this.curativeItems = curativeItems;
    134        }
    135
    136        /***
    137         * Adds the given stack to list of curative items for the potion effect
    138         * @param stack The ItemStack being added to the curative item list
    139         */
    140        public void addCurativeItem(ItemStack stack)
    141        {
    142            boolean found = false;
    143            for (ItemStack curativeItem : this.curativeItems)
    144            {
    145                if (curativeItem.isItemEqual(stack))
    146                {
    147                    found = true;
    148                }
    149            }
    150            if (!found)
    151            {
    152                this.curativeItems.add(stack);
    153            }
    154        }
    155
    156        /**
    157         * Set whether this potion is a splash potion.
    158         */
    159        public void setSplashPotion(boolean par1)
    160        {
    161            this.field_82723_d = par1;
    162        }
    163
    164        public boolean func_82720_e()
    165        {
    166            return this.field_82724_e;
    167        }
    168
    169        public boolean onUpdate(EntityLiving par1EntityLiving)
    170        {
    171            if (this.duration > 0)
    172            {
    173                if (Potion.potionTypes[this.potionID].isReady(this.duration, this.amplifier))
    174                {
    175                    this.performEffect(par1EntityLiving);
    176                }
    177
    178                this.deincrementDuration();
    179            }
    180
    181            return this.duration > 0;
    182        }
    183
    184        private int deincrementDuration()
    185        {
    186            return --this.duration;
    187        }
    188
    189        public void performEffect(EntityLiving par1EntityLiving)
    190        {
    191            if (this.duration > 0)
    192            {
    193                Potion.potionTypes[this.potionID].performEffect(par1EntityLiving, this.amplifier);
    194            }
    195        }
    196
    197        public String getEffectName()
    198        {
    199            return Potion.potionTypes[this.potionID].getName();
    200        }
    201
    202        public int hashCode()
    203        {
    204            return this.potionID;
    205        }
    206
    207        public String toString()
    208        {
    209            String var1 = "";
    210
    211            if (this.getAmplifier() > 0)
    212            {
    213                var1 = this.getEffectName() + " x " + (this.getAmplifier() + 1) + ", Duration: " + this.getDuration();
    214            }
    215            else
    216            {
    217                var1 = this.getEffectName() + ", Duration: " + this.getDuration();
    218            }
    219
    220            if (this.field_82723_d)
    221            {
    222                var1 = var1 + ", Splash: true";
    223            }
    224
    225            return Potion.potionTypes[this.potionID].isUsable() ? "(" + var1 + ")" : var1;
    226        }
    227
    228        public boolean equals(Object par1Obj)
    229        {
    230            if (!(par1Obj instanceof PotionEffect))
    231            {
    232                return false;
    233            }
    234            else
    235            {
    236                PotionEffect var2 = (PotionEffect)par1Obj;
    237                return this.potionID == var2.potionID && this.amplifier == var2.amplifier && this.duration == var2.duration && this.field_82723_d == var2.field_82723_d && this.field_82724_e == var2.field_82724_e;
    238            }
    239        }
    240
    241        /**
    242         * Write a custom potion effect to a potion item's NBT data.
    243         */
    244        public NBTTagCompound writeCustomPotionEffectToNBT(NBTTagCompound par1NBTTagCompound)
    245        {
    246            par1NBTTagCompound.setByte("Id", (byte)this.getPotionID());
    247            par1NBTTagCompound.setByte("Amplifier", (byte)this.getAmplifier());
    248            par1NBTTagCompound.setInteger("Duration", this.getDuration());
    249            par1NBTTagCompound.setBoolean("Ambient", this.func_82720_e());
    250            return par1NBTTagCompound;
    251        }
    252
    253        /**
    254         * Read a custom potion effect from a potion item's NBT data.
    255         */
    256        public static PotionEffect readCustomPotionEffectFromNBT(NBTTagCompound par0NBTTagCompound)
    257        {
    258            byte var1 = par0NBTTagCompound.getByte("Id");
    259            byte var2 = par0NBTTagCompound.getByte("Amplifier");
    260            int var3 = par0NBTTagCompound.getInteger("Duration");
    261            boolean var4 = par0NBTTagCompound.getBoolean("Ambient");
    262            return new PotionEffect(var1, var3, var2, var4);
    263        }
    264    }