feat: 领地新增生物蛋/涂蜡权限、基岩版固定算术验证码、-f非管理员静默回退
Check Source / check (push) Successful in 2s
Auto Release / build (push) Successful in 2m11s
Simple Test / test (push) Successful in 1s
Test Env / test (push) Successful in 1s

- protect delete <名> -f:非管理员不再报错拒绝,静默回退到普通60秒倒计时删除流程(含退费)
- 基岩版(Geyser/Floodgate)玩家无法用聊天框唤醒GUI验证码,改为固定出算术题
- 新增领地权限「生物蛋」denySpawnEgg,上级为放置方块,生效条件 denyBlockPlace && denySpawnEgg
- 新增领地权限「涂蜡/刮蜡」denyWax,上级为破坏方块+放置方块,生效条件 denyWax && (denyBlockBreak || denyBlockPlace)
- CLI/GUI/Web同步/DB(70->72列)/tab补全全链路接入两个新权限
- 修复GUI成员权限页历史缺项:耕地破坏/末影人行为点击数组缺失导致条目点不动
This commit is contained in:
youpaishidifu
2026-09-27 16:09:25 +08:00
parent 448f23ac53
commit c65b64030f
7 changed files with 165 additions and 11 deletions
@@ -554,6 +554,8 @@ public class AreaCLIManager {
case "move": oldState = land.denyMove; land.denyMove = !land.denyMove; break;
case "block_place": oldState = land.denyBlockPlace; land.denyBlockPlace = !land.denyBlockPlace; break;
case "block_break": oldState = land.denyBlockBreak; land.denyBlockBreak = !land.denyBlockBreak; break;
case "spawn_egg": oldState = land.denySpawnEgg; land.denySpawnEgg = !land.denySpawnEgg; break;
case "wax": oldState = land.denyWax; land.denyWax = !land.denyWax; break;
case "entity_interact": oldState = land.denyEntityInteract; land.denyEntityInteract = !land.denyEntityInteract; break;
case "container": oldState = land.denyContainer; land.denyContainer = !land.denyContainer; break;
case "pvp": oldState = land.denyPVP; land.denyPVP = !land.denyPVP; break;
@@ -614,6 +616,8 @@ public class AreaCLIManager {
case "move": return "denyMove";
case "block_place": return "denyBlockPlace";
case "block_break": return "denyBlockBreak";
case "spawn_egg": return "denySpawnEgg";
case "wax": return "denyWax";
case "entity_interact": return "denyEntityInteract";
case "container": return "denyContainer";
case "pvp": return "denyPVP";
@@ -675,6 +679,8 @@ public class AreaCLIManager {
perms.add(new PermItem("move", "移动", !land.denyMove));
perms.add(new PermItem("block_place", "放置方块", !land.denyBlockPlace));
perms.add(new PermItem("block_break", "破坏方块", !land.denyBlockBreak));
perms.add(new PermItem("spawn_egg", "生物蛋", !land.denySpawnEgg));
perms.add(new PermItem("wax", "涂蜡/刮蜡", !land.denyWax));
perms.add(new PermItem("entity_interact", "实体交互(船/矿车/盔甲架/展示框)", !land.denyEntityInteract));
perms.add(new PermItem("container", "容器管理", !land.denyContainer));
perms.add(new PermItem("pvp", "玩家对战", !land.denyPVP));
@@ -717,6 +723,8 @@ public class AreaCLIManager {
case "move": return "移动";
case "block_place": return "放置方块";
case "block_break": return "破坏方块";
case "spawn_egg": return "生物蛋";
case "wax": return "涂蜡/刮蜡";
case "container": return "容器管理";
case "pvp": return "玩家对战";
case "mount": return "骑乘坐具";
@@ -1134,6 +1142,8 @@ public class AreaCLIManager {
{"move", "移动", "denyMove"},
{"block_place", "放置方块", "denyBlockPlace"},
{"block_break", "破坏方块", "denyBlockBreak"},
{"spawn_egg", "生物蛋", "denySpawnEgg"},
{"wax", "涂蜡/刮蜡", "denyWax"},
{"entity_interact", "实体交互", "denyEntityInteract"},
{"container", "容器管理", "denyContainer"},
{"pvp", "玩家对战", "denyPVP"},
@@ -1229,6 +1239,8 @@ public class AreaCLIManager {
case "denyMove": return land.denyMove;
case "denyBlockPlace": return land.denyBlockPlace;
case "denyBlockBreak": return land.denyBlockBreak;
case "denySpawnEgg": return land.denySpawnEgg;
case "denyWax": return land.denyWax;
case "denyEntityInteract": return land.denyEntityInteract;
case "denyContainer": return land.denyContainer;
case "denyPVP": return land.denyPVP;
+13 -1
View File
@@ -487,6 +487,7 @@ public class AreaGUIManager implements Listener {
// 权限列表
String[][] permDefs = {
{"移动", "denyMove"}, {"放置方块", "denyBlockPlace"}, {"破坏方块", "denyBlockBreak"},
{"生物蛋", "denySpawnEgg"}, {"涂蜡/刮蜡", "denyWax"},
{"实体交互", "denyEntityInteract"},
{"容器管理", "denyContainer"}, {"玩家对战", "denyPVP"}, {"骑乘坐具", "denyMount"}, {"投掷末影珍珠", "denyEnderPearl"},
{"投掷物", "denyThrownProjectiles"}, {"禁止袭击", "denyRaid"}, {"弓箭射击", "denyBow"},
@@ -585,6 +586,11 @@ public class AreaGUIManager implements Listener {
case "denyMove": return land.denyMove;
case "denyBlockPlace": return land.denyBlockPlace;
case "denyBlockBreak": return land.denyBlockBreak;
case "denySpawnEgg": return land.denySpawnEgg;
case "denyWax": return land.denyWax;
case "denyMobAttack": return land.denyMobAttack;
case "denyFarmlandTrample": return land.denyFarmlandTrample;
case "denyEnderTeleport": return land.denyEnderTeleport;
case "denyEntityInteract": return land.denyEntityInteract;
case "denyContainer": return land.denyContainer;
case "denyPVP": return land.denyPVP;
@@ -669,6 +675,8 @@ public class AreaGUIManager implements Listener {
perms.add(new PermEntry("移动", !land.denyMove));
perms.add(new PermEntry("放置方块", !land.denyBlockPlace));
perms.add(new PermEntry("破坏方块", !land.denyBlockBreak));
perms.add(new PermEntry("生物蛋", !land.denySpawnEgg));
perms.add(new PermEntry("涂蜡/刮蜡", !land.denyWax));
perms.add(new PermEntry("实体交互(船/矿车/盔甲架/展示框)", !land.denyEntityInteract));
perms.add(new PermEntry("容器管理", !land.denyContainer));
perms.add(new PermEntry("玩家对战", !land.denyPVP));
@@ -727,6 +735,8 @@ public class AreaGUIManager implements Listener {
case "移动": land.denyMove = !land.denyMove; break;
case "放置方块": land.denyBlockPlace = !land.denyBlockPlace; break;
case "破坏方块": land.denyBlockBreak = !land.denyBlockBreak; break;
case "生物蛋": land.denySpawnEgg = !land.denySpawnEgg; break;
case "涂蜡/刮蜡": land.denyWax = !land.denyWax; break;
case "实体交互(船/矿车/盔甲架/展示框)": land.denyEntityInteract = !land.denyEntityInteract; break;
case "容器管理": land.denyContainer = !land.denyContainer; break;
case "玩家对战": land.denyPVP = !land.denyPVP; break;
@@ -1153,6 +1163,7 @@ public class AreaGUIManager implements Listener {
// 切换权限
String[][] permDefs = {
{"移动", "denyMove"}, {"放置方块", "denyBlockPlace"}, {"破坏方块", "denyBlockBreak"},
{"生物蛋", "denySpawnEgg"}, {"涂蜡/刮蜡", "denyWax"},
{"实体交互", "denyEntityInteract"},
{"容器管理", "denyContainer"}, {"玩家对战", "denyPVP"}, {"骑乘坐具", "denyMount"}, {"投掷末影珍珠", "denyEnderPearl"},
{"投掷物", "denyThrownProjectiles"}, {"禁止袭击", "denyRaid"}, {"弓箭射击", "denyBow"},
@@ -1164,7 +1175,8 @@ public class AreaGUIManager implements Listener {
{"农作物收获", "denyCropHarvest"}, {"剪切羊毛", "denyWoolShear"}, {"投喂动物", "denyAnimalFeeding"},
{"攻击生物", "denyMobAttack"},
{"禁止编辑告示牌", "denySignEdit"},
{"玩家发光", "denyGlowing"}, {"传送", "allowTeleport"}, {"和平模式", "peaceMode"}
{"玩家发光", "denyGlowing"}, {"传送", "allowTeleport"}, {"和平模式", "peaceMode"},
{"耕地破坏", "denyFarmlandTrample"}, {"末影人行为", "denyEnderTeleport"}
};
if (raw < permDefs.length) {
+110 -7
View File
@@ -1233,6 +1233,8 @@ public class AreaProtection implements Listener {
try { ac.denyContainer = rs.getInt("deny_container") == 1; } catch (Exception ignored) {}
try { ac.denyMobAttack = rs.getInt("deny_mob_attack") == 1; } catch (Exception ignored) {}
try { ac.denySignEdit = rs.getInt("deny_sign_edit") == 1; } catch (Exception ignored) {}
try { ac.denySpawnEgg = rs.getInt("deny_spawn_egg") == 1; } catch (Exception ignored) {}
try { ac.denyWax = rs.getInt("deny_wax") == 1; } catch (Exception ignored) {}
try { ac.warpX = rs.getDouble("warp_x"); } catch (Exception ignored) {}
try { ac.warpY = rs.getDouble("warp_y"); } catch (Exception ignored) {}
try { ac.warpZ = rs.getDouble("warp_z"); } catch (Exception ignored) {}
@@ -1529,6 +1531,10 @@ public class AreaProtection implements Listener {
// ★ 二级权限:实体交互(受一级放置/破坏总开关影响)
try { stmt.executeUpdate("ALTER TABLE area_lands ADD COLUMN deny_entity_interact INTEGER DEFAULT 0"); } catch (Exception ignored) {}
try { stmt.executeUpdate("ALTER TABLE area_lands ADD COLUMN create_cost INTEGER DEFAULT 0"); } catch (Exception ignored) {}
// ★ 生物蛋权限列(上级权限:放置方块)
try { stmt.executeUpdate("ALTER TABLE area_lands ADD COLUMN deny_spawn_egg INTEGER DEFAULT 0"); } catch (Exception ignored) {}
// ★ 涂蜡/刮蜡权限列(上级权限:破坏方块/放置方块)
try { stmt.executeUpdate("ALTER TABLE area_lands ADD COLUMN deny_wax INTEGER DEFAULT 0"); } catch (Exception ignored) {}
// ★ 全局配置默认值
try {
@@ -2913,6 +2919,32 @@ public class AreaProtection implements Listener {
return getLandDefaultDeny(ac, permName);
}
/** ★ 是否为刷怪蛋(生物蛋)物品 */
private static boolean isSpawnEggItem(Material m) {
return m != null && m.name().endsWith("_SPAWN_EGG");
}
/**
* ★ 涂蜡/刮蜡权限是否生效:
* 本权限为二级权限,上级权限=破坏方块/放置方块,
* 上级两项都未开启时,单独开启本项不生效。
*/
private boolean isWaxDenied(Player player, AreaConfig ac) {
if (ac == null) return false;
if (!getEffectiveDeny(player, ac, "denyWax")) return false;
return getEffectiveDeny(player, ac, "denyBlockBreak")
|| getEffectiveDeny(player, ac, "denyBlockPlace");
}
/** ★ 可涂蜡/刮蜡的方块(铜质方块、避雷针、告示牌) */
private static boolean isWaxableBlock(Block b) {
if (b == null) return false;
String n = b.getType().name();
if (n.contains("COPPER") && !n.contains("RAW_COPPER")) return true;
if (n.equals("LIGHTNING_ROD")) return true;
return n.endsWith("_SIGN");
}
/**
* 获取领地默认deny状态(按字段名映射)
*/
@@ -2952,6 +2984,8 @@ public class AreaProtection implements Listener {
case "denyAnimalFeeding": return ac.denyAnimalFeeding;
case "denyMobAttack": return ac.denyMobAttack;
case "denySignEdit": return ac.denySignEdit;
case "denySpawnEgg": return ac.denySpawnEgg;
case "denyWax": return ac.denyWax;
case "peaceMode": return ac.peaceMode;
default: return false;
}
@@ -5086,6 +5120,15 @@ public class AreaProtection implements Listener {
loc.getBlockZ());
if (ac == null) return;
// ★ 生物蛋权限:上级权限=放置方块(放置未开启时,单独开启生物蛋不生效)
if (isSpawnEggItem(p.getInventory().getItemInMainHand().getType())
&& getEffectiveDeny(p, ac, "denyBlockPlace")
&& getEffectiveDeny(p, ac, "denySpawnEgg")) {
e.setCancelled(true);
p.sendMessage("§c§l[区域防护] §f禁止使用生物蛋");
return;
}
// 层级:denyBlockPlace (一级) → denyEntityInteract (二级) → denyItemFrame (三级)
if (getEffectiveDeny(p, ac, "denyBlockPlace")) {
e.setCancelled(true);
@@ -5326,6 +5369,43 @@ public class AreaProtection implements Listener {
}
}
// ===== 涂蜡/刮蜡权限(denyWax)=====
// 上级权限=破坏方块/放置方块:两者都未开启时,单独开启本项不生效
if (e.getAction() == Action.RIGHT_CLICK_BLOCK) {
Block waxBlock = e.getClickedBlock();
if (waxBlock != null) {
Material waxMat = hand.getType();
boolean waxOn = waxMat == Material.HONEYCOMB && isWaxableBlock(waxBlock);
boolean waxOff = waxMat.name().endsWith("_AXE") && isWaxableBlock(waxBlock);
if (waxOn || waxOff) {
AreaConfig waxAc = getArea(waxBlock.getWorld().getName(),
waxBlock.getX(), waxBlock.getY(), waxBlock.getZ());
if (isWaxDenied(p, waxAc)) {
e.setCancelled(true);
p.sendMessage("§c§l[区域防护] §f禁止" + (waxOn ? "涂蜡" : "刮蜡"));
return;
}
}
}
}
// ===== 生物蛋权限(denySpawnEgg)=====
// 上级权限=放置方块:放置未开启时,单独开启本项不生效
if (isSpawnEggItem(hand.getType())
&& (e.getAction() == Action.RIGHT_CLICK_BLOCK || e.getAction() == Action.RIGHT_CLICK_AIR)) {
Block eggBlock = e.getClickedBlock();
Location eggLoc = (eggBlock != null) ? eggBlock.getLocation() : p.getLocation();
AreaConfig eggAc = getArea(p.getWorld().getName(),
eggLoc.getBlockX(), eggLoc.getBlockY(), eggLoc.getBlockZ());
if (eggAc != null
&& getEffectiveDeny(p, eggAc, "denyBlockPlace")
&& getEffectiveDeny(p, eggAc, "denySpawnEgg")) {
e.setCancelled(true);
p.sendMessage("§c§l[区域防护] §f禁止使用生物蛋");
return;
}
}
// ===== 实体类物品放置:层级管控 =====
// Level 1: denyBlockPlace(一级总开关)→ 禁止一切放置
// Level 2: denyEntityInteract(二级实体交互)→ 禁止实体交互
@@ -6087,6 +6167,19 @@ public class AreaProtection implements Listener {
if (!(e.getPlayer() instanceof Player)) return;
Player p = e.getPlayer();
Entity entity = e.getRightClicked();
// ★ 蜜脾涂蜡实体(铜傀儡等):受涂蜡权限管控(上级=破坏方块/放置方块)
ItemStack waxHand = p.getInventory().getItemInMainHand();
if (waxHand != null && waxHand.getType() == Material.HONEYCOMB) {
Location waxLoc = entity.getLocation();
AreaConfig waxAc = getArea(waxLoc.getWorld().getName(),
waxLoc.getBlockX(), waxLoc.getBlockY(), waxLoc.getBlockZ());
if (isWaxDenied(p, waxAc)) {
e.setCancelled(true);
p.sendMessage("§c§l[区域防护] §f禁止涂蜡");
return;
}
}
// 只检测动物类
String typeName = entity.getType().name();
if (!(entity instanceof Animals || typeName.contains("IRON_GOLEM")
@@ -7911,11 +8004,11 @@ public class AreaProtection implements Listener {
break;
}
}
// ★ 非管理员携带 -f:不报错、不提示,静默回退到普通60秒删除流程
if (forceDelete && !isAreaAdmin(sender)) {
forceDelete = false;
}
if (forceDelete) {
if (!isAreaAdmin(sender)) {
sender.sendMessage("§c强制删除(-f)仅插件管理员可用");
return true;
}
if (delAc == null) {
sender.sendMessage("§c领地数据异常: " + areaName);
return true;
@@ -9391,8 +9484,8 @@ public class AreaProtection implements Listener {
+ "confiscate_msg, enable_announce, announce_template, txt_content, created_at, "
+ "deny_thrown_projectiles, deny_glowing, deny_redstone_interaction, deny_door_interaction, "
+ "deny_noteblock_jukebox, deny_lead, deny_crop_harvest, deny_wool_shear, deny_animal_feeding, "
+ "warp_x, warp_y, warp_z, warp_yaw, warp_pitch, warp_world, deny_container, deny_mob_attack, deny_sign_edit, is_public_building, allow_visitor_teleport, deny_farmland_trample, deny_ender_teleport, create_cost) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
+ "warp_x, warp_y, warp_z, warp_yaw, warp_pitch, warp_world, deny_container, deny_mob_attack, deny_sign_edit, is_public_building, allow_visitor_teleport, deny_farmland_trample, deny_ender_teleport, create_cost, deny_spawn_egg, deny_wax) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
+ "ON CONFLICT(name) DO UPDATE SET "
+ "owner=excluded.owner, world=excluded.world, x1=excluded.x1, z1=excluded.z1, x2=excluded.x2, z2=excluded.z2, y_min=excluded.y_min, y_max=excluded.y_max, "
+ "confiscate_items=excluded.confiscate_items, deny_use_items=excluded.deny_use_items, give_effects=excluded.give_effects, clear_effects=excluded.clear_effects, clear_all_bad=excluded.clear_all_bad, "
@@ -9405,7 +9498,7 @@ public class AreaProtection implements Listener {
+ "confiscate_msg=excluded.confiscate_msg, enable_announce=excluded.enable_announce, announce_template=excluded.announce_template, txt_content=excluded.txt_content, created_at=excluded.created_at, "
+ "deny_thrown_projectiles=excluded.deny_thrown_projectiles, deny_glowing=excluded.deny_glowing, deny_redstone_interaction=excluded.deny_redstone_interaction, deny_door_interaction=excluded.deny_door_interaction, "
+ "deny_noteblock_jukebox=excluded.deny_noteblock_jukebox, deny_lead=excluded.deny_lead, deny_crop_harvest=excluded.deny_crop_harvest, deny_wool_shear=excluded.deny_wool_shear, deny_animal_feeding=excluded.deny_animal_feeding, "
+ "warp_x=excluded.warp_x, warp_y=excluded.warp_y, warp_z=excluded.warp_z, warp_yaw=excluded.warp_yaw, warp_pitch=excluded.warp_pitch, warp_world=excluded.warp_world, deny_container=excluded.deny_container, deny_mob_attack=excluded.deny_mob_attack, deny_sign_edit=excluded.deny_sign_edit, is_public_building=excluded.is_public_building, allow_visitor_teleport=excluded.allow_visitor_teleport, deny_farmland_trample=excluded.deny_farmland_trample, deny_ender_teleport=excluded.deny_ender_teleport, create_cost=excluded.create_cost");
+ "warp_x=excluded.warp_x, warp_y=excluded.warp_y, warp_z=excluded.warp_z, warp_yaw=excluded.warp_yaw, warp_pitch=excluded.warp_pitch, warp_world=excluded.warp_world, deny_container=excluded.deny_container, deny_mob_attack=excluded.deny_mob_attack, deny_sign_edit=excluded.deny_sign_edit, is_public_building=excluded.is_public_building, allow_visitor_teleport=excluded.allow_visitor_teleport, deny_farmland_trample=excluded.deny_farmland_trample, deny_ender_teleport=excluded.deny_ender_teleport, create_cost=excluded.create_cost, deny_spawn_egg=excluded.deny_spawn_egg, deny_wax=excluded.deny_wax");
stmt.setString(1, ac.name);
stmt.setString(2, ac.owner != null ? ac.owner : "");
@@ -9477,6 +9570,8 @@ public class AreaProtection implements Listener {
stmt.setInt(68, ac.denyFarmlandTrample ? 1 : 0);
stmt.setInt(69, ac.denyEnderTeleport ? 1 : 0);
stmt.setInt(70, ac.createCost);
stmt.setInt(71, ac.denySpawnEgg ? 1 : 0);
stmt.setInt(72, ac.denyWax ? 1 : 0);
stmt.executeUpdate();
stmt.close();
// ★ 领地设置变更:立即触发PHP同步(防抖10秒)
@@ -9881,6 +9976,8 @@ public class AreaProtection implements Listener {
case "deny_crop_harvest": ac.denyCropHarvest = "1".equals(value); break;
case "deny_wool_shear": ac.denyWoolShear = "1".equals(value); break;
case "deny_animal_feeding": ac.denyAnimalFeeding = "1".equals(value); break;
case "deny_spawn_egg": ac.denySpawnEgg = "1".equals(value); break;
case "deny_wax": ac.denyWax = "1".equals(value); break;
case "deny_mob_attack": ac.denyMobAttack = "1".equals(value); break;
case "deny_item_frame": ac.denyItemFrame = "1".equals(value); break;
case "deny_entity_interact": ac.denyEntityInteract = "1".equals(value); break;
@@ -12082,6 +12179,10 @@ public class AreaProtection implements Listener {
public boolean denyWoolShear = false;
// ★ 投喂动物
public boolean denyAnimalFeeding = false;
// ★ 生物蛋(右键刷怪蛋生成实体)——上级权限:放置方块(放置未开启时单独开启本项不生效)
public boolean denySpawnEgg = false;
// ★ 涂蜡/刮蜡(蜜脾涂蜡、斧头刮蜡)——上级权限:破坏方块/放置方块(两者都未开启时单独开启本项不生效)
public boolean denyWax = false;
// ★ 玩家攻击生物
public boolean denyMobAttack = false;
public boolean enableAnnounce = false;
@@ -12228,6 +12329,8 @@ public class AreaProtection implements Listener {
if (denyCropHarvest) c++;
if (denyWoolShear) c++;
if (denyAnimalFeeding) c++;
if (denySpawnEgg) c++;
if (denyWax) c++;
if (!peaceWhitelist.isEmpty()) c++;
return c;
@@ -201,6 +201,10 @@ public class ChatFilterManager {
}
int kind = rand.nextInt(5); // 0加 1减 2乘 3除 4GUI
// ★ 基岩版特性:没法用聊天框唤醒GUI验证码 → 基岩版固定出算术题
if (kind == 4 && online != null && isBedrockPlayer(online)) {
kind = rand.nextInt(4); // 0加 1减 2乘 3除
}
if (kind == 4) {
generateGUIChallenge(playerName, rand);
} else {
@@ -208,6 +212,20 @@ public class ChatFilterManager {
}
}
/** ★ 基岩版玩家判定:UUID特征 + Geyser/Floodgate API 兜底 */
private boolean isBedrockPlayer(Player p) {
if (!(plugin instanceof Main)) return false;
Main main = (Main) plugin;
try {
VerificationManager vm = main.getVerification();
if (vm != null && vm.isBedrockPlayer(p)) return true;
TeleportManager tm = main.getTeleport();
return tm != null && tm.isBedrockPlayer(p);
} catch (Throwable t) {
return false;
}
}
/** 关掉还开着的验证码GUI(标题匹配才关,避免误关玩家自己的箱子/菜单) */
private void closeVerificationGuiIfOpen(Player p) {
try {
+8 -2
View File
@@ -288,6 +288,10 @@ public class Main extends JavaPlugin
return verification;
}
public TeleportManager getTeleport() {
return teleportMgr;
}
public RiskControlManager getRiskControl() {
return riskControl;
}
@@ -7962,7 +7966,8 @@ public class Main extends JavaPlugin
"fire", "fire_spread", "pickup", "drop", "explosion",
"fall_damage", "hunger", "all_damage", "all_effects",
"item_frame", "redstone", "door", "audio", "lead",
"crop_harvest", "wool_shear", "animal_feed", "glowing", "peace_mode"),
"crop_harvest", "wool_shear", "animal_feed", "glowing", "peace_mode",
"spawn_egg", "wax"),
args[3]);
}
if (action.equals("manage") || action.equals("members")
@@ -7999,7 +8004,8 @@ public class Main extends JavaPlugin
"denyFire", "denyFireSpread", "denyPickup", "denyDrop", "denyExplosion",
"denyFallDamage", "denyHunger", "denyAllDamage", "denyAllEffects",
"denyItemFrame", "denyRedstoneInteraction", "denyDoorInteraction", "denyNoteblockJukebox",
"denyLead", "denyCropHarvest", "denyWoolShear", "denyAnimalFeeding", "denyGlowing", "peaceMode"),
"denyLead", "denyCropHarvest", "denyWoolShear", "denyAnimalFeeding", "denyGlowing", "peaceMode",
"denySpawnEgg", "denyWax"),
args[4]);
}
}
@@ -258,7 +258,8 @@ public class TeleportManager implements Listener {
/**
* 判断是否为基岩版玩家(通过Geyser/Floodgate API)
*/
private boolean isBedrockPlayer(Player player) {
// ★ 公开:验证码(ChatFilterManager)复用此判定,保证基岩版不出GUI题
public boolean isBedrockPlayer(Player player) {
// 检查 Geyser-Spigot 插件
Plugin geyserPlugin = Bukkit.getPluginManager().getPlugin("Geyser-Spigot");
if (geyserPlugin == null || !geyserPlugin.isEnabled()) {
+2
View File
@@ -3383,6 +3383,8 @@ public class WebManager {
hashBuilder.append(land.getOrDefault("deny_crop_harvest", 0)).append(":");
hashBuilder.append(land.getOrDefault("deny_wool_shear", 0)).append(":");
hashBuilder.append(land.getOrDefault("deny_animal_feeding", 0)).append(":");
hashBuilder.append(land.getOrDefault("deny_spawn_egg", 0)).append(":");
hashBuilder.append(land.getOrDefault("deny_wax", 0)).append(":");
hashBuilder.append(land.getOrDefault("deny_mob_attack", 0)).append(":");
hashBuilder.append(land.getOrDefault("deny_fire", 0)).append(":");
hashBuilder.append(land.getOrDefault("deny_all_effects", 0)).append(":");