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