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