2011-01-12 06:48:19 +01:00
package net.minecraft.server ;
import java.util.List ;
2011-01-21 06:54:30 +01:00
// CraftBukkit start
2012-02-08 09:19:24 +01:00
import org.bukkit.event.entity.EntityCombustByEntityEvent ;
2011-06-26 17:02:47 +02:00
import org.bukkit.event.player.PlayerPickupItemEvent ;
2011-01-21 06:54:30 +01:00
// CraftBukkit end
2011-01-12 06:48:19 +01:00
2012-10-25 05:53:23 +02:00
public class EntityArrow extends Entity implements IProjectile {
2011-01-12 06:48:19 +01:00
2012-07-29 09:33:13 +02:00
private int d = - 1 ;
2011-01-29 22:50:29 +01:00
private int e = - 1 ;
2011-05-26 14:48:22 +02:00
private int f = - 1 ;
2013-11-04 14:07:38 +01:00
private Block g ;
2013-07-01 13:03:00 +02:00
private int h ;
private boolean inGround ;
public int fromPlayer ;
public int shake ;
2011-09-15 02:23:52 +02:00
public Entity shooter ;
2012-07-29 09:33:13 +02:00
private int j ;
2013-07-01 13:03:00 +02:00
private int au ;
2012-01-12 23:10:13 +01:00
private double damage = 2 . 0D ;
2013-12-17 04:30:13 +01:00
public int aw ; // CraftBukkit - private -> public
2011-01-29 22:50:29 +01:00
2011-01-12 06:48:19 +01:00
public EntityArrow ( World world ) {
super ( world ) ;
2013-11-04 14:07:38 +01:00
this . k = 10 . 0D ;
2012-07-29 09:33:13 +02:00
this . a ( 0 . 5F , 0 . 5F ) ;
2011-01-12 06:48:19 +01:00
}
2011-01-29 22:50:29 +01:00
public EntityArrow ( World world , double d0 , double d1 , double d2 ) {
2011-01-30 16:15:17 +01:00
super ( world ) ;
2013-11-04 14:07:38 +01:00
this . k = 10 . 0D ;
2012-07-29 09:33:13 +02:00
this . a ( 0 . 5F , 0 . 5F ) ;
2011-04-20 19:05:14 +02:00
this . setPosition ( d0 , d1 , d2 ) ;
2011-01-29 22:50:29 +01:00
this . height = 0 . 0F ;
2011-01-12 06:48:19 +01:00
}
2012-03-01 11:49:23 +01:00
public EntityArrow ( World world , EntityLiving entityliving , EntityLiving entityliving1 , float f , float f1 ) {
super ( world ) ;
2013-11-04 14:07:38 +01:00
this . k = 10 . 0D ;
2012-03-01 11:49:23 +01:00
this . shooter = entityliving ;
2012-07-29 09:33:13 +02:00
if ( entityliving instanceof EntityHuman ) {
this . fromPlayer = 1 ;
}
2012-03-01 11:49:23 +01:00
this . locY = entityliving . locY + ( double ) entityliving . getHeadHeight ( ) - 0 . 10000000149011612D ;
double d0 = entityliving1 . locX - entityliving . locX ;
2013-03-13 23:33:27 +01:00
double d1 = entityliving1 . boundingBox . b + ( double ) ( entityliving1 . length / 3 . 0F ) - this . locY ;
2012-03-01 11:49:23 +01:00
double d2 = entityliving1 . locZ - entityliving . locZ ;
double d3 = ( double ) MathHelper . sqrt ( d0 * d0 + d2 * d2 ) ;
if ( d3 > = 1 . 0E - 7D ) {
float f2 = ( float ) ( Math . atan2 ( d2 , d0 ) * 180 . 0D / 3 . 1415927410125732D ) - 90 . 0F ;
float f3 = ( float ) ( - ( Math . atan2 ( d1 , d3 ) * 180 . 0D / 3 . 1415927410125732D ) ) ;
double d4 = d0 / d3 ;
double d5 = d2 / d3 ;
this . setPositionRotation ( entityliving . locX + d4 , this . locY , entityliving . locZ + d5 , f2 , f3 ) ;
this . height = 0 . 0F ;
float f4 = ( float ) d3 * 0 . 2F ;
this . shoot ( d0 , d1 + ( double ) f4 , d2 , f , f1 ) ;
}
}
2011-09-15 02:23:52 +02:00
public EntityArrow ( World world , EntityLiving entityliving , float f ) {
2011-01-30 16:15:17 +01:00
super ( world ) ;
2013-11-04 14:07:38 +01:00
this . k = 10 . 0D ;
2011-04-20 19:05:14 +02:00
this . shooter = entityliving ;
2012-07-29 09:33:13 +02:00
if ( entityliving instanceof EntityHuman ) {
this . fromPlayer = 1 ;
}
this . a ( 0 . 5F , 0 . 5F ) ;
2012-02-29 22:31:04 +01:00
this . setPositionRotation ( entityliving . locX , entityliving . locY + ( double ) entityliving . getHeadHeight ( ) , entityliving . locZ , entityliving . yaw , entityliving . pitch ) ;
2011-04-20 19:05:14 +02:00
this . locX - = ( double ) ( MathHelper . cos ( this . yaw / 180 . 0F * 3 . 1415927F ) * 0 . 16F ) ;
2011-01-29 22:50:29 +01:00
this . locY - = 0 . 10000000149011612D ;
2011-04-20 19:05:14 +02:00
this . locZ - = ( double ) ( MathHelper . sin ( this . yaw / 180 . 0F * 3 . 1415927F ) * 0 . 16F ) ;
this . setPosition ( this . locX , this . locY , this . locZ ) ;
2011-01-29 22:50:29 +01:00
this . height = 0 . 0F ;
2011-04-20 19:05:14 +02:00
this . motX = ( double ) ( - MathHelper . sin ( this . yaw / 180 . 0F * 3 . 1415927F ) * MathHelper . cos ( this . pitch / 180 . 0F * 3 . 1415927F ) ) ;
this . motZ = ( double ) ( MathHelper . cos ( this . yaw / 180 . 0F * 3 . 1415927F ) * MathHelper . cos ( this . pitch / 180 . 0F * 3 . 1415927F ) ) ;
this . motY = ( double ) ( - MathHelper . sin ( this . pitch / 180 . 0F * 3 . 1415927F ) ) ;
2012-01-12 16:27:39 +01:00
this . shoot ( this . motX , this . motY , this . motZ , f * 1 . 5F , 1 . 0F ) ;
2011-01-12 06:48:19 +01:00
}
2013-11-04 14:07:38 +01:00
protected void c ( ) {
2012-07-29 09:33:13 +02:00
this . datawatcher . a ( 16 , Byte . valueOf ( ( byte ) 0 ) ) ;
}
2011-01-12 06:48:19 +01:00
2012-01-12 16:27:39 +01:00
public void shoot ( double d0 , double d1 , double d2 , float f , float f1 ) {
2012-01-14 21:03:48 +01:00
float f2 = MathHelper . sqrt ( d0 * d0 + d1 * d1 + d2 * d2 ) ;
2011-01-29 22:50:29 +01:00
d0 / = ( double ) f2 ;
d1 / = ( double ) f2 ;
d2 / = ( double ) f2 ;
2013-03-13 23:33:27 +01:00
d0 + = this . random . nextGaussian ( ) * ( double ) ( this . random . nextBoolean ( ) ? - 1 : 1 ) * 0 . 007499999832361937D * ( double ) f1 ;
d1 + = this . random . nextGaussian ( ) * ( double ) ( this . random . nextBoolean ( ) ? - 1 : 1 ) * 0 . 007499999832361937D * ( double ) f1 ;
d2 + = this . random . nextGaussian ( ) * ( double ) ( this . random . nextBoolean ( ) ? - 1 : 1 ) * 0 . 007499999832361937D * ( double ) f1 ;
2011-01-29 22:50:29 +01:00
d0 * = ( double ) f ;
d1 * = ( double ) f ;
d2 * = ( double ) f ;
this . motX = d0 ;
this . motY = d1 ;
this . motZ = d2 ;
2012-01-14 21:03:48 +01:00
float f3 = MathHelper . sqrt ( d0 * d0 + d2 * d2 ) ;
2011-01-29 22:50:29 +01:00
this . lastYaw = this . yaw = ( float ) ( Math . atan2 ( d0 , d2 ) * 180 . 0D / 3 . 1415927410125732D ) ;
this . lastPitch = this . pitch = ( float ) ( Math . atan2 ( d1 , ( double ) f3 ) * 180 . 0D / 3 . 1415927410125732D ) ;
2012-07-29 09:33:13 +02:00
this . j = 0 ;
2011-01-12 06:48:19 +01:00
}
2013-11-04 14:07:38 +01:00
public void h ( ) {
super . h ( ) ;
2011-01-29 22:50:29 +01:00
if ( this . lastPitch = = 0 . 0F & & this . lastYaw = = 0 . 0F ) {
2012-01-14 21:03:48 +01:00
float f = MathHelper . sqrt ( this . motX * this . motX + this . motZ * this . motZ ) ;
2011-01-12 06:48:19 +01:00
2011-01-29 22:50:29 +01:00
this . lastYaw = this . yaw = ( float ) ( Math . atan2 ( this . motX , this . motZ ) * 180 . 0D / 3 . 1415927410125732D ) ;
this . lastPitch = this . pitch = ( float ) ( Math . atan2 ( this . motY , ( double ) f ) * 180 . 0D / 3 . 1415927410125732D ) ;
2011-01-12 06:48:19 +01:00
}
2011-01-29 22:50:29 +01:00
2013-11-04 14:07:38 +01:00
Block block = this . world . getType ( this . d , this . e , this . f ) ;
2011-05-26 14:48:22 +02:00
2013-11-04 14:07:38 +01:00
if ( block . getMaterial ( ) ! = Material . AIR ) {
block . updateShape ( this . world , this . d , this . e , this . f ) ;
AxisAlignedBB axisalignedbb = block . a ( this . world , this . d , this . e , this . f ) ;
2011-05-31 15:55:45 +02:00
2012-10-25 05:53:23 +02:00
if ( axisalignedbb ! = null & & axisalignedbb . a ( this . world . getVec3DPool ( ) . create ( this . locX , this . locY , this . locZ ) ) ) {
2011-06-27 00:25:01 +02:00
this . inGround = true ;
2011-05-26 14:48:22 +02:00
}
2011-01-12 06:48:19 +01:00
}
2011-01-29 22:50:29 +01:00
2011-06-27 00:25:01 +02:00
if ( this . shake > 0 ) {
- - this . shake ;
2011-05-26 14:48:22 +02:00
}
2011-01-29 22:50:29 +01:00
2011-06-27 00:25:01 +02:00
if ( this . inGround ) {
2013-11-04 14:07:38 +01:00
int i = this . world . getData ( this . d , this . e , this . f ) ;
2011-05-26 14:48:22 +02:00
2013-11-04 14:07:38 +01:00
if ( block = = this . g & & i = = this . h ) {
2012-07-29 09:33:13 +02:00
+ + this . j ;
if ( this . j = = 1200 ) {
2011-04-20 19:05:14 +02:00
this . die ( ) ;
2011-01-12 06:48:19 +01:00
}
2011-05-26 14:48:22 +02:00
} else {
2011-06-27 00:25:01 +02:00
this . inGround = false ;
2011-05-26 14:48:22 +02:00
this . motX * = ( double ) ( this . random . nextFloat ( ) * 0 . 2F ) ;
this . motY * = ( double ) ( this . random . nextFloat ( ) * 0 . 2F ) ;
this . motZ * = ( double ) ( this . random . nextFloat ( ) * 0 . 2F ) ;
2012-07-29 09:33:13 +02:00
this . j = 0 ;
2013-03-13 23:33:27 +01:00
this . au = 0 ;
2011-01-12 06:48:19 +01:00
}
} else {
2013-03-13 23:33:27 +01:00
+ + this . au ;
2012-10-25 05:53:23 +02:00
Vec3D vec3d = this . world . getVec3DPool ( ) . create ( this . locX , this . locY , this . locZ ) ;
Vec3D vec3d1 = this . world . getVec3DPool ( ) . create ( this . locX + this . motX , this . locY + this . motY , this . locZ + this . motZ ) ;
2013-11-04 14:07:38 +01:00
MovingObjectPosition movingobjectposition = this . world . rayTrace ( vec3d , vec3d1 , false , true , false ) ;
2011-05-26 14:48:22 +02:00
2012-10-25 05:53:23 +02:00
vec3d = this . world . getVec3DPool ( ) . create ( this . locX , this . locY , this . locZ ) ;
vec3d1 = this . world . getVec3DPool ( ) . create ( this . locX + this . motX , this . locY + this . motY , this . locZ + this . motZ ) ;
2011-05-26 14:48:22 +02:00
if ( movingobjectposition ! = null ) {
2012-10-25 05:53:23 +02:00
vec3d1 = this . world . getVec3DPool ( ) . create ( movingobjectposition . pos . c , movingobjectposition . pos . d , movingobjectposition . pos . e ) ;
2011-05-26 14:48:22 +02:00
}
2011-01-29 22:50:29 +01:00
2011-05-26 14:48:22 +02:00
Entity entity = null ;
2012-01-12 16:27:39 +01:00
List list = this . world . getEntities ( this , this . boundingBox . a ( this . motX , this . motY , this . motZ ) . grow ( 1 . 0D , 1 . 0D , 1 . 0D ) ) ;
2011-05-26 14:48:22 +02:00
double d0 = 0 . 0D ;
2011-01-12 06:48:19 +01:00
2013-11-04 14:07:38 +01:00
int j ;
2011-05-26 14:48:22 +02:00
float f1 ;
2011-01-29 22:50:29 +01:00
2013-11-04 14:07:38 +01:00
for ( j = 0 ; j < list . size ( ) ; + + j ) {
Entity entity1 = ( Entity ) list . get ( j ) ;
2011-01-12 06:48:19 +01:00
2013-11-04 14:07:38 +01:00
if ( entity1 . R ( ) & & ( entity1 ! = this . shooter | | this . au > = 5 ) ) {
2011-05-26 14:48:22 +02:00
f1 = 0 . 3F ;
2012-01-12 16:27:39 +01:00
AxisAlignedBB axisalignedbb1 = entity1 . boundingBox . grow ( ( double ) f1 , ( double ) f1 , ( double ) f1 ) ;
2011-05-31 15:55:45 +02:00
MovingObjectPosition movingobjectposition1 = axisalignedbb1 . a ( vec3d , vec3d1 ) ;
2011-01-12 06:48:19 +01:00
2011-05-26 14:48:22 +02:00
if ( movingobjectposition1 ! = null ) {
2012-02-29 22:31:04 +01:00
double d1 = vec3d . distanceSquared ( movingobjectposition1 . pos ) ; // CraftBukkit - distance efficiency
2011-01-12 06:48:19 +01:00
2011-05-26 14:48:22 +02:00
if ( d1 < d0 | | d0 = = 0 . 0D ) {
entity = entity1 ;
d0 = d1 ;
}
2011-01-29 22:50:29 +01:00
}
}
2011-01-12 06:48:19 +01:00
}
2011-05-26 14:48:22 +02:00
if ( entity ! = null ) {
movingobjectposition = new MovingObjectPosition ( entity ) ;
}
2011-01-29 22:50:29 +01:00
2013-03-13 23:33:27 +01:00
if ( movingobjectposition ! = null & & movingobjectposition . entity ! = null & & movingobjectposition . entity instanceof EntityHuman ) {
EntityHuman entityhuman = ( EntityHuman ) movingobjectposition . entity ;
if ( entityhuman . abilities . isInvulnerable | | this . shooter instanceof EntityHuman & & ! ( ( EntityHuman ) this . shooter ) . a ( entityhuman ) ) {
movingobjectposition = null ;
}
}
2011-05-26 14:48:22 +02:00
float f2 ;
2012-12-20 05:03:52 +01:00
float f3 ;
2011-05-26 14:48:22 +02:00
if ( movingobjectposition ! = null ) {
2013-03-23 17:16:00 +01:00
org . bukkit . craftbukkit . event . CraftEventFactory . callProjectileHitEvent ( this ) ; // CraftBukkit - Call event
2013-03-13 23:33:27 +01:00
2011-05-26 14:48:22 +02:00
if ( movingobjectposition . entity ! = null ) {
2012-01-14 21:03:48 +01:00
f2 = MathHelper . sqrt ( this . motX * this . motX + this . motY * this . motY + this . motZ * this . motZ ) ;
2013-11-04 14:07:38 +01:00
int k = MathHelper . f ( ( double ) f2 * this . damage ) ;
2011-09-15 02:23:52 +02:00
2013-11-04 14:07:38 +01:00
if ( this . f ( ) ) {
k + = this . random . nextInt ( k / 2 + 2 ) ;
2011-11-20 09:01:14 +01:00
}
DamageSource damagesource = null ;
if ( this . shooter = = null ) {
damagesource = DamageSource . arrow ( this , this ) ;
} else {
damagesource = DamageSource . arrow ( this , this . shooter ) ;
2011-09-15 02:23:52 +02:00
}
2013-03-25 05:22:32 +01:00
// CraftBukkit start - Moved damage call
2013-11-04 14:07:38 +01:00
if ( movingobjectposition . entity . damageEntity ( damagesource , k ) ) {
2013-03-13 23:33:27 +01:00
if ( this . isBurning ( ) & & ! ( movingobjectposition . entity instanceof EntityEnderman ) & & ( ! ( movingobjectposition . entity instanceof EntityPlayer ) | | ! ( this . shooter instanceof EntityPlayer ) | | this . world . pvpMode ) ) { // CraftBukkit - abide by pvp setting if destination is a player
2012-02-08 09:19:24 +01:00
EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent ( this . getBukkitEntity ( ) , entity . getBukkitEntity ( ) , 5 ) ;
2012-03-26 03:58:12 +02:00
org . bukkit . Bukkit . getPluginManager ( ) . callEvent ( combustEvent ) ;
2012-02-08 09:19:24 +01:00
if ( ! combustEvent . isCancelled ( ) ) {
movingobjectposition . entity . setOnFire ( combustEvent . getDuration ( ) ) ;
}
// CraftBukkit end
2012-01-12 23:10:13 +01:00
}
2012-03-12 23:55:02 +01:00
2013-11-04 14:07:38 +01:00
// if (movingobjectposition.entity.damageEntity(damagesource, (float) k)) { // CraftBukkit - moved up
2011-09-16 21:10:11 +02:00
if ( movingobjectposition . entity instanceof EntityLiving ) {
2012-12-20 05:03:52 +01:00
EntityLiving entityliving = ( EntityLiving ) movingobjectposition . entity ;
2012-11-06 13:05:28 +01:00
2012-12-20 05:03:52 +01:00
if ( ! this . world . isStatic ) {
2013-11-04 14:07:38 +01:00
entityliving . p ( entityliving . aZ ( ) + 1 ) ;
2012-11-06 13:05:28 +01:00
}
2013-03-13 23:33:27 +01:00
if ( this . aw > 0 ) {
2012-12-20 05:03:52 +01:00
f3 = MathHelper . sqrt ( this . motX * this . motX + this . motZ * this . motZ ) ;
2012-01-12 23:10:13 +01:00
if ( f3 > 0 . 0F ) {
2013-03-13 23:33:27 +01:00
movingobjectposition . entity . g ( this . motX * ( double ) this . aw * 0 . 6000000238418579D / ( double ) f3 , 0 . 1D , this . motZ * ( double ) this . aw * 0 . 6000000238418579D / ( double ) f3 ) ;
2012-01-12 23:10:13 +01:00
}
}
2012-12-20 05:03:52 +01:00
2013-11-04 14:07:38 +01:00
if ( this . shooter ! = null & & this . shooter instanceof EntityLiving ) {
EnchantmentManager . a ( entityliving , this . shooter ) ;
EnchantmentManager . b ( ( EntityLiving ) this . shooter , entityliving ) ;
2012-12-30 02:05:32 +01:00
}
2013-01-17 10:28:44 +01:00
2012-12-20 05:03:52 +01:00
if ( this . shooter ! = null & & movingobjectposition . entity ! = this . shooter & & movingobjectposition . entity instanceof EntityHuman & & this . shooter instanceof EntityPlayer ) {
2013-11-04 14:07:38 +01:00
( ( EntityPlayer ) this . shooter ) . playerConnection . sendPacket ( new PacketPlayOutGameStateChange ( 6 , 0 . 0F ) ) ;
2012-12-20 05:03:52 +01:00
}
2011-09-16 21:10:11 +02:00
}
2012-11-06 13:05:28 +01:00
this . makeSound ( " random.bowhit " , 1 . 0F , 1 . 2F / ( this . random . nextFloat ( ) * 0 . 2F + 0 . 9F ) ) ;
2012-12-20 05:03:52 +01:00
if ( ! ( movingobjectposition . entity instanceof EntityEnderman ) ) {
this . die ( ) ;
}
2011-01-12 06:48:19 +01:00
} else {
2011-05-26 14:48:22 +02:00
this . motX * = - 0 . 10000000149011612D ;
this . motY * = - 0 . 10000000149011612D ;
this . motZ * = - 0 . 10000000149011612D ;
this . yaw + = 180 . 0F ;
this . lastYaw + = 180 . 0F ;
2013-03-13 23:33:27 +01:00
this . au = 0 ;
2011-01-12 06:48:19 +01:00
}
} else {
2012-07-29 09:33:13 +02:00
this . d = movingobjectposition . b ;
this . e = movingobjectposition . c ;
this . f = movingobjectposition . d ;
2013-11-04 14:07:38 +01:00
this . g = block ;
2012-07-29 09:33:13 +02:00
this . h = this . world . getData ( this . d , this . e , this . f ) ;
2012-10-25 05:53:23 +02:00
this . motX = ( double ) ( ( float ) ( movingobjectposition . pos . c - this . locX ) ) ;
this . motY = ( double ) ( ( float ) ( movingobjectposition . pos . d - this . locY ) ) ;
this . motZ = ( double ) ( ( float ) ( movingobjectposition . pos . e - this . locZ ) ) ;
2012-01-14 21:03:48 +01:00
f2 = MathHelper . sqrt ( this . motX * this . motX + this . motY * this . motY + this . motZ * this . motZ ) ;
2011-05-26 14:48:22 +02:00
this . locX - = this . motX / ( double ) f2 * 0 . 05000000074505806D ;
this . locY - = this . motY / ( double ) f2 * 0 . 05000000074505806D ;
this . locZ - = this . motZ / ( double ) f2 * 0 . 05000000074505806D ;
2012-11-06 13:05:28 +01:00
this . makeSound ( " random.bowhit " , 1 . 0F , 1 . 2F / ( this . random . nextFloat ( ) * 0 . 2F + 0 . 9F ) ) ;
2011-06-27 00:25:01 +02:00
this . inGround = true ;
this . shake = 7 ;
2013-03-13 23:33:27 +01:00
this . a ( false ) ;
2013-11-04 14:07:38 +01:00
if ( this . g . getMaterial ( ) ! = Material . AIR ) {
this . g . a ( this . world , this . d , this . e , this . f , ( Entity ) this ) ;
2012-11-06 13:05:28 +01:00
}
2011-09-15 02:23:52 +02:00
}
}
2013-11-04 14:07:38 +01:00
if ( this . f ( ) ) {
for ( j = 0 ; j < 4 ; + + j ) {
this . world . addParticle ( " crit " , this . locX + this . motX * ( double ) j / 4 . 0D , this . locY + this . motY * ( double ) j / 4 . 0D , this . locZ + this . motZ * ( double ) j / 4 . 0D , - this . motX , - this . motY + 0 . 2D , - this . motZ ) ;
2011-01-12 06:48:19 +01:00
}
}
2011-05-26 14:48:22 +02:00
this . locX + = this . motX ;
this . locY + = this . motY ;
this . locZ + = this . motZ ;
2012-01-14 21:03:48 +01:00
f2 = MathHelper . sqrt ( this . motX * this . motX + this . motZ * this . motZ ) ;
2011-05-26 14:48:22 +02:00
this . yaw = ( float ) ( Math . atan2 ( this . motX , this . motZ ) * 180 . 0D / 3 . 1415927410125732D ) ;
2011-01-29 22:50:29 +01:00
2011-05-26 14:48:22 +02:00
for ( this . pitch = ( float ) ( Math . atan2 ( this . motY , ( double ) f2 ) * 180 . 0D / 3 . 1415927410125732D ) ; this . pitch - this . lastPitch < - 180 . 0F ; this . lastPitch - = 360 . 0F ) {
;
}
2011-01-29 22:50:29 +01:00
2011-05-26 14:48:22 +02:00
while ( this . pitch - this . lastPitch > = 180 . 0F ) {
this . lastPitch + = 360 . 0F ;
}
2011-01-29 22:50:29 +01:00
2011-05-26 14:48:22 +02:00
while ( this . yaw - this . lastYaw < - 180 . 0F ) {
this . lastYaw - = 360 . 0F ;
}
2011-01-29 22:50:29 +01:00
2011-05-26 14:48:22 +02:00
while ( this . yaw - this . lastYaw > = 180 . 0F ) {
this . lastYaw + = 360 . 0F ;
}
2011-01-12 06:48:19 +01:00
2011-05-26 14:48:22 +02:00
this . pitch = this . lastPitch + ( this . pitch - this . lastPitch ) * 0 . 2F ;
this . yaw = this . lastYaw + ( this . yaw - this . lastYaw ) * 0 . 2F ;
2012-01-12 23:10:13 +01:00
float f4 = 0 . 99F ;
2011-01-12 06:48:19 +01:00
2011-09-15 02:23:52 +02:00
f1 = 0 . 05F ;
2013-11-04 14:07:38 +01:00
if ( this . M ( ) ) {
for ( int l = 0 ; l < 4 ; + + l ) {
2012-12-20 05:03:52 +01:00
f3 = 0 . 25F ;
this . world . addParticle ( " bubble " , this . locX - this . motX * ( double ) f3 , this . locY - this . motY * ( double ) f3 , this . locZ - this . motZ * ( double ) f3 , this . motX , this . motY , this . motZ ) ;
2011-05-26 14:48:22 +02:00
}
2012-01-12 23:10:13 +01:00
f4 = 0 . 8F ;
2011-01-12 06:48:19 +01:00
}
2013-11-04 14:07:38 +01:00
if ( this . L ( ) ) {
this . extinguish ( ) ;
}
2012-01-12 23:10:13 +01:00
this . motX * = ( double ) f4 ;
this . motY * = ( double ) f4 ;
this . motZ * = ( double ) f4 ;
2011-05-26 14:48:22 +02:00
this . motY - = ( double ) f1 ;
this . setPosition ( this . locX , this . locY , this . locZ ) ;
2013-11-04 14:07:38 +01:00
this . I ( ) ;
2011-01-12 06:48:19 +01:00
}
}
2011-04-20 22:47:26 +02:00
public void b ( NBTTagCompound nbttagcompound ) {
2012-07-29 09:33:13 +02:00
nbttagcompound . setShort ( " xTile " , ( short ) this . d ) ;
nbttagcompound . setShort ( " yTile " , ( short ) this . e ) ;
nbttagcompound . setShort ( " zTile " , ( short ) this . f ) ;
2013-11-04 14:07:38 +01:00
nbttagcompound . setShort ( " life " , ( short ) this . j ) ;
nbttagcompound . setByte ( " inTile " , ( byte ) Block . b ( this . g ) ) ;
2012-07-29 09:33:13 +02:00
nbttagcompound . setByte ( " inData " , ( byte ) this . h ) ;
2011-11-30 00:17:43 +01:00
nbttagcompound . setByte ( " shake " , ( byte ) this . shake ) ;
nbttagcompound . setByte ( " inGround " , ( byte ) ( this . inGround ? 1 : 0 ) ) ;
2012-07-29 09:33:13 +02:00
nbttagcompound . setByte ( " pickup " , ( byte ) this . fromPlayer ) ;
2012-01-12 23:10:13 +01:00
nbttagcompound . setDouble ( " damage " , this . damage ) ;
2011-01-12 06:48:19 +01:00
}
2011-04-20 22:47:26 +02:00
public void a ( NBTTagCompound nbttagcompound ) {
2012-07-29 09:33:13 +02:00
this . d = nbttagcompound . getShort ( " xTile " ) ;
this . e = nbttagcompound . getShort ( " yTile " ) ;
this . f = nbttagcompound . getShort ( " zTile " ) ;
2013-11-04 14:07:38 +01:00
this . j = nbttagcompound . getShort ( " life " ) ;
this . g = Block . e ( nbttagcompound . getByte ( " inTile " ) & 255 ) ;
2012-07-29 09:33:13 +02:00
this . h = nbttagcompound . getByte ( " inData " ) & 255 ;
2011-11-30 00:17:43 +01:00
this . shake = nbttagcompound . getByte ( " shake " ) & 255 ;
this . inGround = nbttagcompound . getByte ( " inGround " ) = = 1 ;
2013-11-04 14:07:38 +01:00
if ( nbttagcompound . hasKeyOfType ( " damage " , 99 ) ) {
2012-01-12 23:10:13 +01:00
this . damage = nbttagcompound . getDouble ( " damage " ) ;
}
2012-07-29 09:33:13 +02:00
2013-11-04 14:07:38 +01:00
if ( nbttagcompound . hasKeyOfType ( " pickup " , 99 ) ) {
2012-07-29 09:33:13 +02:00
this . fromPlayer = nbttagcompound . getByte ( " pickup " ) ;
2013-11-04 14:07:38 +01:00
} else if ( nbttagcompound . hasKeyOfType ( " player " , 99 ) ) {
2012-07-29 09:33:13 +02:00
this . fromPlayer = nbttagcompound . getBoolean ( " player " ) ? 1 : 0 ;
}
2011-01-12 06:48:19 +01:00
}
2013-03-13 23:33:27 +01:00
public void b_ ( EntityHuman entityhuman ) {
2012-07-29 09:33:13 +02:00
if ( ! this . world . isStatic & & this . inGround & & this . shake < = 0 ) {
2011-06-26 17:02:47 +02:00
// CraftBukkit start
2013-11-04 14:07:38 +01:00
ItemStack itemstack = new ItemStack ( Items . ARROW ) ;
2012-10-25 05:53:23 +02:00
if ( this . fromPlayer = = 1 & & entityhuman . inventory . canHold ( itemstack ) > 0 ) {
2012-03-26 03:58:12 +02:00
EntityItem item = new EntityItem ( this . world , this . locX , this . locY , this . locZ , itemstack ) ;
2011-06-26 17:02:47 +02:00
2012-03-26 03:58:12 +02:00
PlayerPickupItemEvent event = new PlayerPickupItemEvent ( ( org . bukkit . entity . Player ) entityhuman . getBukkitEntity ( ) , new org . bukkit . craftbukkit . entity . CraftItem ( this . world . getServer ( ) , this , item ) , 0 ) ;
2013-07-01 13:03:00 +02:00
// event.setCancelled(!entityhuman.canPickUpLoot); TODO
2011-06-26 17:02:47 +02:00
this . world . getServer ( ) . getPluginManager ( ) . callEvent ( event ) ;
if ( event . isCancelled ( ) ) {
return ;
}
}
2011-06-27 00:25:01 +02:00
// CraftBukkit end
2011-06-26 17:02:47 +02:00
2012-07-29 09:33:13 +02:00
boolean flag = this . fromPlayer = = 1 | | this . fromPlayer = = 2 & & entityhuman . abilities . canInstantlyBuild ;
2013-11-04 14:07:38 +01:00
if ( this . fromPlayer = = 1 & & ! entityhuman . inventory . pickup ( new ItemStack ( Items . ARROW , 1 ) ) ) {
2012-07-29 09:33:13 +02:00
flag = false ;
}
if ( flag ) {
2012-11-06 13:05:28 +01:00
this . makeSound ( " random.pop " , 0 . 2F , ( ( this . random . nextFloat ( ) - this . random . nextFloat ( ) ) * 0 . 7F + 1 . 0F ) * 2 . 0F ) ;
2011-04-20 19:05:14 +02:00
entityhuman . receive ( this , 1 ) ;
this . die ( ) ;
2011-01-29 22:50:29 +01:00
}
2011-01-12 06:48:19 +01:00
}
}
2012-01-12 23:10:13 +01:00
2013-11-04 14:07:38 +01:00
protected boolean g_ ( ) {
2012-10-25 05:53:23 +02:00
return false ;
}
2012-07-29 09:33:13 +02:00
public void b ( double d0 ) {
2012-01-12 23:10:13 +01:00
this . damage = d0 ;
}
2013-11-04 14:07:38 +01:00
public double e ( ) {
2012-01-12 23:10:13 +01:00
return this . damage ;
}
2012-07-29 09:33:13 +02:00
public void a ( int i ) {
2013-03-13 23:33:27 +01:00
this . aw = i ;
2012-01-12 23:10:13 +01:00
}
2012-03-01 11:49:23 +01:00
2013-11-04 14:07:38 +01:00
public boolean av ( ) {
2012-03-01 11:49:23 +01:00
return false ;
}
2012-07-29 09:33:13 +02:00
2013-03-13 23:33:27 +01:00
public void a ( boolean flag ) {
2012-07-29 09:33:13 +02:00
byte b0 = this . datawatcher . getByte ( 16 ) ;
if ( flag ) {
this . datawatcher . watch ( 16 , Byte . valueOf ( ( byte ) ( b0 | 1 ) ) ) ;
} else {
this . datawatcher . watch ( 16 , Byte . valueOf ( ( byte ) ( b0 & - 2 ) ) ) ;
}
}
2013-11-04 14:07:38 +01:00
public boolean f ( ) {
2012-07-29 09:33:13 +02:00
byte b0 = this . datawatcher . getByte ( 16 ) ;
return ( b0 & 1 ) ! = 0 ;
}
2013-07-11 02:25:34 +02:00
// CraftBukkit start
public boolean isInGround ( ) {
return inGround ;
}
// CraftBukkit end
2011-01-12 06:48:19 +01:00
}