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 /** 152 * Set whether this potion is a splash potion. 153 */ 154 public void setSplashPotion(boolean par1) 155 { 156 this.field_82723_d = par1; 157 } 158 159 public boolean func_82720_e() 160 { 161 return this.field_82724_e; 162 } 163 164 public boolean onUpdate(EntityLiving par1EntityLiving) 165 { 166 if (this.duration > 0) 167 { 168 if (Potion.potionTypes[this.potionID].isReady(this.duration, this.amplifier)) 169 { 170 this.performEffect(par1EntityLiving); 171 } 172 173 this.deincrementDuration(); 174 } 175 176 return this.duration > 0; 177 } 178 179 private int deincrementDuration() 180 { 181 return --this.duration; 182 } 183 184 public void performEffect(EntityLiving par1EntityLiving) 185 { 186 if (this.duration > 0) 187 { 188 Potion.potionTypes[this.potionID].performEffect(par1EntityLiving, this.amplifier); 189 } 190 } 191 192 public String getEffectName() 193 { 194 return Potion.potionTypes[this.potionID].getName(); 195 } 196 197 public int hashCode() 198 { 199 return this.potionID; 200 } 201 202 public String toString() 203 { 204 String var1 = ""; 205 206 if (this.getAmplifier() > 0) 207 { 208 var1 = this.getEffectName() + " x " + (this.getAmplifier() + 1) + ", Duration: " + this.getDuration(); 209 } 210 else 211 { 212 var1 = this.getEffectName() + ", Duration: " + this.getDuration(); 213 } 214 215 if (this.field_82723_d) 216 { 217 var1 = var1 + ", Splash: true"; 218 } 219 220 return Potion.potionTypes[this.potionID].isUsable() ? "(" + var1 + ")" : var1; 221 } 222 223 public boolean equals(Object par1Obj) 224 { 225 if (!(par1Obj instanceof PotionEffect)) 226 { 227 return false; 228 } 229 else 230 { 231 PotionEffect var2 = (PotionEffect)par1Obj; 232 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; 233 } 234 } 235 236 /** 237 * Write a custom potion effect to a potion item's NBT data. 238 */ 239 public NBTTagCompound writeCustomPotionEffectToNBT(NBTTagCompound par1NBTTagCompound) 240 { 241 par1NBTTagCompound.setByte("Id", (byte)this.getPotionID()); 242 par1NBTTagCompound.setByte("Amplifier", (byte)this.getAmplifier()); 243 par1NBTTagCompound.setInteger("Duration", this.getDuration()); 244 par1NBTTagCompound.setBoolean("Ambient", this.func_82720_e()); 245 return par1NBTTagCompound; 246 } 247 248 /** 249 * Read a custom potion effect from a potion item's NBT data. 250 */ 251 public static PotionEffect readCustomPotionEffectFromNBT(NBTTagCompound par0NBTTagCompound) 252 { 253 byte var1 = par0NBTTagCompound.getByte("Id"); 254 byte var2 = par0NBTTagCompound.getByte("Amplifier"); 255 int var3 = par0NBTTagCompound.getInteger("Duration"); 256 boolean var4 = par0NBTTagCompound.getBoolean("Ambient"); 257 return new PotionEffect(var1, var3, var2, var4); 258 } 259 }