package net.minecraft.entity.projectile;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.Iterator;
import java.util.List;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.World;

public class EntityPotion extends EntityThrowable
{
	private ItemStack potionDamage;
	private static final String __OBFID = "CL_00001727";

	public EntityPotion(World par1World)
	{
		super(par1World);
	}

	public EntityPotion(World par1World, EntityLivingBase par2EntityLivingBase, int par3)
	{
		this(par1World, par2EntityLivingBase, new ItemStack(Items.potionitem, 1, par3));
	}

	public EntityPotion(World par1World, EntityLivingBase par2EntityLivingBase, ItemStack par3ItemStack)
	{
		super(par1World, par2EntityLivingBase);
		this.potionDamage = par3ItemStack;
	}

	@SideOnly(Side.CLIENT)
	public EntityPotion(World par1World, double par2, double par4, double par6, int par8)
	{
		this(par1World, par2, par4, par6, new ItemStack(Items.potionitem, 1, par8));
	}

	public EntityPotion(World par1World, double par2, double par4, double par6, ItemStack par8ItemStack)
	{
		super(par1World, par2, par4, par6);
		this.potionDamage = par8ItemStack;
	}

	protected float getGravityVelocity()
	{
		return 0.05F;
	}

	protected float func_70182_d()
	{
		return 0.5F;
	}

	protected float func_70183_g()
	{
		return -20.0F;
	}

	public void setPotionDamage(int par1)
	{
		if (this.potionDamage == null)
		{
			this.potionDamage = new ItemStack(Items.potionitem, 1, 0);
		}

		this.potionDamage.setItemDamage(par1);
	}

	public int getPotionDamage()
	{
		if (this.potionDamage == null)
		{
			this.potionDamage = new ItemStack(Items.potionitem, 1, 0);
		}

		return this.potionDamage.getItemDamage();
	}

	protected void onImpact(MovingObjectPosition par1MovingObjectPosition)
	{
		if (!this.worldObj.isRemote)
		{
			List list = Items.potionitem.getEffects(this.potionDamage);

			if (list != null && !list.isEmpty())
			{
				AxisAlignedBB axisalignedbb = this.boundingBox.expand(4.0D, 2.0D, 4.0D);
				List list1 = this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb);

				if (list1 != null && !list1.isEmpty())
				{
					Iterator iterator = list1.iterator();

					while (iterator.hasNext())
					{
						EntityLivingBase entitylivingbase = (EntityLivingBase)iterator.next();
						double d0 = this.getDistanceSqToEntity(entitylivingbase);

						if (d0 < 16.0D)
						{
							double d1 = 1.0D - Math.sqrt(d0) / 4.0D;

							if (entitylivingbase == par1MovingObjectPosition.entityHit)
							{
								d1 = 1.0D;
							}

							Iterator iterator1 = list.iterator();

							while (iterator1.hasNext())
							{
								PotionEffect potioneffect = (PotionEffect)iterator1.next();
								int i = potioneffect.getPotionID();

								if (Potion.potionTypes[i].isInstant())
								{
									Potion.potionTypes[i].affectEntity(this.getThrower(), entitylivingbase, potioneffect.getAmplifier(), d1);
								}
								else
								{
									int j = (int)(d1 * (double)potioneffect.getDuration() + 0.5D);

									if (j > 20)
									{
										entitylivingbase.addPotionEffect(new PotionEffect(i, j, potioneffect.getAmplifier()));
									}
								}
							}
						}
					}
				}
			}

			this.worldObj.playAuxSFX(2002, (int)Math.round(this.posX), (int)Math.round(this.posY), (int)Math.round(this.posZ), this.getPotionDamage());
			this.setDead();
		}
	}

	public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
	{
		super.readEntityFromNBT(par1NBTTagCompound);

		if (par1NBTTagCompound.hasKey("Potion", 10))
		{
			this.potionDamage = ItemStack.loadItemStackFromNBT(par1NBTTagCompound.getCompoundTag("Potion"));
		}
		else
		{
			this.setPotionDamage(par1NBTTagCompound.getInteger("potionValue"));
		}

		if (this.potionDamage == null)
		{
			this.setDead();
		}
	}

	public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
	{
		super.writeEntityToNBT(par1NBTTagCompound);

		if (this.potionDamage != null)
		{
			par1NBTTagCompound.setTag("Potion", this.potionDamage.writeToNBT(new NBTTagCompound()));
		}
	}
}