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    }