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 }