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