From 495492c75c0d11d3e4b965907dc8fcbf2e14bd8f Mon Sep 17 00:00:00 2001 From: CatTeaA <135555687+CatTeaA@users.noreply.github.com> Date: Sun, 27 Sep 2026 08:19:26 +0800 Subject: [PATCH 1/2] Fix PlayerBucketEmptyEvent to use correct position check --- .../bukkit/listener/EventAbstractionListener.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java index 7bc7957e8..09fa40891 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java @@ -668,8 +668,11 @@ public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { Player player = event.getPlayer(); Block blockClicked = event.getBlockClicked(); Block blockAffected; - - if (blockClicked.getBlockData() instanceof Waterlogged) { + // https://github.com/PaperMC/Paper/issues/12239 + // POWDER_SNOW_BUCKET does not trigger PlayerBucketEmptyEvent + // Lava buckets are always placed outside the block + // Water can be placed inside blocks only when not sneaking + if (event.getBucket() != Material.LAVA_BUCKET && !player.isSneaking() && blockClicked.getBlockData() instanceof Waterlogged) { blockAffected = blockClicked; } else { blockAffected = blockClicked.getRelative(event.getBlockFace()); From 514245f2fce36a2d0a4593130374830873e271cb Mon Sep 17 00:00:00 2001 From: CatTeaA <1615856447@qq.com> Date: Sun, 27 Sep 2026 10:10:26 +0800 Subject: [PATCH 2/2] Considering that cauldrons trigger PlayerBucketEmptyEvent --- .../listener/EventAbstractionListener.java | 12 +++++++----- .../sk89q/worldguard/bukkit/util/Materials.java | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java index 09fa40891..9dac240e9 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java @@ -668,11 +668,13 @@ public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { Player player = event.getPlayer(); Block blockClicked = event.getBlockClicked(); Block blockAffected; - // https://github.com/PaperMC/Paper/issues/12239 - // POWDER_SNOW_BUCKET does not trigger PlayerBucketEmptyEvent - // Lava buckets are always placed outside the block - // Water can be placed inside blocks only when not sneaking - if (event.getBucket() != Material.LAVA_BUCKET && !player.isSneaking() && blockClicked.getBlockData() instanceof Waterlogged) { + boolean canPlaceInside = false; + // Can be placed inside blocks only when not sneaking + if (!player.isSneaking()) { + canPlaceInside = (event.getBucket() != Material.LAVA_BUCKET && blockClicked.getBlockData() instanceof Waterlogged) + || (Materials.isCauldron(blockClicked.getType()) && Materials.isCauldronBucketType(event.getBucket())); + } + if (canPlaceInside) { blockAffected = blockClicked; } else { blockAffected = blockClicked.getRelative(event.getBlockFace()); diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/Materials.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/Materials.java index 15ad891a2..6bbcf6c7d 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/Materials.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/Materials.java @@ -1057,6 +1057,7 @@ public static Material getBucketBlockMaterial(Material type) { return switch (type) { case LAVA_BUCKET -> Material.LAVA; case WATER_BUCKET -> Material.WATER; + case POWDER_SNOW_BUCKET -> Material.POWDER_SNOW; default -> Material.WATER; }; } @@ -1583,4 +1584,19 @@ public static boolean isAmethystGrowth(Material mat) { public static boolean isSculkGrowth(Material mat) { return mat == Material.SCULK || mat == Material.SCULK_VEIN; } + + public static boolean isCauldron(Material mat) { + return switch (mat) { + case CAULDRON, LAVA_CAULDRON, POWDER_SNOW_CAULDRON, WATER_CAULDRON -> true; + default -> false; + }; + } + + // Other buckets containing mobs cannot be placed inside cauldrons + public static boolean isCauldronBucketType(Material mat) { + return switch (mat) { + case WATER_BUCKET, LAVA_BUCKET, POWDER_SNOW_BUCKET -> true; + default -> false; + }; + } }