001    package net.minecraft.entity.projectile;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import java.util.Iterator;
006    import java.util.List;
007    import net.minecraft.entity.EntityLiving;
008    import net.minecraft.item.Item;
009    import net.minecraft.item.ItemStack;
010    import net.minecraft.nbt.NBTTagCompound;
011    import net.minecraft.potion.Potion;
012    import net.minecraft.potion.PotionEffect;
013    import net.minecraft.util.AxisAlignedBB;
014    import net.minecraft.util.MovingObjectPosition;
015    import net.minecraft.world.World;
016    
017    public class EntityPotion extends EntityThrowable
018    {
019        /**
020         * The damage value of the thrown potion that this EntityPotion represents.
021         */
022        private ItemStack potionDamage;
023    
024        public EntityPotion(World par1World)
025        {
026            super(par1World);
027        }
028    
029        public EntityPotion(World par1World, EntityLiving par2EntityLiving, int par3)
030        {
031            this(par1World, par2EntityLiving, new ItemStack(Item.potion, 1, par3));
032        }
033    
034        public EntityPotion(World par1World, EntityLiving par2EntityLiving, ItemStack par3ItemStack)
035        {
036            super(par1World, par2EntityLiving);
037            this.potionDamage = par3ItemStack;
038        }
039    
040        @SideOnly(Side.CLIENT)
041        public EntityPotion(World par1World, double par2, double par4, double par6, int par8)
042        {
043            this(par1World, par2, par4, par6, new ItemStack(Item.potion, 1, par8));
044        }
045    
046        public EntityPotion(World par1World, double par2, double par4, double par6, ItemStack par8ItemStack)
047        {
048            super(par1World, par2, par4, par6);
049            this.potionDamage = par8ItemStack;
050        }
051    
052        /**
053         * Gets the amount of gravity to apply to the thrown entity with each tick.
054         */
055        protected float getGravityVelocity()
056        {
057            return 0.05F;
058        }
059    
060        protected float func_70182_d()
061        {
062            return 0.5F;
063        }
064    
065        protected float func_70183_g()
066        {
067            return -20.0F;
068        }
069    
070        public void setPotionDamage(int par1)
071        {
072            if (this.potionDamage == null)
073            {
074                this.potionDamage = new ItemStack(Item.potion, 1, 0);
075            }
076    
077            this.potionDamage.setItemDamage(par1);
078        }
079    
080        /**
081         * Returns the damage value of the thrown potion that this EntityPotion represents.
082         */
083        public int getPotionDamage()
084        {
085            if (this.potionDamage == null)
086            {
087                this.potionDamage = new ItemStack(Item.potion, 1, 0);
088            }
089    
090            return this.potionDamage.getItemDamage();
091        }
092    
093        /**
094         * Called when this EntityThrowable hits a block or entity.
095         */
096        protected void onImpact(MovingObjectPosition par1MovingObjectPosition)
097        {
098            if (!this.worldObj.isRemote)
099            {
100                List var2 = Item.potion.getEffects(this.potionDamage);
101    
102                if (var2 != null && !var2.isEmpty())
103                {
104                    AxisAlignedBB var3 = this.boundingBox.expand(4.0D, 2.0D, 4.0D);
105                    List var4 = this.worldObj.getEntitiesWithinAABB(EntityLiving.class, var3);
106    
107                    if (var4 != null && !var4.isEmpty())
108                    {
109                        Iterator var5 = var4.iterator();
110    
111                        while (var5.hasNext())
112                        {
113                            EntityLiving var6 = (EntityLiving)var5.next();
114                            double var7 = this.getDistanceSqToEntity(var6);
115    
116                            if (var7 < 16.0D)
117                            {
118                                double var9 = 1.0D - Math.sqrt(var7) / 4.0D;
119    
120                                if (var6 == par1MovingObjectPosition.entityHit)
121                                {
122                                    var9 = 1.0D;
123                                }
124    
125                                Iterator var11 = var2.iterator();
126    
127                                while (var11.hasNext())
128                                {
129                                    PotionEffect var12 = (PotionEffect)var11.next();
130                                    int var13 = var12.getPotionID();
131    
132                                    if (Potion.potionTypes[var13].isInstant())
133                                    {
134                                        Potion.potionTypes[var13].affectEntity(this.getThrower(), var6, var12.getAmplifier(), var9);
135                                    }
136                                    else
137                                    {
138                                        int var14 = (int)(var9 * (double)var12.getDuration() + 0.5D);
139    
140                                        if (var14 > 20)
141                                        {
142                                            var6.addPotionEffect(new PotionEffect(var13, var14, var12.getAmplifier()));
143                                        }
144                                    }
145                                }
146                            }
147                        }
148                    }
149                }
150    
151                this.worldObj.playAuxSFX(2002, (int)Math.round(this.posX), (int)Math.round(this.posY), (int)Math.round(this.posZ), this.getPotionDamage());
152                this.setDead();
153            }
154        }
155    
156        /**
157         * (abstract) Protected helper method to read subclass entity data from NBT.
158         */
159        public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
160        {
161            super.readEntityFromNBT(par1NBTTagCompound);
162    
163            if (par1NBTTagCompound.hasKey("Potion"))
164            {
165                this.potionDamage = ItemStack.loadItemStackFromNBT(par1NBTTagCompound.getCompoundTag("Potion"));
166            }
167            else
168            {
169                this.setPotionDamage(par1NBTTagCompound.getInteger("potionValue"));
170            }
171    
172            if (this.potionDamage == null)
173            {
174                this.setDead();
175            }
176        }
177    
178        /**
179         * (abstract) Protected helper method to write subclass entity data to NBT.
180         */
181        public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
182        {
183            super.writeEntityToNBT(par1NBTTagCompound);
184    
185            if (this.potionDamage != null)
186            {
187                par1NBTTagCompound.setCompoundTag("Potion", this.potionDamage.writeToNBT(new NBTTagCompound()));
188            }
189        }
190    }