193 lines
5.9 KiB
Java
193 lines
5.9 KiB
Java
|
package mods.tinker.tconstruct.entity;
|
||
|
|
||
|
import java.util.Iterator;
|
||
|
import java.util.List;
|
||
|
|
||
|
import net.minecraft.entity.EntityLiving;
|
||
|
import net.minecraft.entity.projectile.EntityThrowable;
|
||
|
import net.minecraft.item.Item;
|
||
|
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;
|
||
|
import cpw.mods.fml.relauncher.Side;
|
||
|
import cpw.mods.fml.relauncher.SideOnly;
|
||
|
|
||
|
public class LaunchedPotion extends EntityThrowable
|
||
|
{
|
||
|
/**
|
||
|
* The damage value of the thrown potion that this EntityPotion represents.
|
||
|
*/
|
||
|
private ItemStack potionDamage;
|
||
|
|
||
|
public LaunchedPotion(World par1World)
|
||
|
{
|
||
|
super(par1World);
|
||
|
}
|
||
|
|
||
|
public LaunchedPotion(World par1World, EntityLiving par2EntityLiving, int par3)
|
||
|
{
|
||
|
this(par1World, par2EntityLiving, new ItemStack(Item.potion, 1, par3));
|
||
|
}
|
||
|
|
||
|
public LaunchedPotion(World par1World, EntityLiving par2EntityLiving, ItemStack par3ItemStack)
|
||
|
{
|
||
|
super(par1World, par2EntityLiving);
|
||
|
this.potionDamage = par3ItemStack;
|
||
|
}
|
||
|
|
||
|
@SideOnly(Side.CLIENT)
|
||
|
public LaunchedPotion(World par1World, double par2, double par4, double par6, int par8)
|
||
|
{
|
||
|
this(par1World, par2, par4, par6, new ItemStack(Item.potion, 1, par8));
|
||
|
}
|
||
|
|
||
|
public LaunchedPotion(World par1World, double par2, double par4, double par6, ItemStack par8ItemStack)
|
||
|
{
|
||
|
super(par1World, par2, par4, par6);
|
||
|
this.potionDamage = par8ItemStack;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Gets the amount of gravity to apply to the thrown entity with each tick.
|
||
|
*/
|
||
|
protected float getGravityVelocity()
|
||
|
{
|
||
|
return 0.05F;
|
||
|
}
|
||
|
|
||
|
protected float func_70182_d()
|
||
|
{
|
||
|
return 1.0F;
|
||
|
}
|
||
|
|
||
|
protected float func_70183_g()
|
||
|
{
|
||
|
return -10.0F;
|
||
|
}
|
||
|
|
||
|
public void setPotionDamage(int par1)
|
||
|
{
|
||
|
if (this.potionDamage == null)
|
||
|
{
|
||
|
this.potionDamage = new ItemStack(Item.potion, 1, 0);
|
||
|
}
|
||
|
|
||
|
this.potionDamage.setItemDamage(par1);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the damage value of the thrown potion that this EntityPotion represents.
|
||
|
*/
|
||
|
public int getPotionDamage()
|
||
|
{
|
||
|
if (this.potionDamage == null)
|
||
|
{
|
||
|
this.potionDamage = new ItemStack(Item.potion, 1, 0);
|
||
|
}
|
||
|
|
||
|
return this.potionDamage.getItemDamage();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Called when this EntityThrowable hits a block or entity.
|
||
|
*/
|
||
|
protected void onImpact(MovingObjectPosition par1MovingObjectPosition)
|
||
|
{
|
||
|
if (!this.worldObj.isRemote)
|
||
|
{
|
||
|
List list = Item.potion.getEffects(this.potionDamage);
|
||
|
|
||
|
if (list != null && !list.isEmpty())
|
||
|
{
|
||
|
AxisAlignedBB axisalignedbb = this.boundingBox.expand(4.0D, 2.0D, 4.0D);
|
||
|
List list1 = this.worldObj.getEntitiesWithinAABB(EntityLiving.class, axisalignedbb);
|
||
|
|
||
|
if (list1 != null && !list1.isEmpty())
|
||
|
{
|
||
|
Iterator iterator = list1.iterator();
|
||
|
|
||
|
while (iterator.hasNext())
|
||
|
{
|
||
|
EntityLiving entityliving = (EntityLiving)iterator.next();
|
||
|
double d0 = this.getDistanceSqToEntity(entityliving);
|
||
|
|
||
|
if (d0 < 16.0D)
|
||
|
{
|
||
|
double d1 = 1.0D - Math.sqrt(d0) / 4.0D;
|
||
|
|
||
|
if (entityliving == 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(), entityliving, potioneffect.getAmplifier(), d1);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
int j = (int)(d1 * (double)potioneffect.getDuration() + 0.5D);
|
||
|
|
||
|
if (j > 20)
|
||
|
{
|
||
|
entityliving.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();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* (abstract) Protected helper method to read subclass entity data from NBT.
|
||
|
*/
|
||
|
public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
|
||
|
{
|
||
|
super.readEntityFromNBT(par1NBTTagCompound);
|
||
|
|
||
|
if (par1NBTTagCompound.hasKey("Potion"))
|
||
|
{
|
||
|
this.potionDamage = ItemStack.loadItemStackFromNBT(par1NBTTagCompound.getCompoundTag("Potion"));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.setPotionDamage(par1NBTTagCompound.getInteger("potionValue"));
|
||
|
}
|
||
|
|
||
|
if (this.potionDamage == null)
|
||
|
{
|
||
|
this.setDead();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* (abstract) Protected helper method to write subclass entity data to NBT.
|
||
|
*/
|
||
|
public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
|
||
|
{
|
||
|
super.writeEntityToNBT(par1NBTTagCompound);
|
||
|
|
||
|
if (this.potionDamage != null)
|
||
|
{
|
||
|
par1NBTTagCompound.setCompoundTag("Potion", this.potionDamage.writeToNBT(new NBTTagCompound()));
|
||
|
}
|
||
|
}
|
||
|
}
|