Paper/patches/server/0574-Add-BlockBreakBlockEvent.patch

88 lines
5.8 KiB
Diff
Raw Normal View History

2021-08-25 03:42:23 +02:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
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
2024-10-23 21:43:06 +02:00
index 43c2b411115d3a8a0e47d3e2277789b2667897af..4d140bd83ca0e1554afad80ec4fc6186188a79d8 100644
2021-08-25 03:42:23 +02:00
--- a/src/main/java/net/minecraft/world/level/block/Block.java
+++ b/src/main/java/net/minecraft/world/level/block/Block.java
2024-10-23 21:43:06 +02:00
@@ -304,6 +304,24 @@ public class Block extends BlockBehaviour implements ItemLike {
2021-08-25 03:42:23 +02:00
}
2024-02-01 10:15:57 +01:00
+ // Paper start - Add BlockBreakBlockEvent
2024-02-01 10:15:57 +01:00
+ public static boolean dropResources(BlockState state, LevelAccessor levelAccessor, BlockPos pos, @Nullable BlockEntity blockEntity, BlockPos source) {
+ if (levelAccessor instanceof ServerLevel serverLevel) {
+ List<org.bukkit.inventory.ItemStack> items = new java.util.ArrayList<>();
+ for (ItemStack drop : Block.getDrops(state, serverLevel, pos, blockEntity)) {
2021-08-25 03:42:23 +02:00
+ items.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(drop));
+ }
2024-02-01 10:15:57 +01:00
+ io.papermc.paper.event.block.BlockBreakBlockEvent event = new io.papermc.paper.event.block.BlockBreakBlockEvent(org.bukkit.craftbukkit.block.CraftBlock.at(levelAccessor, pos), org.bukkit.craftbukkit.block.CraftBlock.at(levelAccessor, source), items);
2021-08-25 03:42:23 +02:00
+ event.callEvent();
2024-02-01 10:15:57 +01:00
+ for (org.bukkit.inventory.ItemStack drop : event.getDrops()) {
+ popResource(serverLevel, pos, org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(drop));
2021-08-25 03:42:23 +02:00
+ }
2024-02-01 10:15:57 +01:00
+ state.spawnAfterBreak(serverLevel, pos, ItemStack.EMPTY, true);
2021-08-25 03:42:23 +02:00
+ }
+ return true;
+ }
+ // Paper end - Add BlockBreakBlockEvent
2024-02-01 10:15:57 +01:00
+
2023-06-08 04:04:01 +02:00
public static void dropResources(BlockState state, Level world, BlockPos pos, @Nullable BlockEntity blockEntity, @Nullable Entity entity, ItemStack tool) {
2021-08-25 03:42:23 +02:00
if (world instanceof ServerLevel) {
2024-02-01 10:15:57 +01:00
Block.getDrops(state, (ServerLevel) world, pos, blockEntity, entity, tool).forEach((itemstack1) -> {
2021-08-25 03:42:23 +02:00
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
2024-10-23 21:43:06 +02:00
index e84501fdce7b94300b1f5d6d20e2db90b175454d..560797552799f7874133fd4aaf6e421609a54dbf 100644
2021-08-25 03:42:23 +02:00
--- a/src/main/java/net/minecraft/world/level/block/piston/PistonBaseBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/piston/PistonBaseBlock.java
2024-10-23 21:43:06 +02:00
@@ -406,7 +406,7 @@ public class PistonBaseBlock extends DirectionalBlock {
2021-08-25 03:42:23 +02:00
iblockdata1 = world.getBlockState(blockposition3);
BlockEntity tileentity = iblockdata1.hasBlockEntity() ? world.getBlockEntity(blockposition3) : null;
- dropResources(iblockdata1, world, blockposition3, tileentity);
+ dropResources(iblockdata1, world, blockposition3, tileentity, pos); // Paper - Add BlockBreakBlockEvent
2021-08-25 03:42:23 +02:00
world.setBlock(blockposition3, Blocks.AIR.defaultBlockState(), 18);
2024-04-24 17:27:28 +02:00
world.gameEvent((Holder) GameEvent.BLOCK_DESTROY, blockposition3, GameEvent.Context.of(iblockdata1));
2022-03-01 06:43:03 +01:00
if (!iblockdata1.is(BlockTags.FIRE)) {
2021-08-25 03:42:23 +02:00
diff --git a/src/main/java/net/minecraft/world/level/material/FlowingFluid.java b/src/main/java/net/minecraft/world/level/material/FlowingFluid.java
2024-10-23 21:43:06 +02:00
index 83dc8bcd9e2b8ecbd32225e4e10aec392ef28325..261e5994d13f8bc30490b86691c80c0a21e7640a 100644
2021-08-25 03:42:23 +02:00
--- a/src/main/java/net/minecraft/world/level/material/FlowingFluid.java
+++ b/src/main/java/net/minecraft/world/level/material/FlowingFluid.java
2024-10-23 21:43:06 +02:00
@@ -316,7 +316,7 @@ public abstract class FlowingFluid extends Fluid {
ifluidcontainer.placeLiquid(world, pos, state, fluidState);
2021-08-25 03:42:23 +02:00
} else {
if (!state.isAir()) {
- this.beforeDestroyingBlock(world, pos, state);
+ this.beforeDestroyingBlock(world, pos, state, pos.relative(direction.getOpposite())); // Paper - Add BlockBreakBlockEvent
2021-08-25 03:42:23 +02:00
}
world.setBlock(pos, fluidState.createLegacyBlock(), 3);
2024-10-23 21:43:06 +02:00
@@ -324,6 +324,7 @@ public abstract class FlowingFluid extends Fluid {
2021-08-25 03:42:23 +02:00
}
+ protected void beforeDestroyingBlock(LevelAccessor world, BlockPos pos, BlockState state, BlockPos source) { beforeDestroyingBlock(world, pos, state); } // Paper - Add BlockBreakBlockEvent
2021-08-25 03:42:23 +02:00
protected abstract void beforeDestroyingBlock(LevelAccessor world, BlockPos pos, BlockState state);
2024-10-23 21:43:06 +02:00
protected int getSlopeDistance(LevelReader world, BlockPos pos, int i, Direction direction, BlockState state, FlowingFluid.SpreadContext spreadCache) {
2021-08-25 03:42:23 +02:00
diff --git a/src/main/java/net/minecraft/world/level/material/WaterFluid.java b/src/main/java/net/minecraft/world/level/material/WaterFluid.java
2024-10-23 21:43:06 +02:00
index 421f5d9a57d87a87a801213d562ad5fe244e7b65..0a7c05c08bf8c6c331b91e399dc4103a91dc20fe 100644
2021-08-25 03:42:23 +02:00
--- a/src/main/java/net/minecraft/world/level/material/WaterFluid.java
+++ b/src/main/java/net/minecraft/world/level/material/WaterFluid.java
2024-10-23 21:43:06 +02:00
@@ -81,6 +81,13 @@ public abstract class WaterFluid extends FlowingFluid {
2022-12-07 21:16:54 +01:00
return world.getGameRules().getBoolean(GameRules.RULE_WATER_SOURCE_CONVERSION);
2021-08-25 03:42:23 +02:00
}
+ // Paper start - Add BlockBreakBlockEvent
2021-08-25 03:42:23 +02:00
+ @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 - Add BlockBreakBlockEvent
2021-08-25 03:42:23 +02:00
@Override
protected void beforeDestroyingBlock(LevelAccessor world, BlockPos pos, BlockState state) {
BlockEntity blockEntity = state.hasBlockEntity() ? world.getBlockEntity(pos) : null;