diff --git a/README.md b/README.md index d341e5e..08dda26 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # [HamsterBall](https://gitee.com/MiniDay/hamster-ball) -仓鼠球:一个基于 Netty 的 Minecraft 服务端通用消息中间件(原HamsterService) +仓鼠球:一个基于 Redis 的 Minecraft 服务端通用消息中间件(原HamsterService) 该插件依赖于 [仓鼠核心](https://gitee.com/MiniDay/hamster-core) diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java index 1dbf8cd..747b5d0 100644 --- a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/HamsterBallPlugin.java @@ -28,21 +28,33 @@ public class HamsterBallPlugin extends JavaPlugin { @Override public void onLoad() { - instance = this; + long start = System.currentTimeMillis(); Logger logger = getLogger(); + logger.info("仓鼠球正在初始化..."); + instance = this; + saveDefaultConfig(); + reloadConfig(); + logger.info("已读取配置文件."); try { BallBukkitAPI.init(); - logger.info("BallBukkitAPI 已初始化."); - BallBukkitAPI.getInstance().enable(); - logger.info("BallBukkitAPI 已启动."); + logger.info("已初始化 BallAPI."); } catch (Exception e) { e.printStackTrace(); } + long time = System.currentTimeMillis() - start; + logger.info("仓鼠球初始化完成,总计耗时 " + time + " ms."); } @Override public void onEnable() { + long start = System.currentTimeMillis(); Logger logger = getLogger(); + logger.info("仓鼠球正在启动..."); + try { + BallBukkitAPI.getInstance().enable(); + } catch (Exception e) { + e.printStackTrace(); + } if (!BallAPI.getInstance().isEnabled()) { sync(() -> { logger.info("由于 HamsterBall 未能成功连接, 服务器将立即关闭."); @@ -57,21 +69,27 @@ public class HamsterBallPlugin extends JavaPlugin { ServerOnlineEvent.ACTION, new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()) ); - logger.info("HamsterBall 已启动."); sync(() -> { if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { PlaceholderHook.INSTANCE.register(); logger.info("已挂载 PlaceholderAPI 变量!"); } }); + long time = System.currentTimeMillis() - start; + logger.info("仓鼠球启动完成,总计耗时 " + time + " ms."); } @Override public void onDisable() { + long start = System.currentTimeMillis(); + Logger logger = getLogger(); + logger.info("仓鼠球正在关闭..."); try { BallBukkitAPI.getInstance().disable(); } catch (Exception e) { e.printStackTrace(); } + long time = System.currentTimeMillis() - start; + logger.info("仓鼠球已关闭,总计耗时 " + time + " ms."); } } diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/api/BallBukkitAPI.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/api/BallBukkitAPI.java index 178f441..e19804a 100644 --- a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/api/BallBukkitAPI.java +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/api/BallBukkitAPI.java @@ -65,7 +65,15 @@ public class BallBukkitAPI extends BallAPI { ) ); - DataSource datasource = BallBukkitUtils.getDataSource(config.getConfigurationSection("datasource")); + DataSource datasource; + if (config.contains("datasource")) { + plugin.getLogger().info("检测到配置文件中包含 datasource 节点,启用自定义数据库连接."); + datasource = BallBukkitUtils.getDataSource(config.getConfigurationSection("datasource")); + }else { + plugin.getLogger().info("未检测到配置文件中的 datasource 节点,复用 HamsterCore 数据库连接."); + datasource = CoreAPI.getInstance().getDataSource(); + } + File redissionConfig = new File(plugin.getDataFolder(), "redission.yml"); if (!redissionConfig.exists()) { Files.copy( diff --git a/ball-bukkit/src/main/resources/plugin.yml b/ball-bukkit/src/main/resources/plugin.yml index 016fea9..900b0ca 100644 --- a/ball-bukkit/src/main/resources/plugin.yml +++ b/ball-bukkit/src/main/resources/plugin.yml @@ -5,7 +5,7 @@ api-version: 1.13 author: MiniDay website: https://gitee.com/MiniDay/hamster-ball -description: 仓鼠球:一个基于 Netty 的 Minecraft 服务端通用消息中间件(原HamsterService) +description: 仓鼠球:一个基于 Redis 的 Minecraft 服务端通用消息中间件(原HamsterService) load: STARTUP diff --git a/ball-bungeecord/build.gradle.kts b/ball-bungeecord/build.gradle.kts index ef774a6..6d00cb5 100644 --- a/ball-bungeecord/build.gradle.kts +++ b/ball-bungeecord/build.gradle.kts @@ -15,6 +15,8 @@ dependencies { exclude(group = "org.yaml") exclude(group = "org.slf4j") } + // https://mvnrepository.com/artifact/io.netty/netty-resolver-dns + implementation("io.netty:netty-resolver-dns:4.1.96.Final") } diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java index cf9dcf0..635d6eb 100644 --- a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java @@ -20,22 +20,31 @@ public class HamsterBallPlugin extends Plugin { @Override public void onLoad() { - instance = this; + long start = System.currentTimeMillis(); Logger logger = getLogger(); + logger.info("仓鼠球正在初始化..."); + instance = this; try { BallBungeeCordAPI.init(); - logger.info("BallBungeeCordAPI 已初始化."); - BallBungeeCordAPI.getInstance().enable(); - logger.info("BallBungeeCordAPI 已启动."); + logger.info("已初始化 BallAPI."); } catch (Exception e) { e.printStackTrace(); ProxyServer.getInstance().stop(); } + long time = System.currentTimeMillis() - start; + logger.info("仓鼠球初始化完成,总计耗时 " + time + " ms."); } @Override public void onEnable() { + long start = System.currentTimeMillis(); Logger logger = getLogger(); + logger.info("仓鼠球正在启动..."); + try { + BallBungeeCordAPI.getInstance().enable(); + } catch (Exception e) { + e.printStackTrace(); + } if (!BallAPI.getInstance().isEnabled()) { ProxyServer.getInstance().stop("由于 HamsterBall 未能成功连接, 服务器将立即关闭."); return; @@ -47,7 +56,6 @@ public class HamsterBallPlugin extends Plugin { ServerOnlineEvent.ACTION, new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()) ); - logger.info("HamsterBall 已启动."); BallAPI.getInstance().getAllPlayerInfo().values() .stream() .filter(BallPlayerInfo::isOnline) @@ -56,14 +64,22 @@ public class HamsterBallPlugin extends Plugin { playerInfo.setOnline(false); BallBungeeCordUtils.uploadPlayerInfo(playerInfo); }); + + long time = System.currentTimeMillis() - start; + logger.info("仓鼠球启动完成,总计耗时 " + time + " ms."); } @Override public void onDisable() { + long start = System.currentTimeMillis(); + Logger logger = getLogger(); + logger.info("仓鼠球正在关闭..."); try { BallBungeeCordAPI.getInstance().disable(); } catch (Exception e) { e.printStackTrace(); } + long time = System.currentTimeMillis() - start; + logger.info("仓鼠球已关闭,总计耗时 " + time + " ms."); } } diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java index 5922ed5..a5eec36 100644 --- a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java @@ -61,7 +61,15 @@ public class BallBungeeCordAPI extends BallAPI { ) ); - DataSource datasource = BallBungeeCordUtils.getDataSource(config.getSection("datasource")); + DataSource datasource; + if (config.contains("datasource")) { + plugin.getLogger().info("检测到配置文件中包含 datasource 节点,启用自定义数据库连接."); + datasource = BallBungeeCordUtils.getDataSource(config.getSection("datasource")); + }else { + plugin.getLogger().info("未检测到配置文件中的 datasource 节点,复用 HamsterCore 数据库连接."); + datasource = CoreAPI.getInstance().getDataSource(); + } + File redissionConfig = new File(plugin.getDataFolder(), "redission.yml"); if (!redissionConfig.exists()) { Files.copy( diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java index 2f4360f..4701f0d 100644 --- a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java @@ -85,7 +85,7 @@ public final class BallBungeeCordListener implements Listener, BallListener { String serverID = event.getLocation().getServerID(); ServerInfo serverInfo = ProxyServer.getInstance().getServerInfo(serverID); if (serverInfo == null) { - HamsterBallPlugin.getInstance().getLogger().warning("试图传送玩家时失败: 服务器 " + serverID + " 不在线!"); + HamsterBallPlugin.getInstance().getLogger().warning("试图传送玩家时失败: 服务器 " + serverID + " 不在线!"); break; } for (UUID uuid : event.getSendPlayerUUID()) { @@ -105,7 +105,7 @@ public final class BallBungeeCordListener implements Listener, BallListener { UUID toPlayerUUID = event.getToPlayerUUID(); ProxiedPlayer toPlayer = ProxyServer.getInstance().getPlayer(toPlayerUUID); if (toPlayer == null) { - HamsterBallPlugin.getInstance().getLogger().warning("试图传送玩家时失败: 目标玩家 " + toPlayerUUID + " 不在线!"); + HamsterBallPlugin.getInstance().getLogger().warning("试图传送玩家时失败: 目标玩家 " + toPlayerUUID + " 不在线!"); break; } ServerInfo toServer = toPlayer.getServer().getInfo(); diff --git a/ball-bungeecord/src/main/resources/bungee.yml b/ball-bungeecord/src/main/resources/bungee.yml index 14f50cf..72be04a 100644 --- a/ball-bungeecord/src/main/resources/bungee.yml +++ b/ball-bungeecord/src/main/resources/bungee.yml @@ -3,7 +3,7 @@ main: cn.hamster3.mc.plugin.core.bungee.HamsterBallPlugin version: ${version} author: MiniDay -description: 仓鼠球:一个基于 Netty 的 Minecraft 服务端通用消息中间件(原HamsterService) +description: 仓鼠球:一个基于 Redis 的 Minecraft 服务端通用消息中间件(原HamsterService) depend: - HamsterCore diff --git a/ball-bungeecord/src/main/resources/config.yml b/ball-bungeecord/src/main/resources/config.yml index e466eeb..0f467b5 100644 --- a/ball-bungeecord/src/main/resources/config.yml +++ b/ball-bungeecord/src/main/resources/config.yml @@ -1,17 +1,16 @@ # 是否允许在控制台输出调试信息 debug: false -ball-server: - host: "ball.hamster3.cn" - port: 58888 - event-loop-thread: 5 - server-info: # 服务器唯一识别码,最长 32 字符 id: "BungeeCord" # 服务端名称,用于展示给玩家看 name: "代理端" + # 当前子服的地址 + # 不填则自动设置为 0.0.0.0 host: 0.0.0.0 + # 当前子服端口 + # 不填则自动设置为 25577 port: 25577 # 数据库连接池配置 diff --git a/ball-common/build.gradle.kts b/ball-common/build.gradle.kts index 186cf21..9e0a752 100644 --- a/ball-common/build.gradle.kts +++ b/ball-common/build.gradle.kts @@ -3,8 +3,9 @@ dependencies { // https://mvnrepository.com/artifact/com.google.code.gson/gson compileOnly("com.google.code.gson:gson:2.8.0") - // https://mvnrepository.com/artifact/io.netty/netty-all - compileOnly("io.netty:netty-all:4.1.86.Final") + + // https://mvnrepository.com/artifact/io.netty/netty-buffer + compileOnly("io.netty:netty-buffer:4.1.96.Final") val hamsterCoreVersion = property("hamster_core_version") compileOnly("cn.hamster3.mc.plugin:core-common:${hamsterCoreVersion}") diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java index 380ef91..79c5fe6 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java @@ -209,10 +209,10 @@ public abstract class BallAPI { } } } - enabled = true; - RTopic topic = getRedissonClient().getTopic(BALL_CHANNEL, BallMessageInfoCodec.INSTANCE); topic.addListener(BallMessageInfo.class, BallMessageListener.INSTANCE); + + enabled = true; } protected void disable() throws SQLException, InterruptedException { @@ -233,7 +233,9 @@ public abstract class BallAPI { statement.executeUpdate(); } } + getLogger().info("正在关闭 redission..."); getRedissonClient().shutdown(); + getLogger().info("已关闭 redission."); } /** diff --git a/build.gradle.kts b/build.gradle.kts index 9999ad1..fffe567 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -58,6 +58,12 @@ subprojects { "https://bukkit.windit.net/javadoc" ) } + shadowJar { + destinationDirectory = rootProject.buildDir + } + build { + dependsOn(shadowJar) + } } publishing {