From 61a09c51023c53997c31ef24849a99262f7ddaf0 Mon Sep 17 00:00:00 2001 From: Jake Potrebic <15055071+Machine-Maker@users.noreply.github.com> Date: Tue, 24 Aug 2021 18:42:23 -0700 Subject: [PATCH] Add BlockBreakBlockEvent (#4989) --- .../api/0331-Add-BlockBreakBlockEvent.patch | 71 +++++++++++++++ .../0752-Add-BlockBreakBlockEvent.patch | 86 +++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 patches/api/0331-Add-BlockBreakBlockEvent.patch create mode 100644 patches/server/0752-Add-BlockBreakBlockEvent.patch diff --git a/patches/api/0331-Add-BlockBreakBlockEvent.patch b/patches/api/0331-Add-BlockBreakBlockEvent.patch new file mode 100644 index 000000000..dfd13b135 --- /dev/null +++ b/patches/api/0331-Add-BlockBreakBlockEvent.patch @@ -0,0 +1,71 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jake Potrebic +Date: Sun, 3 Jan 2021 17:58:25 -0800 +Subject: [PATCH] Add BlockBreakBlockEvent + + +diff --git a/src/main/java/io/papermc/paper/event/block/BlockBreakBlockEvent.java b/src/main/java/io/papermc/paper/event/block/BlockBreakBlockEvent.java +new file mode 100644 +index 0000000000000000000000000000000000000000..ac7a60403a9e51fc194f2cc92b0bd60d8879a661 +--- /dev/null ++++ b/src/main/java/io/papermc/paper/event/block/BlockBreakBlockEvent.java +@@ -0,0 +1,59 @@ ++package io.papermc.paper.event.block; ++ ++import org.bukkit.block.Block; ++import org.bukkit.event.HandlerList; ++import org.bukkit.event.block.BlockEvent; ++import org.bukkit.inventory.ItemStack; ++import org.jetbrains.annotations.NotNull; ++ ++import java.util.List; ++ ++/** ++ * Called when a block forces another block to break and drop items. ++ *

++ * Currently called for piston's and liquid flows. ++ */ ++public class BlockBreakBlockEvent extends BlockEvent { ++ ++ private static final HandlerList HANDLER_LIST = new HandlerList(); ++ ++ private final List drops; ++ private final Block source; ++ ++ public BlockBreakBlockEvent(@NotNull Block block, @NotNull Block source, @NotNull List drops) { ++ super(block); ++ this.source = source; ++ this.drops = drops; ++ } ++ ++ /** ++ * Get the drops of this event ++ * ++ * @return the drops ++ */ ++ @NotNull ++ public List getDrops() { ++ return drops; ++ } ++ ++ /** ++ * Gets the block that cause this (e.g. a piston, or adjacent liquid) ++ * ++ * @return the source ++ */ ++ @NotNull ++ public Block getSource() { ++ return source; ++ } ++ ++ @NotNull ++ @Override ++ public HandlerList getHandlers() { ++ return HANDLER_LIST; ++ } ++ ++ @NotNull ++ public static HandlerList getHandlerList() { ++ return HANDLER_LIST; ++ } ++} diff --git a/patches/server/0752-Add-BlockBreakBlockEvent.patch b/patches/server/0752-Add-BlockBreakBlockEvent.patch new file mode 100644 index 000000000..5360c8768 --- /dev/null +++ b/patches/server/0752-Add-BlockBreakBlockEvent.patch @@ -0,0 +1,86 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jake Potrebic +Date: Sun, 3 Jan 2021 17:58:11 -0800 +Subject: [PATCH] Add BlockBreakBlockEvent + + +diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java +index 1a5605b11170dfe1bd37165de886bad0f2e38ecd..8c30e28b97ac7e8b54322c903e0b75ee8135620b 100644 +--- a/src/main/java/net/minecraft/world/level/block/Block.java ++++ b/src/main/java/net/minecraft/world/level/block/Block.java +@@ -331,6 +331,23 @@ public class Block extends BlockBehaviour implements ItemLike { + } + + } ++ // Paper start ++ public static boolean dropResources(BlockState state, LevelAccessor world, BlockPos pos, @Nullable BlockEntity blockEntity, BlockPos source) { ++ if (world instanceof ServerLevel) { ++ List items = com.google.common.collect.Lists.newArrayList(); ++ for (net.minecraft.world.item.ItemStack drop : net.minecraft.world.level.block.Block.getDrops(state, world.getMinecraftWorld(), pos, blockEntity)) { ++ items.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(drop)); ++ } ++ io.papermc.paper.event.block.BlockBreakBlockEvent event = new io.papermc.paper.event.block.BlockBreakBlockEvent(org.bukkit.craftbukkit.block.CraftBlock.at(world, pos), org.bukkit.craftbukkit.block.CraftBlock.at(world, source), items); ++ event.callEvent(); ++ for (var drop : event.getDrops()) { ++ popResource(world.getMinecraftWorld(), pos, org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(drop)); ++ } ++ state.spawnAfterBreak(world.getMinecraftWorld(), pos, ItemStack.EMPTY); ++ } ++ return true; ++ } ++ // Paper end + + public static void dropResources(BlockState state, Level world, BlockPos pos, @Nullable BlockEntity blockEntity, Entity entity, ItemStack stack) { + if (world instanceof ServerLevel) { +diff --git a/src/main/java/net/minecraft/world/level/block/piston/PistonBaseBlock.java b/src/main/java/net/minecraft/world/level/block/piston/PistonBaseBlock.java +index 3678f75822b55c3c4c77565893269af4b7f9d8c9..d770649a9e9e9bb28b52d00cd082b87de5814593 100644 +--- a/src/main/java/net/minecraft/world/level/block/piston/PistonBaseBlock.java ++++ b/src/main/java/net/minecraft/world/level/block/piston/PistonBaseBlock.java +@@ -410,7 +410,7 @@ public class PistonBaseBlock extends DirectionalBlock { + iblockdata1 = world.getBlockState(blockposition3); + BlockEntity tileentity = iblockdata1.hasBlockEntity() ? world.getBlockEntity(blockposition3) : null; + +- dropResources(iblockdata1, (LevelAccessor) world, blockposition3, tileentity); ++ dropResources(iblockdata1, (LevelAccessor) world, blockposition3, tileentity, pos); // Paper + world.setBlock(blockposition3, Blocks.AIR.defaultBlockState(), 18); + if (!iblockdata1.is((Tag) BlockTags.FIRE)) { + world.addDestroyBlockEffect(blockposition3, iblockdata1); +diff --git a/src/main/java/net/minecraft/world/level/material/FlowingFluid.java b/src/main/java/net/minecraft/world/level/material/FlowingFluid.java +index 6e3e873efa1f50f53cb6503bde8a981f9cefd006..7fda7da544b2d0bbd3803d88ee34c92350a8b8ef 100644 +--- a/src/main/java/net/minecraft/world/level/material/FlowingFluid.java ++++ b/src/main/java/net/minecraft/world/level/material/FlowingFluid.java +@@ -295,7 +295,7 @@ public abstract class FlowingFluid extends Fluid { + ((LiquidBlockContainer) state.getBlock()).placeLiquid(world, pos, state, fluidState); + } else { + if (!state.isAir()) { +- this.beforeDestroyingBlock(world, pos, state); ++ this.beforeDestroyingBlock(world, pos, state, pos.relative(direction.getOpposite())); // Paper + } + + world.setBlock(pos, fluidState.createLegacyBlock(), 3); +@@ -303,6 +303,7 @@ public abstract class FlowingFluid extends Fluid { + + } + ++ protected void beforeDestroyingBlock(LevelAccessor world, BlockPos pos, BlockState state, BlockPos source) { beforeDestroyingBlock(world, pos, state); } // Paper - add source parameter + protected abstract void beforeDestroyingBlock(LevelAccessor world, BlockPos pos, BlockState state); + + private static short getCacheKey(BlockPos blockposition, BlockPos blockposition1) { +diff --git a/src/main/java/net/minecraft/world/level/material/WaterFluid.java b/src/main/java/net/minecraft/world/level/material/WaterFluid.java +index c2beaba9095c9163f25a46c8b2c423e820639cf6..56d50b9310d30e0f81f3d2549ff5c256eb07cc2a 100644 +--- a/src/main/java/net/minecraft/world/level/material/WaterFluid.java ++++ b/src/main/java/net/minecraft/world/level/material/WaterFluid.java +@@ -63,6 +63,13 @@ public abstract class WaterFluid extends FlowingFluid { + return true; + } + ++ // Paper start ++ @Override ++ protected void beforeDestroyingBlock(LevelAccessor world, BlockPos pos, BlockState state, BlockPos source) { ++ BlockEntity tileentity = state.hasBlockEntity() ? world.getBlockEntity(pos) : null; ++ Block.dropResources(state, world, pos, tileentity, source); ++ } ++ // Paper end + @Override + protected void beforeDestroyingBlock(LevelAccessor world, BlockPos pos, BlockState state) { + BlockEntity blockEntity = state.hasBlockEntity() ? world.getBlockEntity(pos) : null;