From 83e0624c3a783f828406acca0aac7198697d862c Mon Sep 17 00:00:00 2001 From: CatTeaA <1615856447@qq.com> Date: Sun, 19 Jul 2026 05:42:48 +0800 Subject: [PATCH 1/4] Add Ignite TNT-SulfurCube Check --- pom.xml | 2 +- .../bekvon/bukkit/residence/Residence.java | 66 +++++++++++-------- .../listeners/ResidenceEntityListener.java | 17 ++--- .../listeners/ResidenceListener1_08.java | 13 +++- .../listeners/ResidenceListener1_09.java | 10 +++ .../listeners/ResidenceListener1_10.java | 10 ++- .../listeners/ResidenceListener1_13.java | 4 +- .../listeners/ResidenceListener1_14.java | 9 ++- .../listeners/ResidenceListener1_21.java | 18 ++--- .../listeners/ResidenceListener26_2.java | 63 ++++++++++++++++++ .../listeners/ResidencePlayerListener.java | 13 ++-- 11 files changed, 156 insertions(+), 69 deletions(-) create mode 100644 src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener26_2.java diff --git a/pom.xml b/pom.xml index 29dffe54e..b548cee6a 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ io.papermc.paper paper-api - 26.2.build.34-alpha + 26.2.build.62-beta provided diff --git a/src/main/java/com/bekvon/bukkit/residence/Residence.java b/src/main/java/com/bekvon/bukkit/residence/Residence.java index f08618d42..de43652d8 100644 --- a/src/main/java/com/bekvon/bukkit/residence/Residence.java +++ b/src/main/java/com/bekvon/bukkit/residence/Residence.java @@ -73,6 +73,7 @@ import com.bekvon.bukkit.residence.listeners.ResidenceListener1_21_8_Paper; import com.bekvon.bukkit.residence.listeners.ResidenceListener1_21_8_Spigot; import com.bekvon.bukkit.residence.listeners.ResidenceListener1_21_9_Paper; +import com.bekvon.bukkit.residence.listeners.ResidenceListener26_2; import com.bekvon.bukkit.residence.listeners.ResidencePlayerListener; import com.bekvon.bukkit.residence.permissions.PermissionManager; import com.bekvon.bukkit.residence.persistance.YMLSaveHelper; @@ -581,49 +582,58 @@ public void onEnable() { PluginManager pm = getServer().getPluginManager(); - if (Version.isCurrentEqualOrHigher(Version.v1_8_R1)) - pm.registerEvents(new ResidenceListener1_08(), this); - if (Version.isCurrentEqualOrHigher(Version.v1_9_R1)) + if (Version.isCurrentEqualOrHigher(Version.v1_8_0)) { + pm.registerEvents(new ResidenceListener1_08(this), this); + } + if (Version.isCurrentEqualOrHigher(Version.v1_9_0)) { pm.registerEvents(new ResidenceListener1_09(this), this); - if (Version.isCurrentEqualOrHigher(Version.v1_10_R1)) - pm.registerEvents(new ResidenceListener1_10(), this); - if (Version.isCurrentEqualOrHigher(Version.v1_12_R1)) + } + if (Version.isCurrentEqualOrHigher(Version.v1_10_0)) { + pm.registerEvents(new ResidenceListener1_10(this), this); + } + if (Version.isCurrentEqualOrHigher(Version.v1_12_0)) { pm.registerEvents(new ResidenceListener1_12(this), this); - if (Version.isCurrentEqualOrHigher(Version.v1_13_R1)) + } + if (Version.isCurrentEqualOrHigher(Version.v1_13_0)) { pm.registerEvents(new ResidenceListener1_13(this), this); - if (Version.isCurrentEqualOrHigher(Version.v1_14_R1)) + } + if (Version.isCurrentEqualOrHigher(Version.v1_14_0)) { pm.registerEvents(new ResidenceListener1_14(this), this); - if (Version.isCurrentEqualOrHigher(Version.v1_15_R1)) + } + if (Version.isCurrentEqualOrHigher(Version.v1_15_0)) { pm.registerEvents(new ResidenceListener1_15(this), this); - if (Version.isCurrentEqualOrHigher(Version.v1_16_R1)) + } + if (Version.isCurrentEqualOrHigher(Version.v1_16_0)) { pm.registerEvents(new ResidenceListener1_16(this), this); - - if ((Version.isCurrentEqualOrHigher(Version.v1_16_R3) && Version.isCurrentSubEqualOrHigher(5)) || Version.isCurrentEqualOrHigher(Version.v1_17_R1)) { - if (Version.isPaperBranch()) - pm.registerEvents(new ResidenceListener1_16_5_Paper(this), this); } - - if (Version.isCurrentEqualOrHigher(Version.v1_17_R1)) + if (Version.isCurrentEqualOrHigher(Version.v1_16_5) && Version.isPaperBranch()) { + pm.registerEvents(new ResidenceListener1_16_5_Paper(this), this); + } + if (Version.isCurrentEqualOrHigher(Version.v1_17_0)) { pm.registerEvents(new ResidenceListener1_17(this), this); - if (Version.isCurrentEqualOrHigher(Version.v1_19_R1)) + } + if (Version.isCurrentEqualOrHigher(Version.v1_19_0)) { pm.registerEvents(new ResidenceListener1_19(this), this); - if (Version.isCurrentEqualOrHigher(Version.v1_20_R1)) + } + if (Version.isCurrentEqualOrHigher(Version.v1_20_0)) { pm.registerEvents(new ResidenceListener1_20(this), this); - if (Version.isCurrentEqualOrHigher(Version.v1_21_R1)) + } + if (Version.isCurrentEqualOrHigher(Version.v1_21_0)) { pm.registerEvents(new ResidenceListener1_21(this), this); - - if ((Version.isCurrentEqualOrHigher(Version.v1_21_R5) && Version.isCurrentSubEqualOrHigher(8)) || Version.isCurrentEqualOrHigher(Version.v1_21_R6)) { - if (Version.isPaperBranch()) + } + if (Version.isCurrentEqualOrHigher(Version.v1_21_8)) { + if (Version.isPaperBranch()) { pm.registerEvents(new ResidenceListener1_21_8_Paper(this), this); - else + } else { pm.registerEvents(new ResidenceListener1_21_8_Spigot(this), this); + } } - - if (Version.isCurrentEqualOrHigher(Version.v1_21_R6)) { - if (Version.isPaperBranch()) - pm.registerEvents(new ResidenceListener1_21_9_Paper(this), this); + if (Version.isCurrentEqualOrHigher(Version.v1_21_9) && Version.isPaperBranch()) { + pm.registerEvents(new ResidenceListener1_21_9_Paper(this), this); + } + if (Version.isCurrentEqualOrHigher(Version.v26_2_0)) { + pm.registerEvents(new ResidenceListener26_2(this), this); } - pm.registerEvents(new ResidenceBlockListener(this), this); pm.registerEvents(getPlayerListener(), this); pm.registerEvents(new ResidenceEntityListener(this), this); diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceEntityListener.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceEntityListener.java index 322ad8543..7804789ef 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceEntityListener.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceEntityListener.java @@ -124,24 +124,19 @@ public void onEntityChangeBlockEvent(EntityChangeBlockEvent event) { if (FlagPermissions.has(block.getLocation(), Flags.destroy, FlagCombo.OnlyFalse)) event.setCancelled(true); - } else if (entity instanceof Boat) { - if (!CMIMaterial.get(block.getType()).equals(CMIMaterial.LILY_PAD)) - return; - - Player riderPlayer = null; - - if (Version.isCurrentEqualOrLower(Version.v1_11_R1)) { - Entity rider = entity.getPassenger(); - riderPlayer = rider instanceof Player ? (Player) rider : null; + } else if (entity instanceof Boat && CMIMaterial.get(block.getType()) == CMIMaterial.LILY_PAD) { + Entity rider = null; + if (Version.isCurrentLower(Version.v1_11_2)) { + rider = entity.getPassenger(); } else { List passengers = entity.getPassengers(); if (!passengers.isEmpty()) { // first passenger - Entity rider = passengers.get(0); - riderPlayer = rider instanceof Player ? (Player) rider : null; + rider = passengers.get(0); } } + Player riderPlayer = rider instanceof Player ? (Player) rider : null; if (riderPlayer != null) { if (ResAdmin.isResAdmin(riderPlayer)) diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_08.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_08.java index 720d74acd..81dc1945f 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_08.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_08.java @@ -22,6 +22,13 @@ import com.bekvon.bukkit.residence.utils.Utils; public class ResidenceListener1_08 implements Listener { + + private Residence plugin; + + public ResidenceListener1_08(Residence plugin) { + this.plugin = plugin; + } + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onPlayerInteractAtArmoStand(PlayerInteractAtEntityEvent event) { // Disabling listener if flag disabled globally @@ -30,7 +37,7 @@ public void onPlayerInteractAtArmoStand(PlayerInteractAtEntityEvent event) { Player player = event.getPlayer(); // disabling event on world - if (Residence.getInstance().isDisabledWorldListener(player.getWorld())) + if (plugin.isDisabledWorldListener(player.getWorld())) return; Entity ent = event.getRightClicked(); @@ -56,7 +63,7 @@ public void AnimalUnleash(PlayerUnleashEntityEvent event) { Entity entity = event.getEntity(); // disabling event on world - if (Residence.getInstance().isDisabledWorldListener(entity.getWorld())) + if (plugin.isDisabledWorldListener(entity.getWorld())) return; Player player = event.getPlayer(); @@ -81,7 +88,7 @@ public void onBlockExplodeEvent(BlockExplodeEvent event) { Location loc = event.getBlock().getLocation(); // disabling event on world - if (Residence.getInstance().isDisabledWorldListener(loc.getWorld())) + if (plugin.isDisabledWorldListener(loc.getWorld())) return; FlagPermissions world = FlagPermissions.getPerms(loc.getWorld()); diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_09.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_09.java index 7ef09d98a..e68b164ce 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_09.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_09.java @@ -5,6 +5,7 @@ import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; @@ -19,7 +20,9 @@ import org.bukkit.event.entity.EntityToggleGlideEvent; import org.bukkit.event.entity.LingeringPotionSplashEvent; import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerItemConsumeEvent; +import org.bukkit.inventory.EquipmentSlot; import org.bukkit.potion.PotionEffect; import com.bekvon.bukkit.residence.Residence; @@ -317,4 +320,11 @@ public void onCauldronLevelChange(CauldronLevelChangeEvent event) { lm.Flag_Deny.sendMessage(player, Flags.build); event.setCancelled(true); } + + // Supported 1.9+ + public static Material getHeldMaterial(PlayerInteractEntityEvent event) { + return event.getHand() == EquipmentSlot.OFF_HAND + ? event.getPlayer().getInventory().getItemInOffHand().getType() + : event.getPlayer().getInventory().getItemInMainHand().getType(); + } } diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_10.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_10.java index f1a28222f..d54d70817 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_10.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_10.java @@ -12,14 +12,20 @@ import com.bekvon.bukkit.residence.protection.FlagPermissions; public class ResidenceListener1_10 implements Listener { - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + private Residence plugin; + + public ResidenceListener1_10(Residence plugin) { + this.plugin = plugin; + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onEntityHotFloorDamage(EntityDamageEvent event) { // Disabling listener if flag disabled globally if (!Flags.hotfloor.isGlobalyEnabled()) return; // disabling event on world - if (Residence.getInstance().isDisabledWorldListener(event.getEntity().getWorld())) + if (plugin.isDisabledWorldListener(event.getEntity().getWorld())) return; if (event.getCause() != DamageCause.HOT_FLOOR) diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_13.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_13.java index e0ca33403..9232e954a 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_13.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_13.java @@ -146,9 +146,7 @@ public void onPlayerInteractAtFish(PlayerInteractEntityEvent event) { Player player = event.getPlayer(); - Material held = (event.getHand() == EquipmentSlot.OFF_HAND) - ? player.getInventory().getItemInOffHand().getType() - : player.getInventory().getItemInMainHand().getType(); + Material held = ResidenceListener1_09.getHeldMaterial(event); if (held != Material.WATER_BUCKET) return; diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_14.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_14.java index 2e2844081..1248fc550 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_14.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_14.java @@ -250,8 +250,11 @@ public void onVanillaRaidTrigger(RaidTriggerEvent event) { if (plugin.isDisabledWorldListener(raidLoc.getWorld())) { return; } - if (FlagPermissions.has(raidLoc, Flags.raid, FlagCombo.OnlyFalse)) { - event.setCancelled(true); - } + if (FlagPermissions.has(raidLoc, Flags.raid, true)) { + return; + } + lm.Flag_Deny.sendMessage(event.getPlayer(), Flags.raid); + event.setCancelled(true); + } } 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 ff9b29080..514691759 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 @@ -214,9 +214,7 @@ public void onInteractCopperGolem(PlayerInteractEntityEvent event) { } // Copper_golem has no item in hand - Material held = (event.getHand() == EquipmentSlot.OFF_HAND) - ? player.getInventory().getItemInOffHand().getType() - : player.getInventory().getItemInMainHand().getType(); + Material held = ResidenceListener1_09.getHeldMaterial(event); // Avoid overwriting Leash Flag, Lead Shears if (held != Material.HONEYCOMB && !isItemTag(held, "axes")) @@ -277,15 +275,12 @@ public void onAnimalFeeding(PlayerInteractEntityEvent event) { if (!(entity instanceof Mob)) return; - Player player = event.getPlayer(); - - Material held = event.getHand() == EquipmentSlot.OFF_HAND - ? player.getInventory().getItemInOffHand().getType() - : player.getInventory().getItemInMainHand().getType(); + Material held = ResidenceListener1_09.getHeldMaterial(event); if (!isFeedingAnimal((Mob) entity, held)) return; + Player player = event.getPlayer(); if (ResAdmin.isResAdmin(player)) return; @@ -393,17 +388,14 @@ public void onPlayerEquipAnimal(PlayerInteractEntityEvent event) { if (!(entity instanceof Animals)) return; - Player player = event.getPlayer(); - - Material held = event.getHand() == EquipmentSlot.OFF_HAND - ? player.getInventory().getItemInOffHand().getType() - : player.getInventory().getItemInMainHand().getType(); + Material held = ResidenceListener1_09.getHeldMaterial(event); // check if held item and interacted entity match // if conditions match, also check if the target entity slot is Air if (!isEquipFitAnimal((Animals) entity, CMIMaterial.get(held))) return; + Player player = event.getPlayer(); if (ResAdmin.isResAdmin(player)) return; diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener26_2.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener26_2.java new file mode 100644 index 000000000..53350329d --- /dev/null +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener26_2.java @@ -0,0 +1,63 @@ +package com.bekvon.bukkit.residence.listeners; + +import org.bukkit.Material; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.entity.SulfurCube; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractEntityEvent; + +import com.bekvon.bukkit.residence.Residence; +import com.bekvon.bukkit.residence.containers.Flags; +import com.bekvon.bukkit.residence.containers.ResAdmin; +import com.bekvon.bukkit.residence.protection.FlagPermissions; +import com.bekvon.bukkit.residence.containers.lm; +import org.bukkit.inventory.EntityEquipment; +import org.bukkit.inventory.EquipmentSlot; + +public class ResidenceListener26_2 implements Listener { + + private Residence plugin; + + public ResidenceListener26_2(Residence plugin) { + this.plugin = plugin; + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onPlayerIgniteTntSulfurCube(PlayerInteractEntityEvent event) { + // Disabling listener if flag disabled globally + if (!Flags.ignite.isGlobalyEnabled()) { + return; + } + Entity entity = event.getRightClicked(); + // disabling event on world + if (plugin.isDisabledWorldListener(entity.getWorld())) { + return; + } + if (!(entity instanceof SulfurCube)) { + return; + } + EntityEquipment equipment = ((SulfurCube) entity).getEquipment(); + if (equipment != null && equipment.getItem(EquipmentSlot.BODY).getType() != Material.TNT) { + return; + } + Material held = ResidenceListener1_09.getHeldMaterial(event); + + if (held != Material.FLINT_AND_STEEL && held != Material.FIRE_CHARGE) { + return; + } + Player player = event.getPlayer(); + if (ResAdmin.isResAdmin(player)) { + return; + } + FlagPermissions perms = FlagPermissions.getPerms(entity.getLocation(), player); + if (perms.playerHas(player, Flags.ignite, perms.playerHas(player, Flags.animalkilling, true))) { + return; + } + lm.Flag_Deny.sendMessage(player, Flags.ignite); + event.setCancelled(true); + + } +} \ No newline at end of file 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 e48b01d05..f497d674d 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidencePlayerListener.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidencePlayerListener.java @@ -1030,7 +1030,7 @@ private boolean isBuildClickBlock(CMIMaterial block, CMIMaterial held) { case ROOTED_DIRT: // check Hoe interact Rooted_Dirt, Fix upstream dupe // bug(https://github.com/PaperMC/Paper/issues/13536) - return held.name().contains("_HOE"); + return held.name().endsWith("_HOE"); case SPAWNER: case TRIAL_SPAWNER: return held.containsCriteria(CMIMC.SPAWNEGG); @@ -1129,24 +1129,27 @@ public void onPlayerStepOn(PlayerInteractEvent event) { if (player.hasMetadata("NPC") || (flag != Flags.trample && ResAdmin.isResAdmin(player))) { return; } - FlagPermissions perms = FlagPermissions.getPerms(block.getLocation(), player); + FlagPermissions perms; switch (flag) { case destroy: // Turtle Egg - if (perms.playerHas(player, Flags.destroy, true)) { + perms = FlagPermissions.getPerms(block.getLocation(), player); + if (perms.playerHas(player, flag, true)) { return; } break; case pressure: // Pressure Plate - if (perms.playerHas(player, Flags.pressure, (perms.playerHas(player, Flags.use, true)))) { + perms = FlagPermissions.getPerms(block.getLocation(), player); + if (perms.playerHas(player, flag, (perms.playerHas(player, Flags.use, true)))) { return; } break; case trample: // Farmland - if (perms.playerHas(player, Flags.trample, (perms.playerHas(player, Flags.build, true)))) { + perms = FlagPermissions.getPerms(block.getLocation(), player); + if (perms.playerHas(player, flag, (perms.playerHas(player, Flags.build, true)))) { return; } break; From 2e36f79ceb9726d1550db563126be02bf1c59cc2 Mon Sep 17 00:00:00 2001 From: CatTeaA <1615856447@qq.com> Date: Thu, 23 Jul 2026 05:23:52 +0800 Subject: [PATCH 2/4] Classify more hostile mobs as Monsters --- .../listeners/ResidenceEntityListener.java | 32 +++++++++++++------ .../listeners/ResidenceListener26_2.java | 4 +-- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceEntityListener.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceEntityListener.java index 7804789ef..082d049b1 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceEntityListener.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceEntityListener.java @@ -18,7 +18,6 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Firework; -import org.bukkit.entity.Ghast; import org.bukkit.entity.Hanging; import org.bukkit.entity.Item; import org.bukkit.entity.ItemFrame; @@ -26,7 +25,6 @@ import org.bukkit.entity.Monster; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; -import org.bukkit.entity.Slime; import org.bukkit.entity.Silverfish; import org.bukkit.entity.Tameable; import org.bukkit.entity.ThrownPotion; @@ -251,15 +249,31 @@ public void onEntityInteractEvent(EntityInteractEvent event) { } - public static boolean isMonster(Entity ent) { - if (ent == null) { + public static boolean isMonster(Entity entity) { + if (entity == null) { return false; } - CMIEntityType type = CMIEntityType.get(ent); - return (ent instanceof Monster || - ent instanceof Slime || - ent instanceof Ghast || - type == CMIEntityType.SHULKER); + if (Version.isCurrentEqualOrHigher(Version.v1_19_3)) { + return entity instanceof org.bukkit.entity.Enemy; + } + if (entity instanceof Monster) { + return true; + } + CMIEntityType type = CMIEntityType.get(entity); + if (type != null) { + switch (type) { + case ENDER_DRAGON: + case GHAST: + case HOGLIN: + case PHANTOM: + case SHULKER: + case SLIME: + return true; + default: + return false; + } + } + return false; } private static boolean isTamed(Entity ent) { diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener26_2.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener26_2.java index 53350329d..bf6f2e670 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener26_2.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener26_2.java @@ -8,14 +8,14 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.inventory.EntityEquipment; +import org.bukkit.inventory.EquipmentSlot; import com.bekvon.bukkit.residence.Residence; import com.bekvon.bukkit.residence.containers.Flags; import com.bekvon.bukkit.residence.containers.ResAdmin; import com.bekvon.bukkit.residence.protection.FlagPermissions; import com.bekvon.bukkit.residence.containers.lm; -import org.bukkit.inventory.EntityEquipment; -import org.bukkit.inventory.EquipmentSlot; public class ResidenceListener26_2 implements Listener { From e9b4238689a792291e44df7aa0a58100a30d684e Mon Sep 17 00:00:00 2001 From: CatTeaA <1615856447@qq.com> Date: Sat, 8 Aug 2026 16:23:39 +0800 Subject: [PATCH 3/4] fix: prevent trident from bypassing break protection on sulfur_spike; replace LightningStrikeEvent with EntityTransformEvent in Spigot --- pom.xml | 2 +- .../listeners/ResidenceListener1_14.java | 25 +++++---- .../listeners/ResidenceListener1_16.java | 50 ++++++++---------- .../ResidenceListener1_16_5_Paper.java | 52 ++++++++++++++++--- .../listeners/ResidenceListener1_20.java | 18 +++++-- .../residence/protection/FlagPermissions.java | 8 --- 6 files changed, 99 insertions(+), 56 deletions(-) diff --git a/pom.xml b/pom.xml index b548cee6a..d8ec4fc96 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ io.papermc.paper paper-api - 26.2.build.62-beta + 26.2.build.111-stable provided diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_14.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_14.java index 1248fc550..a0724e7ae 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_14.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_14.java @@ -35,6 +35,7 @@ import com.bekvon.bukkit.residence.utils.Utils; import net.Zrips.CMILib.Items.CMIMaterial; +import org.jetbrains.annotations.NotNull; public class ResidenceListener1_14 implements Listener { @@ -139,23 +140,27 @@ public void onVehicleDamage(VehicleDamageEvent event) { @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onProjectileHitBell(ProjectileHitEvent event) { - + // Disabling listener if flag disabled globally + if (!Flags.use.isGlobalyEnabled()) { + return; + } Block block = event.getHitBlock(); - if (block == null || block.getType() != Material.BELL) { + if (block == null) { + return; + } + // disabling event on world + if (plugin.isDisabledWorldListener(block.getWorld())) { return; } - if (shouldBlockProjectileHit(block, event.getEntity())) { + if (block.getType() != Material.BELL) { + return; + } + if (shouldDenyProjectileHit(block, event.getEntity(), Flags.use)) { event.setCancelled(true); } - } - public static boolean shouldBlockProjectileHit(Block block, Projectile projectile) { - - Flags flag = FlagPermissions.checkBlockPhysicalFlag(block); - if (flag == null) { - return false; - } + public static boolean shouldDenyProjectileHit(@NotNull Block block, @NotNull Projectile projectile, @NotNull Flags flag) { Player player = Utils.potentialProjectileToPlayer(projectile); if (player != null) { diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_16.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_16.java index a6d6b04de..b5896b5b1 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_16.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_16.java @@ -1,23 +1,23 @@ package com.bekvon.bukkit.residence.listeners; -import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.entity.LightningStrike; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityTransformEvent; import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.weather.LightningStrikeEvent; import com.bekvon.bukkit.residence.Residence; import com.bekvon.bukkit.residence.containers.Flags; import com.bekvon.bukkit.residence.containers.ResAdmin; import com.bekvon.bukkit.residence.containers.lm; import com.bekvon.bukkit.residence.protection.FlagPermissions; -import com.bekvon.bukkit.residence.protection.FlagPermissions.FlagCombo; +import com.bekvon.bukkit.residence.utils.Utils; import net.Zrips.CMILib.Version.Version; @@ -30,38 +30,32 @@ public ResidenceListener1_16(Residence plugin) { } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) - public void onLightningStrikeEvent(LightningStrikeEvent event) { - - if (event.getCause() != LightningStrikeEvent.Cause.TRIDENT) { + public void onLightningTransformAnimal(EntityTransformEvent event) { + // Paper 1.16.5+ uses EntityZapEvent for more detailed handling + if (Version.isPaperBranch() && Version.isCurrentEqualOrHigher(Version.v1_16_5)) { return; } - if (shouldBlockLightning(event.getLightning(), event.getLightning().getLocation())) { - event.setCancelled(true); - } - - } - - public static boolean shouldBlockLightning(LightningStrike lightning, Location entLoc) { // Disabling listener if flag disabled globally if (!Flags.animalkilling.isGlobalyEnabled()) { - return false; + return; } + Entity entity = event.getEntity(); // disabling event on world - if (Residence.getInstance().isDisabledWorldListener(lightning.getWorld())) { - return false; + if (plugin.isDisabledWorldListener(entity.getWorld())) { + return; } - Player player = Version.isCurrentEqualOrHigher(Version.v1_20_R2) - ? lightning.getCausingPlayer() - : null; - - if (player != null) { - if (ResAdmin.isResAdmin(player)) { - return false; - } - return FlagPermissions.has(entLoc, player, Flags.animalkilling, FlagCombo.OnlyFalse); - } else { - return FlagPermissions.has(entLoc, Flags.animalkilling, FlagCombo.OnlyFalse); + if (event.getTransformReason() != EntityTransformEvent.TransformReason.LIGHTNING) { + return; } + if (!(entity instanceof LivingEntity) || !Utils.isAnimal(entity)) { + return; + } + if (FlagPermissions.has(entity.getLocation(), Flags.animalkilling, true)) { + return; + } + + event.setCancelled(true); + } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_16_5_Paper.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_16_5_Paper.java index 43ea958dc..10f3640a8 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_16_5_Paper.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_16_5_Paper.java @@ -1,15 +1,22 @@ package com.bekvon.bukkit.residence.listeners; +import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import com.bekvon.bukkit.residence.Residence; +import com.bekvon.bukkit.residence.containers.Flags; +import com.bekvon.bukkit.residence.containers.ResAdmin; +import com.bekvon.bukkit.residence.protection.FlagPermissions; import com.bekvon.bukkit.residence.utils.Utils; import com.destroystokyo.paper.event.entity.EntityZapEvent; +import net.Zrips.CMILib.Version.Version; + import io.papermc.paper.event.block.TargetHitEvent; public class ResidenceListener1_16_5_Paper implements Listener { @@ -22,23 +29,56 @@ public ResidenceListener1_16_5_Paper(Residence plugin) { @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onHitTargetBlock(TargetHitEvent event) { - // Event only triggered by Projectile hitting TargetBlock - if (ResidenceListener1_14.shouldBlockProjectileHit(event.getHitBlock(), event.getEntity())) { + // Disabling listener if flag disabled globally + if (!Flags.use.isGlobalyEnabled()) { + return; + } + Block block = event.getHitBlock(); + if (block == null) { + return; + } + // disabling event on world + if (plugin.isDisabledWorldListener(block.getWorld())) { + return; + } + if (ResidenceListener1_14.shouldDenyProjectileHit(block, event.getEntity(), Flags.use)) { event.setCancelled(true); } - } @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onEntityZapEvent(EntityZapEvent event) { - // Check if animal can be damaged or converted by lightning + // Disabling listener if flag disabled globally + if (!Flags.animalkilling.isGlobalyEnabled()) { + return; + } Entity entity = event.getEntity(); + // disabling event on world + if (plugin.isDisabledWorldListener(entity.getWorld())) { + return; + } + // Check if animal can be damaged or converted by lightning if (!(entity instanceof LivingEntity) || !Utils.isAnimal(entity)) { return; } - if (ResidenceListener1_16.shouldBlockLightning(event.getBolt(), entity.getLocation())) { - event.setCancelled(true); + Player player = Version.isCurrentEqualOrHigher(Version.v1_20_2) + ? event.getBolt().getCausingPlayer() + : null; + + if (player != null) { + if (ResAdmin.isResAdmin(player)) { + return; + } + if (FlagPermissions.has(entity.getLocation(), player, Flags.animalkilling, true)) { + return; + } + } else { + if (FlagPermissions.has(entity.getLocation(), Flags.animalkilling, true)) { + return; + } } + event.setCancelled(true); + } } diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_20.java b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_20.java index c87ac03b3..408fdb881 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_20.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidenceListener1_20.java @@ -59,18 +59,30 @@ public void onSignInteract(PlayerSignOpenEvent event) { @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onProjectileChangeBlock(EntityChangeBlockEvent event) { + // Disabling listener if flag disabled globally + if (!Flags.destroy.isGlobalyEnabled()) { + return; + } + Block block = event.getBlock(); + // disabling event on world + if (plugin.isDisabledWorldListener(block.getWorld())) { + return; + } // Only valid for versions 1.20+ + // Projectile-triggered EntityChangeBlockEvent always means breaking a block. Entity entity = event.getEntity(); if (!(entity instanceof Projectile)) { return; } // Projectile hit chorus_flower/decorated_pot - // Trident hit pointed_dripstone + // Trident hit pointed_dripstone/sulfur_spike // Flame_Arrow hit tnt - if (ResidenceListener1_14.shouldBlockProjectileHit(event.getBlock(), (Projectile) entity)) { + + // Now uses Flags.destroy to decide the result (not block type). + // Future blocks are auto-compatible — no manual fix required. + if (ResidenceListener1_14.shouldDenyProjectileHit(block, (Projectile) entity, Flags.destroy)) { event.setCancelled(true); } - } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) diff --git a/src/main/java/com/bekvon/bukkit/residence/protection/FlagPermissions.java b/src/main/java/com/bekvon/bukkit/residence/protection/FlagPermissions.java index 047c0d9af..f675fe04d 100644 --- a/src/main/java/com/bekvon/bukkit/residence/protection/FlagPermissions.java +++ b/src/main/java/com/bekvon/bukkit/residence/protection/FlagPermissions.java @@ -373,17 +373,9 @@ public static Flags checkBlockPhysicalFlag(Block block) { CMIMaterial mat = CMIMaterial.get(block.getType()); Flags flag = null; switch (mat) { - case BELL: - case TARGET: - flag = Flags.use; - break; case FARMLAND: flag = Flags.trample; break; - case CHORUS_FLOWER: - case DECORATED_POT: - case POINTED_DRIPSTONE: - case TNT: case TURTLE_EGG: flag = Flags.destroy; break; From 59f156c3dec7da9ac73efa204900c3518784ad83 Mon Sep 17 00:00:00 2001 From: CatTeaA <1615856447@qq.com> Date: Mon, 10 Aug 2026 05:17:21 +0800 Subject: [PATCH 4/4] Fix issue where some blacklisted items could be used in special scenarios --- .../listeners/ResidencePlayerListener.java | 51 +++++++++++-------- 1 file changed, 29 insertions(+), 22 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 f497d674d..3407740fe 100644 --- a/src/main/java/com/bekvon/bukkit/residence/listeners/ResidencePlayerListener.java +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/ResidencePlayerListener.java @@ -26,6 +26,7 @@ import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.entity.Vehicle; +import org.bukkit.event.Event.Result; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -1233,7 +1234,7 @@ public void onInfoCheck(PlayerInteractEvent event) { if (heldItem != plugin.getConfigManager().getInfoTool()) return; - if (this.isContainer(block.getType(), block)) + if (this.isContainer(block.getType())) return; if (player.hasMetadata("NPC")) return; @@ -1259,12 +1260,12 @@ public void onBlockPlace(BlockPlaceEvent event) { event.setCancelled(true); } - private boolean isContainer(Material mat, Block block) { + private boolean isContainer(Material mat) { return FlagPermissions.getMaterialUseFlagList().containsKey(mat) && FlagPermissions.getMaterialUseFlagList().get(mat).equals(Flags.container) - || plugin.getConfigManager().getCustomContainers().contains(block.getType()); + || plugin.getConfigManager().getCustomContainers().contains(mat); } - public static boolean isCanUseEntity_BothClick(Material mat, Block block) { + public static boolean isCanUseEntity_BothClick(Material mat) { CMIMaterial cmat = CMIMaterial.get(mat); switch (cmat) { @@ -1272,11 +1273,11 @@ public static boolean isCanUseEntity_BothClick(Material mat, Block block) { case DRAGON_EGG: return true; default: - return Residence.getInstance().getConfigManager().getCustomBothClick().contains(block.getType()); + return Residence.getInstance().getConfigManager().getCustomBothClick().contains(mat); } } - private boolean isCanUseEntity_RClickOnly(Material mat, Block block) { + private boolean isCanUseEntity_RClickOnly(Material mat) { CMIMaterial cmat = CMIMaterial.get(mat); switch (cmat) { @@ -1331,14 +1332,14 @@ private boolean isCanUseEntity_RClickOnly(Material mat, Block block) { if (mat.name().equals("DAYLIGHT_DETECTOR_INVERTED")) return true; - return plugin.getConfigManager().getCustomRightClick().contains(block.getType()); + return plugin.getConfigManager().getCustomRightClick().contains(mat); } - private boolean isCanUseEntity(Material mat, Block block) { - return isCanUseEntity_BothClick(mat, block) || isCanUseEntity_RClickOnly(mat, block); + private boolean isCanUseEntity(Material mat) { + return isCanUseEntity_BothClick(mat) || isCanUseEntity_RClickOnly(mat); } - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.LOWEST)// Do not use (ignoreCancelled = true) public void onPlayerInteract(PlayerInteractEvent event) { Block block = event.getClickedBlock(); @@ -1355,19 +1356,24 @@ public void onPlayerInteract(PlayerInteractEvent event) { if (ResAdmin.isResAdmin(player)) return; - CMIMaterial heldItem = CMIMaterial.get(event.getItem()); - // Check held Material Blacklist - if (!heldItem.isNone() && heldItem.isValidItem() - && !plugin.getItemManager().isAllowed(heldItem.getMaterial(), plugin.getPlayerManager().getResidencePlayer(player).getGroup(), player.getWorld() - .getName())) { - lm.General_ItemBlacklisted.sendMessage(player); - event.setCancelled(true); + if (event.useItemInHand() != Result.DENY ) { + CMIMaterial heldItem = CMIMaterial.get(event.getItem()); + // Check held Material Blacklist + if (!heldItem.isNone() && heldItem.isValidItem() && !plugin.getItemManager().isAllowed( + heldItem.getMaterial(), + plugin.getPlayerManager().getResidencePlayer(player).getGroup(), + player.getWorld().getName())) { + lm.General_ItemBlacklisted.sendMessage(player); + event.setCancelled(true); + return; + } + } + if (event.useInteractedBlock() == Result.DENY) { return; } - Material mat = block.getType(); - if (!isContainer(mat, block) && !isCanUseEntity(mat, block)) + if (!isContainer(mat) && !isCanUseEntity(mat)) return; FlagPermissions perms = FlagPermissions.getPerms(block.getLocation(), player); @@ -1417,7 +1423,7 @@ public void onPlayerInteract(PlayerInteractEvent event) { return; } - if (isCanUseEntity_BothClick(mat, block)) { + if (isCanUseEntity_BothClick(mat)) { if (res != null && res.getRaid().isUnderRaid() && res.getRaid().isAttacker(player)) { break main; @@ -1440,13 +1446,14 @@ public void onPlayerInteract(PlayerInteractEvent event) { } } // Restrict custom both-click block - if (plugin.getConfigManager().getCustomBothClick().contains(mat) && !hasUse) { + if (!hasUse && plugin.getConfigManager().getCustomBothClick().contains(mat)) { event.setCancelled(true); lm.Flag_Deny.sendMessage(player, Flags.use); return; } // Restrict custom right-click block - if (plugin.getConfigManager().getCustomRightClick().contains(mat) && event.getAction() == Action.RIGHT_CLICK_BLOCK && !hasUse) { + if (!hasUse && event.getAction() == Action.RIGHT_CLICK_BLOCK + && plugin.getConfigManager().getCustomRightClick().contains(mat)) { event.setCancelled(true); lm.Flag_Deny.sendMessage(player, Flags.use); }