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 func_82340_a(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.func_82340_a(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 }