diff options
author | Travis Watkins <amaranth@ubuntu.com> | 2013-12-17 17:26:02 -0600 |
---|---|---|
committer | Travis Watkins <amaranth@ubuntu.com> | 2013-12-17 17:36:49 -0600 |
commit | 0f48e9b06d0ad7f588a819aafa1465e54c95f28e (patch) | |
tree | 5400ee785b43578ee29cc674cffbc87ae1a8beb7 | |
parent | 4f63a5f255ebb23cba967772bb48e51bbc68dc59 (diff) | |
download | craftbukkit-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.java | 14 |
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(); } } |