This allows previous causes to be available during the event, as well as making the damage cause a valid one. If EntityDamageEvent is canceled, then it's not the last DamageCause. Also prevents setting DamageCause involuntarily through construction.
1580 lines
51 KiB
Java
1580 lines
51 KiB
Java
package net.minecraft.server;
|
|
|
|
import java.util.List;
|
|
import java.util.Random;
|
|
|
|
// CraftBukkit start
|
|
import java.util.UUID;
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.block.BlockFace;
|
|
import org.bukkit.entity.LivingEntity;
|
|
import org.bukkit.entity.Painting;
|
|
import org.bukkit.entity.Vehicle;
|
|
import org.bukkit.event.entity.EntityCombustByBlockEvent;
|
|
import org.bukkit.event.entity.EntityCombustByEntityEvent;
|
|
import org.bukkit.event.painting.PaintingBreakByEntityEvent;
|
|
import org.bukkit.event.vehicle.VehicleBlockCollisionEvent;
|
|
import org.bukkit.event.vehicle.VehicleEnterEvent;
|
|
import org.bukkit.event.vehicle.VehicleExitEvent;
|
|
import org.bukkit.craftbukkit.entity.CraftPlayer;
|
|
import org.bukkit.event.entity.EntityCombustEvent;
|
|
import org.bukkit.event.entity.EntityDamageByBlockEvent;
|
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
|
import org.bukkit.event.entity.EntityDamageEvent;
|
|
import org.bukkit.plugin.PluginManager;
|
|
import org.bukkit.util.NumberConversions;
|
|
// CraftBukkit end
|
|
|
|
public abstract class Entity {
|
|
// CraftBukkit start - size of entity for clipping calculations
|
|
public enum EntitySize {
|
|
SIZE_1,
|
|
SIZE_2,
|
|
SIZE_3,
|
|
SIZE_4,
|
|
SIZE_5,
|
|
SIZE_6;
|
|
|
|
public int getXZCoord(double loc) {
|
|
double diff = loc - (NumberConversions.floor(loc) + 0.5D);
|
|
|
|
switch (this) {
|
|
case SIZE_1:
|
|
if (diff < 0.0D ? diff < -0.3125D : diff < 0.3125D) {
|
|
return NumberConversions.ceil(loc * 32.0D);
|
|
}
|
|
|
|
return NumberConversions.floor(loc * 32.0D);
|
|
case SIZE_2:
|
|
if (diff < 0.0D ? diff < -0.3125D : diff < 0.3125D) {
|
|
return NumberConversions.floor(loc * 32.0D);
|
|
}
|
|
|
|
return NumberConversions.ceil(loc * 32.0D);
|
|
case SIZE_3:
|
|
if (diff > 0.0D) {
|
|
return NumberConversions.floor(loc * 32.0D);
|
|
}
|
|
|
|
return NumberConversions.ceil(loc * 32.0D);
|
|
case SIZE_4:
|
|
if (diff < 0.0D ? diff < -0.1875D : diff < 0.1875D) {
|
|
return NumberConversions.ceil(loc * 32.0D);
|
|
}
|
|
|
|
return NumberConversions.floor(loc * 32.0D);
|
|
case SIZE_5:
|
|
if (diff < 0.0D ? diff < -0.1875D : diff < 0.1875D) {
|
|
return NumberConversions.floor(loc * 32.0D);
|
|
}
|
|
|
|
return NumberConversions.ceil(loc * 32.0D);
|
|
case SIZE_6:
|
|
default:
|
|
if (diff > 0.0D) {
|
|
return NumberConversions.ceil(loc * 32.0D);
|
|
}
|
|
|
|
return NumberConversions.floor(loc * 32.0D);
|
|
}
|
|
}
|
|
}
|
|
public EntitySize size;
|
|
// CraftBukkit end
|
|
|
|
private static int entityCount = 0;
|
|
public int id;
|
|
public double be;
|
|
public boolean bf;
|
|
public Entity passenger;
|
|
public Entity vehicle;
|
|
public World world;
|
|
public double lastX;
|
|
public double lastY;
|
|
public double lastZ;
|
|
public double locX;
|
|
public double locY;
|
|
public double locZ;
|
|
public double motX;
|
|
public double motY;
|
|
public double motZ;
|
|
public float yaw;
|
|
public float pitch;
|
|
public float lastYaw;
|
|
public float lastPitch;
|
|
public final AxisAlignedBB boundingBox;
|
|
public boolean onGround;
|
|
public boolean positionChanged;
|
|
public boolean bz;
|
|
public boolean bA;
|
|
public boolean velocityChanged;
|
|
protected boolean bC;
|
|
public boolean bD;
|
|
public boolean dead;
|
|
public float height;
|
|
public float width;
|
|
public float length;
|
|
public float bI;
|
|
public float bJ;
|
|
public float fallDistance; // CraftBukkit - private -> public
|
|
private int b;
|
|
public double bL;
|
|
public double bM;
|
|
public double bN;
|
|
public float bO;
|
|
public float bP;
|
|
public boolean bQ;
|
|
public float bR;
|
|
protected Random random;
|
|
public int ticksLived;
|
|
public int maxFireTicks;
|
|
public int fireTicks; // CraftBukkit - private -> public
|
|
protected boolean bV;
|
|
public int noDamageTicks;
|
|
private boolean justCreated;
|
|
protected boolean fireProof;
|
|
protected DataWatcher datawatcher;
|
|
private double e;
|
|
private double f;
|
|
public boolean bZ;
|
|
public int ca;
|
|
public int cb;
|
|
public int cc;
|
|
public boolean cd;
|
|
public boolean ce;
|
|
public UUID uniqueId = UUID.randomUUID(); // CraftBukkit
|
|
public boolean valid = true; // CraftBukkit
|
|
|
|
public Entity(World world) {
|
|
this.id = entityCount++;
|
|
this.be = 1.0D;
|
|
this.bf = false;
|
|
this.boundingBox = AxisAlignedBB.a(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
|
|
this.onGround = false;
|
|
this.bA = false;
|
|
this.velocityChanged = false;
|
|
this.bD = true;
|
|
this.dead = false;
|
|
this.height = 0.0F;
|
|
this.width = 0.6F;
|
|
this.size = EntitySize.SIZE_2; // CraftBukkit
|
|
this.length = 1.8F;
|
|
this.bI = 0.0F;
|
|
this.bJ = 0.0F;
|
|
this.fallDistance = 0.0F;
|
|
this.b = 1;
|
|
this.bO = 0.0F;
|
|
this.bP = 0.0F;
|
|
this.bQ = false;
|
|
this.bR = 0.0F;
|
|
this.random = new Random();
|
|
this.ticksLived = 0;
|
|
this.maxFireTicks = 1;
|
|
this.fireTicks = 0;
|
|
this.bV = false;
|
|
this.noDamageTicks = 0;
|
|
this.justCreated = true;
|
|
this.fireProof = false;
|
|
this.datawatcher = new DataWatcher();
|
|
this.bZ = false;
|
|
this.world = world;
|
|
this.setPosition(0.0D, 0.0D, 0.0D);
|
|
this.datawatcher.a(0, Byte.valueOf((byte) 0));
|
|
this.datawatcher.a(1, Short.valueOf((short) 300));
|
|
this.b();
|
|
}
|
|
|
|
protected abstract void b();
|
|
|
|
public DataWatcher getDataWatcher() {
|
|
return this.datawatcher;
|
|
}
|
|
|
|
public boolean equals(Object object) {
|
|
return object instanceof Entity ? ((Entity) object).id == this.id : false;
|
|
}
|
|
|
|
public int hashCode() {
|
|
return this.id;
|
|
}
|
|
|
|
public void die() {
|
|
this.dead = true;
|
|
}
|
|
|
|
protected void b(float f, float f1) {
|
|
this.width = f;
|
|
this.length = f1;
|
|
// CraftBukkit start - figure out entity size for clipping calculations
|
|
float mod = f % 2f;
|
|
if (mod < 0.375) {
|
|
this.size = EntitySize.SIZE_1;
|
|
} else if (mod < 0.75) {
|
|
this.size = EntitySize.SIZE_2;
|
|
} else if (mod < 1.0) {
|
|
this.size = EntitySize.SIZE_3;
|
|
} else if (mod < 1.375) {
|
|
this.size = EntitySize.SIZE_4;
|
|
} else if (mod < 1.75) {
|
|
this.size = EntitySize.SIZE_5;
|
|
} else {
|
|
this.size = EntitySize.SIZE_6;
|
|
}
|
|
// CraftBukkit end
|
|
}
|
|
|
|
protected void c(float f, float f1) {
|
|
// CraftBukkit start - yaw was sometimes set to NaN, so we need to set it back to 0.
|
|
if (Float.isNaN(f)) {
|
|
f = 0;
|
|
}
|
|
|
|
if ((f == Float.POSITIVE_INFINITY) || (f == Float.NEGATIVE_INFINITY)) {
|
|
if (this instanceof EntityPlayer) {
|
|
System.err.println(((CraftPlayer) this.getBukkitEntity()).getName() + " was caught trying to crash the server with an invalid yaw");
|
|
((CraftPlayer) this.getBukkitEntity()).kickPlayer("Nope");
|
|
}
|
|
f = 0;
|
|
}
|
|
|
|
// pitch was sometimes set to NaN, so we need to set it back to 0.
|
|
if (Float.isNaN(f1)) {
|
|
f1 = 0;
|
|
}
|
|
|
|
if ((f1 == Float.POSITIVE_INFINITY) || (f1 == Float.NEGATIVE_INFINITY)) {
|
|
if (this instanceof EntityPlayer) {
|
|
System.err.println(((CraftPlayer) this.getBukkitEntity()).getName() + " was caught trying to crash the server with an invalid pitch");
|
|
((CraftPlayer) this.getBukkitEntity()).kickPlayer("Nope");
|
|
}
|
|
f1 = 0;
|
|
}
|
|
// CraftBukkit end
|
|
|
|
this.yaw = f % 360.0F;
|
|
this.pitch = f1 % 360.0F;
|
|
}
|
|
|
|
public void setPosition(double d0, double d1, double d2) {
|
|
this.locX = d0;
|
|
this.locY = d1;
|
|
this.locZ = d2;
|
|
float f = this.width / 2.0F;
|
|
float f1 = this.length;
|
|
|
|
this.boundingBox.c(d0 - (double) f, d1 - (double) this.height + (double) this.bO, d2 - (double) f, d0 + (double) f, d1 - (double) this.height + (double) this.bO + (double) f1, d2 + (double) f);
|
|
}
|
|
|
|
public void F_() {
|
|
this.aA();
|
|
}
|
|
|
|
public void aA() {
|
|
// MethodProfiler.a("entityBaseTick"); // CraftBukkit - not in production code
|
|
if (this.vehicle != null && this.vehicle.dead) {
|
|
this.vehicle = null;
|
|
}
|
|
|
|
++this.ticksLived;
|
|
this.bI = this.bJ;
|
|
this.lastX = this.locX;
|
|
this.lastY = this.locY;
|
|
this.lastZ = this.locZ;
|
|
this.lastPitch = this.pitch;
|
|
this.lastYaw = this.yaw;
|
|
int i;
|
|
|
|
if (this.isSprinting() && !this.aU()) {
|
|
int j = MathHelper.floor(this.locX);
|
|
int k = MathHelper.floor(this.locY - 0.20000000298023224D - (double) this.height);
|
|
|
|
i = MathHelper.floor(this.locZ);
|
|
int l = this.world.getTypeId(j, k, i);
|
|
|
|
if (l > 0) {
|
|
this.world.a("tilecrack_" + l, this.locX + ((double) this.random.nextFloat() - 0.5D) * (double) this.width, this.boundingBox.b + 0.1D, this.locZ + ((double) this.random.nextFloat() - 0.5D) * (double) this.width, -this.motX * 4.0D, 1.5D, -this.motZ * 4.0D);
|
|
}
|
|
}
|
|
|
|
if (this.h_()) {
|
|
if (!this.bV && !this.justCreated) {
|
|
float f = MathHelper.sqrt(this.motX * this.motX * 0.20000000298023224D + this.motY * this.motY + this.motZ * this.motZ * 0.20000000298023224D) * 0.2F;
|
|
|
|
if (f > 1.0F) {
|
|
f = 1.0F;
|
|
}
|
|
|
|
this.world.makeSound(this, "random.splash", f, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F);
|
|
float f1 = (float) MathHelper.floor(this.boundingBox.b);
|
|
|
|
float f2;
|
|
float f3;
|
|
|
|
for (i = 0; (float) i < 1.0F + this.width * 20.0F; ++i) {
|
|
f3 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width;
|
|
f2 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width;
|
|
this.world.a("bubble", this.locX + (double) f3, (double) (f1 + 1.0F), this.locZ + (double) f2, this.motX, this.motY - (double) (this.random.nextFloat() * 0.2F), this.motZ);
|
|
}
|
|
|
|
for (i = 0; (float) i < 1.0F + this.width * 20.0F; ++i) {
|
|
f3 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width;
|
|
f2 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width;
|
|
this.world.a("splash", this.locX + (double) f3, (double) (f1 + 1.0F), this.locZ + (double) f2, this.motX, this.motY, this.motZ);
|
|
}
|
|
}
|
|
|
|
this.fallDistance = 0.0F;
|
|
this.bV = true;
|
|
this.fireTicks = 0;
|
|
} else {
|
|
this.bV = false;
|
|
}
|
|
|
|
if (this.world.isStatic) {
|
|
this.fireTicks = 0;
|
|
} else if (this.fireTicks > 0) {
|
|
if (this.fireProof) {
|
|
this.fireTicks -= 4;
|
|
if (this.fireTicks < 0) {
|
|
this.fireTicks = 0;
|
|
}
|
|
} else {
|
|
if (this.fireTicks % 20 == 0) {
|
|
// CraftBukkit start - TODO: this event spams!
|
|
if (this instanceof EntityLiving) {
|
|
EntityDamageEvent event = new EntityDamageEvent(this.getBukkitEntity(), EntityDamageEvent.DamageCause.FIRE_TICK, 1);
|
|
this.world.getServer().getPluginManager().callEvent(event);
|
|
|
|
if (!event.isCancelled()) {
|
|
event.getEntity().setLastDamageCause(event);
|
|
this.damageEntity(DamageSource.BURN, event.getDamage());
|
|
}
|
|
} else {
|
|
this.damageEntity(DamageSource.BURN, 1);
|
|
}
|
|
// CraftBukkit end
|
|
}
|
|
|
|
--this.fireTicks;
|
|
}
|
|
}
|
|
|
|
if (this.aV()) {
|
|
this.aQ();
|
|
this.fallDistance *= 0.5F;
|
|
}
|
|
|
|
if (this.locY < -64.0D) {
|
|
this.aI();
|
|
}
|
|
|
|
if (!this.world.isStatic) {
|
|
this.a(0, this.fireTicks > 0);
|
|
this.a(2, this.vehicle != null);
|
|
}
|
|
|
|
this.justCreated = false;
|
|
// MethodProfiler.a(); // CraftBukkit - not in production code
|
|
}
|
|
|
|
protected void aQ() {
|
|
if (!this.fireProof) {
|
|
// CraftBukkit start - fallen in lava TODO: this event spams!
|
|
if (this instanceof EntityLiving) {
|
|
org.bukkit.Server server = this.world.getServer();
|
|
|
|
// TODO: shouldn't be sending null for the block.
|
|
org.bukkit.block.Block damager = null; // ((WorldServer) this.l).getWorld().getBlockAt(i, j, k);
|
|
org.bukkit.entity.Entity damagee = this.getBukkitEntity();
|
|
|
|
EntityDamageByBlockEvent event = new EntityDamageByBlockEvent(damager, damagee, EntityDamageEvent.DamageCause.LAVA, 4);
|
|
server.getPluginManager().callEvent(event);
|
|
|
|
if (!event.isCancelled()) {
|
|
damagee.setLastDamageCause(event);
|
|
this.damageEntity(DamageSource.LAVA, event.getDamage());
|
|
}
|
|
|
|
if (this.fireTicks <= 0) {
|
|
// not on fire yet
|
|
EntityCombustEvent combustEvent = new EntityCombustByBlockEvent(damager, damagee, 15);
|
|
server.getPluginManager().callEvent(combustEvent);
|
|
|
|
if (!combustEvent.isCancelled()) {
|
|
this.setOnFire(combustEvent.getDuration());
|
|
}
|
|
} else {
|
|
// This will be called every single tick the entity is in lava, so don't throw an event.
|
|
this.setOnFire(15);
|
|
}
|
|
return;
|
|
}
|
|
// CraftBukkit end - we also don't throw an event unless the object in lava is living, to save on some event calls
|
|
|
|
this.damageEntity(DamageSource.LAVA, 4);
|
|
this.setOnFire(15);
|
|
}
|
|
}
|
|
|
|
public void setOnFire(int i) {
|
|
int j = i * 20;
|
|
|
|
if (this.fireTicks < j) {
|
|
this.fireTicks = j;
|
|
}
|
|
}
|
|
|
|
public void extinguish() {
|
|
this.fireTicks = 0;
|
|
}
|
|
|
|
protected void aI() {
|
|
this.die();
|
|
}
|
|
|
|
public boolean d(double d0, double d1, double d2) {
|
|
AxisAlignedBB axisalignedbb = this.boundingBox.c(d0, d1, d2);
|
|
List list = this.world.getCubes(this, axisalignedbb);
|
|
|
|
return list.size() > 0 ? false : !this.world.containsLiquid(axisalignedbb);
|
|
}
|
|
|
|
public void move(double d0, double d1, double d2) {
|
|
if (this.bQ) {
|
|
this.boundingBox.d(d0, d1, d2);
|
|
this.locX = (this.boundingBox.a + this.boundingBox.d) / 2.0D;
|
|
this.locY = this.boundingBox.b + (double) this.height - (double) this.bO;
|
|
this.locZ = (this.boundingBox.c + this.boundingBox.f) / 2.0D;
|
|
} else {
|
|
// MethodProfiler.a("move"); // CraftBukkit - not in production code
|
|
this.bO *= 0.4F;
|
|
double d3 = this.locX;
|
|
double d4 = this.locZ;
|
|
|
|
if (this.bC) {
|
|
this.bC = false;
|
|
d0 *= 0.25D;
|
|
d1 *= 0.05000000074505806D;
|
|
d2 *= 0.25D;
|
|
this.motX = 0.0D;
|
|
this.motY = 0.0D;
|
|
this.motZ = 0.0D;
|
|
}
|
|
|
|
double d5 = d0;
|
|
double d6 = d1;
|
|
double d7 = d2;
|
|
AxisAlignedBB axisalignedbb = this.boundingBox.clone();
|
|
boolean flag = this.onGround && this.isSneaking() && this instanceof EntityHuman;
|
|
|
|
if (flag) {
|
|
double d8;
|
|
|
|
for (d8 = 0.05D; d0 != 0.0D && this.world.getCubes(this, this.boundingBox.c(d0, -1.0D, 0.0D)).size() == 0; d5 = d0) {
|
|
if (d0 < d8 && d0 >= -d8) {
|
|
d0 = 0.0D;
|
|
} else if (d0 > 0.0D) {
|
|
d0 -= d8;
|
|
} else {
|
|
d0 += d8;
|
|
}
|
|
}
|
|
|
|
for (; d2 != 0.0D && this.world.getCubes(this, this.boundingBox.c(0.0D, -1.0D, d2)).size() == 0; d7 = d2) {
|
|
if (d2 < d8 && d2 >= -d8) {
|
|
d2 = 0.0D;
|
|
} else if (d2 > 0.0D) {
|
|
d2 -= d8;
|
|
} else {
|
|
d2 += d8;
|
|
}
|
|
}
|
|
|
|
while (d0 != 0.0D && d2 != 0.0D && this.world.getCubes(this, this.boundingBox.c(d0, -1.0D, d2)).size() == 0) {
|
|
if (d0 < d8 && d0 >= -d8) {
|
|
d0 = 0.0D;
|
|
} else if (d0 > 0.0D) {
|
|
d0 -= d8;
|
|
} else {
|
|
d0 += d8;
|
|
}
|
|
|
|
if (d2 < d8 && d2 >= -d8) {
|
|
d2 = 0.0D;
|
|
} else if (d2 > 0.0D) {
|
|
d2 -= d8;
|
|
} else {
|
|
d2 += d8;
|
|
}
|
|
|
|
d5 = d0;
|
|
d7 = d2;
|
|
}
|
|
}
|
|
|
|
List list = this.world.getCubes(this, this.boundingBox.a(d0, d1, d2));
|
|
|
|
for (int i = 0; i < list.size(); ++i) {
|
|
d1 = ((AxisAlignedBB) list.get(i)).b(this.boundingBox, d1);
|
|
}
|
|
|
|
this.boundingBox.d(0.0D, d1, 0.0D);
|
|
if (!this.bD && d6 != d1) {
|
|
d2 = 0.0D;
|
|
d1 = 0.0D;
|
|
d0 = 0.0D;
|
|
}
|
|
|
|
boolean flag1 = this.onGround || d6 != d1 && d6 < 0.0D;
|
|
|
|
int j;
|
|
|
|
for (j = 0; j < list.size(); ++j) {
|
|
d0 = ((AxisAlignedBB) list.get(j)).a(this.boundingBox, d0);
|
|
}
|
|
|
|
this.boundingBox.d(d0, 0.0D, 0.0D);
|
|
if (!this.bD && d5 != d0) {
|
|
d2 = 0.0D;
|
|
d1 = 0.0D;
|
|
d0 = 0.0D;
|
|
}
|
|
|
|
for (j = 0; j < list.size(); ++j) {
|
|
d2 = ((AxisAlignedBB) list.get(j)).c(this.boundingBox, d2);
|
|
}
|
|
|
|
this.boundingBox.d(0.0D, 0.0D, d2);
|
|
if (!this.bD && d7 != d2) {
|
|
d2 = 0.0D;
|
|
d1 = 0.0D;
|
|
d0 = 0.0D;
|
|
}
|
|
|
|
double d9;
|
|
double d10;
|
|
int k;
|
|
|
|
if (this.bP > 0.0F && flag1 && (flag || this.bO < 0.05F) && (d5 != d0 || d7 != d2)) {
|
|
d9 = d0;
|
|
d10 = d1;
|
|
double d11 = d2;
|
|
|
|
d0 = d5;
|
|
d1 = (double) this.bP;
|
|
d2 = d7;
|
|
AxisAlignedBB axisalignedbb1 = this.boundingBox.clone();
|
|
|
|
this.boundingBox.b(axisalignedbb);
|
|
list = this.world.getCubes(this, this.boundingBox.a(d5, d1, d7));
|
|
|
|
for (k = 0; k < list.size(); ++k) {
|
|
d1 = ((AxisAlignedBB) list.get(k)).b(this.boundingBox, d1);
|
|
}
|
|
|
|
this.boundingBox.d(0.0D, d1, 0.0D);
|
|
if (!this.bD && d6 != d1) {
|
|
d2 = 0.0D;
|
|
d1 = 0.0D;
|
|
d0 = 0.0D;
|
|
}
|
|
|
|
for (k = 0; k < list.size(); ++k) {
|
|
d0 = ((AxisAlignedBB) list.get(k)).a(this.boundingBox, d0);
|
|
}
|
|
|
|
this.boundingBox.d(d0, 0.0D, 0.0D);
|
|
if (!this.bD && d5 != d0) {
|
|
d2 = 0.0D;
|
|
d1 = 0.0D;
|
|
d0 = 0.0D;
|
|
}
|
|
|
|
for (k = 0; k < list.size(); ++k) {
|
|
d2 = ((AxisAlignedBB) list.get(k)).c(this.boundingBox, d2);
|
|
}
|
|
|
|
this.boundingBox.d(0.0D, 0.0D, d2);
|
|
if (!this.bD && d7 != d2) {
|
|
d2 = 0.0D;
|
|
d1 = 0.0D;
|
|
d0 = 0.0D;
|
|
}
|
|
|
|
if (!this.bD && d6 != d1) {
|
|
d2 = 0.0D;
|
|
d1 = 0.0D;
|
|
d0 = 0.0D;
|
|
} else {
|
|
d1 = (double) (-this.bP);
|
|
|
|
for (k = 0; k < list.size(); ++k) {
|
|
d1 = ((AxisAlignedBB) list.get(k)).b(this.boundingBox, d1);
|
|
}
|
|
|
|
this.boundingBox.d(0.0D, d1, 0.0D);
|
|
}
|
|
|
|
if (d9 * d9 + d11 * d11 >= d0 * d0 + d2 * d2) {
|
|
d0 = d9;
|
|
d1 = d10;
|
|
d2 = d11;
|
|
this.boundingBox.b(axisalignedbb1);
|
|
} else {
|
|
double d12 = this.boundingBox.b - (double) ((int) this.boundingBox.b);
|
|
|
|
if (d12 > 0.0D) {
|
|
this.bO = (float) ((double) this.bO + d12 + 0.01D);
|
|
}
|
|
}
|
|
}
|
|
|
|
// MethodProfiler.a(); // CraftBukkit - not in production code
|
|
// MethodProfiler.a("rest"); // CraftBukkit - not in production code
|
|
this.locX = (this.boundingBox.a + this.boundingBox.d) / 2.0D;
|
|
this.locY = this.boundingBox.b + (double) this.height - (double) this.bO;
|
|
this.locZ = (this.boundingBox.c + this.boundingBox.f) / 2.0D;
|
|
this.positionChanged = d5 != d0 || d7 != d2;
|
|
this.bz = d6 != d1;
|
|
this.onGround = d6 != d1 && d6 < 0.0D;
|
|
this.bA = this.positionChanged || this.bz;
|
|
this.a(d1, this.onGround);
|
|
if (d5 != d0) {
|
|
this.motX = 0.0D;
|
|
}
|
|
|
|
if (d6 != d1) {
|
|
this.motY = 0.0D;
|
|
}
|
|
|
|
if (d7 != d2) {
|
|
this.motZ = 0.0D;
|
|
}
|
|
|
|
d9 = this.locX - d3;
|
|
d10 = this.locZ - d4;
|
|
int l;
|
|
int i1;
|
|
int j1;
|
|
|
|
// CraftBukkit start
|
|
if ((this.positionChanged) && (this.getBukkitEntity() instanceof Vehicle)) {
|
|
Vehicle vehicle = (Vehicle) this.getBukkitEntity();
|
|
org.bukkit.block.Block block = this.world.getWorld().getBlockAt(MathHelper.floor(this.locX), MathHelper.floor(this.locY - (double) this.height), MathHelper.floor(this.locZ));
|
|
|
|
if (d5 > d0) {
|
|
block = block.getRelative(BlockFace.SOUTH);
|
|
} else if (d5 < d0) {
|
|
block = block.getRelative(BlockFace.NORTH);
|
|
} else if (d7 > d2) {
|
|
block = block.getRelative(BlockFace.WEST);
|
|
} else if (d7 < d2) {
|
|
block = block.getRelative(BlockFace.EAST);
|
|
}
|
|
|
|
VehicleBlockCollisionEvent event = new VehicleBlockCollisionEvent(vehicle, block);
|
|
this.world.getServer().getPluginManager().callEvent(event);
|
|
}
|
|
// CraftBukkit end
|
|
|
|
if (this.g_() && !flag && this.vehicle == null) {
|
|
this.bJ = (float) ((double) this.bJ + (double) MathHelper.sqrt(d9 * d9 + d10 * d10) * 0.6D);
|
|
l = MathHelper.floor(this.locX);
|
|
i1 = MathHelper.floor(this.locY - 0.20000000298023224D - (double) this.height);
|
|
j1 = MathHelper.floor(this.locZ);
|
|
k = this.world.getTypeId(l, i1, j1);
|
|
if (k == 0 && this.world.getTypeId(l, i1 - 1, j1) == Block.FENCE.id) {
|
|
k = this.world.getTypeId(l, i1 - 1, j1);
|
|
}
|
|
|
|
if (this.bJ > (float) this.b && k > 0) {
|
|
this.b = (int) this.bJ + 1;
|
|
this.a(l, i1, j1, k);
|
|
Block.byId[k].b(this.world, l, i1, j1, this);
|
|
}
|
|
}
|
|
|
|
l = MathHelper.floor(this.boundingBox.a + 0.0010D);
|
|
i1 = MathHelper.floor(this.boundingBox.b + 0.0010D);
|
|
j1 = MathHelper.floor(this.boundingBox.c + 0.0010D);
|
|
k = MathHelper.floor(this.boundingBox.d - 0.0010D);
|
|
int k1 = MathHelper.floor(this.boundingBox.e - 0.0010D);
|
|
int l1 = MathHelper.floor(this.boundingBox.f - 0.0010D);
|
|
|
|
if (this.world.a(l, i1, j1, k, k1, l1)) {
|
|
for (int i2 = l; i2 <= k; ++i2) {
|
|
for (int j2 = i1; j2 <= k1; ++j2) {
|
|
for (int k2 = j1; k2 <= l1; ++k2) {
|
|
int l2 = this.world.getTypeId(i2, j2, k2);
|
|
|
|
if (l2 > 0) {
|
|
Block.byId[l2].a(this.world, i2, j2, k2, this);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
boolean flag2 = this.aT();
|
|
|
|
if (this.world.d(this.boundingBox.shrink(0.0010D, 0.0010D, 0.0010D))) {
|
|
this.burn(1);
|
|
if (!flag2) {
|
|
++this.fireTicks;
|
|
// CraftBukkit start - not on fire yet
|
|
if (this.fireTicks <= 0) { // only throw events on the first combust, otherwise it spams
|
|
EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8);
|
|
this.world.getServer().getPluginManager().callEvent(event);
|
|
|
|
if (!event.isCancelled()) {
|
|
this.setOnFire(event.getDuration());
|
|
}
|
|
} else {
|
|
// CraftBukkit end
|
|
this.setOnFire(8);
|
|
}
|
|
}
|
|
} else if (this.fireTicks <= 0) {
|
|
this.fireTicks = -this.maxFireTicks;
|
|
}
|
|
|
|
if (flag2 && this.fireTicks > 0) {
|
|
this.world.makeSound(this, "random.fizz", 0.7F, 1.6F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F);
|
|
this.fireTicks = -this.maxFireTicks;
|
|
}
|
|
|
|
// MethodProfiler.a(); // CraftBukkit - not in production code
|
|
}
|
|
}
|
|
|
|
protected void a(int i, int j, int k, int l) {
|
|
StepSound stepsound = Block.byId[l].stepSound;
|
|
|
|
if (this.world.getTypeId(i, j + 1, k) == Block.SNOW.id) {
|
|
stepsound = Block.SNOW.stepSound;
|
|
this.world.makeSound(this, stepsound.getName(), stepsound.getVolume1() * 0.15F, stepsound.getVolume2());
|
|
} else if (!Block.byId[l].material.isLiquid()) {
|
|
this.world.makeSound(this, stepsound.getName(), stepsound.getVolume1() * 0.15F, stepsound.getVolume2());
|
|
}
|
|
}
|
|
|
|
protected boolean g_() {
|
|
return true;
|
|
}
|
|
|
|
protected void a(double d0, boolean flag) {
|
|
if (flag) {
|
|
if (this.fallDistance > 0.0F) {
|
|
if (this instanceof EntityLiving) {
|
|
int i = MathHelper.floor(this.locX);
|
|
int j = MathHelper.floor(this.locY - 0.20000000298023224D - (double) this.height);
|
|
int k = MathHelper.floor(this.locZ);
|
|
int l = this.world.getTypeId(i, j, k);
|
|
|
|
if (l == 0 && this.world.getTypeId(i, j - 1, k) == Block.FENCE.id) {
|
|
l = this.world.getTypeId(i, j - 1, k);
|
|
}
|
|
|
|
if (l > 0) {
|
|
Block.byId[l].a(this.world, i, j, k, this, this.fallDistance);
|
|
}
|
|
}
|
|
|
|
this.a(this.fallDistance);
|
|
this.fallDistance = 0.0F;
|
|
}
|
|
} else if (d0 < 0.0D) {
|
|
this.fallDistance = (float) ((double) this.fallDistance - d0);
|
|
}
|
|
}
|
|
|
|
public AxisAlignedBB h() {
|
|
return null;
|
|
}
|
|
|
|
protected void burn(int i) {
|
|
if (!this.fireProof) {
|
|
// CraftBukkit start
|
|
if (this instanceof EntityLiving) {
|
|
EntityDamageEvent event = new EntityDamageEvent(this.getBukkitEntity(), EntityDamageEvent.DamageCause.FIRE, i);
|
|
this.world.getServer().getPluginManager().callEvent(event);
|
|
|
|
if (event.isCancelled()) {
|
|
return;
|
|
}
|
|
|
|
i = event.getDamage();
|
|
}
|
|
// CraftBukkit end
|
|
this.damageEntity(DamageSource.FIRE, i);
|
|
}
|
|
}
|
|
|
|
public final boolean isFireproof() {
|
|
return this.fireProof;
|
|
}
|
|
|
|
protected void a(float f) {
|
|
if (this.passenger != null) {
|
|
this.passenger.a(f);
|
|
}
|
|
}
|
|
|
|
public boolean aT() {
|
|
return this.bV || this.world.y(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ));
|
|
}
|
|
|
|
public boolean aU() {
|
|
return this.bV;
|
|
}
|
|
|
|
public boolean h_() {
|
|
return this.world.a(this.boundingBox.grow(0.0D, -0.4000000059604645D, 0.0D).shrink(0.0010D, 0.0010D, 0.0010D), Material.WATER, this);
|
|
}
|
|
|
|
public boolean a(Material material) {
|
|
double d0 = this.locY + (double) this.getHeadHeight();
|
|
int i = MathHelper.floor(this.locX);
|
|
int j = MathHelper.d((float) MathHelper.floor(d0));
|
|
int k = MathHelper.floor(this.locZ);
|
|
int l = this.world.getTypeId(i, j, k);
|
|
|
|
if (l != 0 && Block.byId[l].material == material) {
|
|
float f = BlockFluids.d(this.world.getData(i, j, k)) - 0.11111111F;
|
|
float f1 = (float) (j + 1) - f;
|
|
|
|
return d0 < (double) f1;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public float getHeadHeight() {
|
|
return 0.0F;
|
|
}
|
|
|
|
public boolean aV() {
|
|
return this.world.a(this.boundingBox.grow(-0.10000000149011612D, -0.4000000059604645D, -0.10000000149011612D), Material.LAVA);
|
|
}
|
|
|
|
public void a(float f, float f1, float f2) {
|
|
float f3 = MathHelper.c(f * f + f1 * f1);
|
|
|
|
if (f3 >= 0.01F) {
|
|
if (f3 < 1.0F) {
|
|
f3 = 1.0F;
|
|
}
|
|
|
|
f3 = f2 / f3;
|
|
f *= f3;
|
|
f1 *= f3;
|
|
float f4 = MathHelper.sin(this.yaw * 3.1415927F / 180.0F);
|
|
float f5 = MathHelper.cos(this.yaw * 3.1415927F / 180.0F);
|
|
|
|
this.motX += (double) (f * f5 - f1 * f4);
|
|
this.motZ += (double) (f1 * f5 + f * f4);
|
|
}
|
|
}
|
|
|
|
public float b(float f) {
|
|
int i = MathHelper.floor(this.locX);
|
|
int j = MathHelper.floor(this.locZ);
|
|
|
|
if (this.world.isLoaded(i, 0, j)) {
|
|
double d0 = (this.boundingBox.e - this.boundingBox.b) * 0.66D;
|
|
int k = MathHelper.floor(this.locY - (double) this.height + d0);
|
|
|
|
return this.world.p(i, k, j);
|
|
} else {
|
|
return 0.0F;
|
|
}
|
|
}
|
|
|
|
public void spawnIn(World world) {
|
|
// CraftBukkit start
|
|
if (world == null) {
|
|
this.die();
|
|
this.world = ((org.bukkit.craftbukkit.CraftWorld) Bukkit.getServer().getWorlds().get(0)).getHandle();
|
|
return;
|
|
}
|
|
// CraftBukkit end
|
|
this.world = world;
|
|
}
|
|
|
|
public void setLocation(double d0, double d1, double d2, float f, float f1) {
|
|
this.lastX = this.locX = d0;
|
|
this.lastY = this.locY = d1;
|
|
this.lastZ = this.locZ = d2;
|
|
this.lastYaw = this.yaw = f;
|
|
this.lastPitch = this.pitch = f1;
|
|
this.bO = 0.0F;
|
|
double d3 = (double) (this.lastYaw - f);
|
|
|
|
if (d3 < -180.0D) {
|
|
this.lastYaw += 360.0F;
|
|
}
|
|
|
|
if (d3 >= 180.0D) {
|
|
this.lastYaw -= 360.0F;
|
|
}
|
|
|
|
this.setPosition(this.locX, this.locY, this.locZ);
|
|
this.c(f, f1);
|
|
}
|
|
|
|
public void setPositionRotation(double d0, double d1, double d2, float f, float f1) {
|
|
this.bL = this.lastX = this.locX = d0;
|
|
this.bM = this.lastY = this.locY = d1 + (double) this.height;
|
|
this.bN = this.lastZ = this.locZ = d2;
|
|
this.yaw = f;
|
|
this.pitch = f1;
|
|
this.setPosition(this.locX, this.locY, this.locZ);
|
|
}
|
|
|
|
public float i(Entity entity) {
|
|
float f = (float) (this.locX - entity.locX);
|
|
float f1 = (float) (this.locY - entity.locY);
|
|
float f2 = (float) (this.locZ - entity.locZ);
|
|
|
|
return MathHelper.c(f * f + f1 * f1 + f2 * f2);
|
|
}
|
|
|
|
public double e(double d0, double d1, double d2) {
|
|
double d3 = this.locX - d0;
|
|
double d4 = this.locY - d1;
|
|
double d5 = this.locZ - d2;
|
|
|
|
return d3 * d3 + d4 * d4 + d5 * d5;
|
|
}
|
|
|
|
public double f(double d0, double d1, double d2) {
|
|
double d3 = this.locX - d0;
|
|
double d4 = this.locY - d1;
|
|
double d5 = this.locZ - d2;
|
|
|
|
return (double) MathHelper.sqrt(d3 * d3 + d4 * d4 + d5 * d5);
|
|
}
|
|
|
|
public double j(Entity entity) {
|
|
double d0 = this.locX - entity.locX;
|
|
double d1 = this.locY - entity.locY;
|
|
double d2 = this.locZ - entity.locZ;
|
|
|
|
return d0 * d0 + d1 * d1 + d2 * d2;
|
|
}
|
|
|
|
public void a_(EntityHuman entityhuman) {}
|
|
|
|
public void collide(Entity entity) {
|
|
if (entity.passenger != this && entity.vehicle != this) {
|
|
double d0 = entity.locX - this.locX;
|
|
double d1 = entity.locZ - this.locZ;
|
|
double d2 = MathHelper.a(d0, d1);
|
|
|
|
if (d2 >= 0.009999999776482582D) {
|
|
d2 = (double) MathHelper.sqrt(d2);
|
|
d0 /= d2;
|
|
d1 /= d2;
|
|
double d3 = 1.0D / d2;
|
|
|
|
if (d3 > 1.0D) {
|
|
d3 = 1.0D;
|
|
}
|
|
|
|
d0 *= d3;
|
|
d1 *= d3;
|
|
d0 *= 0.05000000074505806D;
|
|
d1 *= 0.05000000074505806D;
|
|
d0 *= (double) (1.0F - this.bR);
|
|
d1 *= (double) (1.0F - this.bR);
|
|
this.b_(-d0, 0.0D, -d1);
|
|
entity.b_(d0, 0.0D, d1);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void b_(double d0, double d1, double d2) {
|
|
this.motX += d0;
|
|
this.motY += d1;
|
|
this.motZ += d2;
|
|
this.ce = true;
|
|
}
|
|
|
|
protected void aW() {
|
|
this.velocityChanged = true;
|
|
}
|
|
|
|
public boolean damageEntity(DamageSource damagesource, int i) {
|
|
this.aW();
|
|
return false;
|
|
}
|
|
|
|
public boolean o_() {
|
|
return false;
|
|
}
|
|
|
|
public boolean e_() {
|
|
return false;
|
|
}
|
|
|
|
public void b(Entity entity, int i) {}
|
|
|
|
public boolean c(NBTTagCompound nbttagcompound) {
|
|
String s = this.aX();
|
|
|
|
if (!this.dead && s != null) {
|
|
nbttagcompound.setString("id", s);
|
|
this.d(nbttagcompound);
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public void d(NBTTagCompound nbttagcompound) {
|
|
nbttagcompound.set("Pos", this.a(new double[] { this.locX, this.locY + (double) this.bO, this.locZ}));
|
|
nbttagcompound.set("Motion", this.a(new double[] { this.motX, this.motY, this.motZ}));
|
|
|
|
// CraftBukkit start - checking for NaN pitch/yaw and resetting to zero
|
|
// TODO: make sure this is the best way to address this.
|
|
if (Float.isNaN(this.yaw)) {
|
|
this.yaw = 0;
|
|
}
|
|
|
|
if (Float.isNaN(this.pitch)) {
|
|
this.pitch = 0;
|
|
}
|
|
// CraftBukkit end
|
|
|
|
nbttagcompound.set("Rotation", this.a(new float[] { this.yaw, this.pitch}));
|
|
nbttagcompound.setFloat("FallDistance", this.fallDistance);
|
|
nbttagcompound.setShort("Fire", (short) this.fireTicks);
|
|
nbttagcompound.setShort("Air", (short) this.getAirTicks());
|
|
nbttagcompound.setBoolean("OnGround", this.onGround);
|
|
// CraftBukkit start
|
|
nbttagcompound.setLong("WorldUUIDLeast", this.world.getUUID().getLeastSignificantBits());
|
|
nbttagcompound.setLong("WorldUUIDMost", this.world.getUUID().getMostSignificantBits());
|
|
nbttagcompound.setLong("UUIDLeast", this.uniqueId.getLeastSignificantBits());
|
|
nbttagcompound.setLong("UUIDMost", this.uniqueId.getMostSignificantBits());
|
|
// CraftBukkit end
|
|
this.b(nbttagcompound);
|
|
}
|
|
|
|
public void e(NBTTagCompound nbttagcompound) {
|
|
NBTTagList nbttaglist = nbttagcompound.getList("Pos");
|
|
NBTTagList nbttaglist1 = nbttagcompound.getList("Motion");
|
|
NBTTagList nbttaglist2 = nbttagcompound.getList("Rotation");
|
|
|
|
this.motX = ((NBTTagDouble) nbttaglist1.get(0)).data;
|
|
this.motY = ((NBTTagDouble) nbttaglist1.get(1)).data;
|
|
this.motZ = ((NBTTagDouble) nbttaglist1.get(2)).data;
|
|
/* CraftBukkit start - moved section down
|
|
if (Math.abs(this.motX) > 10.0D) {
|
|
this.motX = 0.0D;
|
|
}
|
|
|
|
if (Math.abs(this.motY) > 10.0D) {
|
|
this.motY = 0.0D;
|
|
}
|
|
|
|
if (Math.abs(this.motZ) > 10.0D) {
|
|
this.motZ = 0.0D;
|
|
}
|
|
// CraftBukkit end */
|
|
|
|
this.lastX = this.bL = this.locX = ((NBTTagDouble) nbttaglist.get(0)).data;
|
|
this.lastY = this.bM = this.locY = ((NBTTagDouble) nbttaglist.get(1)).data;
|
|
this.lastZ = this.bN = this.locZ = ((NBTTagDouble) nbttaglist.get(2)).data;
|
|
this.lastYaw = this.yaw = ((NBTTagFloat) nbttaglist2.get(0)).data;
|
|
this.lastPitch = this.pitch = ((NBTTagFloat) nbttaglist2.get(1)).data;
|
|
this.fallDistance = nbttagcompound.getFloat("FallDistance");
|
|
this.fireTicks = nbttagcompound.getShort("Fire");
|
|
this.setAirTicks(nbttagcompound.getShort("Air"));
|
|
this.onGround = nbttagcompound.getBoolean("OnGround");
|
|
this.setPosition(this.locX, this.locY, this.locZ);
|
|
|
|
// CraftBukkit start
|
|
long least = nbttagcompound.getLong("UUIDLeast");
|
|
long most = nbttagcompound.getLong("UUIDMost");
|
|
|
|
if (least != 0L && most != 0L) {
|
|
this.uniqueId = new UUID(most, least);
|
|
}
|
|
// CraftBukkit end
|
|
|
|
this.c(this.yaw, this.pitch);
|
|
this.a(nbttagcompound);
|
|
|
|
// CraftBukkit start - Exempt Vehicles from notch's sanity check
|
|
if (!(this.getBukkitEntity() instanceof Vehicle)) {
|
|
if (Math.abs(this.motX) > 10.0D) {
|
|
this.motX = 0.0D;
|
|
}
|
|
|
|
if (Math.abs(this.motY) > 10.0D) {
|
|
this.motY = 0.0D;
|
|
}
|
|
|
|
if (Math.abs(this.motZ) > 10.0D) {
|
|
this.motZ = 0.0D;
|
|
}
|
|
}
|
|
// CraftBukkit end
|
|
|
|
// CraftBukkit start - reset world
|
|
if (this instanceof EntityPlayer) {
|
|
org.bukkit.Server server = Bukkit.getServer();
|
|
org.bukkit.World bworld = null;
|
|
|
|
// TODO: Remove World related checks, replaced with WorldUID.
|
|
String worldName = nbttagcompound.getString("World");
|
|
|
|
if (nbttagcompound.hasKey("WorldUUIDMost") && nbttagcompound.hasKey("WorldUUIDLeast")) {
|
|
UUID uid = new UUID(nbttagcompound.getLong("WorldUUIDMost"), nbttagcompound.getLong("WorldUUIDLeast"));
|
|
bworld = server.getWorld(uid);
|
|
} else {
|
|
bworld = server.getWorld(worldName);
|
|
}
|
|
if (bworld == null) {
|
|
EntityPlayer entityPlayer = (EntityPlayer) this;
|
|
bworld = ((org.bukkit.craftbukkit.CraftServer) server).getServer().getWorldServer(entityPlayer.dimension).getWorld();
|
|
}
|
|
|
|
this.spawnIn(bworld == null ? null : ((org.bukkit.craftbukkit.CraftWorld) bworld).getHandle());
|
|
}
|
|
// CraftBukkit end
|
|
}
|
|
|
|
protected final String aX() {
|
|
return EntityTypes.b(this);
|
|
}
|
|
|
|
protected abstract void a(NBTTagCompound nbttagcompound);
|
|
|
|
protected abstract void b(NBTTagCompound nbttagcompound);
|
|
|
|
protected NBTTagList a(double... adouble) {
|
|
NBTTagList nbttaglist = new NBTTagList();
|
|
double[] adouble1 = adouble;
|
|
int i = adouble.length;
|
|
|
|
for (int j = 0; j < i; ++j) {
|
|
double d0 = adouble1[j];
|
|
|
|
nbttaglist.add(new NBTTagDouble((String) null, d0));
|
|
}
|
|
|
|
return nbttaglist;
|
|
}
|
|
|
|
protected NBTTagList a(float... afloat) {
|
|
NBTTagList nbttaglist = new NBTTagList();
|
|
float[] afloat1 = afloat;
|
|
int i = afloat.length;
|
|
|
|
for (int j = 0; j < i; ++j) {
|
|
float f = afloat1[j];
|
|
|
|
nbttaglist.add(new NBTTagFloat((String) null, f));
|
|
}
|
|
|
|
return nbttaglist;
|
|
}
|
|
|
|
public EntityItem b(int i, int j) {
|
|
return this.a(i, j, 0.0F);
|
|
}
|
|
|
|
public EntityItem a(int i, int j, float f) {
|
|
return this.a(new ItemStack(i, j, 0), f);
|
|
}
|
|
|
|
public EntityItem a(ItemStack itemstack, float f) {
|
|
EntityItem entityitem = new EntityItem(this.world, this.locX, this.locY + (double) f, this.locZ, itemstack);
|
|
|
|
entityitem.pickupDelay = 10;
|
|
this.world.addEntity(entityitem);
|
|
return entityitem;
|
|
}
|
|
|
|
public boolean isAlive() {
|
|
return !this.dead;
|
|
}
|
|
|
|
public boolean inBlock() {
|
|
for (int i = 0; i < 8; ++i) {
|
|
float f = ((float) ((i >> 0) % 2) - 0.5F) * this.width * 0.8F;
|
|
float f1 = ((float) ((i >> 1) % 2) - 0.5F) * 0.1F;
|
|
float f2 = ((float) ((i >> 2) % 2) - 0.5F) * this.width * 0.8F;
|
|
int j = MathHelper.floor(this.locX + (double) f);
|
|
int k = MathHelper.floor(this.locY + (double) this.getHeadHeight() + (double) f1);
|
|
int l = MathHelper.floor(this.locZ + (double) f2);
|
|
|
|
if (this.world.e(j, k, l)) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public boolean b(EntityHuman entityhuman) {
|
|
return false;
|
|
}
|
|
|
|
public AxisAlignedBB b_(Entity entity) {
|
|
return null;
|
|
}
|
|
|
|
public void R() {
|
|
if (this.vehicle.dead) {
|
|
this.vehicle = null;
|
|
} else {
|
|
this.motX = 0.0D;
|
|
this.motY = 0.0D;
|
|
this.motZ = 0.0D;
|
|
this.F_();
|
|
if (this.vehicle != null) {
|
|
this.vehicle.i_();
|
|
this.f += (double) (this.vehicle.yaw - this.vehicle.lastYaw);
|
|
|
|
for (this.e += (double) (this.vehicle.pitch - this.vehicle.lastPitch); this.f >= 180.0D; this.f -= 360.0D) {
|
|
;
|
|
}
|
|
|
|
while (this.f < -180.0D) {
|
|
this.f += 360.0D;
|
|
}
|
|
|
|
while (this.e >= 180.0D) {
|
|
this.e -= 360.0D;
|
|
}
|
|
|
|
while (this.e < -180.0D) {
|
|
this.e += 360.0D;
|
|
}
|
|
|
|
double d0 = this.f * 0.5D;
|
|
double d1 = this.e * 0.5D;
|
|
float f = 10.0F;
|
|
|
|
if (d0 > (double) f) {
|
|
d0 = (double) f;
|
|
}
|
|
|
|
if (d0 < (double) (-f)) {
|
|
d0 = (double) (-f);
|
|
}
|
|
|
|
if (d1 > (double) f) {
|
|
d1 = (double) f;
|
|
}
|
|
|
|
if (d1 < (double) (-f)) {
|
|
d1 = (double) (-f);
|
|
}
|
|
|
|
this.f -= d0;
|
|
this.e -= d1;
|
|
this.yaw = (float) ((double) this.yaw + d0);
|
|
this.pitch = (float) ((double) this.pitch + d1);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void i_() {
|
|
this.passenger.setPosition(this.locX, this.locY + this.x_() + this.passenger.W(), this.locZ);
|
|
}
|
|
|
|
public double W() {
|
|
return (double) this.height;
|
|
}
|
|
|
|
public double x_() {
|
|
return (double) this.length * 0.75D;
|
|
}
|
|
|
|
public void mount(Entity entity) {
|
|
// CraftBukkit start
|
|
this.setPassengerOf(entity);
|
|
}
|
|
|
|
protected org.bukkit.entity.Entity bukkitEntity;
|
|
|
|
public org.bukkit.entity.Entity getBukkitEntity() {
|
|
if (this.bukkitEntity == null) {
|
|
this.bukkitEntity = org.bukkit.craftbukkit.entity.CraftEntity.getEntity(this.world.getServer(), this);
|
|
}
|
|
return this.bukkitEntity;
|
|
}
|
|
|
|
public void setPassengerOf(Entity entity) {
|
|
// b(null) doesn't really fly for overloaded methods,
|
|
// so this method is needed
|
|
|
|
PluginManager pluginManager = Bukkit.getPluginManager();
|
|
this.getBukkitEntity(); // make sure bukkitEntity is initialised
|
|
// CraftBukkit end
|
|
this.e = 0.0D;
|
|
this.f = 0.0D;
|
|
if (entity == null) {
|
|
if (this.vehicle != null) {
|
|
// CraftBukkit start
|
|
if ((this.bukkitEntity instanceof LivingEntity) && (this.vehicle.getBukkitEntity() instanceof Vehicle)) {
|
|
VehicleExitEvent event = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity);
|
|
pluginManager.callEvent(event);
|
|
}
|
|
// CraftBukkit end
|
|
|
|
this.setPositionRotation(this.vehicle.locX, this.vehicle.boundingBox.b + (double) this.vehicle.length, this.vehicle.locZ, this.yaw, this.pitch);
|
|
this.vehicle.passenger = null;
|
|
}
|
|
|
|
this.vehicle = null;
|
|
} else if (this.vehicle == entity) {
|
|
// CraftBukkit start
|
|
if ((this.bukkitEntity instanceof LivingEntity) && (this.vehicle.getBukkitEntity() instanceof Vehicle)) {
|
|
VehicleExitEvent event = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity);
|
|
pluginManager.callEvent(event);
|
|
}
|
|
// CraftBukkit end
|
|
|
|
this.vehicle.passenger = null;
|
|
this.vehicle = null;
|
|
this.setPositionRotation(entity.locX, entity.boundingBox.b + (double) entity.length, entity.locZ, this.yaw, this.pitch);
|
|
} else {
|
|
// CraftBukkit start
|
|
if ((this.bukkitEntity instanceof LivingEntity) && (entity.getBukkitEntity() instanceof Vehicle)) {
|
|
VehicleEnterEvent event = new VehicleEnterEvent((Vehicle) entity.getBukkitEntity(), this.bukkitEntity);
|
|
pluginManager.callEvent(event);
|
|
|
|
if (event.isCancelled()) {
|
|
return;
|
|
}
|
|
}
|
|
// CraftBukkit end
|
|
|
|
if (this.vehicle != null) {
|
|
this.vehicle.passenger = null;
|
|
}
|
|
|
|
if (entity.passenger != null) {
|
|
entity.passenger.vehicle = null;
|
|
}
|
|
|
|
this.vehicle = entity;
|
|
entity.passenger = this;
|
|
}
|
|
}
|
|
|
|
public float j_() {
|
|
return 0.1F;
|
|
}
|
|
|
|
public Vec3D aJ() {
|
|
return null;
|
|
}
|
|
|
|
public void ad() {}
|
|
|
|
public ItemStack[] getEquipment() {
|
|
return null;
|
|
}
|
|
|
|
public boolean isBurning() {
|
|
return this.fireTicks > 0 || this.j(0);
|
|
}
|
|
|
|
public boolean isSneaking() {
|
|
return this.j(1);
|
|
}
|
|
|
|
public void setSneak(boolean flag) {
|
|
this.a(1, flag);
|
|
}
|
|
|
|
public boolean isSprinting() {
|
|
return this.j(3);
|
|
}
|
|
|
|
public void setSprinting(boolean flag) {
|
|
this.a(3, flag);
|
|
}
|
|
|
|
public void i(boolean flag) {
|
|
this.a(4, flag);
|
|
}
|
|
|
|
protected boolean j(int i) {
|
|
return (this.datawatcher.getByte(0) & 1 << i) != 0;
|
|
}
|
|
|
|
protected void a(int i, boolean flag) {
|
|
byte b0 = this.datawatcher.getByte(0);
|
|
|
|
if (flag) {
|
|
this.datawatcher.watch(0, Byte.valueOf((byte) (b0 | 1 << i)));
|
|
} else {
|
|
this.datawatcher.watch(0, Byte.valueOf((byte) (b0 & ~(1 << i))));
|
|
}
|
|
}
|
|
|
|
public int getAirTicks() {
|
|
return this.datawatcher.b(1);
|
|
}
|
|
|
|
public void setAirTicks(int i) {
|
|
this.datawatcher.watch(1, Short.valueOf((short) i));
|
|
}
|
|
|
|
public void a(EntityWeatherLighting entityweatherlighting) {
|
|
// CraftBukkit start
|
|
final org.bukkit.entity.Entity thisBukkitEntity = this.getBukkitEntity();
|
|
final org.bukkit.entity.Entity stormBukkitEntity = entityweatherlighting.getBukkitEntity();
|
|
final PluginManager pluginManager = Bukkit.getPluginManager();
|
|
|
|
if (thisBukkitEntity instanceof Painting) {
|
|
PaintingBreakByEntityEvent event = new PaintingBreakByEntityEvent((Painting) thisBukkitEntity, stormBukkitEntity);
|
|
pluginManager.callEvent(event);
|
|
|
|
if (event.isCancelled()) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(stormBukkitEntity, thisBukkitEntity, EntityDamageEvent.DamageCause.LIGHTNING, 5);
|
|
pluginManager.callEvent(event);
|
|
|
|
if (event.isCancelled()) {
|
|
return;
|
|
}
|
|
|
|
this.burn(event.getDamage());
|
|
// CraftBukkit end
|
|
|
|
++this.fireTicks;
|
|
if (this.fireTicks == 0) {
|
|
// CraftBukkit start - raise a combust event when lightning strikes
|
|
EntityCombustByEntityEvent entityCombustEvent = new EntityCombustByEntityEvent(stormBukkitEntity, thisBukkitEntity, 8);
|
|
pluginManager.callEvent(entityCombustEvent);
|
|
if (!entityCombustEvent.isCancelled()) {
|
|
this.setOnFire(entityCombustEvent.getDuration());
|
|
}
|
|
// CraftBukkit end
|
|
}
|
|
}
|
|
|
|
public void c(EntityLiving entityliving) {}
|
|
|
|
protected boolean g(double d0, double d1, double d2) {
|
|
int i = MathHelper.floor(d0);
|
|
int j = MathHelper.floor(d1);
|
|
int k = MathHelper.floor(d2);
|
|
double d3 = d0 - (double) i;
|
|
double d4 = d1 - (double) j;
|
|
double d5 = d2 - (double) k;
|
|
|
|
if (this.world.e(i, j, k)) {
|
|
boolean flag = !this.world.e(i - 1, j, k);
|
|
boolean flag1 = !this.world.e(i + 1, j, k);
|
|
boolean flag2 = !this.world.e(i, j - 1, k);
|
|
boolean flag3 = !this.world.e(i, j + 1, k);
|
|
boolean flag4 = !this.world.e(i, j, k - 1);
|
|
boolean flag5 = !this.world.e(i, j, k + 1);
|
|
byte b0 = -1;
|
|
double d6 = 9999.0D;
|
|
|
|
if (flag && d3 < d6) {
|
|
d6 = d3;
|
|
b0 = 0;
|
|
}
|
|
|
|
if (flag1 && 1.0D - d3 < d6) {
|
|
d6 = 1.0D - d3;
|
|
b0 = 1;
|
|
}
|
|
|
|
if (flag2 && d4 < d6) {
|
|
d6 = d4;
|
|
b0 = 2;
|
|
}
|
|
|
|
if (flag3 && 1.0D - d4 < d6) {
|
|
d6 = 1.0D - d4;
|
|
b0 = 3;
|
|
}
|
|
|
|
if (flag4 && d5 < d6) {
|
|
d6 = d5;
|
|
b0 = 4;
|
|
}
|
|
|
|
if (flag5 && 1.0D - d5 < d6) {
|
|
d6 = 1.0D - d5;
|
|
b0 = 5;
|
|
}
|
|
|
|
float f = this.random.nextFloat() * 0.2F + 0.1F;
|
|
|
|
if (b0 == 0) {
|
|
this.motX = (double) (-f);
|
|
}
|
|
|
|
if (b0 == 1) {
|
|
this.motX = (double) f;
|
|
}
|
|
|
|
if (b0 == 2) {
|
|
this.motY = (double) (-f);
|
|
}
|
|
|
|
if (b0 == 3) {
|
|
this.motY = (double) f;
|
|
}
|
|
|
|
if (b0 == 4) {
|
|
this.motZ = (double) (-f);
|
|
}
|
|
|
|
if (b0 == 5) {
|
|
this.motZ = (double) f;
|
|
}
|
|
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public void u() {
|
|
this.bC = true;
|
|
this.fallDistance = 0.0F;
|
|
}
|
|
|
|
public String getLocalizedName() {
|
|
String s = EntityTypes.b(this);
|
|
|
|
if (s == null) {
|
|
s = "generic";
|
|
}
|
|
|
|
return LocaleI18n.get("entity." + s + ".name");
|
|
}
|
|
|
|
public Entity[] bb() {
|
|
return null;
|
|
}
|
|
|
|
public boolean a_(Entity entity) {
|
|
return this == entity;
|
|
}
|
|
|
|
public float ar() {
|
|
return 0.0F;
|
|
}
|
|
|
|
public boolean k_() {
|
|
return true;
|
|
}
|
|
}
|