diff --git a/src/main/java/net/minecraft/server/EntityFallingBlock.java b/src/main/java/net/minecraft/server/EntityFallingBlock.java new file mode 100644 index 0000000000..7fe8ab57d2 --- /dev/null +++ b/src/main/java/net/minecraft/server/EntityFallingBlock.java @@ -0,0 +1,178 @@ +package net.minecraft.server; + +import java.util.ArrayList; +import java.util.Iterator; + +public class EntityFallingBlock extends Entity { + + public int id; + public int data; + public int c; + public boolean dropItem; + private boolean e; + private boolean hurtEntities; + private int fallHurtMax; + private float fallHurtAmount; + + public EntityFallingBlock(World world) { + super(world); + this.c = 0; + this.dropItem = true; + this.e = false; + this.hurtEntities = false; + this.fallHurtMax = 20; + this.fallHurtAmount = 2.0F; + } + + public EntityFallingBlock(World world, double d0, double d1, double d2, int i) { + this(world, d0, d1, d2, i, 0); + } + + public EntityFallingBlock(World world, double d0, double d1, double d2, int i, int j) { + super(world); + this.c = 0; + this.dropItem = true; + this.e = false; + this.hurtEntities = false; + this.fallHurtMax = 20; + this.fallHurtAmount = 2.0F; + this.id = i; + this.data = j; + this.m = true; + this.a(0.98F, 0.98F); + this.height = this.length / 2.0F; + this.setPosition(d0, d1, d2); + this.motX = 0.0D; + this.motY = 0.0D; + this.motZ = 0.0D; + this.lastX = d0; + this.lastY = d1; + this.lastZ = d2; + } + + protected boolean f_() { + return false; + } + + protected void a() {} + + public boolean L() { + return !this.dead; + } + + public void j_() { + if (this.id == 0) { + this.die(); + } else { + this.lastX = this.locX; + this.lastY = this.locY; + this.lastZ = this.locZ; + ++this.c; + this.motY -= 0.03999999910593033D; + this.move(this.motX, this.motY, this.motZ); + this.motX *= 0.9800000190734863D; + this.motY *= 0.9800000190734863D; + this.motZ *= 0.9800000190734863D; + if (!this.world.isStatic) { + int i = MathHelper.floor(this.locX); + int j = MathHelper.floor(this.locY); + int k = MathHelper.floor(this.locZ); + + if (this.c == 1) { + if (this.c == 1 && this.world.getTypeId(i, j, k) == this.id) { + this.world.setTypeId(i, j, k, 0); + } else { + this.die(); + } + } + + if (this.onGround) { + this.motX *= 0.699999988079071D; + this.motZ *= 0.699999988079071D; + this.motY *= -0.5D; + if (this.world.getTypeId(i, j, k) != Block.PISTON_MOVING.id) { + this.die(); + if (!this.e && this.world.mayPlace(this.id, i, j, k, true, 1, (Entity) null) && !BlockSand.canFall(this.world, i, j - 1, k) && this.world.setTypeIdAndData(i, j, k, this.id, this.data)) { + if (Block.byId[this.id] instanceof BlockSand) { + ((BlockSand) Block.byId[this.id]).a_(this.world, i, j, k, this.data); + } + } else if (this.dropItem && !this.e) { + this.a(new ItemStack(this.id, 1, Block.byId[this.id].getDropData(this.data)), 0.0F); + } + } + } else if (this.c > 100 && !this.world.isStatic && (j < 1 || j > 256) || this.c > 600) { + if (this.dropItem) { + this.a(new ItemStack(this.id, 1, Block.byId[this.id].getDropData(this.data)), 0.0F); + } + + this.die(); + } + } + } + } + + protected void a(float f) { + if (this.hurtEntities) { + int i = MathHelper.f(f - 1.0F); + + if (i > 0) { + ArrayList arraylist = new ArrayList(this.world.getEntities(this, this.boundingBox)); + DamageSource damagesource = this.id == Block.ANVIL.id ? DamageSource.ANVIL : DamageSource.FALLING_BLOCK; + Iterator iterator = arraylist.iterator(); + + while (iterator.hasNext()) { + Entity entity = (Entity) iterator.next(); + + entity.damageEntity(damagesource, Math.min(MathHelper.d((float) i * this.fallHurtAmount), this.fallHurtMax)); + } + + if (this.id == Block.ANVIL.id && (double) this.random.nextFloat() < 0.05000000074505806D + (double) i * 0.05D) { + int j = this.data >> 2; + int k = this.data & 3; + + ++j; + if (j > 2) { + this.e = true; + } else { + this.data = k | j << 2; + } + } + } + } + } + + protected void b(NBTTagCompound nbttagcompound) { + nbttagcompound.setByte("Tile", (byte) this.id); + nbttagcompound.setByte("Data", (byte) this.data); + nbttagcompound.setByte("Time", (byte) this.c); + nbttagcompound.setBoolean("DropItem", this.dropItem); + nbttagcompound.setBoolean("HurtEntities", this.hurtEntities); + nbttagcompound.setFloat("FallHurtAmount", this.fallHurtAmount); + nbttagcompound.setInt("FallHurtMax", this.fallHurtMax); + } + + protected void a(NBTTagCompound nbttagcompound) { + this.id = nbttagcompound.getByte("Tile") & 255; + this.data = nbttagcompound.getByte("Data") & 255; + this.c = nbttagcompound.getByte("Time") & 255; + if (nbttagcompound.hasKey("HurtEntities")) { + this.hurtEntities = nbttagcompound.getBoolean("HurtEntities"); + this.fallHurtAmount = nbttagcompound.getFloat("FallHurtAmount"); + this.fallHurtMax = nbttagcompound.getInt("FallHurtMax"); + } else if (this.id == Block.ANVIL.id) { + this.hurtEntities = true; + } + + if (nbttagcompound.hasKey("DropItem")) { + this.dropItem = nbttagcompound.getBoolean("DropItem"); + } + + if (this.id == 0) { + this.id = Block.SAND.id; + } + } + + public void e(boolean flag) { + this.hurtEntities = flag; + } +}