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    
049        /** The wither Potion object. */
050        public static final Potion wither = (new Potion(20, true, 3484199)).setPotionName("potion.wither").setIconIndex(1, 2).setEffectiveness(0.25D);
051        public static final Potion field_76434_w = null;
052        public static final Potion field_76444_x = null;
053        public static final Potion field_76443_y = null;
054        public static final Potion field_76442_z = null;
055        public static final Potion field_76409_A = null;
056        public static final Potion field_76410_B = null;
057        public static final Potion field_76411_C = null;
058        public static final Potion field_76405_D = null;
059        public static final Potion field_76406_E = null;
060        public static final Potion field_76407_F = null;
061        public static final Potion field_76408_G = null;
062    
063        /** The Id of a Potion object. */
064        public final int id;
065    
066        /** The name of the Potion. */
067        private String name = "";
068    
069        /** The index for the icon displayed when the potion effect is active. */
070        private int statusIconIndex = -1;
071    
072        /**
073         * This field indicated if the effect is 'bad' - negative - for the entity.
074         */
075        private final boolean isBadEffect;
076        private double effectiveness;
077        private boolean usable;
078    
079        /** Is the color of the liquid for this potion. */
080        private final int liquidColor;
081    
082        protected Potion(int par1, boolean par2, int par3)
083        {
084            this.id = par1;
085            potionTypes[par1] = this;
086            this.isBadEffect = par2;
087    
088            if (par2)
089            {
090                this.effectiveness = 0.5D;
091            }
092            else
093            {
094                this.effectiveness = 1.0D;
095            }
096    
097            this.liquidColor = par3;
098        }
099    
100        /**
101         * Sets the index for the icon displayed in the player's inventory when the status is active.
102         */
103        protected Potion setIconIndex(int par1, int par2)
104        {
105            this.statusIconIndex = par1 + par2 * 8;
106            return this;
107        }
108    
109        /**
110         * returns the ID of the potion
111         */
112        public int getId()
113        {
114            return this.id;
115        }
116    
117        public void performEffect(EntityLiving par1EntityLiving, int par2)
118        {
119            if (this.id == regeneration.id)
120            {
121                if (par1EntityLiving.getHealth() < par1EntityLiving.getMaxHealth())
122                {
123                    par1EntityLiving.heal(1);
124                }
125            }
126            else if (this.id == poison.id)
127            {
128                if (par1EntityLiving.getHealth() > 1)
129                {
130                    par1EntityLiving.attackEntityFrom(DamageSource.magic, 1);
131                }
132            }
133            else if (this.id == wither.id)
134            {
135                par1EntityLiving.attackEntityFrom(DamageSource.wither, 1);
136            }
137            else if (this.id == hunger.id && par1EntityLiving instanceof EntityPlayer)
138            {
139                ((EntityPlayer)par1EntityLiving).addExhaustion(0.025F * (float)(par2 + 1));
140            }
141            else if ((this.id != heal.id || par1EntityLiving.isEntityUndead()) && (this.id != harm.id || !par1EntityLiving.isEntityUndead()))
142            {
143                if (this.id == harm.id && !par1EntityLiving.isEntityUndead() || this.id == heal.id && par1EntityLiving.isEntityUndead())
144                {
145                    par1EntityLiving.attackEntityFrom(DamageSource.magic, 6 << par2);
146                }
147            }
148            else
149            {
150                par1EntityLiving.heal(6 << par2);
151            }
152        }
153    
154        /**
155         * Hits the provided entity with this potion's instant effect.
156         */
157        public void affectEntity(EntityLiving par1EntityLiving, EntityLiving par2EntityLiving, int par3, double par4)
158        {
159            int var6;
160    
161            if ((this.id != heal.id || par2EntityLiving.isEntityUndead()) && (this.id != harm.id || !par2EntityLiving.isEntityUndead()))
162            {
163                if (this.id == harm.id && !par2EntityLiving.isEntityUndead() || this.id == heal.id && par2EntityLiving.isEntityUndead())
164                {
165                    var6 = (int)(par4 * (double)(6 << par3) + 0.5D);
166    
167                    if (par1EntityLiving == null)
168                    {
169                        par2EntityLiving.attackEntityFrom(DamageSource.magic, var6);
170                    }
171                    else
172                    {
173                        par2EntityLiving.attackEntityFrom(DamageSource.causeIndirectMagicDamage(par2EntityLiving, par1EntityLiving), var6);
174                    }
175                }
176            }
177            else
178            {
179                var6 = (int)(par4 * (double)(6 << par3) + 0.5D);
180                par2EntityLiving.heal(var6);
181            }
182        }
183    
184        /**
185         * Returns true if the potion has an instant effect instead of a continuous one (eg Harming)
186         */
187        public boolean isInstant()
188        {
189            return false;
190        }
191    
192        /**
193         * checks if Potion effect is ready to be applied this tick.
194         */
195        public boolean isReady(int par1, int par2)
196        {
197            int var3;
198    
199            if (this.id != regeneration.id && this.id != poison.id)
200            {
201                if (this.id == wither.id)
202                {
203                    var3 = 40 >> par2;
204                    return var3 > 0 ? par1 % var3 == 0 : true;
205                }
206                else
207                {
208                    return this.id == hunger.id;
209                }
210            }
211            else
212            {
213                var3 = 25 >> par2;
214                return var3 > 0 ? par1 % var3 == 0 : true;
215            }
216        }
217    
218        /**
219         * Set the potion name.
220         */
221        public Potion setPotionName(String par1Str)
222        {
223            this.name = par1Str;
224            return this;
225        }
226    
227        /**
228         * returns the name of the potion
229         */
230        public String getName()
231        {
232            return this.name;
233        }
234    
235        protected Potion setEffectiveness(double par1)
236        {
237            this.effectiveness = par1;
238            return this;
239        }
240    
241        @SideOnly(Side.CLIENT)
242    
243        /**
244         * Returns true if the potion has a associated status icon to display in then inventory when active.
245         */
246        public boolean hasStatusIcon()
247        {
248            return this.statusIconIndex >= 0;
249        }
250    
251        @SideOnly(Side.CLIENT)
252    
253        /**
254         * Returns the index for the icon to display when the potion is active.
255         */
256        public int getStatusIconIndex()
257        {
258            return this.statusIconIndex;
259        }
260    
261        @SideOnly(Side.CLIENT)
262    
263        /**
264         * This method returns true if the potion effect is bad - negative - for the entity.
265         */
266        public boolean isBadEffect()
267        {
268            return this.isBadEffect;
269        }
270    
271        @SideOnly(Side.CLIENT)
272        public static String getDurationString(PotionEffect par0PotionEffect)
273        {
274            int var1 = par0PotionEffect.getDuration();
275            return StringUtils.ticksToElapsedTime(var1);
276        }
277    
278        public double getEffectiveness()
279        {
280            return this.effectiveness;
281        }
282    
283        public boolean isUsable()
284        {
285            return this.usable;
286        }
287    
288        /**
289         * Returns the color of the potion liquid.
290         */
291        public int getLiquidColor()
292        {
293            return this.liquidColor;
294        }
295    }