package net.minecraft.server; import java.util.Iterator; import java.util.List; import java.util.UUID; import javax.annotation.Nullable; public class EntityLlamaSpit extends Entity implements IProjectile { public EntityLiving shooter; // CraftBukkit - type private NBTTagCompound b; public EntityLlamaSpit(World world) { super(world); } public EntityLlamaSpit(World world, EntityLlama entityllama) { super(world); this.shooter = entityllama; this.setPosition(entityllama.locX - (double) (entityllama.width + 1.0F) * 0.5D * (double) MathHelper.sin(entityllama.aN * 0.017453292F), entityllama.locY + (double) entityllama.getHeadHeight() - 0.10000000149011612D, entityllama.locZ + (double) (entityllama.width + 1.0F) * 0.5D * (double) MathHelper.cos(entityllama.aN * 0.017453292F)); this.setSize(0.25F, 0.25F); } public void A_() { super.A_(); if (this.b != null) { this.j(); } Vec3D vec3d = new Vec3D(this.locX, this.locY, this.locZ); Vec3D vec3d1 = new Vec3D(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); MovingObjectPosition movingobjectposition = this.world.rayTrace(vec3d, vec3d1); vec3d = new Vec3D(this.locX, this.locY, this.locZ); vec3d1 = new Vec3D(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); if (movingobjectposition != null) { vec3d1 = new Vec3D(movingobjectposition.pos.x, movingobjectposition.pos.y, movingobjectposition.pos.z); } Entity entity = this.a(vec3d, vec3d1); if (entity != null) { movingobjectposition = new MovingObjectPosition(entity); } if (movingobjectposition != null) { this.a(movingobjectposition); } this.locX += this.motX; this.locY += this.motY; this.locZ += this.motZ; float f = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); this.yaw = (float) (MathHelper.c(this.motX, this.motZ) * 57.2957763671875D); for (this.pitch = (float) (MathHelper.c(this.motY, (double) f) * 57.2957763671875D); this.pitch - this.lastPitch < -180.0F; this.lastPitch -= 360.0F) { ; } while (this.pitch - this.lastPitch >= 180.0F) { this.lastPitch += 360.0F; } while (this.yaw - this.lastYaw < -180.0F) { this.lastYaw -= 360.0F; } while (this.yaw - this.lastYaw >= 180.0F) { this.lastYaw += 360.0F; } this.pitch = this.lastPitch + (this.pitch - this.lastPitch) * 0.2F; this.yaw = this.lastYaw + (this.yaw - this.lastYaw) * 0.2F; float f1 = 0.99F; float f2 = 0.06F; if (!this.world.a(this.getBoundingBox(), Material.AIR)) { this.die(); } else if (this.isInWater()) { this.die(); } else { this.motX *= 0.9900000095367432D; this.motY *= 0.9900000095367432D; this.motZ *= 0.9900000095367432D; if (!this.isNoGravity()) { this.motY -= 0.05999999865889549D; } this.setPosition(this.locX, this.locY, this.locZ); } } @Nullable private Entity a(Vec3D vec3d, Vec3D vec3d1) { Entity entity = null; List list = this.world.getEntities(this, this.getBoundingBox().b(this.motX, this.motY, this.motZ).g(1.0D)); double d0 = 0.0D; Iterator iterator = list.iterator(); while (iterator.hasNext()) { Entity entity1 = (Entity) iterator.next(); if (entity1 != this.shooter) { AxisAlignedBB axisalignedbb = entity1.getBoundingBox().g(0.30000001192092896D); MovingObjectPosition movingobjectposition = axisalignedbb.b(vec3d, vec3d1); if (movingobjectposition != null) { double d1 = vec3d.distanceSquared(movingobjectposition.pos); if (d1 < d0 || d0 == 0.0D) { entity = entity1; d0 = d1; } } } } return entity; } public void shoot(double d0, double d1, double d2, float f, float f1) { float f2 = MathHelper.sqrt(d0 * d0 + d1 * d1 + d2 * d2); 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; float f3 = MathHelper.sqrt(d0 * d0 + d2 * d2); this.yaw = (float) (MathHelper.c(d0, d2) * 57.2957763671875D); this.pitch = (float) (MathHelper.c(d1, (double) f3) * 57.2957763671875D); this.lastYaw = this.yaw; this.lastPitch = this.pitch; } public void a(MovingObjectPosition movingobjectposition) { if (movingobjectposition.entity != null && this.shooter != null) { movingobjectposition.entity.damageEntity(DamageSource.a(this, this.shooter).b(), 1.0F); } if (!this.world.isClientSide) { this.die(); } } protected void i() {} protected void a(NBTTagCompound nbttagcompound) { if (nbttagcompound.hasKeyOfType("Owner", 10)) { this.b = nbttagcompound.getCompound("Owner"); } } protected void b(NBTTagCompound nbttagcompound) { if (this.shooter != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); UUID uuid = this.shooter.getUniqueID(); nbttagcompound1.a("OwnerUUID", uuid); nbttagcompound.set("Owner", nbttagcompound1); } } private void j() { if (this.b != null && this.b.b("OwnerUUID")) { UUID uuid = this.b.a("OwnerUUID"); List list = this.world.a(EntityLlama.class, this.getBoundingBox().g(15.0D)); Iterator iterator = list.iterator(); while (iterator.hasNext()) { EntityLlama entityllama = (EntityLlama) iterator.next(); if (entityllama.getUniqueID().equals(uuid)) { this.shooter = entityllama; break; } } } this.b = null; } }