From c303849335dafdfb3e27a0f96ba2c0b5a5f6b352 Mon Sep 17 00:00:00 2001 From: youpaishidifu Date: Mon, 29 Jun 2026 21:29:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=89=80=E6=9C=89=E8=BD=AC=E8=AE=A9?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E5=A2=9E=E5=8A=A0=E6=B3=A8=E5=86=8C=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E2=89=A55=E5=88=86=E9=92=9F=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WebManager: 管理面板改主和玩家过户都验证register_time - AreaProtection: 游戏内转让也验证register_time - 防止注册秒退玩家接收领地,确保玩家是真实有效 --- src/main/java/Sdf1_login/AreaProtection.java | 44 ++++++++++++++++++++ src/main/java/Sdf1_login/WebManager.java | 44 +++++++++++++++++++- 2 files changed, 87 insertions(+), 1 deletion(-) diff --git a/src/main/java/Sdf1_login/AreaProtection.java b/src/main/java/Sdf1_login/AreaProtection.java index 7abbd07..f6cb07d 100644 --- a/src/main/java/Sdf1_login/AreaProtection.java +++ b/src/main/java/Sdf1_login/AreaProtection.java @@ -7459,6 +7459,28 @@ public class AreaProtection implements Listener { return true; } + // ★ 验证玩家注册时间必须超过5分钟(防止注册秒退玩家接收领地) + if (dbMgr != null) { + long registerTime = 0; + try { + Object regTimeObj = dbMgr.getField(newOwner, "register_time"); + if (regTimeObj instanceof Number) { + registerTime = ((Number) regTimeObj).longValue(); + } + } catch (Exception e) { + // 忽略异常 + } + if (registerTime > 0) { + long now = System.currentTimeMillis(); + long fiveMinutesMs = 5 * 60 * 1000; + if (now - registerTime < fiveMinutesMs) { + long minutesLeft = (fiveMinutesMs - (now - registerTime)) / 60000; + sender.sendMessage("§c玩家 §e" + newOwner + " §c注册时间不足5分钟(还差" + minutesLeft + "分钟)"); + return true; + } + } + } + // ★ 执行转让 ac.owner = newOwner; saveAreaToDb(ac); @@ -8511,6 +8533,28 @@ public class AreaProtection implements Listener { return true; } + // ★ 验证玩家注册时间必须超过5分钟(防止注册秒退玩家接收领地) + if (dbMgr != null) { + long registerTime = 0; + try { + Object regTimeObj = dbMgr.getField(newOwner, "register_time"); + if (regTimeObj instanceof Number) { + registerTime = ((Number) regTimeObj).longValue(); + } + } catch (Exception e) { + // 忽略异常 + } + if (registerTime > 0) { + long now = System.currentTimeMillis(); + long fiveMinutesMs = 5 * 60 * 1000; + if (now - registerTime < fiveMinutesMs) { + long minutesLeft = (fiveMinutesMs - (now - registerTime)) / 60000; + p.sendMessage("§c玩家 §e" + newOwner + " §c注册时间不足5分钟(还差" + minutesLeft + "分钟)"); + return true; + } + } + } + // 执行转让 String oldOwner = ac.owner; ac.owner = newOwner; diff --git a/src/main/java/Sdf1_login/WebManager.java b/src/main/java/Sdf1_login/WebManager.java index b2d93c8..57ee897 100644 --- a/src/main/java/Sdf1_login/WebManager.java +++ b/src/main/java/Sdf1_login/WebManager.java @@ -3522,7 +3522,28 @@ public class WebManager { applied = false; break; } - // 2. 执行改主 + // 2. 验证玩家注册时间必须超过5分钟(防止注册秒退玩家接收领地) + long registerTime = 0; + try { + Object regTimeObj = plugin.getDb().getField(newOwner, "register_time"); + if (regTimeObj instanceof Number) { + registerTime = ((Number) regTimeObj).longValue(); + } + } catch (Exception e) { + // 忽略异常 + } + if (registerTime > 0) { + long now = System.currentTimeMillis(); + long fiveMinutesMs = 5 * 60 * 1000; + if (now - registerTime < fiveMinutesMs) { + long minutesLeft = (fiveMinutesMs - (now - registerTime)) / 60000; + plugin.getLogger().warning("[Web通信] 管理面板改主失败: 玩家 " + newOwner + " 注册时间不足5分钟(还差" + minutesLeft + "分钟)"); + callbackOwnerChangeToPHP(id, false, "玩家 " + newOwner + " 注册时间不足5分钟(还差" + minutesLeft + "分钟)"); + applied = false; + break; + } + } + // 3. 执行改主 areaProtect.setLandOwnerFromWeb(landName, newOwner); plugin.getLogger().info("[Web通信] PHP端领地所有者变更: " + landName + " → " + newOwner); // 3. 回调PHP更新本地副本 @@ -3677,6 +3698,27 @@ public class WebManager { return false; } + // ★ 验证玩家注册时间必须超过5分钟(防止注册秒退玩家接收领地) + long registerTime = 0; + try { + Object regTimeObj = dbMgr.getField(newOwner, "register_time"); + if (regTimeObj instanceof Number) { + registerTime = ((Number) regTimeObj).longValue(); + } + } catch (Exception e) { + // 忽略异常 + } + if (registerTime > 0) { + long now = System.currentTimeMillis(); + long fiveMinutesMs = 5 * 60 * 1000; + if (now - registerTime < fiveMinutesMs) { + long minutesLeft = (fiveMinutesMs - (now - registerTime)) / 60000; + plugin.getLogger().info("[过户] 验证失败: 玩家 " + newOwner + " 注册时间不足5分钟(还差" + minutesLeft + "分钟)"); + notifyTransferCallback(transferId, "failed", "玩家 " + newOwner + " 注册时间不足5分钟(还差" + minutesLeft + "分钟)"); + return false; + } + } + // ★ 验证通过:改Java本地DB AreaProtection areaProtect = plugin.getAreaProtection(); if (areaProtect == null) {