diff --git a/nms-patches/net/minecraft/world/level/block/entity/BrushableBlockEntity.patch b/nms-patches/net/minecraft/world/level/block/entity/BrushableBlockEntity.patch index 3b5b8926a..e023ec99f 100644 --- a/nms-patches/net/minecraft/world/level/block/entity/BrushableBlockEntity.patch +++ b/nms-patches/net/minecraft/world/level/block/entity/BrushableBlockEntity.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/entity/BrushableBlockEntity.java +++ b/net/minecraft/world/level/block/entity/BrushableBlockEntity.java -@@ -31,6 +31,12 @@ +@@ -31,6 +31,13 @@ import net.minecraft.world.phys.Vec3D; import org.slf4j.Logger; @@ -8,12 +8,57 @@ +import java.util.Arrays; +import org.bukkit.craftbukkit.block.CraftBlock; +import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.block.BlockBrushEvent; +// CraftBukkit end + public class BrushableBlockEntity extends TileEntity { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -151,7 +157,10 @@ +@@ -80,7 +87,12 @@ + IBlockData iblockdata = this.getBlockState(); + IBlockData iblockdata1 = (IBlockData) iblockdata.setValue(BlockProperties.DUSTED, k); + +- worldserver.setBlock(this.getBlockPos(), iblockdata1, 3); ++ // CraftBukkit start ++ BlockBrushEvent event = CraftEventFactory.callBlockBrushEvent(worldserver, this.getBlockPos(), iblockdata1, 3, entityhuman); ++ if (!event.isCancelled()) { ++ event.getNewState().update(true); ++ } ++ // CraftBukkit end + } + + return false; +@@ -121,10 +133,10 @@ + } + + private void brushingCompleted(WorldServer worldserver, EntityHuman entityhuman, ItemStack itemstack) { +- this.dropContent(worldserver, entityhuman, itemstack); ++ // this.dropContent(worldserver, entityhuman, itemstack); // CraftBukkit - moved down + IBlockData iblockdata = this.getBlockState(); + +- worldserver.levelEvent(3008, this.getBlockPos(), Block.getId(iblockdata)); ++ // worldserver.levelEvent(3008, this.getBlockPos(), Block.getId(iblockdata)); // CraftBukkit - moved down + Block block = this.getBlockState().getBlock(); + Block block1; + +@@ -134,7 +146,15 @@ + block1 = Blocks.AIR; + } + +- worldserver.setBlock(this.worldPosition, block1.defaultBlockState(), 3); ++ // CraftBukkit start ++ BlockBrushEvent event = CraftEventFactory.callBlockBrushEvent(worldserver, this.worldPosition, block1.defaultBlockState(), 3, entityhuman); ++ if (!event.isCancelled()) { ++ this.dropContent(worldserver, entityhuman, itemstack); // CraftBukkit - from above ++ worldserver.levelEvent(3008, this.getBlockPos(), Block.getId(iblockdata)); // CraftBukkit - from above ++ ++ event.getNewState().update(true); ++ } ++ // CraftBukkit end + } + + private void dropContent(WorldServer worldserver, EntityHuman entityhuman, ItemStack itemstack) { +@@ -151,7 +171,10 @@ EntityItem entityitem = new EntityItem(worldserver, d3, d4, d5, this.item.split(worldserver.random.nextInt(21) + 10)); entityitem.setDeltaMovement(Vec3D.ZERO); diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index ddbdaa33d..dfcc86531 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -149,6 +149,7 @@ import org.bukkit.event.Event.Result; import org.bukkit.event.block.Action; import org.bukkit.event.block.BellResonateEvent; import org.bukkit.event.block.BellRingEvent; +import org.bukkit.event.block.BlockBrushEvent; import org.bukkit.event.block.BlockDamageAbortEvent; import org.bukkit.event.block.BlockDamageEvent; import org.bukkit.event.block.BlockDispenseLootEvent; @@ -1194,6 +1195,19 @@ public class CraftEventFactory { return !event.isCancelled(); } + public static BlockBrushEvent callBlockBrushEvent(World world, BlockPosition pos, IBlockData newData, int flag, EntityHuman entity) { + Player player = (Player) entity.getBukkitEntity(); + + Block block = CraftBlock.at(world, pos); + CraftBlockState state = (CraftBlockState) block.getState(); + state.setData(newData); + + BlockBrushEvent event = new BlockBrushEvent(block, state, player); + Bukkit.getPluginManager().callEvent(event); + + return event; + } + public static FluidLevelChangeEvent callFluidLevelChangeEvent(World world, BlockPosition block, IBlockData newData) { FluidLevelChangeEvent event = new FluidLevelChangeEvent(CraftBlock.at(world, block), CraftBlockData.fromData(newData)); world.getCraftServer().getPluginManager().callEvent(event);