001    package net.minecraft.src;
002    
003    import java.util.Iterator;
004    import java.util.List;
005    
006    public class EntityPotion extends EntityThrowable
007    {
008        /**
009         * The damage value of the thrown potion that this EntityPotion represents.
010         */
011        private int potionDamage;
012    
013        public EntityPotion(World par1World)
014        {
015            super(par1World);
016        }
017    
018        public EntityPotion(World par1World, EntityLiving par2EntityLiving, int par3)
019        {
020            super(par1World, par2EntityLiving);
021            this.potionDamage = par3;
022        }
023    
024        public EntityPotion(World par1World, double par2, double par4, double par6, int par8)
025        {
026            super(par1World, par2, par4, par6);
027            this.potionDamage = par8;
028        }
029    
030        /**
031         * Gets the amount of gravity to apply to the thrown entity with each tick.
032         */
033        protected float getGravityVelocity()
034        {
035            return 0.05F;
036        }
037    
038        protected float func_70182_d()
039        {
040            return 0.5F;
041        }
042    
043        protected float func_70183_g()
044        {
045            return -20.0F;
046        }
047    
048        /**
049         * Returns the damage value of the thrown potion that this EntityPotion represents.
050         */
051        public int getPotionDamage()
052        {
053            return this.potionDamage;
054        }
055    
056        /**
057         * Called when this EntityThrowable hits a block or entity.
058         */
059        protected void onImpact(MovingObjectPosition par1MovingObjectPosition)
060        {
061            if (!this.worldObj.isRemote)
062            {
063                List var2 = Item.potion.getEffects(this.potionDamage);
064    
065                if (var2 != null && !var2.isEmpty())
066                {
067                    AxisAlignedBB var3 = this.boundingBox.expand(4.0D, 2.0D, 4.0D);
068                    List var4 = this.worldObj.getEntitiesWithinAABB(EntityLiving.class, var3);
069    
070                    if (var4 != null && !var4.isEmpty())
071                    {
072                        Iterator var5 = var4.iterator();
073    
074                        while (var5.hasNext())
075                        {
076                            EntityLiving var6 = (EntityLiving)var5.next();
077                            double var7 = this.getDistanceSqToEntity(var6);
078    
079                            if (var7 < 16.0D)
080                            {
081                                double var9 = 1.0D - Math.sqrt(var7) / 4.0D;
082    
083                                if (var6 == par1MovingObjectPosition.entityHit)
084                                {
085                                    var9 = 1.0D;
086                                }
087    
088                                Iterator var11 = var2.iterator();
089    
090                                while (var11.hasNext())
091                                {
092                                    PotionEffect var12 = (PotionEffect)var11.next();
093                                    int var13 = var12.getPotionID();
094    
095                                    if (Potion.potionTypes[var13].isInstant())
096                                    {
097                                        Potion.potionTypes[var13].affectEntity(this.thrower, var6, var12.getAmplifier(), var9);
098                                    }
099                                    else
100                                    {
101                                        int var14 = (int)(var9 * (double)var12.getDuration() + 0.5D);
102    
103                                        if (var14 > 20)
104                                        {
105                                            var6.addPotionEffect(new PotionEffect(var13, var14, var12.getAmplifier()));
106                                        }
107                                    }
108                                }
109                            }
110                        }
111                    }
112                }
113    
114                this.worldObj.playAuxSFX(2002, (int)Math.round(this.posX), (int)Math.round(this.posY), (int)Math.round(this.posZ), this.potionDamage);
115                this.setDead();
116            }
117        }
118    
119        /**
120         * (abstract) Protected helper method to read subclass entity data from NBT.
121         */
122        public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
123        {
124            super.readEntityFromNBT(par1NBTTagCompound);
125            this.potionDamage = par1NBTTagCompound.getInteger("potionValue");
126        }
127    
128        /**
129         * (abstract) Protected helper method to write subclass entity data to NBT.
130         */
131        public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
132        {
133            super.writeEntityToNBT(par1NBTTagCompound);
134            par1NBTTagCompound.setInteger("potionValue", this.potionDamage);
135        }
136    }