From a5de5fd79725c074558e2cd797adf4cf05b69577 Mon Sep 17 00:00:00 2001 From: ypsdf1 Date: Wed, 21 Oct 2026 12:25:26 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC31=E6=89=B9=EF=BC=9Aweb=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E6=97=B6=E6=9C=AC=E5=9C=B0=E5=85=91=E6=8D=A2=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E7=9B=B4=E6=8E=A5=E8=BF=94=E5=9B=9E(=E4=B8=8D?= =?UTF-8?q?=E8=BF=9B=E8=BF=9C=E7=AB=AF=E6=9F=A5=E8=AF=A2)=EF=BC=9B?= =?UTF-8?q?=E8=A2=AB=E6=8B=89=E9=BB=91=E7=8E=A9=E5=AE=B6=E4=B8=8D=E8=BF=9B?= =?UTF-8?q?=E5=85=A5=E5=8F=A3=E4=BB=A4=E7=9B=91=E5=90=AC=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/sdf1/Main.java | 42 ++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/main/java/com/sdf1/Main.java b/src/main/java/com/sdf1/Main.java index 66cd362..c16c1a9 100644 --- a/src/main/java/com/sdf1/Main.java +++ b/src/main/java/com/sdf1/Main.java @@ -1908,7 +1908,32 @@ public class Main extends JavaPlugin implements Listener, CommandExecutor { } return false; } + /** + * ★ 第31批(#202):反射查询 Sdf1_login 的拉黑状态。 + * Sdf1_login 未安装/未启用/异常时一律视为未拉黑,不拦正常玩家。 + */ + private boolean isLoginBlacklisted(Player p) { + try { + org.bukkit.plugin.Plugin login = + Bukkit.getPluginManager() + .getPlugin("Sdf1_login"); + if (login == null || !login.isEnabled()) return false; + java.lang.reflect.Method m = login.getClass() + .getMethod("isBlacklisted", + org.bukkit.entity.Player.class); + return Boolean.TRUE.equals(m.invoke(login, p)); + } catch (Throwable t) { + return false; + } + } + private void startListening(Player p) { + // ★ 第31批(#202):被拉黑用户不进入口令监听流程 + if (isLoginBlacklisted(p)) { + p.sendMessage(colorize( + "&c[SDF1] 你已被拉黑,无法使用口令兑换")); + return; + } listening.put(p.getUniqueId(), System.currentTimeMillis()); p.sendMessage(colorize("&a[SDF1] &f已开启口令监听 (15秒)")); final UUID uuid = p.getUniqueId(); @@ -1935,6 +1960,12 @@ public class Main extends JavaPlugin implements Listener, CommandExecutor { if (msg.isEmpty() || !listening.containsKey(u)) return; event.setCancelled(true); stopListening(u, true); + // ★ 第31批(#202):监听期间被拉黑 → 退出监听,不进入兑换流程 + if (isLoginBlacklisted(p)) { + p.sendMessage(colorize( + "&c[SDF1] 你已被拉黑,无法使用口令兑换")); + return; + } p.sendMessage(colorize("&a[SDF1] &f已拦截,比对中...")); Long last = chatCd.get(u); if (last != null && System.currentTimeMillis() - last < 500) return; @@ -2302,6 +2333,17 @@ public class Main extends JavaPlugin implements Listener, CommandExecutor { return true; } + // ★ 第31批(#202):sdf1_login 的 web通信关闭 → 本地失败直接返回, + // 不进入「正在查询远程验证」流程(否则玩家干等45秒超时) + if ("fail:web_disabled".equals(res)) { + p.sendMessage(colorize( + "&c[债券] 远程验证未开启(web通信已关闭)," + + "本地也没有这个兑换码")); + log("[债券] web关闭跳过远程验证: " + + p.getName() + " code=" + code); + return true; + } + if ("fail:not_found".equals(res)) { // ★ 本地未找到 → 存入pending队列,Sdf1_login轮询统一调度 log("[债券] 本地CDK未找到,提交远程验证: " + code);