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