001package net.minecraft.potion;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005import net.minecraft.entity.EntityLiving;
006import net.minecraft.entity.player.EntityPlayer;
007import net.minecraft.util.DamageSource;
008import net.minecraft.util.StringUtils;
009
010public 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 j;
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                j = (int)(par4 * (double)(6 << par3) + 0.5D);
170
171                if (par1EntityLiving == null)
172                {
173                    par2EntityLiving.attackEntityFrom(DamageSource.magic, j);
174                }
175                else
176                {
177                    par2EntityLiving.attackEntityFrom(DamageSource.causeIndirectMagicDamage(par2EntityLiving, par1EntityLiving), j);
178                }
179            }
180        }
181        else
182        {
183            j = (int)(par4 * (double)(6 << par3) + 0.5D);
184            par2EntityLiving.heal(j);
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 k;
202
203        if (this.id != regeneration.id && this.id != poison.id)
204        {
205            if (this.id == wither.id)
206            {
207                k = 40 >> par2;
208                return k > 0 ? par1 % k == 0 : true;
209            }
210            else
211            {
212                return this.id == hunger.id;
213            }
214        }
215        else
216        {
217            k = 25 >> par2;
218            return k > 0 ? par1 % k == 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        if (par0PotionEffect.func_100011_g())
279        {
280            return "**:**";
281        }
282        else
283        {
284            int i = par0PotionEffect.getDuration();
285            return StringUtils.ticksToElapsedTime(i);
286        }
287    }
288
289    public double getEffectiveness()
290    {
291        return this.effectiveness;
292    }
293
294    public boolean isUsable()
295    {
296        return this.usable;
297    }
298
299    /**
300     * Returns the color of the potion liquid.
301     */
302    public int getLiquidColor()
303    {
304        return this.liquidColor;
305    }
306}