diff options
author | Travis Watkins <amaranth@ubuntu.com> | 2012-11-06 06:05:28 -0600 |
---|---|---|
committer | Travis Watkins <amaranth@ubuntu.com> | 2012-11-13 16:09:52 -0600 |
commit | 7f7192f8fd8357e664e7e2d6e7c5f65fd0fcd2f7 (patch) | |
tree | 843902ff94d82e86f40d7e0af1ac838fee859e75 /src/main/java/net/minecraft/server/Entity.java | |
parent | a0c3b4f9d1b403fa64230f22b5dd3222181ba646 (diff) | |
download | craftbukkit-7f7192f8fd8357e664e7e2d6e7c5f65fd0fcd2f7.tar craftbukkit-7f7192f8fd8357e664e7e2d6e7c5f65fd0fcd2f7.tar.gz craftbukkit-7f7192f8fd8357e664e7e2d6e7c5f65fd0fcd2f7.tar.lz craftbukkit-7f7192f8fd8357e664e7e2d6e7c5f65fd0fcd2f7.tar.xz craftbukkit-7f7192f8fd8357e664e7e2d6e7c5f65fd0fcd2f7.zip |
Update CraftBukkit to Minecraft 1.4.4.
Diffstat (limited to 'src/main/java/net/minecraft/server/Entity.java')
-rw-r--r-- | src/main/java/net/minecraft/server/Entity.java | 457 |
1 files changed, 254 insertions, 203 deletions
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java index a99392ef..50d4834c 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -1,8 +1,8 @@ package net.minecraft.server; -import java.util.Iterator; import java.util.List; import java.util.Random; +import java.util.concurrent.Callable; // CraftBukkit start import java.util.UUID; @@ -90,11 +90,12 @@ public abstract class Entity { public int ak; public boolean al; public boolean am; - public int an; + public int portalCooldown; protected boolean ao; private int h; public int dimension; protected int aq; + private boolean invulnerable; public EnumEntitySize ar; public UUID uniqueId = UUID.randomUUID(); // CraftBukkit public boolean valid = false; // CraftBukkit @@ -132,6 +133,7 @@ public abstract class Entity { this.datawatcher = new DataWatcher(); this.ah = false; this.aq = 0; + this.invulnerable = false; this.ar = EnumEntitySize.SIZE_2; this.world = world; this.setPosition(0.0D, 0.0D, 0.0D); @@ -244,14 +246,15 @@ public abstract class Entity { int i; if (!this.world.isStatic && this.world instanceof WorldServer) { + this.world.methodProfiler.a("portal"); MinecraftServer minecraftserver = ((WorldServer) this.world).getMinecraftServer(); i = this.z(); if (this.ao) { - if (minecraftserver.getAllowNether()) { + if (true || minecraftserver.getAllowNether()) { // CraftBukkit if (this.vehicle == null && this.h++ >= i) { this.h = i; - this.an = this.ab(); + this.portalCooldown = this.ab(); byte b0; if (this.world.worldProvider.dimension == -1) { @@ -275,59 +278,26 @@ public abstract class Entity { } } - if (this.an > 0) { - --this.an; + if (this.portalCooldown > 0) { + --this.portalCooldown; } - } - int j; + this.world.methodProfiler.b(); + } if (this.isSprinting() && !this.H()) { - int k = MathHelper.floor(this.locX); + int j = MathHelper.floor(this.locX); i = MathHelper.floor(this.locY - 0.20000000298023224D - (double) this.height); - j = MathHelper.floor(this.locZ); - int l = this.world.getTypeId(k, i, j); + int k = MathHelper.floor(this.locZ); + int l = this.world.getTypeId(j, i, k); if (l > 0) { - this.world.addParticle("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); + this.world.addParticle("tilecrack_" + l + "_" + this.world.getData(j, i, k), 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.I()) { - if (!this.ad && !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, "liquid.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 (j = 0; (float) j < 1.0F + this.width * 20.0F; ++j) { - f3 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width; - f2 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width; - this.world.addParticle("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 (j = 0; (float) j < 1.0F + this.width * 20.0F; ++j) { - f3 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width; - f2 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width; - this.world.addParticle("splash", this.locX + (double) f3, (double) (f1 + 1.0F), this.locZ + (double) f2, this.motX, this.motY, this.motZ); - } - } - - this.fallDistance = 0.0F; - this.ad = true; - this.fireTicks = 0; - } else { - this.ad = false; - } - + this.I(); if (this.world.isStatic) { this.fireTicks = 0; } else if (this.fireTicks > 0) { @@ -517,10 +487,8 @@ public abstract class Entity { List list = this.world.getCubes(this, this.boundingBox.a(d0, d1, d2)); - AxisAlignedBB axisalignedbb1; - - for (Iterator iterator = list.iterator(); iterator.hasNext(); d1 = axisalignedbb1.b(this.boundingBox, d1)) { - axisalignedbb1 = (AxisAlignedBB) iterator.next(); + 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); @@ -532,11 +500,10 @@ public abstract class Entity { boolean flag1 = this.onGround || d7 != d1 && d7 < 0.0D; - AxisAlignedBB axisalignedbb2; - Iterator iterator1; + int j; - for (iterator1 = list.iterator(); iterator1.hasNext(); d0 = axisalignedbb2.a(this.boundingBox, d0)) { - axisalignedbb2 = (AxisAlignedBB) iterator1.next(); + for (j = 0; j < list.size(); ++j) { + d0 = ((AxisAlignedBB) list.get(j)).a(this.boundingBox, d0); } this.boundingBox.d(d0, 0.0D, 0.0D); @@ -546,8 +513,8 @@ public abstract class Entity { d0 = 0.0D; } - for (iterator1 = list.iterator(); iterator1.hasNext(); d2 = axisalignedbb2.c(this.boundingBox, d2)) { - axisalignedbb2 = (AxisAlignedBB) iterator1.next(); + for (j = 0; j < list.size(); ++j) { + d2 = ((AxisAlignedBB) list.get(j)).c(this.boundingBox, d2); } this.boundingBox.d(0.0D, 0.0D, d2); @@ -560,6 +527,7 @@ public abstract class Entity { double d10; double d11; double d12; + int k; if (this.X > 0.0F && flag1 && (flag || this.W < 0.05F) && (d6 != d0 || d8 != d2)) { d10 = d0; @@ -568,16 +536,13 @@ public abstract class Entity { d0 = d6; d1 = (double) this.X; d2 = d8; - AxisAlignedBB axisalignedbb3 = this.boundingBox.clone(); + AxisAlignedBB axisalignedbb1 = this.boundingBox.clone(); this.boundingBox.c(axisalignedbb); list = this.world.getCubes(this, this.boundingBox.a(d6, d1, d8)); - Iterator iterator2; - AxisAlignedBB axisalignedbb4; - - for (iterator2 = list.iterator(); iterator2.hasNext(); d1 = axisalignedbb4.b(this.boundingBox, d1)) { - axisalignedbb4 = (AxisAlignedBB) iterator2.next(); + for (k = 0; k < list.size(); ++k) { + d1 = ((AxisAlignedBB) list.get(k)).b(this.boundingBox, d1); } this.boundingBox.d(0.0D, d1, 0.0D); @@ -587,8 +552,8 @@ public abstract class Entity { d0 = 0.0D; } - for (iterator2 = list.iterator(); iterator2.hasNext(); d0 = axisalignedbb4.a(this.boundingBox, d0)) { - axisalignedbb4 = (AxisAlignedBB) iterator2.next(); + for (k = 0; k < list.size(); ++k) { + d0 = ((AxisAlignedBB) list.get(k)).a(this.boundingBox, d0); } this.boundingBox.d(d0, 0.0D, 0.0D); @@ -598,8 +563,8 @@ public abstract class Entity { d0 = 0.0D; } - for (iterator2 = list.iterator(); iterator2.hasNext(); d2 = axisalignedbb4.c(this.boundingBox, d2)) { - axisalignedbb4 = (AxisAlignedBB) iterator2.next(); + for (k = 0; k < list.size(); ++k) { + d2 = ((AxisAlignedBB) list.get(k)).c(this.boundingBox, d2); } this.boundingBox.d(0.0D, 0.0D, d2); @@ -616,8 +581,8 @@ public abstract class Entity { } else { d1 = (double) (-this.X); - for (iterator2 = list.iterator(); iterator2.hasNext(); d1 = axisalignedbb4.b(this.boundingBox, d1)) { - axisalignedbb4 = (AxisAlignedBB) iterator2.next(); + for (k = 0; k < list.size(); ++k) { + d1 = ((AxisAlignedBB) list.get(k)).b(this.boundingBox, d1); } this.boundingBox.d(0.0D, d1, 0.0D); @@ -627,7 +592,7 @@ public abstract class Entity { d0 = d10; d1 = d11; d2 = d12; - this.boundingBox.c(axisalignedbb3); + this.boundingBox.c(axisalignedbb1); } else { double d13 = this.boundingBox.b - (double) ((int) this.boundingBox.b); @@ -684,22 +649,27 @@ public abstract class Entity { // CraftBukkit end if (this.f_() && !flag && this.vehicle == null) { - 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); + int l = MathHelper.floor(this.locX); + + k = MathHelper.floor(this.locY - 0.20000000298023224D - (double) this.height); + int i1 = MathHelper.floor(this.locZ); + int j1 = this.world.getTypeId(l, k, i1); + + if (j1 == 0) { + int k1 = this.world.e(l, k - 1, i1); - if (l == 0 && this.world.getTypeId(i, j - 1, k) == Block.FENCE.id) { - l = this.world.getTypeId(i, j - 1, k); + if (k1 == 11 || k1 == 32 || k1 == 21) { + j1 = this.world.getTypeId(l, k - 1, i1); + } } - if (l != Block.LADDER.id) { + if (j1 != Block.LADDER.id) { d11 = 0.0D; } this.Q = (float) ((double) this.Q + (double) MathHelper.sqrt(d10 * d10 + d12 * d12) * 0.6D); this.R = (float) ((double) this.R + (double) MathHelper.sqrt(d10 * d10 + d11 * d11 + d12 * d12) * 0.6D); - if (this.R > (float) this.c && l > 0) { + if (this.R > (float) this.c && j1 > 0) { this.c = (int) this.R + 1; if (this.H()) { float f = MathHelper.sqrt(this.motX * this.motX * 0.20000000298023224D + this.motY * this.motY + this.motZ * this.motZ * 0.20000000298023224D) * 0.35F; @@ -708,11 +678,11 @@ public abstract class Entity { f = 1.0F; } - this.world.makeSound(this, "liquid.swim", f, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F); + this.makeSound("liquid.swim", f, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F); } - this.a(i, j, k, l); - Block.byId[l].b(this.world, i, j, k, this); + this.a(l, k, i1, j1); + Block.byId[j1].b(this.world, l, k, i1, this); } } @@ -741,7 +711,7 @@ public abstract class Entity { } if (flag2 && this.fireTicks > 0) { - this.world.makeSound(this, "random.fizz", 0.7F, 1.6F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F); + this.makeSound("random.fizz", 0.7F, 1.6F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F); this.fireTicks = -this.maxFireTicks; } @@ -777,12 +747,16 @@ public abstract class Entity { 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()); + this.makeSound(stepsound.getStepSound(), 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()); + this.makeSound(stepsound.getStepSound(), stepsound.getVolume1() * 0.15F, stepsound.getVolume2()); } } + protected void makeSound(String s, float f, float f1) { + this.world.makeSound(this, s, f, f1); + } + protected boolean f_() { return true; } @@ -833,7 +807,7 @@ public abstract class Entity { } public boolean G() { - return this.ad || this.world.B(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)); + return this.ad || this.world.D(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)) || this.world.D(MathHelper.floor(this.locX), MathHelper.floor(this.locY + (double) this.length), MathHelper.floor(this.locZ)); } public boolean H() { @@ -841,7 +815,42 @@ public abstract class Entity { } public boolean I() { - return this.world.a(this.boundingBox.grow(0.0D, -0.4000000059604645D, 0.0D).shrink(0.001D, 0.001D, 0.001D), Material.WATER, this); + if (this.world.a(this.boundingBox.grow(0.0D, -0.4000000059604645D, 0.0D).shrink(0.001D, 0.001D, 0.001D), Material.WATER, this)) { + if (!this.ad && !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.makeSound("liquid.splash", f, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F); + float f1 = (float) MathHelper.floor(this.boundingBox.b); + + int i; + float f2; + float f3; + + for (i = 0; (float) i < 1.0F + this.width * 20.0F; ++i) { + f2 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width; + f3 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width; + this.world.addParticle("bubble", this.locX + (double) f2, (double) (f1 + 1.0F), this.locZ + (double) f3, this.motX, this.motY - (double) (this.random.nextFloat() * 0.2F), this.motZ); + } + + for (i = 0; (float) i < 1.0F + this.width * 20.0F; ++i) { + f2 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width; + f3 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width; + this.world.addParticle("splash", this.locX + (double) f2, (double) (f1 + 1.0F), this.locZ + (double) f3, this.motX, this.motY, this.motZ); + } + } + + this.fallDistance = 0.0F; + this.ad = true; + this.fireTicks = 0; + } else { + this.ad = false; + } + + return this.ad; } public boolean a(Material material) { @@ -897,7 +906,7 @@ public abstract class Entity { double d0 = (this.boundingBox.e - this.boundingBox.b) * 0.66D; int k = MathHelper.floor(this.locY - (double) this.height + d0); - return this.world.o(i, k, j); + return this.world.p(i, k, j); } else { return 0.0F; } @@ -977,7 +986,7 @@ public abstract class Entity { return d0 * d0 + d1 * d1 + d2 * d2; } - public void b_(EntityHuman entityhuman) {} + public void c_(EntityHuman entityhuman) {} public void collide(Entity entity) { if (entity.passenger != this && entity.vehicle != this) { @@ -1019,8 +1028,12 @@ public abstract class Entity { } public boolean damageEntity(DamageSource damagesource, int i) { - this.K(); - return false; + if (this.isInvulnerable()) { + return false; + } else { + this.K(); + return false; + } } public boolean L() { @@ -1046,83 +1059,55 @@ public abstract class Entity { } public void d(NBTTagCompound nbttagcompound) { - nbttagcompound.set("Pos", this.a(new double[] { this.locX, this.locY + (double) this.W, this.locZ})); - nbttagcompound.set("Motion", this.a(new double[] { this.motX, this.motY, this.motZ})); + try { + nbttagcompound.set("Pos", this.a(new double[] { this.locX, this.locY + (double) this.W, 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; + } - // 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 - 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); + nbttagcompound.setInt("Dimension", this.dimension); + nbttagcompound.setBoolean("Invulnerable", this.invulnerable); + nbttagcompound.setInt("PortalCooldown", this.portalCooldown); + // CraftBukkit start + nbttagcompound.setLong("WorldUUIDLeast", this.world.getDataManager().getUUID().getLeastSignificantBits()); + nbttagcompound.setLong("WorldUUIDMost", this.world.getDataManager().getUUID().getMostSignificantBits()); + nbttagcompound.setLong("UUIDLeast", this.uniqueId.getLeastSignificantBits()); + nbttagcompound.setLong("UUIDMost", this.uniqueId.getMostSignificantBits()); + // CraftBukkit end + this.b(nbttagcompound); + } catch (Throwable throwable) { + CrashReport crashreport = CrashReport.a(throwable, "Saving entity NBT"); + CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being saved"); - 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); - nbttagcompound.setInt("Dimension", this.dimension); - // CraftBukkit start - nbttagcompound.setLong("WorldUUIDLeast", this.world.getDataManager().getUUID().getLeastSignificantBits()); - nbttagcompound.setLong("WorldUUIDMost", this.world.getDataManager().getUUID().getMostSignificantBits()); - nbttagcompound.setLong("UUIDLeast", this.uniqueId.getLeastSignificantBits()); - nbttagcompound.setLong("UUIDMost", this.uniqueId.getMostSignificantBits()); - // CraftBukkit end - this.b(nbttagcompound); + this.a(crashreportsystemdetails); + throw new ReportedException(crashreport); + } } 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.T = this.locX = ((NBTTagDouble) nbttaglist.get(0)).data; - this.lastY = this.U = this.locY = ((NBTTagDouble) nbttaglist.get(1)).data; - this.lastZ = this.V = 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.dimension = nbttagcompound.getInt("Dimension"); - 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.b(this.yaw, this.pitch); - this.a(nbttagcompound); - - // CraftBukkit start - exempt Vehicles from notch's sanity check - if (!(this.getBukkitEntity() instanceof Vehicle)) { + try { + 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; } @@ -1134,32 +1119,80 @@ public abstract class Entity { if (Math.abs(this.motZ) > 10.0D) { this.motZ = 0.0D; } - } - // CraftBukkit end + // CraftBukkit end */ + + this.lastX = this.T = this.locX = ((NBTTagDouble) nbttaglist.get(0)).data; + this.lastY = this.U = this.locY = ((NBTTagDouble) nbttaglist.get(1)).data; + this.lastZ = this.V = 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.dimension = nbttagcompound.getInt("Dimension"); + this.invulnerable = nbttagcompound.getBoolean("Invulnerable"); + this.portalCooldown = nbttagcompound.getInt("PortalCooldown"); + this.setPosition(this.locX, this.locY, this.locZ); + + // CraftBukkit start + long least = nbttagcompound.getLong("UUIDLeast"); + long most = nbttagcompound.getLong("UUIDMost"); - // CraftBukkit start - reset world - if (this instanceof EntityPlayer) { - Server server = Bukkit.getServer(); - org.bukkit.World bworld = null; + if (least != 0L && most != 0L) { + this.uniqueId = new UUID(most, least); + } + // CraftBukkit end - // TODO: Remove World related checks, replaced with WorldUID. - String worldName = nbttagcompound.getString("World"); + this.b(this.yaw, this.pitch); + this.a(nbttagcompound); - 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); + // 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) { + 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(); + } - if (bworld == null) { - EntityPlayer entityPlayer = (EntityPlayer) this; - bworld = ((org.bukkit.craftbukkit.CraftServer) server).getServer().getWorldServer(entityPlayer.dimension).getWorld(); + this.spawnIn(bworld == null ? null : ((CraftWorld) bworld).getHandle()); } + // CraftBukkit end + } catch (Throwable throwable) { + CrashReport crashreport = CrashReport.a(throwable, "Loading entity NBT"); + CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being loaded"); - this.spawnIn(bworld == null ? null : ((CraftWorld) bworld).getHandle()); + this.a(crashreportsystemdetails); + throw new ReportedException(crashreport); } - // CraftBukkit end } protected final String Q() { @@ -1227,7 +1260,7 @@ public abstract class Entity { int k = MathHelper.floor(this.locY + (double) this.getHeadHeight() + (double) f1); int l = MathHelper.floor(this.locZ + (double) f2); - if (this.world.s(j, k, l)) { + if (this.world.t(j, k, l)) { return true; } } @@ -1235,7 +1268,7 @@ public abstract class Entity { return false; } - public boolean c(EntityHuman entityhuman) { + public boolean a(EntityHuman entityhuman) { return false; } @@ -1300,7 +1333,7 @@ public abstract class Entity { } public void V() { - if (!(this.passenger instanceof EntityHuman) || !((EntityHuman) this.passenger).bS()) { + if (!(this.passenger instanceof EntityHuman) || !((EntityHuman) this.passenger).bW()) { this.passenger.T = this.T; this.passenger.U = this.U + this.X() + this.passenger.W(); this.passenger.V = this.V; @@ -1403,12 +1436,12 @@ public abstract class Entity { AxisAlignedBB axisalignedbb = this.boundingBox.c(d3, 1.0D, d4); if (this.world.a(axisalignedbb).isEmpty()) { - if (this.world.t(i, (int) this.locY, j)) { + if (this.world.v(i, (int) this.locY, j)) { this.setPositionRotation(this.locX + d3, this.locY + 1.0D, this.locZ + d4, this.yaw, this.pitch); return; } - if (this.world.t(i, (int) this.locY - 1, j) || this.world.getMaterial(i, (int) this.locY - 1, j) == Material.WATER) { + if (this.world.v(i, (int) this.locY - 1, j) || this.world.getMaterial(i, (int) this.locY - 1, j) == Material.WATER) { d0 = this.locX + d3; d1 = this.locY + 1.0D; d2 = this.locZ + d4; @@ -1430,8 +1463,8 @@ public abstract class Entity { } public void aa() { - if (this.an > 0) { - this.an = this.ab(); + if (this.portalCooldown > 0) { + this.portalCooldown = this.ab(); } else { double d0 = this.lastX - this.locX; double d1 = this.lastZ - this.locZ; @@ -1445,7 +1478,7 @@ public abstract class Entity { } public int ab() { - return 500; + return 900; } public ItemStack[] getEquipment() { @@ -1559,15 +1592,18 @@ public abstract class Entity { double d3 = d0 - (double) i; double d4 = d1 - (double) j; double d5 = d2 - (double) k; + List list = this.world.a(this.boundingBox); - if (this.world.s(i, j, k)) { - boolean flag = !this.world.s(i - 1, j, k); - boolean flag1 = !this.world.s(i + 1, j, k); - boolean flag2 = !this.world.s(i, j - 1, k); - boolean flag3 = !this.world.s(i, j + 1, k); - boolean flag4 = !this.world.s(i, j, k - 1); - boolean flag5 = !this.world.s(i, j, k + 1); - byte b0 = -1; + if (list.isEmpty() && !this.world.u(i, j, k)) { + return false; + } else { + boolean flag = !this.world.u(i - 1, j, k); + boolean flag1 = !this.world.u(i + 1, j, k); + boolean flag2 = !this.world.u(i, j - 1, k); + boolean flag3 = !this.world.u(i, j + 1, k); + boolean flag4 = !this.world.u(i, j, k - 1); + boolean flag5 = !this.world.u(i, j, k + 1); + byte b0 = 3; double d6 = 9999.0D; if (flag && d3 < d6) { @@ -1580,11 +1616,6 @@ public abstract class Entity { b0 = 1; } - if (flag2 && d4 < d6) { - d6 = d4; - b0 = 2; - } - if (flag3 && 1.0D - d4 < d6) { d6 = 1.0D - d4; b0 = 3; @@ -1627,8 +1658,6 @@ public abstract class Entity { } return true; - } else { - return false; } } @@ -1663,11 +1692,19 @@ public abstract class Entity { return true; } + public boolean j(Entity entity) { + return false; + } + public String toString() { return String.format("%s[\'%s\'/%d, l=\'%s\', x=%.2f, y=%.2f, z=%.2f]", new Object[] { this.getClass().getSimpleName(), this.getLocalizedName(), Integer.valueOf(this.id), this.world == null ? "~NULL~" : this.world.getWorldData().getName(), Double.valueOf(this.locX), Double.valueOf(this.locY), Double.valueOf(this.locZ)}); } - public void j(Entity entity) { + public boolean isInvulnerable() { + return this.invulnerable; + } + + public void k(Entity entity) { this.setPositionRotation(entity.locX, entity.locY, entity.locZ, entity.yaw, entity.pitch); } @@ -1676,12 +1713,13 @@ public abstract class Entity { entity.d(nbttagcompound); this.e(nbttagcompound); - this.an = entity.an; + this.portalCooldown = entity.portalCooldown; this.aq = entity.aq; } public void b(int i) { if (false && !this.world.isStatic && !this.dead) { // CraftBukkit - disable entity portal support for now. + this.world.methodProfiler.a("changeDimension"); MinecraftServer minecraftserver = MinecraftServer.getServer(); int j = this.dimension; WorldServer worldserver = minecraftserver.getWorldServer(j); @@ -1690,7 +1728,9 @@ public abstract class Entity { this.dimension = i; this.world.kill(this); this.dead = false; + this.world.methodProfiler.a("reposition"); minecraftserver.getServerConfigurationManager().a(this, j, worldserver, worldserver1); + this.world.methodProfiler.c("reloading"); Entity entity = EntityTypes.createEntityByName(EntityTypes.b(this), worldserver1); if (entity != null) { @@ -1699,8 +1739,10 @@ public abstract class Entity { } this.dead = true; + this.world.methodProfiler.b(); worldserver.i(); worldserver1.i(); + this.world.methodProfiler.b(); } } @@ -1719,4 +1761,13 @@ public abstract class Entity { public boolean au() { return false; } + + public void a(CrashReportSystemDetails crashreportsystemdetails) { + crashreportsystemdetails.a("Entity Type", (Callable) (new CrashReportEntityType(this))); + crashreportsystemdetails.a("Entity ID", Integer.valueOf(this.id)); + crashreportsystemdetails.a("Name", this.getLocalizedName()); + crashreportsystemdetails.a("Exact location", String.format("%.2f, %.2f, %.2f", new Object[] { Double.valueOf(this.locX), Double.valueOf(this.locY), Double.valueOf(this.locZ)})); + crashreportsystemdetails.a("Block location", CrashReportSystemDetails.a(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ))); + crashreportsystemdetails.a("Momentum", String.format("%.2f, %.2f, %.2f", new Object[] { Double.valueOf(this.motX), Double.valueOf(this.motY), Double.valueOf(this.motZ)})); + } } |