summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTravis Watkins <amaranth@ubuntu.com>2013-12-17 17:26:02 -0600
committerTravis Watkins <amaranth@ubuntu.com>2013-12-17 17:36:49 -0600
commit0f48e9b06d0ad7f588a819aafa1465e54c95f28e (patch)
tree5400ee785b43578ee29cc674cffbc87ae1a8beb7
parent4f63a5f255ebb23cba967772bb48e51bbc68dc59 (diff)
downloadcraftbukkit-0f48e9b06d0ad7f588a819aafa1465e54c95f28e.tar
craftbukkit-0f48e9b06d0ad7f588a819aafa1465e54c95f28e.tar.gz
craftbukkit-0f48e9b06d0ad7f588a819aafa1465e54c95f28e.tar.lz
craftbukkit-0f48e9b06d0ad7f588a819aafa1465e54c95f28e.tar.xz
craftbukkit-0f48e9b06d0ad7f588a819aafa1465e54c95f28e.zip
Check pending blocks before falling back to world. Fixes BUKKIT-5122
When growing trees we use a BlockChangeDelegate which queues up the block changes so plugins can modify/block/log tree growing. However, we always check the actual world when checking for existing blocks. This means when the tree growing code checks to see if putting a leaf in a block is valid it may incorrectly overwrite a log block that should exist in that location. To ensure trees grow correctly we now check the delegate itself for blocks that match the queried location before checking the world.
-rw-r--r--src/main/java/org/bukkit/craftbukkit/util/StructureGrowDelegate.java14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/main/java/org/bukkit/craftbukkit/util/StructureGrowDelegate.java b/src/main/java/org/bukkit/craftbukkit/util/StructureGrowDelegate.java
index 6566b9e0..bb6a5796 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/StructureGrowDelegate.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/StructureGrowDelegate.java
@@ -3,6 +3,8 @@ package org.bukkit.craftbukkit.util;
import java.util.ArrayList;
import java.util.List;
+import net.minecraft.server.Block;
+import net.minecraft.server.Blocks;
import net.minecraft.server.World;
import org.bukkit.BlockChangeDelegate;
@@ -39,6 +41,12 @@ public class StructureGrowDelegate implements BlockChangeDelegate {
}
public int getTypeId(int x, int y, int z) {
+ for (BlockState state : blocks) {
+ if (state.getX() == x && state.getY() == y && state.getZ() == z) {
+ return state.getTypeId();
+ }
+ }
+
return world.getBlockTypeIdAt(x, y, z);
}
@@ -51,6 +59,12 @@ public class StructureGrowDelegate implements BlockChangeDelegate {
}
public boolean isEmpty(int x, int y, int z) {
+ for (BlockState state : blocks) {
+ if (state.getX() == x && state.getY() == y && state.getZ() == z) {
+ return Block.e(state.getTypeId()) == Blocks.AIR;
+ }
+ }
+
return world.getBlockAt(x, y, z).isEmpty();
}
}