diff options
author | Travis Watkins <amaranth@ubuntu.com> | 2012-10-24 22:53:23 -0500 |
---|---|---|
committer | EvilSeph <evilseph@gmail.com> | 2012-10-27 22:19:03 -0400 |
commit | 60819c6693daf19dde68b04af38a4fee8c7da988 (patch) | |
tree | e7bd96a07f0e9d9f1f6b2721ddd1bb5dd71eaf48 /src/main/java/net/minecraft/server/EntityHanging.java | |
parent | b9a72531b6e2ccc84bd021bca421255a957d96f7 (diff) | |
download | craftbukkit-60819c6693daf19dde68b04af38a4fee8c7da988.tar craftbukkit-60819c6693daf19dde68b04af38a4fee8c7da988.tar.gz craftbukkit-60819c6693daf19dde68b04af38a4fee8c7da988.tar.lz craftbukkit-60819c6693daf19dde68b04af38a4fee8c7da988.tar.xz craftbukkit-60819c6693daf19dde68b04af38a4fee8c7da988.zip |
Update CraftBukkit to Minecraft 1.4(.2).
Diffstat (limited to 'src/main/java/net/minecraft/server/EntityHanging.java')
-rw-r--r-- | src/main/java/net/minecraft/server/EntityHanging.java | 318 |
1 files changed, 318 insertions, 0 deletions
diff --git a/src/main/java/net/minecraft/server/EntityHanging.java b/src/main/java/net/minecraft/server/EntityHanging.java new file mode 100644 index 00000000..97ae4f6f --- /dev/null +++ b/src/main/java/net/minecraft/server/EntityHanging.java @@ -0,0 +1,318 @@ +package net.minecraft.server; + +import java.util.Iterator; +import java.util.List; + +// CraftBukkit start +import org.bukkit.entity.Painting; +import org.bukkit.event.painting.PaintingBreakEvent.RemoveCause; +import org.bukkit.event.painting.PaintingBreakEvent; +// CraftBukkit end + +public abstract class EntityHanging extends Entity { + + private int e; + public int direction; + public int x; + public int y; + public int z; + + public EntityHanging(World world) { + super(world); + this.e = 0; + this.direction = 0; + this.height = 0.0F; + this.a(0.5F, 0.5F); + } + + public EntityHanging(World world, int i, int j, int k, int l) { + this(world); + this.x = i; + this.y = j; + this.z = k; + } + + protected void a() {} + + public void setDirection(int i) { + this.direction = i; + this.lastYaw = this.yaw = (float) (i * 90); + float f = (float) this.d(); + float f1 = (float) this.g(); + float f2 = (float) this.d(); + + if (i != 2 && i != 0) { + f = 0.5F; + } else { + f2 = 0.5F; + this.yaw = this.lastYaw = (float) (Direction.f[i] * 90); + } + + f /= 32.0F; + f1 /= 32.0F; + f2 /= 32.0F; + float f3 = (float) this.x + 0.5F; + float f4 = (float) this.y + 0.5F; + float f5 = (float) this.z + 0.5F; + float f6 = 0.5625F; + + if (i == 2) { + f5 -= f6; + } + + if (i == 1) { + f3 -= f6; + } + + if (i == 0) { + f5 += f6; + } + + if (i == 3) { + f3 += f6; + } + + if (i == 2) { + f3 -= this.g(this.d()); + } + + if (i == 1) { + f5 += this.g(this.d()); + } + + if (i == 0) { + f3 += this.g(this.d()); + } + + if (i == 3) { + f5 -= this.g(this.d()); + } + + f4 += this.g(this.g()); + this.setPosition((double) f3, (double) f4, (double) f5); + float f7 = -0.03125F; + + this.boundingBox.b((double) (f3 - f - f7), (double) (f4 - f1 - f7), (double) (f5 - f2 - f7), (double) (f3 + f + f7), (double) (f4 + f1 + f7), (double) (f5 + f2 + f7)); + } + + private float g(int i) { + return i == 32 ? 0.5F : (i == 64 ? 0.5F : 0.0F); + } + + public void j_() { + if (this.e++ == 100 && !this.world.isStatic) { + this.e = 0; + if (!this.dead && !this.survives()) { + // CraftBukkit start + if (this instanceof EntityPainting) { + Material material = this.world.getMaterial((int) this.locX, (int) this.locY, (int) this.locZ); + RemoveCause cause; + + if (material.equals(Material.WATER)) { + cause = RemoveCause.WATER; + } else if (!material.equals(Material.AIR)) { + // TODO: This feels insufficient to catch 100% of suffocation cases + cause = RemoveCause.OBSTRUCTION; + } else { + cause = RemoveCause.PHYSICS; + } + + PaintingBreakEvent event = new PaintingBreakEvent((Painting) this.getBukkitEntity(), cause); + this.world.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled() || dead) { + return; + } + } + // CraftBukkit end + + this.die(); + this.h(); + } + } + } + + public boolean survives() { + if (!this.world.getCubes(this, this.boundingBox).isEmpty()) { + return false; + } else { + int i = Math.max(1, this.d() / 16); + int j = Math.max(1, this.g() / 16); + int k = this.x; + int l = this.y; + int i1 = this.z; + + if (this.direction == 2) { + k = MathHelper.floor(this.locX - (double) ((float) this.d() / 32.0F)); + } + + if (this.direction == 1) { + i1 = MathHelper.floor(this.locZ - (double) ((float) this.d() / 32.0F)); + } + + if (this.direction == 0) { + k = MathHelper.floor(this.locX - (double) ((float) this.d() / 32.0F)); + } + + if (this.direction == 3) { + i1 = MathHelper.floor(this.locZ - (double) ((float) this.d() / 32.0F)); + } + + l = MathHelper.floor(this.locY - (double) ((float) this.g() / 32.0F)); + + for (int j1 = 0; j1 < i; ++j1) { + for (int k1 = 0; k1 < j; ++k1) { + Material material; + + if (this.direction != 2 && this.direction != 0) { + material = this.world.getMaterial(this.x, l + k1, i1 + j1); + } else { + material = this.world.getMaterial(k + j1, l + k1, this.z); + } + + if (!material.isBuildable()) { + return false; + } + } + } + + List list = this.world.getEntities(this, this.boundingBox); + Iterator iterator = list.iterator(); + + Entity entity; + + do { + if (!iterator.hasNext()) { + return true; + } + + entity = (Entity) iterator.next(); + } while (!(entity instanceof EntityHanging)); + + return false; + } + } + + public boolean L() { + return true; + } + + public boolean damageEntity(DamageSource damagesource, int i) { + if (!this.dead && !this.world.isStatic) { + // CraftBukkit start + if (this instanceof EntityPainting) { + PaintingBreakEvent event = null; + if (damagesource.getEntity() != null) { + event = new org.bukkit.event.painting.PaintingBreakByEntityEvent((Painting) this.getBukkitEntity(), damagesource.getEntity() == null ? null : damagesource.getEntity().getBukkitEntity()); + } else { + if (damagesource == DamageSource.FIRE) { + event = new PaintingBreakEvent((Painting) this.getBukkitEntity(), RemoveCause.FIRE); + } + // TODO: Could put other stuff here? + } + + if (event != null) { + this.world.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return true; + } + } + + if (this.dead) { + return true; + } + } + // CraftBukkit end + + this.die(); + this.K(); + EntityHuman entityhuman = null; + + if (damagesource.getEntity() instanceof EntityHuman) { + entityhuman = (EntityHuman) damagesource.getEntity(); + } + + if (entityhuman != null && entityhuman.abilities.canInstantlyBuild) { + return true; + } + + this.h(); + } + + return true; + } + + public void move(double d0, double d1, double d2) { + if (!this.world.isStatic && !this.dead && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { + if (dead) return; // CraftBukkit + + this.die(); + this.h(); + } + } + + public void g(double d0, double d1, double d2) { + if (false && !this.world.isStatic && !this.dead && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { // CraftBukkit - not needed + this.die(); + this.h(); + } + } + + public void b(NBTTagCompound nbttagcompound) { + nbttagcompound.setByte("Direction", (byte) this.direction); + nbttagcompound.setInt("TileX", this.x); + nbttagcompound.setInt("TileY", this.y); + nbttagcompound.setInt("TileZ", this.z); + switch (this.direction) { + case 0: + nbttagcompound.setByte("Dir", (byte) 2); + break; + + case 1: + nbttagcompound.setByte("Dir", (byte) 1); + break; + + case 2: + nbttagcompound.setByte("Dir", (byte) 0); + break; + + case 3: + nbttagcompound.setByte("Dir", (byte) 3); + } + } + + public void a(NBTTagCompound nbttagcompound) { + if (nbttagcompound.hasKey("Direction")) { + this.direction = nbttagcompound.getByte("Direction"); + } else { + switch (nbttagcompound.getByte("Dir")) { + case 0: + this.direction = 2; + break; + + case 1: + this.direction = 1; + break; + + case 2: + this.direction = 0; + break; + + case 3: + this.direction = 3; + } + } + + this.x = nbttagcompound.getInt("TileX"); + this.y = nbttagcompound.getInt("TileY"); + this.z = nbttagcompound.getInt("TileZ"); + this.setDirection(this.direction); + } + + public abstract int d(); + + public abstract int g(); + + public abstract void h(); +} |