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..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,8 +668,13 @@ public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { Player player = event.getPlayer(); Block blockClicked = event.getBlockClicked(); Block blockAffected; - - if (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; + }; + } }