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
2011-06-18 17:10:31 +02:00
import org.bukkit.entity.Projectile ;
2012-02-08 09:19:24 +01:00
import org.bukkit.event.entity.EntityCombustByEntityEvent ;
2011-07-14 19:46:02 +02:00
import org.bukkit.event.entity.ProjectileHitEvent ;
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 ;
2012-07-29 09:33:13 +02:00
private int g = 0 ;
2011-05-26 14:48:22 +02:00
private int h = 0 ;
2011-06-27 00:25:01 +02:00
private boolean inGround = false ;
2012-07-29 09:33:13 +02:00
public int fromPlayer = 0 ;
2011-06-27 00:25:01 +02:00
public int shake = 0 ;
2011-09-15 02:23:52 +02:00
public Entity shooter ;
2012-07-29 09:33:13 +02:00
private int j ;
2012-10-25 05:53:23 +02:00
private int as = 0 ;
2012-01-12 23:10:13 +01:00
private double damage = 2 . 0D ;
2012-10-25 05:53:23 +02:00
private int au ;
2011-01-29 22:50:29 +01:00
2011-01-12 06:48:19 +01:00
public EntityArrow ( World world ) {
super ( world ) ;
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 ) ;
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 ) ;
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 ;
double d1 = entityliving1 . locY + ( double ) entityliving1 . getHeadHeight ( ) - 0 . 699999988079071D - this . locY ;
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 ) ;
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
}
2012-07-29 09:33:13 +02:00
protected void a ( ) {
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 ;
d0 + = this . random . nextGaussian ( ) * 0 . 007499999832361937D * ( double ) f1 ;
d1 + = this . random . nextGaussian ( ) * 0 . 007499999832361937D * ( double ) f1 ;
d2 + = this . random . nextGaussian ( ) * 0 . 007499999832361937D * ( double ) f1 ;
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
}
2012-10-25 05:53:23 +02:00
public void j_ ( ) {
super . j_ ( ) ;
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
2012-07-29 09:33:13 +02:00
int i = this . world . getTypeId ( this . d , this . e , this . f ) ;
2011-05-26 14:48:22 +02:00
if ( i > 0 ) {
2012-07-29 09:33:13 +02:00
Block . byId [ i ] . updateShape ( this . world , this . d , this . e , this . f ) ;
AxisAlignedBB axisalignedbb = Block . byId [ i ] . e ( 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 ) {
2012-07-29 09:33:13 +02:00
int j = this . world . getTypeId ( this . d , this . e , this . f ) ;
int k = this . world . getData ( this . d , this . e , this . f ) ;
2011-05-26 14:48:22 +02:00
2012-07-29 09:33:13 +02:00
if ( j = = this . g & & k = = this . h ) {
+ + 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 ;
2012-10-25 05:53:23 +02:00
this . as = 0 ;
2011-01-12 06:48:19 +01:00
}
} else {
2012-10-25 05:53:23 +02:00
+ + this . as ;
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 ) ;
2011-05-26 14:48:22 +02:00
MovingObjectPosition movingobjectposition = this . world . rayTrace ( vec3d , vec3d1 , false , true ) ;
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
2012-11-06 13:05:28 +01:00
int l ;
2011-05-26 14:48:22 +02:00
float f1 ;
2011-01-29 22:50:29 +01:00
2012-11-06 13:05:28 +01:00
for ( l = 0 ; l < list . size ( ) ; + + l ) {
Entity entity1 = ( Entity ) list . get ( l ) ;
2011-01-12 06:48:19 +01:00
2012-10-25 05:53:23 +02:00
if ( entity1 . L ( ) & & ( entity1 ! = this . shooter | | this . as > = 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
2011-05-26 14:48:22 +02:00
float f2 ;
if ( movingobjectposition ! = null ) {
2011-07-14 19:46:02 +02:00
// CraftBukkit start
2012-02-10 15:32:11 +01:00
Projectile projectile = ( Projectile ) this . getBukkitEntity ( ) ;
ProjectileHitEvent phe = new ProjectileHitEvent ( projectile ) ;
2011-07-14 19:46:02 +02:00
this . world . getServer ( ) . getPluginManager ( ) . callEvent ( phe ) ;
// CraftBukkit end
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 ) ;
2012-11-06 13:05:28 +01:00
int i1 = MathHelper . f ( ( double ) f2 * this . damage ) ;
2011-09-15 02:23:52 +02:00
2012-10-25 05:53:23 +02:00
if ( this . d ( ) ) {
2012-11-06 13:05:28 +01:00
i1 + = this . random . nextInt ( i1 / 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
}
2012-03-14 11:22:43 +01:00
// CraftBukkit start - moved damage call
2012-11-06 13:05:28 +01:00
if ( movingobjectposition . entity . damageEntity ( damagesource , i1 ) ) {
2012-11-27 19:14:53 +01:00
if ( this . isBurning ( ) & & ( ! ( 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
2012-11-06 13:05:28 +01:00
// if (movingobjectposition.entity.damageEntity(damagesource, i1)) { // CraftBukkit - moved up
2011-09-16 21:10:11 +02:00
if ( movingobjectposition . entity instanceof EntityLiving ) {
2012-11-06 13:05:28 +01:00
if ( ! this . world . isStatic ) {
EntityLiving entityliving = ( EntityLiving ) movingobjectposition . entity ;
entityliving . r ( entityliving . bJ ( ) + 1 ) ;
}
2012-10-25 05:53:23 +02:00
if ( this . au > 0 ) {
2012-01-14 21:03:48 +01:00
float f3 = MathHelper . sqrt ( this . motX * this . motX + this . motZ * this . motZ ) ;
2012-01-12 23:10:13 +01:00
if ( f3 > 0 . 0F ) {
2012-10-25 05:53:23 +02:00
movingobjectposition . entity . g ( this . motX * ( double ) this . au * 0 . 6000000238418579D / ( double ) f3 , 0 . 1D , this . motZ * ( double ) this . au * 0 . 6000000238418579D / ( double ) f3 ) ;
2012-01-12 23:10:13 +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 ) ) ;
2011-05-26 14:48:22 +02:00
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 ;
2012-10-25 05:53:23 +02:00
this . as = 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 ;
this . g = this . world . getTypeId ( this . d , this . e , this . f ) ;
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 ;
2012-10-25 05:53:23 +02:00
this . e ( false ) ;
2012-11-06 13:05:28 +01:00
if ( this . g ! = 0 ) {
Block . byId [ this . g ] . a ( this . world , this . d , this . e , this . f , this ) ;
}
2011-09-15 02:23:52 +02:00
}
}
2012-10-25 05:53:23 +02:00
if ( this . d ( ) ) {
2012-11-06 13:05:28 +01:00
for ( l = 0 ; l < 4 ; + + l ) {
this . world . addParticle ( " crit " , this . locX + this . motX * ( double ) l / 4 . 0D , this . locY + this . motY * ( double ) l / 4 . 0D , this . locZ + this . motZ * ( double ) l / 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 ;
2012-07-29 09:33:13 +02:00
if ( this . H ( ) ) {
for ( int j1 = 0 ; j1 < 4 ; + + j1 ) {
2012-01-12 23:10:13 +01:00
float f5 = 0 . 25F ;
2011-01-29 22:50:29 +01:00
2012-10-25 05:53:23 +02:00
this . world . addParticle ( " bubble " , this . locX - this . motX * ( double ) f5 , this . locY - this . motY * ( double ) f5 , this . locZ - this . motZ * ( double ) f5 , 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
}
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 ) ;
2012-07-29 09:33:13 +02:00
this . D ( ) ;
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 ) ;
nbttagcompound . setByte ( " inTile " , ( byte ) this . g ) ;
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 " ) ;
this . g = nbttagcompound . getByte ( " inTile " ) & 255 ;
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 ;
2012-01-12 23:10:13 +01:00
if ( nbttagcompound . hasKey ( " damage " ) ) {
this . damage = nbttagcompound . getDouble ( " damage " ) ;
}
2012-07-29 09:33:13 +02:00
if ( nbttagcompound . hasKey ( " pickup " ) ) {
this . fromPlayer = nbttagcompound . getByte ( " pickup " ) ;
} else if ( nbttagcompound . hasKey ( " player " ) ) {
this . fromPlayer = nbttagcompound . getBoolean ( " player " ) ? 1 : 0 ;
}
2011-01-12 06:48:19 +01:00
}
2012-11-06 13:05:28 +01:00
public void c_ ( 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
2012-03-26 03:58:12 +02:00
ItemStack itemstack = new ItemStack ( Item . 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 ) ;
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 ;
if ( this . fromPlayer = = 1 & & ! entityhuman . inventory . pickup ( new ItemStack ( Item . ARROW , 1 ) ) ) {
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
2012-10-25 05:53:23 +02:00
protected boolean f_ ( ) {
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 ;
}
2012-10-25 05:53:23 +02:00
public double c ( ) {
2012-01-12 23:10:13 +01:00
return this . damage ;
}
2012-07-29 09:33:13 +02:00
public void a ( int i ) {
2012-10-25 05:53:23 +02:00
this . au = i ;
2012-01-12 23:10:13 +01:00
}
2012-03-01 11:49:23 +01:00
2012-10-25 05:53:23 +02:00
public boolean aq ( ) {
2012-03-01 11:49:23 +01:00
return false ;
}
2012-07-29 09:33:13 +02:00
2012-10-25 05:53:23 +02:00
public void e ( 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 ) ) ) ;
}
}
2012-10-25 05:53:23 +02:00
public boolean d ( ) {
2012-07-29 09:33:13 +02:00
byte b0 = this . datawatcher . getByte ( 16 ) ;
return ( b0 & 1 ) ! = 0 ;
}
2011-01-12 06:48:19 +01:00
}