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    }