    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    }