aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJake Potrebic <[email protected]>2022-09-17 20:03:54 -0700
committerGitHub <[email protected]>2022-09-18 04:03:54 +0100
commitb826065a4b16107d376ef15bb2835c5a781a2fde (patch)
treeee30a12d3cd914b9db61274cc65ac88f37873eed
parentef670ebafb2a9cbb7089b031faf63510cbfcb55b (diff)
downloadPaper-b826065a4b16107d376ef15bb2835c5a781a2fde.tar.gz
Paper-b826065a4b16107d376ef15bb2835c5a781a2fde.zip
fire EntityChangeBlockEvent in more places (#6371)
* fire EntityChangeBlockEvent in more places * Rebuild patches Co-authored-by: Shane Freeder <[email protected]>
-rw-r--r--patches/server/0939-Fire-EntityChangeBlockEvent-in-more-places.patch93
1 files changed, 93 insertions, 0 deletions
diff --git a/patches/server/0939-Fire-EntityChangeBlockEvent-in-more-places.patch b/patches/server/0939-Fire-EntityChangeBlockEvent-in-more-places.patch
new file mode 100644
index 0000000000..b63f507fd2
--- /dev/null
+++ b/patches/server/0939-Fire-EntityChangeBlockEvent-in-more-places.patch
@@ -0,0 +1,93 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jake Potrebic <[email protected]>
+Date: Mon, 9 Aug 2021 20:45:46 -0700
+Subject: [PATCH] Fire EntityChangeBlockEvent in more places
+
+
+diff --git a/src/main/java/net/minecraft/world/item/AxeItem.java b/src/main/java/net/minecraft/world/item/AxeItem.java
+index 03a6a99dcc0c8fcc32776dd49cf6092b899bf6ed..9c49d8f696864d2aad23208422c4ab5b598a0cd9 100644
+--- a/src/main/java/net/minecraft/world/item/AxeItem.java
++++ b/src/main/java/net/minecraft/world/item/AxeItem.java
+@@ -54,6 +54,11 @@ public class AxeItem extends DiggerItem {
+ }
+
+ if (optional4.isPresent()) {
++ // Paper start - EntityChangeBlockEvent
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(player, blockPos, optional4.get()).isCancelled()) {
++ return InteractionResult.PASS;
++ }
++ // Paper end
+ if (player instanceof ServerPlayer) {
+ CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger((ServerPlayer)player, blockPos, itemStack);
+ }
+diff --git a/src/main/java/net/minecraft/world/item/HoneycombItem.java b/src/main/java/net/minecraft/world/item/HoneycombItem.java
+index 68a8d3b16d49c10fc9834f32009095d35c9c55a8..1f8b7b50c6aa24778d87821ae2ff4d019d176082 100644
+--- a/src/main/java/net/minecraft/world/item/HoneycombItem.java
++++ b/src/main/java/net/minecraft/world/item/HoneycombItem.java
+@@ -37,6 +37,11 @@ public class HoneycombItem extends Item {
+ return getWaxed(blockState).map((state) -> {
+ Player player = context.getPlayer();
+ ItemStack itemStack = context.getItemInHand();
++ // Paper start - EntityChangeBlockEvent
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(player, blockPos, state).isCancelled()) {
++ return InteractionResult.PASS;
++ }
++ // Paper end
+ if (player instanceof ServerPlayer) {
+ CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger((ServerPlayer)player, blockPos, itemStack);
+ }
+diff --git a/src/main/java/net/minecraft/world/item/ShovelItem.java b/src/main/java/net/minecraft/world/item/ShovelItem.java
+index 32995cb5efdad0bc34ecacacb78cccd21220ba8d..c7195f2e12bbd6545f7bffcc2b4ba5cc3d48df20 100644
+--- a/src/main/java/net/minecraft/world/item/ShovelItem.java
++++ b/src/main/java/net/minecraft/world/item/ShovelItem.java
+@@ -36,20 +36,29 @@ public class ShovelItem extends DiggerItem {
+ Player player = context.getPlayer();
+ BlockState blockState2 = FLATTENABLES.get(blockState.getBlock());
+ BlockState blockState3 = null;
++ Runnable afterAction = null; // Paper
+ if (blockState2 != null && level.getBlockState(blockPos.above()).isAir()) {
+- level.playSound(player, blockPos, SoundEvents.SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F);
++ afterAction = () -> level.playSound(player, blockPos, SoundEvents.SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F); // Paper
+ blockState3 = blockState2;
+ } else if (blockState.getBlock() instanceof CampfireBlock && blockState.getValue(CampfireBlock.LIT)) {
++ afterAction = () -> { // Paper
+ if (!level.isClientSide()) {
+ level.levelEvent((Player)null, 1009, blockPos, 0);
+ }
+
+ CampfireBlock.dowse(context.getPlayer(), level, blockPos, blockState);
++ }; // Paper
+ blockState3 = blockState.setValue(CampfireBlock.LIT, Boolean.valueOf(false));
+ }
+
+ if (blockState3 != null) {
+ if (!level.isClientSide) {
++ // Paper start
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(context.getPlayer(), blockPos, blockState3).isCancelled()) {
++ return InteractionResult.PASS;
++ }
++ afterAction.run();
++ // Paper end
+ level.setBlock(blockPos, blockState3, 11);
+ level.gameEvent(GameEvent.BLOCK_CHANGE, blockPos, GameEvent.Context.of(player, blockState3));
+ if (player != null) {
+diff --git a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java
+index 2b1983d61fd3ed856770146de5cdfd33b4f63a46..492e3ffd6a4588a521486db631f3e8b2a25b74ec 100644
+--- a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java
+@@ -221,7 +221,14 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder {
+
+ if (i < 8 && ComposterBlock.COMPOSTABLES.containsKey(itemstack.getItem())) {
+ if (i < 7 && !world.isClientSide) {
+- BlockState iblockdata1 = ComposterBlock.addItem(state, world, pos, itemstack);
++ // Paper start - EntityChangeBlockEvent
++ double rand = world.getRandom().nextDouble();
++ BlockState dummyBlockState = ComposterBlock.addItem(state, org.bukkit.craftbukkit.util.DummyGeneratorAccess.INSTANCE, pos, itemstack, rand);
++ if (state != dummyBlockState && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(player, pos, dummyBlockState).isCancelled()) { // if block state will change and event cancelled
++ return InteractionResult.sidedSuccess(world.isClientSide);
++ }
++ BlockState iblockdata1 = ComposterBlock.addItem(state, world, pos, itemstack, rand);
++ // Paper end
+
+ world.levelEvent(1500, pos, state != iblockdata1 ? 1 : 0);
+ player.awardStat(Stats.ITEM_USED.get(itemstack.getItem()));