From 85c48a0eaa87fd307147d229067062c2e7c3fe4b Mon Sep 17 00:00:00 2001 From: CatTeaA <1615856447@qq.com> Date: Fri, 6 Feb 2026 20:28:40 +0800 Subject: [PATCH 1/5] Fix potential NPE from mod-added mobs on NeoForge servers --- .../bukkit/residence/listeners/ResidenceListener1_21.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_21.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_21.java index 1b2ff9c6d..17c15291b 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_21.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_21.java @@ -255,6 +255,9 @@ public void onAnimalFeeding(PlayerInteractEntityEvent event) { } private boolean isFeedingAnimal(CMIEntityType type, Material held) { + if (type == null) { + return false; + } switch (type) { case ARMADILLO: return isItemTag(held, "armadillo_food"); case AXOLOTL: return isItemTag(held, "axolotl_food"); @@ -341,6 +344,9 @@ private static boolean isEquipFitAnimal(Entity entity, CMIMaterial held) { return false; CMIEntityType type = CMIEntityType.get(entity); + if (type == null) + return false; + boolean isBodySlotAir = entInv.getItem(EquipmentSlot.BODY).getType() == Material.AIR; if (held.containsCriteria(CMIMC.CARPET)) From 62acafcd870ae301c8213799517553fb11141746 Mon Sep 17 00:00:00 2001 From: CatTeaA <1615856447@qq.com> Date: Sat, 14 Feb 2026 22:43:20 +0800 Subject: [PATCH 2/5] Fixed bypassing water/lava placement at Residence edges by interacting with waterlogged blocks while sneaking --- .../listeners/ResidenceListener1_21.java | 6 +++--- .../listeners/ResidencePlayerListener.java | 20 +++++++++---------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_21.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_21.java index 17c15291b..e0907b0e1 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_21.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_21.java @@ -239,6 +239,9 @@ public void onAnimalFeeding(PlayerInteractEntityEvent event) { CMIEntityType type = CMIEntityType.get(entity.getType()); + if (type == null) + return; + if (!isFeedingAnimal(type, held)) return; @@ -255,9 +258,6 @@ public void onAnimalFeeding(PlayerInteractEntityEvent event) { } private boolean isFeedingAnimal(CMIEntityType type, Material held) { - if (type == null) { - return false; - } switch (type) { case ARMADILLO: return isItemTag(held, "armadillo_food"); case AXOLOTL: return isItemTag(held, "axolotl_food"); diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidencePlayerListener.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidencePlayerListener.java index deee33347..78e7a8ec4 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidencePlayerListener.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidencePlayerListener.java @@ -1677,21 +1677,19 @@ public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { if (ResAdmin.isResAdmin(player)) return; - Location loc = event.getBlockClicked().getLocation().clone(); + Block block = event.getBlockClicked(); - if (Version.isCurrentHigher(Version.v1_12_R1)) { + if (CMIMaterial.get(block.getType()) == CMIMaterial.CAULDRON && !player.isSneaking()) { + if (FlagPermissions.has(block.getLocation(), player, Flags.build, true)) + return; - if (Version.isCurrentHigher(Version.v1_13_R1) && event.getBlockClicked().getBlockData() instanceof org.bukkit.block.data.Waterlogged) { - org.bukkit.block.data.Waterlogged waterloggedBlock = (org.bukkit.block.data.Waterlogged) event.getBlockClicked().getBlockData(); - if (waterloggedBlock.isWaterlogged()) - loc.add(event.getBlockFace().getDirection()); - } else - try { - loc.add(event.getBlockFace().getDirection()); - } catch (Throwable e) { - } + lm.Flag_Deny.sendMessage(player, Flags.build); + event.setCancelled(true); + return; } + Location loc = block.getRelative(event.getBlockFace()).getLocation(); + CMIMaterial cmat = CMIMaterial.get(event.getBucket()); ClaimedResidence res = plugin.getResidenceManager().getByLoc(loc); if (res != null) { From c1b3d599521f218299e5874600d6326aab4b3746 Mon Sep 17 00:00:00 2001 From: CatTeaA <1615856447@qq.com> Date: Sun, 15 Feb 2026 05:08:57 +0800 Subject: [PATCH 3/5] Waterlogged Block --- .../listeners/ResidencePlayerListener.java | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidencePlayerListener.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidencePlayerListener.java index 78e7a8ec4..60b44148f 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidencePlayerListener.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidencePlayerListener.java @@ -1677,18 +1677,9 @@ public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { if (ResAdmin.isResAdmin(player)) return; - Block block = event.getBlockClicked(); + Block clickBlock = event.getBlockClicked(); - if (CMIMaterial.get(block.getType()) == CMIMaterial.CAULDRON && !player.isSneaking()) { - if (FlagPermissions.has(block.getLocation(), player, Flags.build, true)) - return; - - lm.Flag_Deny.sendMessage(player, Flags.build); - event.setCancelled(true); - return; - } - - Location loc = block.getRelative(event.getBlockFace()).getLocation(); + Location loc = clickBlock.getRelative(event.getBlockFace()).getLocation(); CMIMaterial cmat = CMIMaterial.get(event.getBucket()); ClaimedResidence res = plugin.getResidenceManager().getByLoc(loc); @@ -1711,11 +1702,24 @@ public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { } } - FlagPermissions perms = FlagPermissions.getPerms(loc, player); - if (!perms.playerHas(player, Flags.build, true)) { - lm.Flag_Deny.sendMessage(player, Flags.build); - event.setCancelled(true); - return; + // place inside the block + if (!player.isSneaking() && ((CMIMaterial.get(clickBlock.getType()) == CMIMaterial.CAULDRON) + || (Version.isCurrentEqualOrHigher(Version.v1_13_R1) && clickBlock.getBlockData() instanceof org.bukkit.block.data.Waterlogged))) { + + if (FlagPermissions.has(clickBlock.getLocation(), player, Flags.build, FlagCombo.OnlyFalse)) { + lm.Flag_Deny.sendMessage(player, Flags.build); + event.setCancelled(true); + return; + } + // place outside the block + } else { + + if (FlagPermissions.has(loc ,player, Flags.build, FlagCombo.OnlyFalse)) { + lm.Flag_Deny.sendMessage(player, Flags.build); + event.setCancelled(true); + return; + } + } int level = plugin.getConfigManager().getPlaceLevel(); From 5ea9f06933ef85a9b5c8fa779afc1795b67f2742 Mon Sep 17 00:00:00 2001 From: CatTeaA <1615856447@qq.com> Date: Sun, 15 Feb 2026 05:33:19 +0800 Subject: [PATCH 4/5] simplify --- .../listeners/ResidencePlayerListener.java | 30 +++++++------------ 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidencePlayerListener.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidencePlayerListener.java index 60b44148f..b1fbad277 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidencePlayerListener.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidencePlayerListener.java @@ -1678,9 +1678,15 @@ public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { return; Block clickBlock = event.getBlockClicked(); - + // default place outside the block Location loc = clickBlock.getRelative(event.getBlockFace()).getLocation(); + if (!player.isSneaking() && ((CMIMaterial.get(clickBlock.getType()) == CMIMaterial.CAULDRON) + || (Version.isCurrentEqualOrHigher(Version.v1_13_R1) && clickBlock.getBlockData() instanceof org.bukkit.block.data.Waterlogged))) { + // if place inside the block + loc = clickBlock.getLocation(); + } + CMIMaterial cmat = CMIMaterial.get(event.getBucket()); ClaimedResidence res = plugin.getResidenceManager().getByLoc(loc); if (res != null) { @@ -1702,24 +1708,10 @@ public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { } } - // place inside the block - if (!player.isSneaking() && ((CMIMaterial.get(clickBlock.getType()) == CMIMaterial.CAULDRON) - || (Version.isCurrentEqualOrHigher(Version.v1_13_R1) && clickBlock.getBlockData() instanceof org.bukkit.block.data.Waterlogged))) { - - if (FlagPermissions.has(clickBlock.getLocation(), player, Flags.build, FlagCombo.OnlyFalse)) { - lm.Flag_Deny.sendMessage(player, Flags.build); - event.setCancelled(true); - return; - } - // place outside the block - } else { - - if (FlagPermissions.has(loc ,player, Flags.build, FlagCombo.OnlyFalse)) { - lm.Flag_Deny.sendMessage(player, Flags.build); - event.setCancelled(true); - return; - } - + if (FlagPermissions.has(loc ,player, Flags.build, FlagCombo.OnlyFalse)) { + lm.Flag_Deny.sendMessage(player, Flags.build); + event.setCancelled(true); + return; } int level = plugin.getConfigManager().getPlaceLevel(); From b3d7e30183f304294216cb13ac38399ff71be4fd Mon Sep 17 00:00:00 2001 From: CatTeaA <1615856447@qq.com> Date: Wed, 18 Feb 2026 04:02:15 +0800 Subject: [PATCH 5/5] iceform no longer overrides snowtrail --- .../listeners/ResidenceBlockListener.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceBlockListener.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceBlockListener.java index de1360d11..90cd65dc7 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceBlockListener.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceBlockListener.java @@ -271,17 +271,15 @@ public static boolean canBreakBlock(Player player, Location loc, boolean inform) } @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void onBlockForm(BlockFormEvent event) { + public void onSnowGolemTrailForm(EntityBlockFormEvent event) { // Disabling listener if flag disabled globally if (!Flags.snowtrail.isGlobalyEnabled()) return; // disabling event on world if (plugin.isDisabledWorldListener(event.getBlock().getWorld())) return; - if (!(event instanceof EntityBlockFormEvent)) - return; - if (((EntityBlockFormEvent) event).getEntity() instanceof Snowman) { + if (event.getEntity() instanceof Snowman) { FlagPermissions perms = FlagPermissions.getPerms(event.getBlock().getLocation()); if (!perms.has(Flags.snowtrail, true)) { event.setCancelled(true); @@ -297,11 +295,19 @@ public void onIceForm(BlockFormEvent event) { // disabling event on world if (plugin.isDisabledWorldListener(event.getBlock().getWorld())) return; + // SnowGolem already has SnowTrail Flag + if (event instanceof EntityBlockFormEvent + && ((EntityBlockFormEvent) event).getEntity() instanceof Snowman) { + return; + } - Material ice = Material.getMaterial("FROSTED_ICE"); + CMIMaterial newBlock = CMIMaterial.get(event.getNewState().getType()); - if (event.getNewState().getType() != Material.SNOW && event.getNewState().getType() != Material.ICE && ice != null && ice != event.getNewState().getType()) + if (newBlock != CMIMaterial.FROSTED_ICE + && newBlock != CMIMaterial.ICE + && newBlock != CMIMaterial.SNOW) { return; + } FlagPermissions perms = FlagPermissions.getPerms(event.getBlock().getLocation()); if (!perms.has(Flags.iceform, true)) {