From e798133865d1748942c87c62b7025570ddde9f1f Mon Sep 17 00:00:00 2001
From: Byteflux <byte@byteflux.net>
Date: Fri, 17 Apr 2015 02:26:14 -0700
Subject: [PATCH] Add FallingBlock source location API


diff --git a/src/main/java/net/minecraft/server/BlockDragonEgg.java b/src/main/java/net/minecraft/server/BlockDragonEgg.java
index de7ac6f..76a6272 100644
--- a/src/main/java/net/minecraft/server/BlockDragonEgg.java
+++ b/src/main/java/net/minecraft/server/BlockDragonEgg.java
@@ -28,7 +28,10 @@ public class BlockDragonEgg extends Block {
             byte b0 = 32;
 
             if (!BlockFalling.instaFall && world.areChunksLoadedBetween(blockposition.a(-b0, -b0, -b0), blockposition.a(b0, b0, b0))) {
-                world.addEntity(new EntityFallingBlock(world, (double) ((float) blockposition.getX() + 0.5F), (double) blockposition.getY(), (double) ((float) blockposition.getZ() + 0.5F), this.getBlockData()));
+                // PaperSpigot start - Add FallingBlock source location API
+                org.bukkit.Location loc = new org.bukkit.Location(world.getWorld(), (double) ((float) blockposition.getX() + 0.5F), (double) blockposition.getY(), (double) ((float) blockposition.getZ() + 0.5F));
+                world.addEntity(new EntityFallingBlock(loc, world, (double) ((float) blockposition.getX() + 0.5F), (double) blockposition.getY(), (double) ((float) blockposition.getZ() + 0.5F), this.getBlockData()));
+                // PaperSpigot end
             } else {
                 world.setAir(blockposition);
 
diff --git a/src/main/java/net/minecraft/server/BlockFalling.java b/src/main/java/net/minecraft/server/BlockFalling.java
index 29f8554..1d952b8 100644
--- a/src/main/java/net/minecraft/server/BlockFalling.java
+++ b/src/main/java/net/minecraft/server/BlockFalling.java
@@ -36,7 +36,10 @@ public class BlockFalling extends Block {
 
             if (!BlockFalling.instaFall && world.areChunksLoadedBetween(blockposition.a(-b0, -b0, -b0), blockposition.a(b0, b0, b0))) {
                 if (!world.isClientSide) {
-                    EntityFallingBlock entityfallingblock = new EntityFallingBlock(world, (double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, world.getType(blockposition));
+                    // PaperSpigot start - Add FallingBlock source location API
+                    org.bukkit.Location loc = new org.bukkit.Location(world.getWorld(), (double) ((float) blockposition.getX() + 0.5F), (double) blockposition.getY(), (double) ((float) blockposition.getZ() + 0.5F));
+                    EntityFallingBlock entityfallingblock = new EntityFallingBlock(loc, world, (double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, world.getType(blockposition));
+                    // PaperSpigot end
 
                     this.a(entityfallingblock);
                     world.addEntity(entityfallingblock);
diff --git a/src/main/java/net/minecraft/server/EntityFallingBlock.java b/src/main/java/net/minecraft/server/EntityFallingBlock.java
index 5931e1d..44219cd 100644
--- a/src/main/java/net/minecraft/server/EntityFallingBlock.java
+++ b/src/main/java/net/minecraft/server/EntityFallingBlock.java
@@ -16,13 +16,22 @@ public class EntityFallingBlock extends Entity {
     private int fallHurtMax = 40;
     private float fallHurtAmount = 2.0F;
     public NBTTagCompound tileEntityData;
+    public org.bukkit.Location sourceLoc; // PaperSpigot
 
+    // PaperSpigot start - Add FallingBlock source location API
     public EntityFallingBlock(World world) {
+        this(null, world);
+    }
+
+    public EntityFallingBlock(org.bukkit.Location loc, World world) {
         super(world);
+        sourceLoc = loc;
     }
 
-    public EntityFallingBlock(World world, double d0, double d1, double d2, IBlockData iblockdata) {
+    public EntityFallingBlock(org.bukkit.Location loc, World world, double d0, double d1, double d2, IBlockData iblockdata) {
         super(world);
+        sourceLoc = loc;
+    // PaperSpigot end
         this.block = iblockdata;
         this.k = true;
         this.setSize(0.98F, 0.98F);
@@ -197,7 +206,13 @@ public class EntityFallingBlock extends Entity {
         if (this.tileEntityData != null) {
             nbttagcompound.set("TileEntityData", this.tileEntityData);
         }
-
+        // PaperSpigot start - Add FallingBlock source location API
+        if (sourceLoc != null) {
+            nbttagcompound.setInt("SourceLoc_x", sourceLoc.getBlockX());
+            nbttagcompound.setInt("SourceLoc_y", sourceLoc.getBlockY());
+            nbttagcompound.setInt("SourceLoc_z", sourceLoc.getBlockZ());
+        }
+        // PaperSpigot end
     }
 
     protected void a(NBTTagCompound nbttagcompound) {
@@ -233,7 +248,14 @@ public class EntityFallingBlock extends Entity {
         if (block == null || block.getMaterial() == Material.AIR) {
             this.block = Blocks.SAND.getBlockData();
         }
-
+        // PaperSpigot start - Add FallingBlock source location API
+        if (nbttagcompound.hasKey("SourceLoc_x")) {
+            int srcX = nbttagcompound.getInt("SourceLoc_x");
+            int srcY = nbttagcompound.getInt("SourceLoc_y");
+            int srcZ = nbttagcompound.getInt("SourceLoc_z");
+            sourceLoc = new org.bukkit.Location(world.getWorld(), srcX, srcY, srcZ);
+        }
+        // PaperSpigot end
     }
 
     public void a(boolean flag) {
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
index 6b5800e..f479b50 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -888,7 +888,10 @@ public class CraftWorld implements World {
         double y = location.getBlockY() + 0.5;
         double z = location.getBlockZ() + 0.5;
 
-        EntityFallingBlock entity = new EntityFallingBlock(world, x, y, z, net.minecraft.server.Block.getById(material.getId()).fromLegacyData(data));
+        // PaperSpigot start - Add FallingBlock source location API
+        location = location.clone();
+        EntityFallingBlock entity = new EntityFallingBlock(location, world, x, y, z, net.minecraft.server.Block.getById(material.getId()).fromLegacyData(data));
+        // PaperSpigot end
         entity.ticksLived = 1;
 
         world.addEntity(entity, SpawnReason.CUSTOM);
@@ -923,8 +926,10 @@ public class CraftWorld implements World {
             IBlockData blockData = world.getType(new BlockPosition(x, y, z));
             int type = CraftMagicNumbers.getId(blockData.getBlock());
             int data = blockData.getBlock().toLegacyData(blockData);
-
-            entity = new EntityFallingBlock(world, x + 0.5, y + 0.5, z + 0.5, net.minecraft.server.Block.getById(type).fromLegacyData(data));
+            // PaperSpigot start - Add FallingBlock source location API
+            location = location.clone();
+            entity = new EntityFallingBlock(location, world, x + 0.5, y + 0.5, z + 0.5, net.minecraft.server.Block.getById(type).fromLegacyData(data));
+            // PaperSpigot end
         } else if (Projectile.class.isAssignableFrom(clazz)) {
             if (Snowball.class.isAssignableFrom(clazz)) {
                 entity = new EntitySnowball(world, x, y, z);
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingSand.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingSand.java
index 788f26b..f2dfedd 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingSand.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingSand.java
@@ -47,4 +47,11 @@ public class CraftFallingSand extends CraftEntity implements FallingSand {
     public void setDropItem(boolean drop) {
         getHandle().dropItem = drop;
     }
+
+    // PaperSpigot start - Add FallingBlock source location API
+    @Override
+    public org.bukkit.Location getSourceLoc() {
+        return getHandle().sourceLoc;
+    }
+    // PaperSpigot end
 }
-- 
2.3.5