    001    package net.minecraft.src;
    002
    003    import java.util.ArrayList;
    004    import java.util.List;
    005
    006    public class PotionEffect
    007    {
    008        /** ID value of the potion this effect matches. */
    009        private int potionID;
    010
    011        /** The duration of the potion effect */
    012        private int duration;
    013
    014        /** The amplifier of the potion effect */
    015        private int amplifier;
    016
    017        /** List of ItemStack that can cure the potion effect **/
    018        private List<ItemStack> curativeItems;
    019
    020        public PotionEffect(int par1, int par2, int par3)
    021        {
    022            this.potionID = par1;
    023            this.duration = par2;
    024            this.amplifier = par3;
    025            this.curativeItems = new ArrayList<ItemStack>();
    026            this.curativeItems.add(new ItemStack(Item.bucketMilk));
    027        }
    028
    029        public PotionEffect(PotionEffect par1PotionEffect)
    030        {
    031            this.potionID = par1PotionEffect.potionID;
    032            this.duration = par1PotionEffect.duration;
    033            this.amplifier = par1PotionEffect.amplifier;
    034            this.curativeItems = par1PotionEffect.getCurativeItems();
    035        }
    036
    037        /**
    038         * merges the input PotionEffect into this one if this.amplifier <= tomerge.amplifier. The duration in the supplied
    039         * potion effect is assumed to be greater.
    040         */
    041        public void combine(PotionEffect par1PotionEffect)
    042        {
    043            if (this.potionID != par1PotionEffect.potionID)
    044            {
    045                System.err.println("This method should only be called for matching effects!");
    046            }
    047
    048            if (par1PotionEffect.amplifier > this.amplifier)
    049            {
    050                this.amplifier = par1PotionEffect.amplifier;
    051                this.duration = par1PotionEffect.duration;
    052            }
    053            else if (par1PotionEffect.amplifier == this.amplifier && this.duration < par1PotionEffect.duration)
    054            {
    055                this.duration = par1PotionEffect.duration;
    056            }
    057        }
    058
    059        /**
    060         * Retrieve the ID of the potion this effect matches.
    061         */
    062        public int getPotionID()
    063        {
    064            return this.potionID;
    065        }
    066
    067        public int getDuration()
    068        {
    069            return this.duration;
    070        }
    071
    072        public int getAmplifier()
    073        {
    074            return this.amplifier;
    075        }
    076
    077        /***
    078         * Returns a list of curative items for the potion effect
    079         * @return The list (ItemStack) of curative items for the potion effect
    080         */
    081        public List<ItemStack> getCurativeItems()
    082        {
    083            return this.curativeItems;
    084        }
    085
    086        /***
    087         * Checks the given ItemStack to see if it is in the list of curative items for the potion effect
    088         * @param stack The ItemStack being checked against the list of curative items for the potion effect
    089         * @return true if the given ItemStack is in the list of curative items for the potion effect, false otherwise
    090         */
    091        public boolean isCurativeItem(ItemStack stack)
    092        {
    093            boolean found = false;
    094            for (ItemStack curativeItem : this.curativeItems)
    095            {
    096                if (curativeItem.isItemEqual(stack))
    097                {
    098                    found = true;
    099                }
    100            }
    101
    102            return found;
    103        }
    104
    105        /***
    106         * Sets the array of curative items for the potion effect
    107         * @param curativeItems The list of ItemStacks being set to the potion effect
    108         */
    109        public void setCurativeItems(List<ItemStack> curativeItems)
    110        {
    111            this.curativeItems = curativeItems;
    112        }
    113
    114        /***
    115         * Adds the given stack to list of curative items for the potion effect
    116         * @param stack The ItemStack being added to the curative item list
    117         */
    118        public void addCurativeItem(ItemStack stack)
    119        {
    120            boolean found = false;
    121            for (ItemStack curativeItem : this.curativeItems)
    122            {
    123                if (curativeItem.isItemEqual(stack))
    124                {
    125                    found = true;
    126                }
    127            }
    128            if (!found)
    129            {
    130                this.curativeItems.add(stack);
    131            }
    132        }
    133
    134        public boolean onUpdate(EntityLiving par1EntityLiving)
    135        {
    136            if (this.duration > 0)
    137            {
    138                if (Potion.potionTypes[this.potionID].isReady(this.duration, this.amplifier))
    139                {
    140                    this.performEffect(par1EntityLiving);
    141                }
    142
    143                this.deincrementDuration();
    144            }
    145
    146            return this.duration > 0;
    147        }
    148
    149        private int deincrementDuration()
    150        {
    151            return --this.duration;
    152        }
    153
    154        public void performEffect(EntityLiving par1EntityLiving)
    155        {
    156            if (this.duration > 0)
    157            {
    158                Potion.potionTypes[this.potionID].performEffect(par1EntityLiving, this.amplifier);
    159            }
    160        }
    161
    162        public String getEffectName()
    163        {
    164            return Potion.potionTypes[this.potionID].getName();
    165        }
    166
    167        public int hashCode()
    168        {
    169            return this.potionID;
    170        }
    171
    172        public String toString()
    173        {
    174            String var1 = "";
    175
    176            if (this.getAmplifier() > 0)
    177            {
    178                var1 = this.getEffectName() + " x " + (this.getAmplifier() + 1) + ", Duration: " + this.getDuration();
    179            }
    180            else
    181            {
    182                var1 = this.getEffectName() + ", Duration: " + this.getDuration();
    183            }
    184
    185            return Potion.potionTypes[this.potionID].isUsable() ? "(" + var1 + ")" : var1;
    186        }
    187
    188        public boolean equals(Object par1Obj)
    189        {
    190            if (!(par1Obj instanceof PotionEffect))
    191            {
    192                return false;
    193            }
    194            else
    195            {
    196                PotionEffect var2 = (PotionEffect)par1Obj;
    197                return this.potionID == var2.potionID && this.amplifier == var2.amplifier && this.duration == var2.duration;
    198            }
    199        }
    200    }