From dca54ff187fa10f37523ff744b765b66d177967e Mon Sep 17 00:00:00 2001 From: Travis Watkins Date: Sat, 17 Nov 2012 10:03:16 -0600 Subject: [PATCH] Fire BlockSpreadEvent for vine growth. Fixes BUKKIT-1097 --- .../java/net/minecraft/server/BlockVine.java | 30 ++++++++++++++----- .../craftbukkit/event/CraftEventFactory.java | 13 ++++++++ 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/minecraft/server/BlockVine.java b/src/main/java/net/minecraft/server/BlockVine.java index 5fc654e2bb..7217e32f0d 100644 --- a/src/main/java/net/minecraft/server/BlockVine.java +++ b/src/main/java/net/minecraft/server/BlockVine.java @@ -2,6 +2,8 @@ package net.minecraft.server; import java.util.Random; +import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit + public class BlockVine extends Block { public BlockVine(int i) { @@ -201,7 +203,11 @@ public class BlockVine extends Block { } if (l1 > 0) { - world.setTypeIdAndData(i, j + 1, k, this.id, l1); + // CraftBukkit start - fire BlockSpreadEvent + org.bukkit.block.Block source = world.getWorld().getBlockAt(i, j, k); + org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j + 1, k); + CraftEventFactory.handleBlockSpreadEvent(block, source, this.id, i2); + // CraftBukkit end } } } else { @@ -220,24 +226,34 @@ public class BlockVine extends Block { } else { i2 = k1 + 1 & 3; j2 = k1 + 3 & 3; + // CraftBukkit start - fire BlockSpreadEvent + org.bukkit.block.Block source = world.getWorld().getBlockAt(i, j, k); + org.bukkit.block.Block block = world.getWorld().getBlockAt(i + Direction.a[k1], j, k + Direction.b[k1]); if ((i1 & 1 << i2) != 0 && this.e(world.getTypeId(i + Direction.a[k1] + Direction.a[i2], j, k + Direction.b[k1] + Direction.b[i2]))) { - world.setTypeIdAndData(i + Direction.a[k1], j, k + Direction.b[k1], this.id, 1 << i2); + CraftEventFactory.handleBlockSpreadEvent(block, source, this.id, 1 << i2); } else if ((i1 & 1 << j2) != 0 && this.e(world.getTypeId(i + Direction.a[k1] + Direction.a[j2], j, k + Direction.b[k1] + Direction.b[j2]))) { - world.setTypeIdAndData(i + Direction.a[k1], j, k + Direction.b[k1], this.id, 1 << j2); + CraftEventFactory.handleBlockSpreadEvent(block, source, this.id, 1 << j2); } else if ((i1 & 1 << i2) != 0 && world.isEmpty(i + Direction.a[k1] + Direction.a[i2], j, k + Direction.b[k1] + Direction.b[i2]) && this.e(world.getTypeId(i + Direction.a[i2], j, k + Direction.b[i2]))) { - world.setTypeIdAndData(i + Direction.a[k1] + Direction.a[i2], j, k + Direction.b[k1] + Direction.b[i2], this.id, 1 << (k1 + 2 & 3)); + block = world.getWorld().getBlockAt(i + Direction.a[k1] + Direction.a[i2], j, k + Direction.b[k1] + Direction.b[i2]); + CraftEventFactory.handleBlockSpreadEvent(block, source, this.id, 1 << (k1 + 2 & 3)); } else if ((i1 & 1 << j2) != 0 && world.isEmpty(i + Direction.a[k1] + Direction.a[j2], j, k + Direction.b[k1] + Direction.b[j2]) && this.e(world.getTypeId(i + Direction.a[j2], j, k + Direction.b[j2]))) { - world.setTypeIdAndData(i + Direction.a[k1] + Direction.a[j2], j, k + Direction.b[k1] + Direction.b[j2], this.id, 1 << (k1 + 2 & 3)); + block = world.getWorld().getBlockAt(i + Direction.a[k1] + Direction.a[j2], j, k + Direction.b[k1] + Direction.b[j2]); + CraftEventFactory.handleBlockSpreadEvent(block, source, this.id, 1 << (k1 + 2 & 3)); } else if (this.e(world.getTypeId(i + Direction.a[k1], j + 1, k + Direction.b[k1]))) { - world.setTypeIdAndData(i + Direction.a[k1], j, k + Direction.b[k1], this.id, 0); + CraftEventFactory.handleBlockSpreadEvent(block, source, this.id, 0); } + // CraftBukkit end } } else if (j > 1) { l1 = world.getTypeId(i, j - 1, k); if (l1 == 0) { i2 = world.random.nextInt(16) & i1; if (i2 > 0) { - world.setTypeIdAndData(i, j - 1, k, this.id, i2); + // CraftBukkit start - fire BlockSpreadEvent + org.bukkit.block.Block source = world.getWorld().getBlockAt(i, j, k); + org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j - 1, k); + CraftEventFactory.handleBlockSpreadEvent(block, source, this.id, i2); + // CraftBukkit end } } else if (l1 == this.id) { i2 = world.random.nextInt(16) & i1; diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index 370980ed42..73945848bc 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -288,6 +288,19 @@ public class CraftEventFactory { return event; } + public static void handleBlockSpreadEvent(Block block, Block source, int type, int data) { + BlockState state = block.getState(); + state.setTypeId(type); + state.setRawData((byte) data); + + BlockSpreadEvent event = new BlockSpreadEvent(block, source, state); + Bukkit.getPluginManager().callEvent(event); + + if (!event.isCancelled()) { + state.update(true); + } + } + public static EntityDeathEvent callEntityDeathEvent(EntityLiving victim) { return callEntityDeathEvent(victim, new ArrayList(0)); }