diff --git a/hamster-ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java b/hamster-ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java index 315b298..e7f1348 100644 --- a/hamster-ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java +++ b/hamster-ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java @@ -39,6 +39,13 @@ public class HamsterBallPlugin extends JavaPlugin { @Override public void onEnable() { Logger logger = getLogger(); + if (!BallAPI.getInstance().isConnected()) { + sync(() -> { + logger.info("由于 HamsterBall 未能成功连接, 服务器将立即关闭."); + Bukkit.shutdown(); + }); + return; + } if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { PlaceholderHook.INSTANCE.register(); logger.info("已挂载 PlaceholderAPI 变量!"); diff --git a/hamster-ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java b/hamster-ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java index 68cbf71..327eef5 100644 --- a/hamster-ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java +++ b/hamster-ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java @@ -36,6 +36,10 @@ public class HamsterBallPlugin extends Plugin { @Override public void onEnable() { Logger logger = getLogger(); + if (!BallAPI.getInstance().isConnected()) { + ProxyServer.getInstance().stop("由于 HamsterBall 未能成功连接, 服务器将立即关闭."); + return; + } ProxyServer.getInstance().getPluginManager().registerListener(this, BallBungeeCordListener.INSTANCE); logger.info("已注册 BallBungeeCordListener."); BallAPI.getInstance().sendBallMessage( @@ -44,7 +48,8 @@ public class HamsterBallPlugin extends Plugin { new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()) ); logger.info("HamsterBall 已启动."); - BallAPI.getInstance().getAllPlayerInfo().values().stream() + BallAPI.getInstance().getAllPlayerInfo().values() + .stream() .filter(BallPlayerInfo::isOnline) .filter(o -> BallAPI.getInstance().isLocalServer(o.getProxyServer())) .forEach(playerInfo -> { diff --git a/hamster-ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java b/hamster-ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java index 9278ed8..38b9bbb 100644 --- a/hamster-ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java +++ b/hamster-ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java @@ -56,14 +56,17 @@ public abstract class BallAPI { private final Bootstrap bootstrap; @NotNull private final EventLoopGroup executors; - protected boolean enabled; protected Channel channel; + private boolean enabled; + private boolean connected; + @NotNull private List listeners; protected BallAPI(@NotNull BallConfig config) { this.config = config; this.enabled = false; + this.connected = false; serverInfo = new ConcurrentHashMap<>(); playerInfo = new ConcurrentHashMap<>(); @@ -154,6 +157,7 @@ public abstract class BallAPI { @Override public void onConnectRefused() { enabled = false; + connected = false; executors.shutdownGracefully(); getLogger().info("连接至服务中心的请求被拒绝,已关闭仓鼠球。"); } @@ -252,6 +256,7 @@ public abstract class BallAPI { ChannelFuture future = bootstrap.connect(config.getHost(), config.getPort()).await(); if (future.isSuccess()) { channel = future.channel(); + connected = true; for (BallListener listener : listeners) { listener.onConnectActive(); } @@ -269,6 +274,7 @@ public abstract class BallAPI { return; } channel = null; + connected = false; if (tryCount <= 0) { for (BallListener listener : getListeners()) { try { @@ -281,7 +287,7 @@ public abstract class BallAPI { } try { connect(); - } catch (InterruptedException e) { + } catch (Exception e) { e.printStackTrace(); } if (channel != null) { @@ -320,6 +326,7 @@ public abstract class BallAPI { } channel = null; + connected = false; executors.shutdownGracefully().await(); } @@ -813,6 +820,11 @@ public abstract class BallAPI { return info.getName(); } + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + public boolean isConnected() { + return connected; + } + @NotNull public Map getAllServerInfo() { return serverInfo;