summaryrefslogtreecommitdiffstats
path: root/src
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 /src
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.
Diffstat (limited to 'src')
-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();
}
}