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);
}