From 9e3182e1a1cb9604d2acc53bd269769322801033 Mon Sep 17 00:00:00 2001 From: youpaishidifu Date: Wed, 24 Jun 2026 01:22:59 +0800 Subject: [PATCH] =?UTF-8?q?fix:=208=E9=A1=B9=E9=97=AE=E9=A2=98=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=201.=20PHP=E7=99=BB=E5=BD=95=E5=AE=89=E5=85=A8:=20pla?= =?UTF-8?q?yer.php=E6=94=B9=E7=94=A8web=5Flogin=5Frequest=E8=B5=B0Java?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=202.=20=E5=9C=88=E5=9C=B0=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E6=94=B9=E4=B8=BABLAZE=5FROD(=E9=81=BF=E5=85=8D=E6=8A=95?= =?UTF-8?q?=E5=BD=B1mod=E5=86=B2=E7=AA=81)=203.=20CLI=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=90=8E=E6=89=93=E5=8D=B0=E6=96=B0=E7=89=88=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=86=85=E5=AE=B9=204.=20=E6=99=BA=E8=83=BD=E6=95=B0=E5=AD=97?= =?UTF-8?q?=E8=A7=A3=E6=9E=90:=20=E6=94=AF=E6=8C=81+/-=E5=89=8D=E7=BC=80?= =?UTF-8?q?=E3=80=81=E4=B8=AD=E8=8B=B1=E6=96=87/=E7=BD=97=E9=A9=AC?= =?UTF-8?q?=E6=95=B0=E5=AD=97=E3=80=81=E5=B0=81=E5=BA=95=E5=80=BC=205.=20?= =?UTF-8?q?=E5=88=A0=E9=99=A4upload=5Fsftp.py=E6=95=8F=E6=84=9F=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=B9=B6=E5=8A=A0=E5=85=A5gitignore=206.=20CLI?= =?UTF-8?q?=E6=88=90=E5=91=98=E6=9D=83=E9=99=90=E9=A1=B5=E9=9D=A2=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=89=80=E6=9C=89=E8=80=85/=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=98=E6=9D=83=E9=99=90=E6=A3=80=E6=9F=A5=207.=20GUI?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E7=A7=BB=E9=99=A4=E5=86=97=E4=BD=99sendMessa?= =?UTF-8?q?ge=E8=B0=83=E7=94=A8(=E6=B6=88=E6=81=AF=E4=B8=8D=E5=A4=96?= =?UTF-8?q?=E6=B3=84)=208.=20AreaCLIManager=E5=8F=98=E9=87=8F=E5=90=8D?= =?UTF-8?q?=E5=86=B2=E7=AA=81=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + src/main/java/Sdf1_login/AreaCLIManager.java | 20 ++++- src/main/java/Sdf1_login/AreaGUIManager.java | 20 ++--- src/main/java/Sdf1_login/AreaProtection.java | 77 ++++++++++++++++---- upload_sftp.py | 16 ---- 5 files changed, 91 insertions(+), 43 deletions(-) delete mode 100644 upload_sftp.py diff --git a/.gitignore b/.gitignore index 1baf1b3..3599fd1 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,7 @@ txt/ backup/ 新建*.txt 群戏归类.txt +upload_sftp.py # PHP Web 后端 web/Web.db diff --git a/src/main/java/Sdf1_login/AreaCLIManager.java b/src/main/java/Sdf1_login/AreaCLIManager.java index 76aff45..b64d29e 100644 --- a/src/main/java/Sdf1_login/AreaCLIManager.java +++ b/src/main/java/Sdf1_login/AreaCLIManager.java @@ -645,6 +645,14 @@ public class AreaCLIManager { return; } + // ★ 权限检查:只有所有者或管理员能编辑成员权限 + boolean isOwner = p.getName().equalsIgnoreCase(land.owner); + boolean isAdmin = areaProtect.isAreaAdmin(p); + if (!isOwner && !isAdmin) { + p.sendMessage(Component.text("§c需要领地所有者或管理员权限")); + return; + } + // 获取成员列表 Set members = areaProtect.getAreaMembers(landName); if (members == null || members.isEmpty()) { @@ -668,9 +676,9 @@ public class AreaCLIManager { for (int i = start; i < end; i++) { String member = memberList.get(i); - boolean isOwner = member.equalsIgnoreCase(land.owner); + boolean isMemberOwner = member.equalsIgnoreCase(land.owner); - String roleTag = isOwner ? " §c[所有者]" : ""; + String roleTag = isMemberOwner ? " §c[所有者]" : ""; Component line = Component.empty(); line = line.append(Component.text("§e● " + member + roleTag)); line = line.append(Component.text(" ")); @@ -720,6 +728,14 @@ public class AreaCLIManager { return; } + // ★ 权限检查:只有所有者或管理员能编辑成员权限 + boolean isOwner = p.getName().equalsIgnoreCase(land.owner); + boolean isAdmin = areaProtect.isAreaAdmin(p); + if (!isOwner && !isAdmin) { + p.sendMessage(Component.text("§c需要领地所有者或管理员权限")); + return; + } + int landId = areaProtect.getLandIdFromDb(landName); if (landId <= 0) { p.sendMessage(Component.text("§c领地数据库ID获取失败")); diff --git a/src/main/java/Sdf1_login/AreaGUIManager.java b/src/main/java/Sdf1_login/AreaGUIManager.java index 05efcaa..09ef220 100644 --- a/src/main/java/Sdf1_login/AreaGUIManager.java +++ b/src/main/java/Sdf1_login/AreaGUIManager.java @@ -698,7 +698,7 @@ public class AreaGUIManager implements Listener { (land.z1 + land.z2) / 2.0 ); p.teleport(tpLoc); - p.sendMessage("§a已传送到领地: " + land.name); + // ★ GUI模式不发送聊天消息 } } else if (raw == 45 && page > 0) { openLandList(p, page - 1); @@ -737,7 +737,7 @@ public class AreaGUIManager implements Listener { (land.z1 + land.z2) / 2.0 ); p.teleport(tpLoc); - p.sendMessage("§a已传送到领地: " + landName); + // ★ GUI模式不发送聊天消息 } } else if (raw == 48) { openLandList(p, 0); @@ -765,7 +765,7 @@ public class AreaGUIManager implements Listener { } else if (event.isRightClick()) { // 右键:移除成员 areaProtect.removeLandMember(landName, member); - p.sendMessage("§a已移除成员: " + member); + // ★ GUI模式不发送聊天消息 openMemberList(p, landName, page); } } else if (raw == 45) { @@ -797,7 +797,7 @@ public class AreaGUIManager implements Listener { if (raw >= 0 && raw < (end - start)) { PermEntry perm = perms.get(start + raw); togglePerm(land, perm.name); - p.sendMessage("§a已切换权限: " + perm.name); + // ★ GUI模式不发送聊天消息(视觉反馈已在GUI中体现) openVisitorPerm(p, landName, page); } else if (raw == 45 && page > 0) { openVisitorPerm(p, landName, page - 1); @@ -871,13 +871,13 @@ public class AreaGUIManager implements Listener { : getLandDefaultVal(land, field); boolean newVal = !currentVal; areaProtect.setPlayerPerm(landId, targetPlayer, field, newVal); - p.sendMessage("§a已设置 §e" + targetPlayer + " §a的权限"); + // ★ GUI模式不发送聊天消息 openPlayerPerm(p, landName, targetPlayer); } } else if (raw == 48) { // 清除所有自定义权限 areaProtect.setPlayerPermJson(landId, targetPlayer, ""); - p.sendMessage("§a已清除 §e" + targetPlayer + " §a的所有自定义权限"); + // ★ GUI模式不发送聊天消息 openMemberPermList(p, landName); } else if (raw == 49) { // 返回成员列表 @@ -900,7 +900,7 @@ public class AreaGUIManager implements Listener { String playerName = meta.getDisplayName() .replaceAll("§[0-9a-fk-orA-FK-OR]", ""); areaProtect.addLandMember(landName, playerName); - p.sendMessage("§a已添加成员: " + playerName); + // ★ GUI模式不发送聊天消息 openAddMember(p, landName); } } @@ -923,13 +923,13 @@ public class AreaGUIManager implements Listener { // 切换公告 land.enableAnnounce = !land.enableAnnounce; areaProtect.saveAreaToDb(land); - p.sendMessage("§a领地公告: " + (land.enableAnnounce ? "§a已启用" : "§c已禁用")); + // ★ GUI模式不发送聊天消息 openLandSettings(p, landName); } else if (raw == 13) { // 切换和平模式 land.peaceMode = !land.peaceMode; areaProtect.saveAreaToDb(land); - p.sendMessage("§a和平模式: " + (land.peaceMode ? "§a已启用" : "§c已禁用")); + // ★ GUI模式不发送聊天消息 openLandSettings(p, landName); } else if (raw == 15) { // 切换强制游戏模式 @@ -1103,7 +1103,7 @@ public class AreaGUIManager implements Listener { } } p.getInventory().addItem(wand); - p.sendMessage("§a已获取圈地工具(木棍),左键/右键选择区域边界"); + // ★ GUI模式不发送聊天消息 areaProtect.wandCooldownMap.put(p.getUniqueId(), now); } diff --git a/src/main/java/Sdf1_login/AreaProtection.java b/src/main/java/Sdf1_login/AreaProtection.java index 5b94641..b6a30b2 100644 --- a/src/main/java/Sdf1_login/AreaProtection.java +++ b/src/main/java/Sdf1_login/AreaProtection.java @@ -101,7 +101,7 @@ public class AreaProtection implements Listener { private int globalDefaultHeight = 255; // 默认高度 // 选地 - private static final Material WAND = Material.BREEZE_ROD; + private static final Material WAND = Material.BLAZE_ROD; private final Map pos1 = new ConcurrentHashMap<>(); @@ -4165,7 +4165,7 @@ public class AreaProtection implements Listener { if (hand == null) return; // ===== 选区工具 ===== - if (hand.getType() == Material.BREEZE_ROD) { + if (hand.getType() == Material.BLAZE_ROD) { ItemMeta meta = hand.getItemMeta(); if (meta != null && meta.getDisplayName() != null && meta.getDisplayName().contains("区域选择")) { @@ -5339,29 +5339,33 @@ public class AreaProtection implements Listener { try { switch (key) { case "create_price": - globalCreatePricePerSqm = Integer.parseInt(value); - updateAreaConfig("create_price_per_sqm", value); - sender.sendMessage("§a创建价格已更新为: " + value + "/㎡"); + globalCreatePricePerSqm = parseSmartNumber(value, globalCreatePricePerSqm, 0); + updateAreaConfig("create_price_per_sqm", String.valueOf(globalCreatePricePerSqm)); break; case "max_lands": - globalMaxLandsPerPlayer = Integer.parseInt(value); - updateAreaConfig("max_lands_per_player", value); - sender.sendMessage("§a每人最大领地数已更新为: " + value); + globalMaxLandsPerPlayer = parseSmartNumber(value, globalMaxLandsPerPlayer, 1); + updateAreaConfig("max_lands_per_player", String.valueOf(globalMaxLandsPerPlayer)); break; case "default_height": - updateAreaConfig("default_height", value); - sender.sendMessage("§a默认高度已更新为: " + value); + int newHeight = parseSmartNumber(value, 255, 1); + updateAreaConfig("default_height", String.valueOf(newHeight)); break; case "peace_duration": - updateAreaConfig("peace_mode_max_duration", value); - sender.sendMessage("§a和平模式最大时长已更新为: " + value + "秒"); + int newDuration = parseSmartNumber(value, 3600, 0); + updateAreaConfig("peace_mode_max_duration", String.valueOf(newDuration)); break; default: sender.sendMessage("§c未知配置项: " + key); - break; + return true; } - } catch (NumberFormatException e) { - sender.sendMessage("§c值必须是数字"); + // ★ 更新后显示完整配置页面(而非仅打印"已更新") + if (plugin.areaCLIManager != null) { + plugin.areaCLIManager.showConfigPage((Player) sender); + } else { + sender.sendMessage("§a配置已更新"); + } + } catch (Exception e) { + sender.sendMessage("§c无效的值: " + value + "(支持: 纯数字、+/-前缀、中文数字、罗马数字、英文数字)"); } return true; } @@ -6935,6 +6939,49 @@ public class AreaProtection implements Listener { if (input == null || input.isEmpty()) return null; input = input.trim().toLowerCase(); + // ★ 支持 +/- 前缀(相对增减) + if (input.startsWith("+") || input.startsWith("-")) { + // +/- 前缀需要有后续数字 + String numPart = input.substring(1).trim(); + if (numPart.isEmpty()) return null; + Integer delta = parseSmartNumberBase(numPart); + if (delta == null) return null; + return input.startsWith("-") ? -delta : delta; + } + + return parseSmartNumberBase(input); + } + + /** + * ★ 智能数字解析(带默认值和下限) + * @param input 用户输入 + * @param current 当前值(用于 +/- 计算) + * @param floor 最小值(封底) + */ + public static int parseSmartNumber(String input, int current, int floor) { + if (input == null || input.isEmpty()) return current; + input = input.trim().toLowerCase(); + + // ★ 支持 +/- 前缀(相对增减) + if (input.startsWith("+") || input.startsWith("-")) { + String numPart = input.substring(1).trim(); + if (numPart.isEmpty()) return current; + Integer delta = parseSmartNumberBase(numPart); + if (delta == null) return current; + int result = input.startsWith("-") ? current - delta : current + delta; + return Math.max(result, floor); + } + + // 纯数字(绝对值) + Integer abs = parseSmartNumberBase(input); + if (abs == null) return current; + return Math.max(abs, floor); + } + + private static Integer parseSmartNumberBase(String input) { + if (input == null || input.isEmpty()) return null; + input = input.trim().toLowerCase(); + // 1. 纯数字 try { return Integer.parseInt(input); diff --git a/upload_sftp.py b/upload_sftp.py deleted file mode 100644 index abb4d1c..0000000 --- a/upload_sftp.py +++ /dev/null @@ -1,16 +0,0 @@ -import paramiko -import sys - -ssh = paramiko.SSHClient() -ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) -try: - ssh.connect('sfe4-connect.simpfun.cn', port=2046, username='sfe3192491.df7d2f7f', password='5350427807', timeout=30) - sftp = ssh.open_sftp() - sftp.put('D:/桌面/源码/mc_plugn/Sdf1_login/target/Sdf1_login.jar', '/plugins/Sdf1_login.jar') - sftp.close() - print('SFTP upload success') -except Exception as e: - print(f'Error: {e}', file=sys.stderr) - sys.exit(1) -finally: - ssh.close()