001 package net.minecraft.src; 002 003 import cpw.mods.fml.common.Side; 004 import cpw.mods.fml.common.asm.SideOnly; 005 006 public class Potion 007 { 008 /** The array of potion types. */ 009 public static final Potion[] potionTypes = new Potion[32]; 010 public static final Potion field_76423_b = null; 011 public static final Potion moveSpeed = (new Potion(1, false, 8171462)).setPotionName("potion.moveSpeed").setIconIndex(0, 0); 012 public static final Potion moveSlowdown = (new Potion(2, true, 5926017)).setPotionName("potion.moveSlowdown").setIconIndex(1, 0); 013 public static final Potion digSpeed = (new Potion(3, false, 14270531)).setPotionName("potion.digSpeed").setIconIndex(2, 0).setEffectiveness(1.5D); 014 public static final Potion digSlowdown = (new Potion(4, true, 4866583)).setPotionName("potion.digSlowDown").setIconIndex(3, 0); 015 public static final Potion damageBoost = (new Potion(5, false, 9643043)).setPotionName("potion.damageBoost").setIconIndex(4, 0); 016 public static final Potion heal = (new PotionHealth(6, false, 16262179)).setPotionName("potion.heal"); 017 public static final Potion harm = (new PotionHealth(7, true, 4393481)).setPotionName("potion.harm"); 018 public static final Potion jump = (new Potion(8, false, 7889559)).setPotionName("potion.jump").setIconIndex(2, 1); 019 public static final Potion confusion = (new Potion(9, true, 5578058)).setPotionName("potion.confusion").setIconIndex(3, 1).setEffectiveness(0.25D); 020 021 /** The regeneration Potion object. */ 022 public static final Potion regeneration = (new Potion(10, false, 13458603)).setPotionName("potion.regeneration").setIconIndex(7, 0).setEffectiveness(0.25D); 023 public static final Potion resistance = (new Potion(11, false, 10044730)).setPotionName("potion.resistance").setIconIndex(6, 1); 024 025 /** The fire resistance Potion object. */ 026 public static final Potion fireResistance = (new Potion(12, false, 14981690)).setPotionName("potion.fireResistance").setIconIndex(7, 1); 027 028 /** The water breathing Potion object. */ 029 public static final Potion waterBreathing = (new Potion(13, false, 3035801)).setPotionName("potion.waterBreathing").setIconIndex(0, 2); 030 031 /** The invisibility Potion object. */ 032 public static final Potion invisibility = (new Potion(14, false, 8356754)).setPotionName("potion.invisibility").setIconIndex(0, 1); 033 034 /** The blindness Potion object. */ 035 public static final Potion blindness = (new Potion(15, true, 2039587)).setPotionName("potion.blindness").setIconIndex(5, 1).setEffectiveness(0.25D); 036 037 /** The night vision Potion object. */ 038 public static final Potion nightVision = (new Potion(16, false, 2039713)).setPotionName("potion.nightVision").setIconIndex(4, 1); 039 040 /** The hunger Potion object. */ 041 public static final Potion hunger = (new Potion(17, true, 5797459)).setPotionName("potion.hunger").setIconIndex(1, 1); 042 043 /** The weakness Potion object. */ 044 public static final Potion weakness = (new Potion(18, true, 4738376)).setPotionName("potion.weakness").setIconIndex(5, 0); 045 046 /** The poison Potion object. */ 047 public static final Potion poison = (new Potion(19, true, 5149489)).setPotionName("potion.poison").setIconIndex(6, 0).setEffectiveness(0.25D); 048 public static final Potion field_82731_v = (new Potion(20, true, 3484199)).setPotionName("potion.wither").setIconIndex(1, 2).setEffectiveness(0.25D); 049 public static final Potion field_76434_w = null; 050 public static final Potion field_76444_x = null; 051 public static final Potion field_76443_y = null; 052 public static final Potion field_76442_z = null; 053 public static final Potion field_76409_A = null; 054 public static final Potion field_76410_B = null; 055 public static final Potion field_76411_C = null; 056 public static final Potion field_76405_D = null; 057 public static final Potion field_76406_E = null; 058 public static final Potion field_76407_F = null; 059 public static final Potion field_76408_G = null; 060 061 /** The Id of a Potion object. */ 062 public final int id; 063 064 /** The name of the Potion. */ 065 private String name = ""; 066 067 /** The index for the icon displayed when the potion effect is active. */ 068 private int statusIconIndex = -1; 069 070 /** 071 * This field indicated if the effect is 'bad' - negative - for the entity. 072 */ 073 private final boolean isBadEffect; 074 private double effectiveness; 075 private boolean usable; 076 077 /** Is the color of the liquid for this potion. */ 078 private final int liquidColor; 079 080 protected Potion(int par1, boolean par2, int par3) 081 { 082 this.id = par1; 083 potionTypes[par1] = this; 084 this.isBadEffect = par2; 085 086 if (par2) 087 { 088 this.effectiveness = 0.5D; 089 } 090 else 091 { 092 this.effectiveness = 1.0D; 093 } 094 095 this.liquidColor = par3; 096 } 097 098 /** 099 * Sets the index for the icon displayed in the player's inventory when the status is active. 100 */ 101 protected Potion setIconIndex(int par1, int par2) 102 { 103 this.statusIconIndex = par1 + par2 * 8; 104 return this; 105 } 106 107 /** 108 * returns the ID of the potion 109 */ 110 public int getId() 111 { 112 return this.id; 113 } 114 115 public void performEffect(EntityLiving par1EntityLiving, int par2) 116 { 117 if (this.id == regeneration.id) 118 { 119 if (par1EntityLiving.getHealth() < par1EntityLiving.getMaxHealth()) 120 { 121 par1EntityLiving.heal(1); 122 } 123 } 124 else if (this.id == poison.id) 125 { 126 if (par1EntityLiving.getHealth() > 1) 127 { 128 par1EntityLiving.attackEntityFrom(DamageSource.magic, 1); 129 } 130 } 131 else if (this.id == field_82731_v.id) 132 { 133 par1EntityLiving.attackEntityFrom(DamageSource.field_82727_n, 1); 134 } 135 else if (this.id == hunger.id && par1EntityLiving instanceof EntityPlayer) 136 { 137 ((EntityPlayer)par1EntityLiving).addExhaustion(0.025F * (float)(par2 + 1)); 138 } 139 else if ((this.id != heal.id || par1EntityLiving.isEntityUndead()) && (this.id != harm.id || !par1EntityLiving.isEntityUndead())) 140 { 141 if (this.id == harm.id && !par1EntityLiving.isEntityUndead() || this.id == heal.id && par1EntityLiving.isEntityUndead()) 142 { 143 par1EntityLiving.attackEntityFrom(DamageSource.magic, 6 << par2); 144 } 145 } 146 else 147 { 148 par1EntityLiving.heal(6 << par2); 149 } 150 } 151 152 /** 153 * Hits the provided entity with this potion's instant effect. 154 */ 155 public void affectEntity(EntityLiving par1EntityLiving, EntityLiving par2EntityLiving, int par3, double par4) 156 { 157 int var6; 158 159 if ((this.id != heal.id || par2EntityLiving.isEntityUndead()) && (this.id != harm.id || !par2EntityLiving.isEntityUndead())) 160 { 161 if (this.id == harm.id && !par2EntityLiving.isEntityUndead() || this.id == heal.id && par2EntityLiving.isEntityUndead()) 162 { 163 var6 = (int)(par4 * (double)(6 << par3) + 0.5D); 164 165 if (par1EntityLiving == null) 166 { 167 par2EntityLiving.attackEntityFrom(DamageSource.magic, var6); 168 } 169 else 170 { 171 par2EntityLiving.attackEntityFrom(DamageSource.causeIndirectMagicDamage(par2EntityLiving, par1EntityLiving), var6); 172 } 173 } 174 } 175 else 176 { 177 var6 = (int)(par4 * (double)(6 << par3) + 0.5D); 178 par2EntityLiving.heal(var6); 179 } 180 } 181 182 /** 183 * Returns true if the potion has an instant effect instead of a continuous one (eg Harming) 184 */ 185 public boolean isInstant() 186 { 187 return false; 188 } 189 190 /** 191 * checks if Potion effect is ready to be applied this tick. 192 */ 193 public boolean isReady(int par1, int par2) 194 { 195 int var3; 196 197 if (this.id != regeneration.id && this.id != poison.id) 198 { 199 if (this.id == field_82731_v.id) 200 { 201 var3 = 40 >> par2; 202 return var3 > 0 ? par1 % var3 == 0 : true; 203 } 204 else 205 { 206 return this.id == hunger.id; 207 } 208 } 209 else 210 { 211 var3 = 25 >> par2; 212 return var3 > 0 ? par1 % var3 == 0 : true; 213 } 214 } 215 216 /** 217 * Set the potion name. 218 */ 219 public Potion setPotionName(String par1Str) 220 { 221 this.name = par1Str; 222 return this; 223 } 224 225 /** 226 * returns the name of the potion 227 */ 228 public String getName() 229 { 230 return this.name; 231 } 232 233 protected Potion setEffectiveness(double par1) 234 { 235 this.effectiveness = par1; 236 return this; 237 } 238 239 @SideOnly(Side.CLIENT) 240 241 /** 242 * Returns true if the potion has a associated status icon to display in then inventory when active. 243 */ 244 public boolean hasStatusIcon() 245 { 246 return this.statusIconIndex >= 0; 247 } 248 249 @SideOnly(Side.CLIENT) 250 251 /** 252 * Returns the index for the icon to display when the potion is active. 253 */ 254 public int getStatusIconIndex() 255 { 256 return this.statusIconIndex; 257 } 258 259 @SideOnly(Side.CLIENT) 260 261 /** 262 * This method returns true if the potion effect is bad - negative - for the entity. 263 */ 264 public boolean isBadEffect() 265 { 266 return this.isBadEffect; 267 } 268 269 @SideOnly(Side.CLIENT) 270 public static String getDurationString(PotionEffect par0PotionEffect) 271 { 272 int var1 = par0PotionEffect.getDuration(); 273 return StringUtils.ticksToElapsedTime(var1); 274 } 275 276 public double getEffectiveness() 277 { 278 return this.effectiveness; 279 } 280 281 public boolean isUsable() 282 { 283 return this.usable; 284 } 285 286 /** 287 * Returns the color of the potion liquid. 288 */ 289 public int getLiquidColor() 290 { 291 return this.liquidColor; 292 } 293 }