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