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 }