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