diff --git a/ball-bukkit/build.gradle.kts b/ball-bukkit/build.gradle.kts index 5fb8d8f..4af0bb7 100644 --- a/ball-bukkit/build.gradle.kts +++ b/ball-bukkit/build.gradle.kts @@ -1,4 +1,4 @@ -@file:Suppress("GradlePackageVersionRange") +@file:Suppress("VulnerableLibrariesLocal", "GradlePackageVersionRange", "GradlePackageUpdate") evaluationDependsOn(":ball-common") @@ -8,8 +8,8 @@ dependencies { compileOnly("cn.hamster3.mc.plugin:core-bukkit:+") compileOnly("me.clip:placeholderapi:+") { isTransitive = false } - // https://mvnrepository.com/artifact/io.lettuce/lettuce-core - implementation("io.lettuce:lettuce-core:6.2.6.RELEASE") + + implementation("io.lettuce:lettuce-core:+") } tasks { 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 2359b8f..f62aa93 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 @@ -3,7 +3,11 @@ package cn.hamster3.mc.plugin.ball.bukkit; import cn.hamster3.mc.plugin.ball.bukkit.api.BallBukkitAPI; import cn.hamster3.mc.plugin.ball.bukkit.hook.PlaceholderHook; import cn.hamster3.mc.plugin.ball.bukkit.listener.BallBukkitListener; +import cn.hamster3.mc.plugin.ball.bukkit.listener.UpdatePlayerInfoListener; +import cn.hamster3.mc.plugin.ball.bukkit.util.BallBukkitUtils; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; @@ -55,25 +59,34 @@ public class HamsterBallPlugin extends JavaPlugin { } catch (Exception e) { e.printStackTrace(); } - if (!BallAPI.getInstance().isEnabled()) { - sync(() -> { - logger.info("由于 HamsterBall 未能成功连接, 服务器将立即关闭"); - Bukkit.shutdown(); - }); - return; - } Bukkit.getPluginManager().registerEvents(BallBukkitListener.INSTANCE, this); - logger.info("已注册 BallBukkitListener"); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - ServerOnlineEvent.ACTION, - new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()) - ); + BallAPI.getInstance().getEventBus().register(BallBukkitListener.INSTANCE); + logger.info("已注册监听器 BallBukkitListener"); + if (BallAPI.getInstance().getBallConfig().isGameServerUpdatePlayerInfo()) { + BallAPI.getInstance().subscribe(BallAPI.PLAYER_INFO_UPDATE_CHANNEL); + Bukkit.getPluginManager().registerEvents(UpdatePlayerInfoListener.INSTANCE, this); + BallAPI.getInstance().getEventBus().register(UpdatePlayerInfoListener.INSTANCE); + logger.info("已注册监听器 UpdatePlayerInfoListener"); + + // 移除失效的在线玩家 + BallAPI.getInstance().getAllPlayerInfo().values() + .stream() + .filter(BallPlayerInfo::isOnline) + .filter(o -> BallAPI.getInstance().isLocalServer(o.getGameServer())) + .forEach(playerInfo -> { + playerInfo.setOnline(false); + BallBukkitUtils.uploadPlayerInfo(playerInfo); + }); + } sync(() -> { if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { PlaceholderHook.INSTANCE.register(); logger.info("已挂载 PlaceholderAPI 变量"); } + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, BallActions.ServerOnline.name(), + new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()), false + ); }); 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 4c24ef9..5b1704a 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 @@ -3,6 +3,7 @@ package cn.hamster3.mc.plugin.ball.bukkit.api; import cn.hamster3.mc.plugin.ball.bukkit.HamsterBallPlugin; import cn.hamster3.mc.plugin.ball.bukkit.util.BallBukkitUtils; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.config.BallConfig; import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; import cn.hamster3.mc.plugin.core.common.api.CoreAPI; @@ -10,7 +11,6 @@ import io.lettuce.core.RedisClient; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import javax.sql.DataSource; import java.sql.SQLException; @@ -18,8 +18,8 @@ import java.util.Map; import java.util.logging.Logger; public class BallBukkitAPI extends BallAPI { - public BallBukkitAPI(@NotNull BallServerInfo localServerInfo, @Nullable DataSource datasource, @NotNull RedisClient redisClient, boolean debug) { - super(localServerInfo, datasource, redisClient, debug); + public BallBukkitAPI(@NotNull BallConfig ballConfig) { + super(ballConfig); } public static BallBukkitAPI getInstance() { @@ -56,9 +56,15 @@ public class BallBukkitAPI extends BallAPI { datasource = CoreAPI.getInstance().getDataSource(); } - RedisClient redisClient = RedisClient.create(config.getString("redis-url", "redis://localhost:6379?clientName=HamsterBall")); - - instance = new BallBukkitAPI(serverInfo, datasource, redisClient, config.getBoolean("debug", false)); + BallConfig ballConfig = new BallConfig( + config.getBoolean("debug", false), + RedisClient.create(config.getString("redis-url")), + config.getString("channel-prefix", ""), + config.getBoolean("game-server-update-player-info", false), + serverInfo, + datasource + ); + instance = new BallBukkitAPI(ballConfig); } @Override diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/BallBukkitListener.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/BallBukkitListener.java index c1506f1..ee4e5aa 100644 --- a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/BallBukkitListener.java +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/BallBukkitListener.java @@ -3,15 +3,14 @@ package cn.hamster3.mc.plugin.ball.bukkit.listener; import cn.hamster3.mc.plugin.ball.bukkit.HamsterBallPlugin; import cn.hamster3.mc.plugin.ball.bukkit.data.BukkitLocation; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; -import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo; import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; import cn.hamster3.mc.plugin.ball.common.event.operate.*; -import cn.hamster3.mc.plugin.ball.common.listener.BallListener; import cn.hamster3.mc.plugin.core.bukkit.api.CoreBukkitAPI; import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import cn.hamster3.mc.plugin.core.common.data.DisplayMessage; import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.audience.Audience; import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.text.TextReplacementConfig; +import com.google.common.eventbus.Subscribe; import lombok.AllArgsConstructor; import lombok.Data; import org.bukkit.Bukkit; @@ -33,7 +32,7 @@ import java.util.HashMap; import java.util.List; import java.util.UUID; -public class BallBukkitListener implements Listener, BallListener { +public class BallBukkitListener implements Listener { public static final BallBukkitListener INSTANCE = new BallBukkitListener(); private final HashMap playerToLocation = new HashMap<>(); @@ -42,108 +41,6 @@ public class BallBukkitListener implements Listener, BallListener { private BallBukkitListener() { } - @Override - public void onMessageReceived(@NotNull BallMessageInfo info) { - switch (info.getAction()) { - case BroadcastPlayerMessageEvent.ACTION: { - BroadcastPlayerMessageEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BroadcastPlayerMessageEvent.class); - DisplayMessage message = event.getMessage(); - Audience audience = CoreAPI.getInstance().getAudienceProvider().all(); - message.show(audience); - break; - } - case DispatchConsoleCommandEvent.ACTION: { - DispatchConsoleCommandEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), DispatchConsoleCommandEvent.class); - if (event.getType() != null && event.getType() != BallServerType.GAME) { - return; - } - if (event.getServerID() != null && !BallAPI.getInstance().isLocalServer(event.getServerID())) { - return; - } - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), event.getCommand()); - break; - } - case DispatchPlayerCommandEvent.ACTION: { - DispatchPlayerCommandEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), DispatchPlayerCommandEvent.class); - if (event.getType() != null && event.getType() != BallServerType.GAME) { - return; - } - if (event.getUuid() != null) { - Player player = Bukkit.getPlayer(event.getUuid()); - if (player == null) { - return; - } - Bukkit.dispatchCommand(player, event.getCommand()); - return; - } - for (Player player : Bukkit.getOnlinePlayers()) { - Bukkit.dispatchCommand(player, event.getCommand()); - } - break; - } - case SendPlayerToLocationEvent.ACTION: { - SendPlayerToLocationEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), SendPlayerToLocationEvent.class); - BukkitLocation location = new BukkitLocation(event.getLocation()); - if (BallAPI.getInstance().isLocalServer(location.getServerID())) { - for (UUID uuid : event.getSendPlayerUUID()) { - Player player = Bukkit.getPlayer(uuid); - if (player != null) { - HamsterBallPlugin.sync(() -> { - player.teleport(location.toBukkitLocation()); - if (event.getDoneMessage() != null) { - Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(player); - event.getDoneMessage().show(audience); - } - }); - } else { - playerToLocation.put(uuid, new ToLocation(location.toBukkitLocation(), event.getDoneMessage())); - } - } - } - break; - } - case SendPlayerToPlayerEvent.ACTION: { - SendPlayerToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), SendPlayerToPlayerEvent.class); - Player toPlayer = Bukkit.getPlayer(event.getToPlayerUUID()); - if (toPlayer == null) { - break; - } - Location location = toPlayer.getLocation(); - for (UUID uuid : event.getSendPlayerUUID()) { - Player sendPlayer = Bukkit.getPlayer(uuid); - if (sendPlayer != null) { - HamsterBallPlugin.sync(() -> { - sendPlayer.teleport(location); - if (event.getDoneMessage() != null) { - Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(sendPlayer); - event.getDoneMessage().show(audience, TextReplacementConfig.builder() - .matchLiteral("%player_name%") - .replacement(toPlayer.getName()) - .build()); - } - if (event.getDoneTargetMessage() != null) { - Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(toPlayer); - event.getDoneTargetMessage().show(audience, TextReplacementConfig.builder() - .matchLiteral("%player_name%") - .replacement(sendPlayer.getName()) - .build()); - } - }); - } else { - ToPlayer data = new ToPlayer( - toPlayer.getUniqueId(), - toPlayer.getLocation(), - event.getDoneMessage(), - event.getDoneTargetMessage() - ); - playerToPlayer.put(uuid, data); - } - } - break; - } - } - } - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); @@ -189,6 +86,103 @@ public class BallBukkitListener implements Listener, BallListener { }); } + @Subscribe + public void onBroadcastPlayerMessage(BroadcastPlayerMessageEvent event) { + DisplayMessage message = event.getMessage(); + Audience audience = CoreAPI.getInstance().getAudienceProvider().all(); + message.show(audience); + } + + @Subscribe + public void onDispatchConsoleCommand(DispatchConsoleCommandEvent event) { + if (event.getType() != null && event.getType() != BallServerType.GAME) { + return; + } + if (event.getServerID() != null && !BallAPI.getInstance().isLocalServer(event.getServerID())) { + return; + } + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), event.getCommand()); + } + + @Subscribe + public void onDispatchPlayerCommand(DispatchPlayerCommandEvent event) { + if (event.getType() != null && event.getType() != BallServerType.GAME) { + return; + } + if (event.getUuid() != null) { + Player player = Bukkit.getPlayer(event.getUuid()); + if (player == null) { + return; + } + Bukkit.dispatchCommand(player, event.getCommand()); + return; + } + for (Player player : Bukkit.getOnlinePlayers()) { + Bukkit.dispatchCommand(player, event.getCommand()); + } + } + + @Subscribe + public void onSendPlayerToLocation(SendPlayerToLocationEvent event) { + BukkitLocation location = new BukkitLocation(event.getLocation()); + if (!BallAPI.getInstance().isLocalServer(location.getServerID())) { + return; + } + for (UUID uuid : event.getSendPlayerUUID()) { + Player player = Bukkit.getPlayer(uuid); + if (player != null) { + HamsterBallPlugin.sync(() -> { + player.teleport(location.toBukkitLocation()); + if (event.getDoneMessage() != null) { + Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(player); + event.getDoneMessage().show(audience); + } + }); + } else { + playerToLocation.put(uuid, new ToLocation(location.toBukkitLocation(), event.getDoneMessage())); + } + } + } + + @Subscribe + public void onSendPlayerToPlayer(SendPlayerToPlayerEvent event) { + Player toPlayer = Bukkit.getPlayer(event.getToPlayerUUID()); + if (toPlayer == null) { + return; + } + Location location = toPlayer.getLocation(); + for (UUID uuid : event.getSendPlayerUUID()) { + Player sendPlayer = Bukkit.getPlayer(uuid); + if (sendPlayer != null) { + HamsterBallPlugin.sync(() -> { + sendPlayer.teleport(location); + if (event.getDoneMessage() != null) { + Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(sendPlayer); + event.getDoneMessage().show(audience, TextReplacementConfig.builder() + .matchLiteral("%player_name%") + .replacement(toPlayer.getName()) + .build()); + } + if (event.getDoneTargetMessage() != null) { + Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(toPlayer); + event.getDoneTargetMessage().show(audience, TextReplacementConfig.builder() + .matchLiteral("%player_name%") + .replacement(sendPlayer.getName()) + .build()); + } + }); + } else { + ToPlayer data = new ToPlayer( + toPlayer.getUniqueId(), + toPlayer.getLocation(), + event.getDoneMessage(), + event.getDoneTargetMessage() + ); + playerToPlayer.put(uuid, data); + } + } + } + @NotNull private List getCachedPlayerMessage(@NotNull UUID uuid) throws SQLException { ArrayList list = new ArrayList<>(); diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/UpdatePlayerInfoListener.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/UpdatePlayerInfoListener.java new file mode 100644 index 0000000..048f9ef --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/UpdatePlayerInfoListener.java @@ -0,0 +1,54 @@ +package cn.hamster3.mc.plugin.ball.bukkit.listener; + +import cn.hamster3.mc.plugin.ball.bukkit.util.BallBukkitUtils; +import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerLoginEvent; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerLogoutEvent; +import com.google.common.eventbus.Subscribe; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +public class UpdatePlayerInfoListener implements Listener { + public static final UpdatePlayerInfoListener INSTANCE = new UpdatePlayerInfoListener(); + + private final Map PLAYER_PROXY_SERVER = new ConcurrentHashMap<>(); + + private UpdatePlayerInfoListener() { + } + + @EventHandler(ignoreCancelled = true) + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + BallPlayerInfo playerInfo = new BallPlayerInfo( + player.getUniqueId(), + player.getName(), + BallAPI.getInstance().getLocalServerId(), + PLAYER_PROXY_SERVER.getOrDefault(player.getUniqueId(), "unknown"), + true + ); + BallBukkitUtils.uploadPlayerInfo(playerInfo); + } + + @Subscribe + public void onBallPlayerLogin(BallPlayerLoginEvent event) { + BallPlayerInfo info = event.getPlayerInfo(); + PLAYER_PROXY_SERVER.put(info.getUuid(), info.getProxyServer()); + } + + @Subscribe + public void onBallPlayerLogout(BallPlayerLogoutEvent event) { + BallPlayerInfo playerInfo = BallAPI.getInstance().getPlayerInfo(event.getPlayerInfo().getUuid()); + if (!BallAPI.getInstance().isLocalServer(playerInfo.getGameServer())) { + return; + } + playerInfo.setOnline(false); + BallBukkitUtils.uploadPlayerInfo(playerInfo); + } +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/util/BallBukkitUtils.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/util/BallBukkitUtils.java index 4dd5d4b..cc7b838 100644 --- a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/util/BallBukkitUtils.java +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/util/BallBukkitUtils.java @@ -1,11 +1,20 @@ package cn.hamster3.mc.plugin.ball.bukkit.util; +import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerInfoUpdateEvent; +import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import cn.hamster3.mc.plugin.core.lib.com.zaxxer.hikari.HikariConfig; import cn.hamster3.mc.plugin.core.lib.com.zaxxer.hikari.HikariDataSource; import org.bukkit.configuration.ConfigurationSection; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; public final class BallBukkitUtils { private BallBukkitUtils() { @@ -38,4 +47,28 @@ public final class BallBukkitUtils { return null; } } + + public static void uploadPlayerInfo(@NotNull BallPlayerInfo playerInfo) { + CoreAPI.getInstance().getExecutorService().execute(() -> { + try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { + try (PreparedStatement statement = connection.prepareStatement( + "REPLACE INTO `hamster_ball_player_info` VALUES(?, ?, ?, ?, ?);" + )) { + statement.setString(1, playerInfo.getUuid().toString()); + statement.setString(2, playerInfo.getName()); + statement.setString(3, playerInfo.getGameServer()); + statement.setString(4, playerInfo.getProxyServer()); + statement.setBoolean(5, playerInfo.isOnline()); + statement.executeUpdate(); + } + } catch (SQLException e) { + e.printStackTrace(); + } + BallAPI.getInstance().sendBallMessage( + BallAPI.PLAYER_INFO_UPDATE_CHANNEL, + BallActions.BallPlayerInfoUpdate.name(), + new BallPlayerInfoUpdateEvent(playerInfo) + ); + }); + } } diff --git a/ball-bukkit/src/main/resources/config.yml b/ball-bukkit/src/main/resources/config.yml index 39d28aa..e12947c 100644 --- a/ball-bukkit/src/main/resources/config.yml +++ b/ball-bukkit/src/main/resources/config.yml @@ -13,9 +13,22 @@ debug: false # 详细信息:https://github.com/lettuce-io/lettuce-core/wiki/Redis-URI-and-connection-details redis-url: "redis://localhost:6379?clientName=HamsterBall" +# 频道名前缀 +# 使用这个配置选项可以划分子服消息通信分组 +# 只有在同一个频道名的子服才能互相通信 +channel-prefix: "" + +# 是否在子服端更新玩家信息 +# 默认情况下,BC 统一管理玩家信息,包括记录 UUID 和玩家名称 +# 如果一个子服同时拥有多个 BC 入口 +# 且每个 BC 入口为不同的玩家名称分配不同的 UUID +# 则可以启用该功能以防止 UUID 紊乱的问题 +game-server-update-player-info: false + # 本服务器信息 server-info: # 服务器唯一识别码,最长 32 字符 + # 需要与 BC 端中 config.yml 里填写的服务器 ID 一致,否则插件跨服传送功能将失效 # 推荐格式:全小写英文+横杠+数字尾号 # 例如: # survival-1, survival-2(生存1区,生存2区) diff --git a/ball-bungeecord/build.gradle.kts b/ball-bungee/build.gradle.kts similarity index 64% rename from ball-bungeecord/build.gradle.kts rename to ball-bungee/build.gradle.kts index c8c71f3..4ccd88f 100644 --- a/ball-bungeecord/build.gradle.kts +++ b/ball-bungee/build.gradle.kts @@ -1,12 +1,14 @@ +@file:Suppress("VulnerableLibrariesLocal", "GradlePackageVersionRange", "GradlePackageUpdate") + evaluationDependsOn(":ball-common") dependencies { api(project(":ball-common")) { isTransitive = false } compileOnly("net.md-5:bungeecord-api:+") - compileOnly("cn.hamster3.mc.plugin:core-bungeecord:+") - // https://mvnrepository.com/artifact/io.lettuce/lettuce-core - implementation("io.lettuce:lettuce-core:6.2.6.RELEASE") + compileOnly("cn.hamster3.mc.plugin:core-bungee:+") + + implementation("io.lettuce:lettuce-core:+") } tasks { diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java similarity index 76% rename from ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java rename to ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java index b4b27bd..cc5e9d8 100644 --- a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java @@ -2,9 +2,12 @@ package cn.hamster3.mc.plugin.core.bungee; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; import cn.hamster3.mc.plugin.core.bungee.api.BallBungeeCordAPI; -import cn.hamster3.mc.plugin.core.bungee.listener.BallBungeeCordListener; +import cn.hamster3.mc.plugin.core.bungee.listener.BallBungeeListener; +import cn.hamster3.mc.plugin.core.bungee.listener.BallBungeeListenerV2; +import cn.hamster3.mc.plugin.core.bungee.listener.UpdatePlayerInfoListener; import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.plugin.Plugin; @@ -45,17 +48,18 @@ public class HamsterBallPlugin extends Plugin { } catch (Exception e) { e.printStackTrace(); } - if (!BallAPI.getInstance().isEnabled()) { - ProxyServer.getInstance().stop("由于 HamsterBall 未能成功连接, 服务器将立即关闭"); - return; - } - ProxyServer.getInstance().getPluginManager().registerListener(this, BallBungeeCordListener.INSTANCE); - logger.info("已注册 BallBungeeCordListener"); + ProxyServer.getInstance().getPluginManager().registerListener(this, BallBungeeListener.INSTANCE); + logger.info("已注册监听器 BallBungeeListener"); + BallAPI.getInstance().getEventBus().register(BallBungeeListenerV2.INSTANCE); + logger.info("已注册监听器 BallBungeeListenerV2"); + ProxyServer.getInstance().getPluginManager().registerListener(this, UpdatePlayerInfoListener.INSTANCE); + logger.info("已注册监听器 UpdatePlayerInfoListener"); BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - ServerOnlineEvent.ACTION, - new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()) + BallAPI.BALL_CHANNEL, BallActions.ServerOnline.name(), + new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()), + false ); + // 移除失效的在线玩家 BallAPI.getInstance().getAllPlayerInfo().values() .stream() .filter(BallPlayerInfo::isOnline) diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java similarity index 82% rename from ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java rename to ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java index 1811139..3dc362e 100644 --- a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java @@ -1,6 +1,7 @@ package cn.hamster3.mc.plugin.core.bungee.api; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.config.BallConfig; import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; import cn.hamster3.mc.plugin.core.bungee.HamsterBallPlugin; @@ -10,7 +11,6 @@ import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import io.lettuce.core.RedisClient; import net.md_5.bungee.config.Configuration; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import javax.sql.DataSource; import java.sql.SQLException; @@ -18,8 +18,8 @@ import java.util.Map; import java.util.logging.Logger; public class BallBungeeCordAPI extends BallAPI { - public BallBungeeCordAPI(@NotNull BallServerInfo localServerInfo, @Nullable DataSource datasource, @NotNull RedisClient redisClient, boolean debug) { - super(localServerInfo, datasource, redisClient, debug); + public BallBungeeCordAPI(@NotNull BallConfig ballConfig) { + super(ballConfig); } public static BallBungeeCordAPI getInstance() { @@ -53,9 +53,15 @@ public class BallBungeeCordAPI extends BallAPI { datasource = CoreAPI.getInstance().getDataSource(); } - RedisClient redisClient = RedisClient.create(config.getString("redis-url", "redis://localhost:6379?clientName=HamsterBall")); - - instance = new BallBungeeCordAPI(serverInfo, datasource, redisClient, config.getBoolean("debug", false)); + BallConfig ballConfig = new BallConfig( + config.getBoolean("debug", false), + RedisClient.create(config.getString("redis-url")), + config.getString("channel-prefix", ""), + config.getBoolean("game-server-update-player-info", false), + serverInfo, + datasource + ); + instance = new BallBungeeCordAPI(ballConfig); } @Override diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeListener.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeListener.java new file mode 100644 index 0000000..18d5aff --- /dev/null +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeListener.java @@ -0,0 +1,62 @@ +package cn.hamster3.mc.plugin.core.bungee.listener; + +import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerLoginEvent; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerPostLoginEvent; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerPreLoginEvent; +import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils; +import net.md_5.bungee.api.connection.PendingConnection; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.event.LoginEvent; +import net.md_5.bungee.api.event.PostLoginEvent; +import net.md_5.bungee.api.event.PreLoginEvent; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; +import net.md_5.bungee.event.EventPriority; + +public final class BallBungeeListener implements Listener { + public static final BallBungeeListener INSTANCE = new BallBungeeListener(); + + private BallBungeeListener() { + } + + @EventHandler(priority = EventPriority.HIGH) + public void onPreLogin(PreLoginEvent event) { + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.BallPlayerPreLogin.name(), + new BallPlayerPreLoginEvent(event.getConnection().getName()), + false + ); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onLogin(LoginEvent event) { + if (event.isCancelled()) { + return; + } + PendingConnection connection = event.getConnection(); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.BallPlayerLogin.name(), + new BallPlayerLoginEvent(new BallPlayerInfo( + connection.getUniqueId(), connection.getName(), "connecting", + BallAPI.getInstance().getLocalServerId(), true + )), false + ); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onPostLogin(PostLoginEvent event) { + ProxiedPlayer player = event.getPlayer(); + BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.BallPlayerPostLogin.name(), + new BallPlayerPostLoginEvent(playerInfo), + false + ); + } +} diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeListenerV2.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeListenerV2.java new file mode 100644 index 0000000..e6c10f3 --- /dev/null +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeListenerV2.java @@ -0,0 +1,107 @@ +package cn.hamster3.mc.plugin.core.bungee.listener; + +import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; +import cn.hamster3.mc.plugin.ball.common.event.operate.*; +import cn.hamster3.mc.plugin.core.bungee.HamsterBallPlugin; +import cn.hamster3.mc.plugin.core.common.api.CoreAPI; +import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.audience.Audience; +import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; +import com.google.common.eventbus.Subscribe; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.config.ServerInfo; +import net.md_5.bungee.api.connection.ProxiedPlayer; + +import java.util.UUID; + +public class BallBungeeListenerV2 { + public static final BallBungeeListenerV2 INSTANCE = new BallBungeeListenerV2(); + + private BallBungeeListenerV2() { + } + + @Subscribe + public void onDispatchConsoleCommand(DispatchConsoleCommandEvent event) { + if (event.getType() != null && event.getType() != BallServerType.PROXY) { + return; + } + if (event.getServerID() != null && !BallAPI.getInstance().isLocalServer(event.getServerID())) { + return; + } + ProxyServer server = ProxyServer.getInstance(); + server.getPluginManager().dispatchCommand(server.getConsole(), event.getCommand()); + } + + @Subscribe + public void onDispatchPlayerCommandEvent(DispatchPlayerCommandEvent event) { + if (event.getType() != null && event.getType() != BallServerType.GAME) { + return; + } + ProxyServer server = ProxyServer.getInstance(); + if (event.getUuid() != null) { + ProxiedPlayer player = server.getPlayer(event.getUuid()); + if (player == null) { + return; + } + server.getPluginManager().dispatchCommand(player, event.getCommand()); + return; + } + for (ProxiedPlayer player : server.getPlayers()) { + server.getPluginManager().dispatchCommand(player, event.getCommand()); + } + } + + @Subscribe + public void onKickPlayerEvent(KickPlayerEvent event) { + ProxiedPlayer player = ProxyServer.getInstance().getPlayer(event.getUuid()); + BaseComponent[] components = BungeeComponentSerializer.get().serialize(event.getReason()); + player.disconnect(components); + } + + @Subscribe + public void onSendMessageToPlayerEvent(SendMessageToPlayerEvent event) { + for (UUID receiver : event.getReceivers()) { + Audience audience = CoreAPI.getInstance().getAudienceProvider().player(receiver); + event.getMessage().show(audience); + } + } + + @Subscribe + public void onSendPlayerToLocationEvent(SendPlayerToLocationEvent event) { + String serverID = event.getLocation().getServerID(); + ServerInfo serverInfo = ProxyServer.getInstance().getServerInfo(serverID); + if (serverInfo == null) { + HamsterBallPlugin.getInstance().getLogger().warning("试图传送玩家时失败: 服务器 " + serverID + " 不在线"); + return; + } + for (UUID uuid : event.getSendPlayerUUID()) { + ProxiedPlayer player = ProxyServer.getInstance().getPlayer(uuid); + if (player == null) { + continue; + } + if (player.getServer().getInfo().getName().equals(serverID)) { + continue; + } + player.connect(serverInfo); + } + } + + @Subscribe + public void onSendPlayerToPlayerEvent(SendPlayerToPlayerEvent event) { + UUID toPlayerUUID = event.getToPlayerUUID(); + ProxiedPlayer toPlayer = ProxyServer.getInstance().getPlayer(toPlayerUUID); + if (toPlayer == null) { + HamsterBallPlugin.getInstance().getLogger().warning("试图传送玩家时失败: 目标玩家 " + toPlayerUUID + " 不在线"); + return; + } + ServerInfo toServer = toPlayer.getServer().getInfo(); + for (UUID uuid : event.getSendPlayerUUID()) { + ProxiedPlayer sendPlayer = ProxyServer.getInstance().getPlayer(uuid); + if (sendPlayer.getServer().getInfo().getName().equals(toServer.getName())) { + continue; + } + sendPlayer.connect(toServer); + } + } +} diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/UpdatePlayerInfoListener.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/UpdatePlayerInfoListener.java new file mode 100644 index 0000000..24d6476 --- /dev/null +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/UpdatePlayerInfoListener.java @@ -0,0 +1,64 @@ +package cn.hamster3.mc.plugin.core.bungee.listener; + +import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerLogoutEvent; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerPostConnectServerEvent; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerPreConnectServerEvent; +import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.event.PlayerDisconnectEvent; +import net.md_5.bungee.api.event.ServerConnectEvent; +import net.md_5.bungee.api.event.ServerConnectedEvent; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; +import net.md_5.bungee.event.EventPriority; + +public class UpdatePlayerInfoListener implements Listener { + public static final UpdatePlayerInfoListener INSTANCE = new UpdatePlayerInfoListener(); + + private UpdatePlayerInfoListener() { + } + + @EventHandler(priority = EventPriority.HIGH) + public void onServerConnect(ServerConnectEvent event) { + ProxiedPlayer player = event.getPlayer(); + BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); + playerInfo.setGameServer(event.getTarget().getName()); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.BallPlayerPreConnectServer.name(), + new BallPlayerPreConnectServerEvent(playerInfo, playerInfo.getGameServer(), event.getTarget().getName()), + false + ); + BallBungeeCordUtils.uploadPlayerInfo(playerInfo); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onServerConnected(ServerConnectedEvent event) { + ProxiedPlayer player = event.getPlayer(); + BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); + playerInfo.setGameServer(event.getServer().getInfo().getName()); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.BallPlayerPostConnectServer.name(), + new BallPlayerPostConnectServerEvent(playerInfo), + false + ); + BallBungeeCordUtils.uploadPlayerInfo(playerInfo); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onPlayerDisconnect(PlayerDisconnectEvent event) { + ProxiedPlayer player = event.getPlayer(); + BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, false); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.BallPlayerLogout.name(), + new BallPlayerLogoutEvent(playerInfo), + false + ); + BallBungeeCordUtils.uploadPlayerInfo(playerInfo); + } +} diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java similarity index 89% rename from ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java rename to ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java index 9244d06..deed911 100644 --- a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java @@ -2,6 +2,7 @@ package cn.hamster3.mc.plugin.core.bungee.util; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerInfoUpdateEvent; import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import cn.hamster3.mc.plugin.core.lib.com.zaxxer.hikari.HikariConfig; @@ -49,11 +50,13 @@ public final class BallBungeeCordUtils { } catch (SQLException e) { e.printStackTrace(); } - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerInfoUpdateEvent.ACTION, - new BallPlayerInfoUpdateEvent(playerInfo) - ); + if (!BallAPI.getInstance().getBallConfig().isGameServerUpdatePlayerInfo()) { + BallAPI.getInstance().sendBallMessage( + BallAPI.PLAYER_INFO_UPDATE_CHANNEL, + BallActions.BallPlayerInfoUpdate.name(), + new BallPlayerInfoUpdateEvent(playerInfo) + ); + } }); } diff --git a/ball-bungeecord/src/main/resources/bungee.yml b/ball-bungee/src/main/resources/bungee.yml similarity index 100% rename from ball-bungeecord/src/main/resources/bungee.yml rename to ball-bungee/src/main/resources/bungee.yml diff --git a/ball-bungeecord/src/main/resources/config.yml b/ball-bungee/src/main/resources/config.yml similarity index 82% rename from ball-bungeecord/src/main/resources/config.yml rename to ball-bungee/src/main/resources/config.yml index 946ec3f..d5c1c91 100644 --- a/ball-bungeecord/src/main/resources/config.yml +++ b/ball-bungee/src/main/resources/config.yml @@ -13,6 +13,18 @@ debug: false # 详细信息:https://github.com/lettuce-io/lettuce-core/wiki/Redis-URI-and-connection-details redis-url: "redis://localhost:6379?clientName=HamsterBall" +# 频道名前缀 +# 使用这个配置选项可以划分子服消息通信分组 +# 只有在同一个频道名的子服才能互相通信 +channel-prefix: "" + +# 是否在子服端更新玩家信息 +# 默认情况下,BC 统一管理玩家信息,包括记录 UUID 和玩家名称 +# 如果一个子服同时拥有多个 BC 入口 +# 且每个 BC 入口为不同的玩家名称分配不同的 UUID +# 则可以启用该功能以防止 UUID 紊乱的问题 +game-server-update-player-info: false + # 本服务器信息 server-info: # 服务器唯一识别码,最长 32 字符 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 deleted file mode 100644 index 35d1724..0000000 --- a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java +++ /dev/null @@ -1,205 +0,0 @@ -package cn.hamster3.mc.plugin.core.bungee.listener; - -import cn.hamster3.mc.plugin.ball.common.api.BallAPI; -import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo; -import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; -import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; -import cn.hamster3.mc.plugin.ball.common.event.operate.*; -import cn.hamster3.mc.plugin.ball.common.event.player.*; -import cn.hamster3.mc.plugin.ball.common.listener.BallListener; -import cn.hamster3.mc.plugin.core.bungee.HamsterBallPlugin; -import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils; -import cn.hamster3.mc.plugin.core.common.api.CoreAPI; -import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.audience.Audience; -import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.config.ServerInfo; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.event.*; -import net.md_5.bungee.api.plugin.Listener; -import net.md_5.bungee.event.EventHandler; -import net.md_5.bungee.event.EventPriority; -import org.jetbrains.annotations.NotNull; - -import java.util.UUID; - -public final class BallBungeeCordListener implements Listener, BallListener { - public static final BallBungeeCordListener INSTANCE = new BallBungeeCordListener(); - - private BallBungeeCordListener() { - } - - @Override - public void onMessageReceived(@NotNull BallMessageInfo info) { - switch (info.getAction()) { - case DispatchConsoleCommandEvent.ACTION: { - DispatchConsoleCommandEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), DispatchConsoleCommandEvent.class); - if (event.getType() != null && event.getType() != BallServerType.PROXY) { - return; - } - if (event.getServerID() != null && !BallAPI.getInstance().isLocalServer(event.getServerID())) { - return; - } - ProxyServer server = ProxyServer.getInstance(); - server.getPluginManager().dispatchCommand(server.getConsole(), event.getCommand()); - break; - } - case DispatchPlayerCommandEvent.ACTION: { - DispatchPlayerCommandEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), DispatchPlayerCommandEvent.class); - if (event.getType() != null && event.getType() != BallServerType.GAME) { - return; - } - ProxyServer server = ProxyServer.getInstance(); - if (event.getUuid() != null) { - ProxiedPlayer player = server.getPlayer(event.getUuid()); - if (player == null) { - return; - } - server.getPluginManager().dispatchCommand(player, event.getCommand()); - return; - } - for (ProxiedPlayer player : server.getPlayers()) { - server.getPluginManager().dispatchCommand(player, event.getCommand()); - } - break; - } - case KickPlayerEvent.ACTION: { - KickPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), KickPlayerEvent.class); - ProxiedPlayer player = ProxyServer.getInstance().getPlayer(event.getUuid()); - BaseComponent[] components = BungeeComponentSerializer.get().serialize(event.getReason()); - player.disconnect(components); - break; - } - case SendMessageToPlayerEvent.ACTION: { - SendMessageToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), SendMessageToPlayerEvent.class); - for (UUID receiver : event.getReceivers()) { - Audience audience = CoreAPI.getInstance().getAudienceProvider().player(receiver); - event.getMessage().show(audience); - } - break; - } - case SendPlayerToLocationEvent.ACTION: { - SendPlayerToLocationEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), SendPlayerToLocationEvent.class); - String serverID = event.getLocation().getServerID(); - ServerInfo serverInfo = ProxyServer.getInstance().getServerInfo(serverID); - if (serverInfo == null) { - HamsterBallPlugin.getInstance().getLogger().warning("试图传送玩家时失败: 服务器 " + serverID + " 不在线"); - break; - } - for (UUID uuid : event.getSendPlayerUUID()) { - ProxiedPlayer player = ProxyServer.getInstance().getPlayer(uuid); - if (player == null) { - continue; - } - if (player.getServer().getInfo().getName().equals(serverID)) { - continue; - } - player.connect(serverInfo); - } - break; - } - case SendPlayerToPlayerEvent.ACTION: { - SendPlayerToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), SendPlayerToPlayerEvent.class); - UUID toPlayerUUID = event.getToPlayerUUID(); - ProxiedPlayer toPlayer = ProxyServer.getInstance().getPlayer(toPlayerUUID); - if (toPlayer == null) { - HamsterBallPlugin.getInstance().getLogger().warning("试图传送玩家时失败: 目标玩家 " + toPlayerUUID + " 不在线"); - break; - } - ServerInfo toServer = toPlayer.getServer().getInfo(); - for (UUID uuid : event.getSendPlayerUUID()) { - ProxiedPlayer sendPlayer = ProxyServer.getInstance().getPlayer(uuid); - if (sendPlayer.getServer().getInfo().getName().equals(toServer.getName())) { - continue; - } - sendPlayer.connect(toServer); - } - } - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void onPreLogin(PreLoginEvent event) { - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerPreLoginEvent.ACTION, - new BallPlayerPreLoginEvent(event.getConnection().getName()) - ); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onLogin(LoginEvent event) { - if (event.isCancelled()) { - return; - } - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerLoginEvent.ACTION, - new BallPlayerLoginEvent(new BallPlayerInfo( - event.getConnection().getUniqueId(), - event.getConnection().getName(), - "connecting", - BallAPI.getInstance().getLocalServerId(), - true - )) - ); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onPostLogin(PostLoginEvent event) { - ProxiedPlayer player = event.getPlayer(); - BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerPostLoginEvent.ACTION, - new BallPlayerPostLoginEvent(playerInfo) - ); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onServerConnect(ServerConnectEvent event) { - ProxiedPlayer player = event.getPlayer(); - BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); - playerInfo.setGameServer(event.getTarget().getName()); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerPreConnectServerEvent.ACTION, - new BallPlayerPreConnectServerEvent(playerInfo, playerInfo.getGameServer(), event.getTarget().getName()) - ); - BallBungeeCordUtils.uploadPlayerInfo(playerInfo); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onServerConnected(ServerConnectedEvent event) { - ProxiedPlayer player = event.getPlayer(); - BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); - playerInfo.setGameServer(event.getServer().getInfo().getName()); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerPostConnectServerEvent.ACTION, - new BallPlayerPostConnectServerEvent(playerInfo) - ); - BallBungeeCordUtils.uploadPlayerInfo(playerInfo); - } - - @EventHandler - public void onServerSwitch(ServerSwitchEvent event) { - } - - @EventHandler(priority = EventPriority.HIGH) - public void onServerDisconnect(ServerDisconnectEvent event) { - } - - @EventHandler(priority = EventPriority.HIGH) - public void onPlayerDisconnect(PlayerDisconnectEvent event) { - ProxiedPlayer player = event.getPlayer(); - BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, false); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerLogoutEvent.ACTION, - new BallPlayerLogoutEvent(playerInfo) - ); - BallBungeeCordUtils.uploadPlayerInfo(playerInfo); - } -} diff --git a/ball-common/build.gradle.kts b/ball-common/build.gradle.kts index fcb0a68..22db957 100644 --- a/ball-common/build.gradle.kts +++ b/ball-common/build.gradle.kts @@ -1,12 +1,12 @@ -@file:Suppress("VulnerableLibrariesLocal") +@file:Suppress("VulnerableLibrariesLocal", "GradlePackageVersionRange", "GradlePackageUpdate") dependencies { compileOnly("cn.hamster3.mc.plugin:core-common:+") compileOnly("com.google.code.gson:gson:2.8.0") + compileOnly("com.google.guava:guava:31.0-jre") - // https://mvnrepository.com/artifact/io.lettuce/lettuce-core - compileOnly("io.lettuce:lettuce-core:6.2.6.RELEASE") + compileOnly("io.lettuce:lettuce-core:+") } tasks { 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 e35a81a..3eed97b 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 @@ -1,22 +1,23 @@ package cn.hamster3.mc.plugin.ball.common.api; +import cn.hamster3.mc.plugin.ball.common.config.BallConfig; import cn.hamster3.mc.plugin.ball.common.data.BallLocation; -import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo; +import cn.hamster3.mc.plugin.ball.common.data.BallMessage; import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; +import cn.hamster3.mc.plugin.ball.common.event.message.MessageSentEvent; import cn.hamster3.mc.plugin.ball.common.event.operate.*; -import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerConnectServerEvent; -import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerInfoUpdateEvent; import cn.hamster3.mc.plugin.ball.common.event.server.ServerOfflineEvent; -import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; +import cn.hamster3.mc.plugin.ball.common.listener.BallCommonListener; import cn.hamster3.mc.plugin.ball.common.listener.BallDebugListener; -import cn.hamster3.mc.plugin.ball.common.listener.BallListener; -import cn.hamster3.mc.plugin.ball.common.listener.BallMessageListener; -import cn.hamster3.mc.plugin.ball.common.listener.ListenerPriority; +import cn.hamster3.mc.plugin.ball.common.listener.BallRedisListener; import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import cn.hamster3.mc.plugin.core.common.data.DisplayMessage; import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.text.Component; +import com.google.common.eventbus.AsyncEventBus; +import com.google.common.eventbus.EventBus; import io.lettuce.core.RedisClient; import io.lettuce.core.pubsub.StatefulRedisPubSubConnection; import lombok.Getter; @@ -29,130 +30,53 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; +@Getter @SuppressWarnings("unused") public abstract class BallAPI { /** * API 使用的通信频道 */ public static final String BALL_CHANNEL = "HamsterBall"; + /** + * API 使用的玩家信息更新通信频道 + */ + public static final String PLAYER_INFO_UPDATE_CHANNEL = "HamsterBall:PlayerInfo"; /** * API 实例 */ @Getter protected static BallAPI instance; @NotNull - protected final Map serverInfo; + private final BallConfig ballConfig; @NotNull - protected final Map playerInfo; + private final EventBus eventBus; @NotNull - private final BallServerInfo localServerInfo; - @Nullable - private final DataSource datasource; + private final Map allServerInfo; @NotNull - private final RedisClient redisClient; + private final Map allPlayerInfo; @NotNull - private final StatefulRedisPubSubConnection pubSubConnection; - + private final StatefulRedisPubSubConnection subConnection; @NotNull - private List listeners; - @Getter - private boolean enabled; + private final StatefulRedisPubSubConnection pubConnection; - public BallAPI(@NotNull BallServerInfo localServerInfo, @Nullable DataSource datasource, @NotNull RedisClient redisClient, boolean debug) { - this.localServerInfo = localServerInfo; - this.datasource = datasource; - this.redisClient = redisClient; - pubSubConnection = redisClient.connectPubSub(BallMessageInfo.CODEC); - serverInfo = new ConcurrentHashMap<>(); - playerInfo = new ConcurrentHashMap<>(); - listeners = new ArrayList<>(); - enabled = false; - initListener(debug); - } - - private void initListener(boolean debug) { - addListener(new BallListener() { - @Override - public ListenerPriority getPriority() { - return ListenerPriority.LOW; - } - - @Override - public void onBallPlayerConnectServer(@NotNull BallPlayerConnectServerEvent event) { - BallPlayerInfo info = event.getPlayerInfo(); - playerInfo.put(info.getUuid(), info); - } - - @Override - public void onBallPlayerInfoUpdate(@NotNull BallPlayerInfoUpdateEvent event) { - BallPlayerInfo info = event.getPlayerInfo(); - playerInfo.put(info.getUuid(), info); - } - - @Override - public void onServerOnline(@NotNull ServerOnlineEvent event) { - BallServerInfo info = event.getServerInfo(); - serverInfo.put(info.getId(), info); - switch (info.getType()) { - case GAME: { - playerInfo.forEach((uuid, playerInfo) -> { - if (playerInfo.getGameServer().equals(info.getId())) { - playerInfo.setOnline(false); - } - }); - break; - } - case PROXY: { - playerInfo.forEach((uuid, playerInfo) -> { - if (playerInfo.getProxyServer().equals(info.getId())) { - playerInfo.setOnline(false); - } - }); - break; - } - } - } - - @Override - public void onServerOffline(@NotNull ServerOfflineEvent event) { - String serverID = event.getServerID(); - BallServerInfo info = serverInfo.remove(serverID); - if (info == null) { - return; - } - switch (info.getType()) { - case GAME: { - playerInfo.forEach((uuid, playerInfo) -> { - if (playerInfo.getGameServer().equals(info.getId())) { - playerInfo.setOnline(false); - } - }); - break; - } - case PROXY: { - playerInfo.forEach((uuid, playerInfo) -> { - if (playerInfo.getProxyServer().equals(info.getId())) { - playerInfo.setOnline(false); - } - }); - break; - } - } - } - }); - if (debug) { + public BallAPI(@NotNull BallConfig ballConfig) { + this.ballConfig = ballConfig; + subConnection = ballConfig.getRedisClient().connectPubSub(BallMessage.CODEC); + pubConnection = ballConfig.getRedisClient().connectPubSub(BallMessage.CODEC); + allServerInfo = new ConcurrentHashMap<>(); + allPlayerInfo = new ConcurrentHashMap<>(); + eventBus = new AsyncEventBus("HamsterBall - EventBus", CoreAPI.getInstance().getExecutorService()); + eventBus.register(BallCommonListener.INSTANCE); + if (ballConfig.isDebug()) { getLogger().warning("已启用调试模式"); - pubSubConnection.addListener(BallDebugListener.INSTANCE); + eventBus.register(BallDebugListener.INSTANCE); } } protected void enable() throws SQLException, InterruptedException { - if (enabled) { - return; - } BallServerInfo localInfo = getLocalServerInfo(); - try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { + try (Connection connection = getDatasource().getConnection()) { try (Statement statement = connection.createStatement()) { statement.execute("CREATE TABLE IF NOT EXISTS `hamster_ball_player_info`(" + "`uuid` CHAR(36) PRIMARY KEY," + @@ -189,7 +113,7 @@ public abstract class BallAPI { try (ResultSet set = statement.executeQuery()) { while (set.next()) { String serverID = set.getString("id"); - serverInfo.put(serverID, new BallServerInfo( + allServerInfo.put(serverID, new BallServerInfo( serverID, set.getString("name"), BallServerType.valueOf(set.getString("type")), @@ -205,7 +129,7 @@ public abstract class BallAPI { try (ResultSet set = statement.executeQuery()) { while (set.next()) { UUID uuid = UUID.fromString(set.getString("uuid")); - playerInfo.put(uuid, new BallPlayerInfo(uuid, + allPlayerInfo.put(uuid, new BallPlayerInfo(uuid, set.getString("name"), set.getString("game_server"), set.getString("proxy_server"), @@ -215,16 +139,16 @@ public abstract class BallAPI { } } } - RedisClient client = getRedisClient(); - pubSubConnection.addListener(BallMessageListener.INSTANCE); - pubSubConnection.async().subscribe("HamsterBall"); - enabled = true; + subConnection.addListener(BallRedisListener.INSTANCE); + subConnection.sync().subscribe(BALL_CHANNEL); } protected void disable() throws SQLException, InterruptedException { - sendBallMessage(new BallMessageInfo(BALL_CHANNEL, ServerOfflineEvent.ACTION, new ServerOfflineEvent(getLocalServerId())), true); + sendBallMessage(BallAPI.BALL_CHANNEL, new BallMessage( + BallActions.ServerOffline.name(), new ServerOfflineEvent(getLocalServerInfo()) + ), false, true); - try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { + try (Connection connection = getDatasource().getConnection()) { try (PreparedStatement statement = connection.prepareStatement( "DELETE FROM `hamster_ball_server_info` WHERE `id`=?;" )) { @@ -240,7 +164,7 @@ public abstract class BallAPI { } } getLogger().info("正在关闭 redission"); - getRedisClient().close(); + ballConfig.getRedisClient().close(); getLogger().info("已关闭 redission"); } @@ -279,16 +203,11 @@ public abstract class BallAPI { * @param message 消息 */ public void broadcastPlayerMessage(@NotNull DisplayMessage message) { - sendBallMessage(new BallMessageInfo( - BALL_CHANNEL, - getLocalServerId(), - null, - BallServerType.PROXY, - BroadcastPlayerMessageEvent.ACTION, - CoreAPI.getInstance().getGson().toJsonTree( - new BroadcastPlayerMessageEvent(message) - ) - )); + sendBallMessage(BALL_CHANNEL, new BallMessage( + getLocalServerId(), null, BallServerType.PROXY, + BallActions.BroadcastPlayerMessage.name(), + CoreAPI.getInstance().getGson().toJsonTree(new BroadcastPlayerMessageEvent(message)) + ), false); } /** @@ -299,16 +218,12 @@ public abstract class BallAPI { * @param command 命令内容 */ public void dispatchConsoleCommand(@Nullable BallServerType type, @Nullable String serverID, @NotNull String command) { - sendBallMessage(new BallMessageInfo( - BALL_CHANNEL, - getLocalServerId(), - null, - BallServerType.GAME, - DispatchConsoleCommandEvent.ACTION, - CoreAPI.getInstance().getGson().toJsonTree( - new DispatchConsoleCommandEvent(type, serverID, command) - ) - )); + sendBallMessage(BALL_CHANNEL, new BallMessage( + getLocalServerId(), null, BallServerType.GAME, + BallActions.DispatchConsoleCommand.name(), + CoreAPI.getInstance().getGson().toJsonTree(new DispatchConsoleCommandEvent(type, serverID, command)) + ), false); + } /** @@ -319,16 +234,11 @@ public abstract class BallAPI { * @param command 命令内容 */ public void dispatchPlayerCommand(@Nullable BallServerType type, @Nullable UUID uuid, @NotNull String command) { - sendBallMessage(new BallMessageInfo( - BALL_CHANNEL, - getLocalServerId(), - null, - BallServerType.GAME, - DispatchPlayerCommandEvent.ACTION, - CoreAPI.getInstance().getGson().toJsonTree( - new DispatchPlayerCommandEvent(type, uuid, command) - ) - )); + sendBallMessage(BALL_CHANNEL, new BallMessage( + getLocalServerId(), null, BallServerType.GAME, + BallActions.DispatchPlayerCommand.name(), + CoreAPI.getInstance().getGson().toJsonTree(new DispatchPlayerCommandEvent(type, uuid, command)) + ), false); } /** @@ -348,16 +258,11 @@ public abstract class BallAPI { * @param reason 原因 */ public void kickPlayer(@NotNull UUID uuid, @NotNull Component reason) { - sendBallMessage(new BallMessageInfo( - BALL_CHANNEL, - getLocalServerId(), - null, - BallServerType.PROXY, - KickPlayerEvent.ACTION, - CoreAPI.getInstance().getGson().toJsonTree( - new KickPlayerEvent(uuid, reason) - ) - )); + sendBallMessage(BALL_CHANNEL, new BallMessage( + getLocalServerId(), null, BallServerType.PROXY, + BallActions.KickPlayer.name(), + CoreAPI.getInstance().getGson().toJsonTree(new KickPlayerEvent(uuid, reason)) + ), false); } /** @@ -368,34 +273,7 @@ public abstract class BallAPI { * @param cache 当玩家不在线时,是否缓存消息等待玩家上线再发送 */ public void sendMessageToPlayer(@NotNull UUID receiver, @NotNull DisplayMessage message, boolean cache) { - BallPlayerInfo info = getPlayerInfo(receiver); - if (info == null || !info.isOnline()) { - if (!cache) { - return; - } - try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { - try (PreparedStatement statement = connection.prepareStatement( - "INSERT INTO `hamster_ball_cached_message` VALUES(?, ?);" - )) { - statement.setString(1, receiver.toString()); - statement.setString(2, message.toJson().toString()); - statement.executeUpdate(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return; - } - sendBallMessage(new BallMessageInfo( - BALL_CHANNEL, - getLocalServerId(), - null, - BallServerType.PROXY, - SendMessageToPlayerEvent.ACTION, - CoreAPI.getInstance().getGson().toJsonTree( - new SendMessageToPlayerEvent(Collections.singleton(receiver), message) - ) - )); + sendMessageToPlayer(Collections.singleton(receiver), message, cache); } /** @@ -412,7 +290,7 @@ public abstract class BallAPI { if (info != null && info.isOnline()) { continue; } - try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { + try (Connection connection = getDatasource().getConnection()) { try (PreparedStatement statement = connection.prepareStatement( "INSERT INTO `hamster_ball_cached_message` VALUES(?, ?);" )) { @@ -425,16 +303,11 @@ public abstract class BallAPI { } } } - sendBallMessage(new BallMessageInfo( - BALL_CHANNEL, - getLocalServerId(), - null, - BallServerType.PROXY, - SendMessageToPlayerEvent.ACTION, - CoreAPI.getInstance().getGson().toJsonTree( - new SendMessageToPlayerEvent(new HashSet<>(receivers), message) - ) - )); + sendBallMessage(BALL_CHANNEL, new BallMessage( + getLocalServerId(), null, BallServerType.PROXY, + BallActions.SendMessageToPlayer.name(), + CoreAPI.getInstance().getGson().toJsonTree(new SendMessageToPlayerEvent(new HashSet<>(receivers), message)) + ), false); } /** @@ -449,11 +322,7 @@ public abstract class BallAPI { * @param doneMessage 传送完成后显示的消息 */ public void sendPlayerToLocation(@NotNull UUID sendPlayerUUID, @NotNull BallLocation location, @Nullable DisplayMessage doneMessage) { - sendBallMessage( - BALL_CHANNEL, - SendPlayerToLocationEvent.ACTION, - new SendPlayerToLocationEvent(Collections.singleton(sendPlayerUUID), location, doneMessage) - ); + sendPlayerToLocation(Collections.singleton(sendPlayerUUID), location, doneMessage); } /** @@ -468,10 +337,8 @@ public abstract class BallAPI { * @param doneMessage 传送完成后显示的消息 */ public void sendPlayerToLocation(@NotNull Collection sendPlayerUUID, @NotNull BallLocation location, @Nullable DisplayMessage doneMessage) { - sendBallMessage( - BALL_CHANNEL, - SendPlayerToLocationEvent.ACTION, - new SendPlayerToLocationEvent(new HashSet<>(sendPlayerUUID), location, doneMessage) + sendBallMessage(BALL_CHANNEL, BallActions.SendPlayerToLocation.name(), + new SendPlayerToLocationEvent(new HashSet<>(sendPlayerUUID), location, doneMessage), false ); } @@ -486,11 +353,7 @@ public abstract class BallAPI { * @param doneTargetMessage 传送完成后目标玩家显示的消息,自动将 %player_name% 替换成被传送者的名称 */ public void sendPlayerToPlayer(@NotNull UUID sendPlayer, @NotNull UUID toPlayer, @Nullable DisplayMessage doneMessage, @Nullable DisplayMessage doneTargetMessage) { - sendBallMessage( - BALL_CHANNEL, - SendPlayerToPlayerEvent.ACTION, - new SendPlayerToPlayerEvent(Collections.singleton(sendPlayer), toPlayer, doneMessage, doneTargetMessage) - ); + sendPlayerToPlayer(Collections.singleton(sendPlayer), toPlayer, doneMessage, doneTargetMessage); } /** @@ -506,76 +369,121 @@ public abstract class BallAPI { public void sendPlayerToPlayer(@NotNull Collection sendPlayerUUID, @NotNull UUID toPlayer, @Nullable DisplayMessage doneMessage, @Nullable DisplayMessage doneTargetMessage) { sendBallMessage( BALL_CHANNEL, - SendPlayerToPlayerEvent.ACTION, - new SendPlayerToPlayerEvent(new HashSet<>(sendPlayerUUID), toPlayer, doneMessage, doneTargetMessage) + BallActions.SendPlayerToPlayer.name(), + new SendPlayerToPlayerEvent(new HashSet<>(sendPlayerUUID), toPlayer, doneMessage, doneTargetMessage), + false ); } /** * 发送一条服务消息 * - * @param channel 消息标签 + * @param channel 消息频道 * @param action 执行动作 */ public void sendBallMessage(@NotNull String channel, @NotNull String action) { - sendBallMessage(new BallMessageInfo(channel, action)); + sendBallMessage(channel, new BallMessage(action)); + } + + /** + * 发送一条服务消息 + * + * @param channel 消息频道 + * @param action 执行动作 + * @param prefix 是否自动为消息频道添加分组前缀 + */ + public void sendBallMessage(@NotNull String channel, @NotNull String action, boolean prefix) { + sendBallMessage(channel, new BallMessage(action), prefix); } /** * 发送一条有附加参数的服务消息 * - * @param channel 消息标签 + * @param channel 消息频道 * @param action 执行动作 * @param content 附加参数 */ public void sendBallMessage(@NotNull String channel, @NotNull String action, @NotNull Object content) { - sendBallMessage(new BallMessageInfo(channel, action, content)); + sendBallMessage(channel, new BallMessage(action, content)); + } + + /** + * 发送一条有附加参数的服务消息 + * + * @param channel 消息频道 + * @param action 执行动作 + * @param content 附加参数 + * @param prefix 是否自动为消息频道添加分组前缀 + */ + public void sendBallMessage(@NotNull String channel, @NotNull String action, @NotNull Object content, boolean prefix) { + sendBallMessage(channel, new BallMessage(action, content), prefix); } /** * 发送自定义消息 * - * @param messageInfo 消息内容 + * @param message 消息内容 */ - public void sendBallMessage(@NotNull BallMessageInfo messageInfo) { - sendBallMessage(messageInfo, false); + public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message) { + sendBallMessage(channel, message, true, false); + } + + /** + * 发送自定义消息 + * + * @param message 消息内容 + * @param prefix 是否自动为消息频道添加分组前缀 + */ + public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message, boolean prefix) { + sendBallMessage(channel, message, prefix, false); } /** * 自定义服务消息信息并发送 * - * @param messageInfo 消息内容 - * @param block 是否阻塞(设置为 true 则必须等待消息写入网络的操作完成后,该方法才会退出) + * @param channel 消息频道 + * @param message 消息内容 + * @param prefix 是否自动为消息频道添加分组前缀 + * @param block 是否阻塞(设置为 true 则必须等待消息写入网络的操作完成后,该方法才会退出) */ - public void sendBallMessage(@NotNull BallMessageInfo messageInfo, boolean block) { - String string = CoreAPI.getInstance().getGson().toJson(messageInfo); - try (StatefulRedisPubSubConnection connection = getRedisClient().connectPubSub(BallMessageInfo.CODEC)) { - if (block) { - connection.sync().publish("HamsterBall", messageInfo); - } else { - connection.async().publish("HamsterBall", messageInfo); - } + public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message, boolean prefix, boolean block) { + if (prefix) { + channel = ballConfig.getChannelPrefix() + ":" + channel; } - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onMessageSend(messageInfo); - } catch (Exception | Error e) { - e.printStackTrace(); - } + if (block) { + pubConnection.sync().publish(channel, message); + eventBus.post(new MessageSentEvent(channel, message)); + } else { + @NotNull String finalChannel = channel; + pubConnection.async().publish(channel, message).whenComplete((aLong, throwable) -> { + if (throwable != null) { + return; + } + eventBus.post(new MessageSentEvent(finalChannel, message)); + }); } } - public void addListener(@NotNull BallListener listener) { - ArrayList newListeners = new ArrayList<>(listeners); - newListeners.add(listener); - newListeners.sort(Comparator.comparing(BallListener::getPriority)); - listeners = newListeners; + public void subscribe(@NotNull String... channel) { + for (int i = 0; i < channel.length; i++) { + channel[i] = ballConfig.getChannelPrefix() + ":" + channel[i]; + } + subConnection.sync().subscribe(channel); } - public void removeListener(@NotNull BallListener listener) { - ArrayList newListeners = new ArrayList<>(listeners); - newListeners.remove(listener); - listeners = newListeners; + public void subscribePatterns(@NotNull String patterns) { + subConnection.sync().psubscribe(patterns); + } + + public void unsubscribe(@NotNull String... channel) { + for (int i = 0; i < channel.length; i++) { + channel[i] = ballConfig.getChannelPrefix() + ":" + channel[i]; + } + subConnection.sync().unsubscribe(channel); + } + + public void unsubscribePatterns(@NotNull String patterns) { + subConnection.sync().punsubscribe(patterns); } /** @@ -585,12 +493,12 @@ public abstract class BallAPI { */ @NotNull public BallServerInfo getLocalServerInfo() { - return localServerInfo; + return ballConfig.getServerInfo(); } @NotNull public String getLocalServerId() { - return localServerInfo.getId(); + return ballConfig.getServerInfo().getId(); } /** @@ -600,7 +508,7 @@ public abstract class BallAPI { * @return 可能为 null */ public BallServerInfo getServerInfo(@NotNull String serverID) { - return serverInfo.get(serverID); + return allServerInfo.get(serverID); } /** @@ -610,7 +518,7 @@ public abstract class BallAPI { * @return 玩家信息 */ public BallPlayerInfo getPlayerInfo(@NotNull UUID uuid) { - return playerInfo.get(uuid); + return allPlayerInfo.get(uuid); } /** @@ -620,7 +528,7 @@ public abstract class BallAPI { * @return 玩家信息 */ public BallPlayerInfo getPlayerInfo(@NotNull String playerName) { - for (BallPlayerInfo info : playerInfo.values()) { + for (BallPlayerInfo info : allPlayerInfo.values()) { if (info.getName().equalsIgnoreCase(playerName)) { return info; } @@ -635,7 +543,7 @@ public abstract class BallAPI { * @return 玩家信息 */ public BallPlayerInfo getPlayerInfoExact(@NotNull String playerName) { - for (BallPlayerInfo info : playerInfo.values()) { + for (BallPlayerInfo info : allPlayerInfo.values()) { if (info.getName().equals(playerName)) { return info; } @@ -705,31 +613,16 @@ public abstract class BallAPI { return info.getName(); } - @NotNull - public Map getAllServerInfo() { - return serverInfo; - } - - @NotNull - public Map getAllPlayerInfo() { - return playerInfo; - } - - @NotNull - public List getListeners() { - return listeners; - } - @NotNull public abstract Logger getLogger(); @NotNull public DataSource getDatasource() { - return datasource == null ? CoreAPI.getInstance().getDataSource() : datasource; + return ballConfig.getDatasource() == null ? CoreAPI.getInstance().getDataSource() : ballConfig.getDatasource(); } @NotNull public RedisClient getRedisClient() { - return redisClient; + return ballConfig.getRedisClient(); } } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/config/BallConfig.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/config/BallConfig.java index c6e08bc..1940e98 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/config/BallConfig.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/config/BallConfig.java @@ -1,17 +1,25 @@ package cn.hamster3.mc.plugin.ball.common.config; import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; +import io.lettuce.core.RedisClient; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -@Data +import javax.sql.DataSource; + +@Getter @AllArgsConstructor public class BallConfig { + private boolean debug; @NotNull - private BallServerInfo localInfo; + private RedisClient redisClient; @NotNull - private String host; - private int port; - private int eventLoopThread; + private String channelPrefix; + private boolean gameServerUpdatePlayerInfo; + @NotNull + private BallServerInfo serverInfo; + @Nullable + private DataSource datasource; } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessageInfo.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessage.java similarity index 83% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessageInfo.java rename to ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessage.java index 7d9b7ee..aae2025 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessageInfo.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessage.java @@ -9,6 +9,7 @@ import com.google.gson.JsonObject; import io.lettuce.core.codec.RedisCodec; import io.lettuce.core.codec.StringCodec; import lombok.Data; +import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -21,21 +22,22 @@ import java.util.UUID; * 服务消息 */ @Data +@NoArgsConstructor @SuppressWarnings("unused") -public class BallMessageInfo { +public class BallMessage { /** * 编解码器 */ - public static final RedisCodec CODEC = new RedisCodec() { + public static final RedisCodec CODEC = new RedisCodec() { @Override public String decodeKey(ByteBuffer bytes) { return StringCodec.UTF8.decodeKey(bytes); } @Override - public BallMessageInfo decodeValue(ByteBuffer bytes) { + public BallMessage decodeValue(ByteBuffer bytes) { String string = StringCodec.UTF8.decodeValue(bytes); - return CoreAPI.getInstance().getGson().fromJson(string, BallMessageInfo.class); + return CoreAPI.getInstance().getGson().fromJson(string, BallMessage.class); } @Override @@ -44,7 +46,7 @@ public class BallMessageInfo { } @Override - public ByteBuffer encodeValue(BallMessageInfo value) { + public ByteBuffer encodeValue(BallMessage value) { return StringCodec.UTF8.encodeValue(CoreAPI.getInstance().getGson().toJson(value)); } }; @@ -71,11 +73,6 @@ public class BallMessageInfo { */ @Nullable private BallServerType receiverType; - /** - * 消息的频道 - */ - @NotNull - private String channel; /** * 消息动作 *

@@ -90,22 +87,19 @@ public class BallMessageInfo { */ private JsonElement content; - public BallMessageInfo(@NotNull String channel, @NotNull String action) { + public BallMessage(@NotNull String action) { senderID = BallAPI.getInstance().getLocalServerId(); - this.channel = channel; this.action = action; } - public BallMessageInfo(@NotNull String channel, @NotNull String action, @NotNull Object content) { - this.channel = channel; + public BallMessage(@NotNull String action, @NotNull Object content) { senderID = BallAPI.getInstance().getLocalServerId(); this.action = action; this.content = CoreAPI.getInstance().getGson().toJsonTree(content); } - public BallMessageInfo(@NotNull String channel, @NotNull String senderID, @Nullable String receiverID, - @Nullable BallServerType receiverType, @NotNull String action, @Nullable JsonElement content) { - this.channel = channel; + public BallMessage(@NotNull String senderID, @Nullable String receiverID, + @Nullable BallServerType receiverType, @NotNull String action, @Nullable JsonElement content) { this.senderID = senderID; this.receiverID = receiverID; this.receiverType = receiverType; @@ -121,7 +115,6 @@ public class BallMessageInfo { @NotNull public JsonObject toJson() { JsonObject object = new JsonObject(); - object.addProperty("channel", channel); object.addProperty("senderID", senderID); if (receiverID != null) { object.addProperty("toServer", receiverID); diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/BallActions.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/BallActions.java new file mode 100644 index 0000000..26c65ce --- /dev/null +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/BallActions.java @@ -0,0 +1,24 @@ +package cn.hamster3.mc.plugin.ball.common.event; + +public enum BallActions { + BroadcastPlayerMessage, + DispatchConsoleCommand, + DispatchPlayerCommand, + KickPlayer, + SendMessageToPlayer, + SendPlayerToLocation, + SendPlayerToPlayer, + + BallPlayerPreLogin, + BallPlayerLogin, + BallPlayerPostLogin, + BallPlayerPreConnectServer, + BallPlayerConnectServer, + BallPlayerPostConnectServer, + BallPlayerLogout, + + BallPlayerInfoUpdate, + + ServerOffline, + ServerOnline, +} diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageReceivedEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageReceivedEvent.java new file mode 100644 index 0000000..9cd30e9 --- /dev/null +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageReceivedEvent.java @@ -0,0 +1,21 @@ +package cn.hamster3.mc.plugin.ball.common.event.message; + +import cn.hamster3.mc.plugin.ball.common.data.BallMessage; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.jetbrains.annotations.NotNull; + +@Data +@AllArgsConstructor +public class MessageReceivedEvent { + /** + * 消息的频道 + */ + @NotNull + private String channel; + /** + * 消息的内容 + */ + @NotNull + private BallMessage message; +} diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageSentEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageSentEvent.java new file mode 100644 index 0000000..cd6c229 --- /dev/null +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/message/MessageSentEvent.java @@ -0,0 +1,21 @@ +package cn.hamster3.mc.plugin.ball.common.event.message; + +import cn.hamster3.mc.plugin.ball.common.data.BallMessage; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.jetbrains.annotations.NotNull; + +@Data +@AllArgsConstructor +public class MessageSentEvent { + /** + * 消息的频道 + */ + @NotNull + private String channel; + /** + * 消息的内容 + */ + @NotNull + private BallMessage message; +} diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/BroadcastPlayerMessageEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/BroadcastPlayerMessageEvent.java index 6342330..ae8e886 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/BroadcastPlayerMessageEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/BroadcastPlayerMessageEvent.java @@ -8,9 +8,6 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class BroadcastPlayerMessageEvent { - public static final String ACTION = "BroadcastPlayerMessage"; - @NotNull private final DisplayMessage message; - } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchConsoleCommandEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchConsoleCommandEvent.java index a27e40e..0c4ec36 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchConsoleCommandEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchConsoleCommandEvent.java @@ -9,8 +9,6 @@ import org.jetbrains.annotations.Nullable; @Data @AllArgsConstructor public class DispatchConsoleCommandEvent { - public static final String ACTION = "DispatchConsoleCommand"; - @Nullable private final BallServerType type; @Nullable diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchPlayerCommandEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchPlayerCommandEvent.java index e13018b..1e9365a 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchPlayerCommandEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchPlayerCommandEvent.java @@ -11,8 +11,6 @@ import java.util.UUID; @Data @AllArgsConstructor public class DispatchPlayerCommandEvent { - public static final String ACTION = "DispatchPlayerCommand"; - @Nullable private final BallServerType type; @Nullable diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/KickPlayerEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/KickPlayerEvent.java index 64bee96..ba571da 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/KickPlayerEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/KickPlayerEvent.java @@ -10,8 +10,6 @@ import java.util.UUID; @Data @AllArgsConstructor public class KickPlayerEvent { - public static final String ACTION = "KickPlayer"; - @NotNull private final UUID uuid; @NotNull diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendMessageToPlayerEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendMessageToPlayerEvent.java index 23c48f3..a1a1885 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendMessageToPlayerEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendMessageToPlayerEvent.java @@ -11,8 +11,6 @@ import java.util.UUID; @Data @AllArgsConstructor public class SendMessageToPlayerEvent { - public static final String ACTION = "SendMessageToPlayer"; - @NotNull private final Set receivers; @NotNull diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToLocationEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToLocationEvent.java index d4519eb..a701911 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToLocationEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToLocationEvent.java @@ -13,8 +13,6 @@ import java.util.UUID; @Data @AllArgsConstructor public class SendPlayerToLocationEvent { - public static final String ACTION = "SendPlayerToLocation"; - @NotNull private final Set sendPlayerUUID; @NotNull diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToPlayerEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToPlayerEvent.java index 3af5576..9797624 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToPlayerEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToPlayerEvent.java @@ -12,8 +12,6 @@ import java.util.UUID; @Data @AllArgsConstructor public class SendPlayerToPlayerEvent { - public static final String ACTION = "SendPlayerToPlayer"; - @NotNull private final Set sendPlayerUUID; @NotNull @@ -22,5 +20,4 @@ public class SendPlayerToPlayerEvent { private final DisplayMessage doneMessage; @Nullable private final DisplayMessage doneTargetMessage; - } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerConnectServerEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerConnectServerEvent.java index 4dde9f2..a66fc6e 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerConnectServerEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerConnectServerEvent.java @@ -18,8 +18,6 @@ import org.jetbrains.annotations.Nullable; @Data @AllArgsConstructor public class BallPlayerConnectServerEvent { - public static final String ACTION = "PlayerConnectServer"; - @NotNull private final BallPlayerInfo playerInfo; @Nullable diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerInfoUpdateEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerInfoUpdateEvent.java index 5df3559..3a030e1 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerInfoUpdateEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerInfoUpdateEvent.java @@ -11,8 +11,6 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class BallPlayerInfoUpdateEvent { - public static final String ACTION = "PlayerInfoUpdateEvent"; - @NotNull private final BallPlayerInfo playerInfo; } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLoginEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLoginEvent.java index 8605061..a6f51c1 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLoginEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLoginEvent.java @@ -11,8 +11,6 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class BallPlayerLoginEvent { - public static final String ACTION = "PlayerLogin"; - @NotNull private final BallPlayerInfo playerInfo; diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLogoutEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLogoutEvent.java index fdca0b3..ced102d 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLogoutEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLogoutEvent.java @@ -11,8 +11,6 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class BallPlayerLogoutEvent { - public static final String ACTION = "PlayerLogout"; - @NotNull private BallPlayerInfo playerInfo; } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostConnectServerEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostConnectServerEvent.java index d63ae4e..8ba54f4 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostConnectServerEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostConnectServerEvent.java @@ -15,8 +15,6 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class BallPlayerPostConnectServerEvent { - public static final String ACTION = "PlayerPostConnectServer"; - @NotNull private final BallPlayerInfo playerInfo; } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostLoginEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostLoginEvent.java index 299fa50..0220d80 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostLoginEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostLoginEvent.java @@ -11,8 +11,6 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class BallPlayerPostLoginEvent { - public static final String ACTION = "PlayerPostLogin"; - @NotNull private final BallPlayerInfo playerInfo; } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreConnectServerEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreConnectServerEvent.java index 9a21b5f..ffd2b7a 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreConnectServerEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreConnectServerEvent.java @@ -16,13 +16,10 @@ import org.jetbrains.annotations.Nullable; @Data @AllArgsConstructor public class BallPlayerPreConnectServerEvent { - public static final String ACTION = "PlayerPreConnectServer"; - @NotNull private final BallPlayerInfo playerInfo; @Nullable private final String from; @NotNull private final String to; - } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreLoginEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreLoginEvent.java index 23ce371..63f5c57 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreLoginEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreLoginEvent.java @@ -10,8 +10,6 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class BallPlayerPreLoginEvent { - public static final String ACTION = "PlayerPreLogin"; - @NotNull private final String playerName; } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java index 2109925..31cd515 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java @@ -1,5 +1,6 @@ package cn.hamster3.mc.plugin.ball.common.event.server; +import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; import lombok.AllArgsConstructor; import lombok.Data; import org.jetbrains.annotations.NotNull; @@ -10,8 +11,11 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class ServerOfflineEvent { - public static final String ACTION = "ServerOffline"; + @NotNull + private final BallServerInfo serverInfo; @NotNull - private final String serverID; + public String getServerID() { + return serverInfo.getId(); + } } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOnlineEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOnlineEvent.java index 1fc203e..23e71fe 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOnlineEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOnlineEvent.java @@ -11,8 +11,6 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor public class ServerOnlineEvent { - public static final String ACTION = "ServerOnline"; - @NotNull private final BallServerInfo serverInfo; diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallCommonListener.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallCommonListener.java new file mode 100644 index 0000000..f87e8e7 --- /dev/null +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallCommonListener.java @@ -0,0 +1,81 @@ +package cn.hamster3.mc.plugin.ball.common.listener; + +import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerConnectServerEvent; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerInfoUpdateEvent; +import cn.hamster3.mc.plugin.ball.common.event.server.ServerOfflineEvent; +import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; +import com.google.common.eventbus.Subscribe; +import org.jetbrains.annotations.NotNull; + +public class BallCommonListener { + public static final BallCommonListener INSTANCE = new BallCommonListener(); + + private BallCommonListener() { + } + + @Subscribe + public void onBallPlayerConnectServer(@NotNull BallPlayerConnectServerEvent event) { + BallPlayerInfo info = event.getPlayerInfo(); + BallAPI.getInstance().getAllPlayerInfo().put(info.getUuid(), info); + } + + @Subscribe + public void onBallPlayerInfoUpdate(@NotNull BallPlayerInfoUpdateEvent event) { + BallPlayerInfo info = event.getPlayerInfo(); + BallAPI.getInstance().getAllPlayerInfo().put(info.getUuid(), info); + } + + @Subscribe + public void onServerOnline(@NotNull ServerOnlineEvent event) { + BallServerInfo info = event.getServerInfo(); + BallAPI.getInstance().getAllServerInfo().put(info.getId(), info); + switch (info.getType()) { + case GAME: { + BallAPI.getInstance().getAllPlayerInfo().forEach((uuid, playerInfo) -> { + if (playerInfo.getGameServer().equals(info.getId())) { + playerInfo.setOnline(false); + } + }); + break; + } + case PROXY: { + BallAPI.getInstance().getAllPlayerInfo().forEach((uuid, playerInfo) -> { + if (playerInfo.getProxyServer().equals(info.getId())) { + playerInfo.setOnline(false); + } + }); + break; + } + } + } + + @Subscribe + public void onServerOffline(@NotNull ServerOfflineEvent event) { + String serverID = event.getServerID(); + BallServerInfo info = BallAPI.getInstance().getAllServerInfo().remove(serverID); + if (info == null) { + return; + } + switch (info.getType()) { + case GAME: { + BallAPI.getInstance().getAllPlayerInfo().forEach((uuid, playerInfo) -> { + if (playerInfo.getGameServer().equals(info.getId())) { + playerInfo.setOnline(false); + } + }); + break; + } + case PROXY: { + BallAPI.getInstance().getAllPlayerInfo().forEach((uuid, playerInfo) -> { + if (playerInfo.getProxyServer().equals(info.getId())) { + playerInfo.setOnline(false); + } + }); + break; + } + } + } +} diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java index de77072..10ae469 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java @@ -1,43 +1,23 @@ package cn.hamster3.mc.plugin.ball.common.listener; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; -import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo; -import io.lettuce.core.pubsub.RedisPubSubListener; +import cn.hamster3.mc.plugin.ball.common.event.message.MessageReceivedEvent; +import cn.hamster3.mc.plugin.ball.common.event.message.MessageSentEvent; +import com.google.common.eventbus.Subscribe; -public class BallDebugListener implements RedisPubSubListener { +public class BallDebugListener { public static final BallDebugListener INSTANCE = new BallDebugListener(); private BallDebugListener() { } - @Override - public void message(String channel, BallMessageInfo event) { - BallAPI.getInstance().getLogger().info("从 " + channel + " 收到了一条消息: " + event); + @Subscribe + public void onMessageReceived(MessageReceivedEvent event) { + BallAPI.getInstance().getLogger().info("从 " + event.getChannel() + " 收到了一条消息: " + event.getMessage()); } - @Override - public void message(String pattern, String channel, BallMessageInfo event) { - BallAPI.getInstance().getLogger().info("从 " + pattern + "(" + channel + ") 收到了一条消息: " + event); - } - - @Override - public void subscribed(String channel, long count) { - BallAPI.getInstance().getLogger().info("已订阅 redis 频道: " + channel); - - } - - @Override - public void psubscribed(String pattern, long count) { - BallAPI.getInstance().getLogger().info("已取消订阅 redis 频道(正则): " + pattern); - } - - @Override - public void unsubscribed(String channel, long count) { - BallAPI.getInstance().getLogger().info("已取消订阅 redis 频道: " + channel); - } - - @Override - public void punsubscribed(String pattern, long count) { - BallAPI.getInstance().getLogger().info("已取消订阅 redis 频道(正则): " + pattern); + @Subscribe + public void onMessageSent(MessageSentEvent event) { + BallAPI.getInstance().getLogger().info("向 " + event.getChannel() + " 发送了一条消息: " + event.getMessage()); } } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallListener.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallListener.java deleted file mode 100644 index a360f1e..0000000 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.hamster3.mc.plugin.ball.common.listener; - -import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo; -import cn.hamster3.mc.plugin.ball.common.event.player.*; -import cn.hamster3.mc.plugin.ball.common.event.server.ServerOfflineEvent; -import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; -import org.jetbrains.annotations.NotNull; - -public interface BallListener { - /** - * 该监听器的执行优先级 - * - * @return 优先级 - */ - default ListenerPriority getPriority() { - return ListenerPriority.NORMAL; - } - - default void onMessageReceived(@NotNull BallMessageInfo event) { - } - - default void onMessageSend(@NotNull BallMessageInfo event) { - } - - default void onBallPlayerPreLogin(@NotNull BallPlayerPreLoginEvent event) { - } - - default void onBallPlayerLogin(@NotNull BallPlayerLoginEvent event) { - } - - default void onBallPlayerPostLogin(@NotNull BallPlayerPostLoginEvent event) { - } - - default void onBallPlayerPreConnectServer(@NotNull BallPlayerPreConnectServerEvent event) { - } - - default void onBallPlayerConnectServer(@NotNull BallPlayerConnectServerEvent event) { - } - - default void onBallPlayerPostConnectServer(@NotNull BallPlayerPostConnectServerEvent event) { - } - - default void onBallPlayerLogout(@NotNull BallPlayerLogoutEvent event) { - } - - default void onBallPlayerInfoUpdate(@NotNull BallPlayerInfoUpdateEvent event) { - } - - default void onServerOnline(@NotNull ServerOnlineEvent event) { - } - - default void onServerOffline(@NotNull ServerOfflineEvent event) { - } - -} diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallMessageListener.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallMessageListener.java deleted file mode 100644 index 6b0451e..0000000 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallMessageListener.java +++ /dev/null @@ -1,167 +0,0 @@ -package cn.hamster3.mc.plugin.ball.common.listener; - -import cn.hamster3.mc.plugin.ball.common.api.BallAPI; -import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo; -import cn.hamster3.mc.plugin.ball.common.event.player.*; -import cn.hamster3.mc.plugin.ball.common.event.server.ServerOfflineEvent; -import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; -import cn.hamster3.mc.plugin.core.common.api.CoreAPI; -import io.lettuce.core.pubsub.RedisPubSubListener; - -public class BallMessageListener implements RedisPubSubListener { - public static final BallMessageListener INSTANCE = new BallMessageListener(); - - private BallMessageListener() { - } - - @Override - public void message(String channel, BallMessageInfo info) { - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onMessageReceived(info); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - if (!BallAPI.BALL_CHANNEL.equals(info.getChannel())) { - return; - } - switch (info.getAction()) { - case BallPlayerPreLoginEvent.ACTION: { - BallPlayerPreLoginEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerPreLoginEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerPreLogin(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerLoginEvent.ACTION: { - BallPlayerLoginEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerLoginEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerLogin(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerPostLoginEvent.ACTION: { - BallPlayerPostLoginEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerPostLoginEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerPostLogin(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerPreConnectServerEvent.ACTION: { - BallPlayerPreConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerPreConnectServerEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerPreConnectServer(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerConnectServerEvent.ACTION: { - BallPlayerConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerConnectServerEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerConnectServer(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerPostConnectServerEvent.ACTION: { - BallPlayerPostConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerPostConnectServerEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerPostConnectServer(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerLogoutEvent.ACTION: { - BallPlayerLogoutEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerLogoutEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerLogout(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerInfoUpdateEvent.ACTION: { - BallPlayerInfoUpdateEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerInfoUpdateEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerInfoUpdate(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case ServerOfflineEvent.ACTION: { - ServerOfflineEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), ServerOfflineEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onServerOffline(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case ServerOnlineEvent.ACTION: { - ServerOnlineEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), ServerOnlineEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onServerOnline(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - } - } - - @Override - public void message(String pattern, String channel, BallMessageInfo info) { - message(channel, info); - } - - @Override - public void subscribed(String channel, long count) { - - } - - @Override - public void psubscribed(String pattern, long count) { - - } - - @Override - public void unsubscribed(String channel, long count) { - - } - - @Override - public void punsubscribed(String pattern, long count) { - - } -} diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallRedisListener.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallRedisListener.java new file mode 100644 index 0000000..4ccfae0 --- /dev/null +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallRedisListener.java @@ -0,0 +1,149 @@ +package cn.hamster3.mc.plugin.ball.common.listener; + +import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.data.BallMessage; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; +import cn.hamster3.mc.plugin.ball.common.event.message.MessageReceivedEvent; +import cn.hamster3.mc.plugin.ball.common.event.operate.*; +import cn.hamster3.mc.plugin.ball.common.event.player.*; +import cn.hamster3.mc.plugin.ball.common.event.server.ServerOfflineEvent; +import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; +import cn.hamster3.mc.plugin.core.common.api.CoreAPI; +import io.lettuce.core.pubsub.RedisPubSubListener; + +public class BallRedisListener implements RedisPubSubListener { + public static final BallRedisListener INSTANCE = new BallRedisListener(); + + private BallRedisListener() { + } + + @Override + public void message(String channel, BallMessage ballMessage) { + BallAPI api = BallAPI.getInstance(); + if (ballMessage.getReceiverType() != null && ballMessage.getReceiverType() != api.getLocalServerInfo().getType()) { + return; + } + if (ballMessage.getReceiverID() != null && !api.isLocalServer(ballMessage.getReceiverID())) { + return; + } + api.getEventBus().post(new MessageReceivedEvent(channel, ballMessage)); + if (!BallAPI.BALL_CHANNEL.equals(channel)) { + return; + } + switch (BallActions.valueOf(ballMessage.getAction())) { + case BroadcastPlayerMessage: { + BroadcastPlayerMessageEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BroadcastPlayerMessageEvent.class); + api.getEventBus().post(event); + break; + } + case DispatchConsoleCommand: { + DispatchConsoleCommandEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), DispatchConsoleCommandEvent.class); + api.getEventBus().post(event); + break; + } + case DispatchPlayerCommand: { + DispatchPlayerCommandEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), DispatchPlayerCommandEvent.class); + api.getEventBus().post(event); + break; + } + case KickPlayer: { + KickPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), KickPlayerEvent.class); + api.getEventBus().post(event); + break; + } + case SendMessageToPlayer: { + SendMessageToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), SendMessageToPlayerEvent.class); + api.getEventBus().post(event); + break; + } + case SendPlayerToLocation: { + SendPlayerToLocationEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), SendPlayerToLocationEvent.class); + api.getEventBus().post(event); + break; + } + case SendPlayerToPlayer: { + SendPlayerToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), SendPlayerToPlayerEvent.class); + api.getEventBus().post(event); + break; + } + + case BallPlayerPreLogin: { + BallPlayerPreLoginEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPreLoginEvent.class); + api.getEventBus().post(event); + break; + } + case BallPlayerLogin: { + BallPlayerLoginEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerLoginEvent.class); + api.getEventBus().post(event); + break; + } + case BallPlayerPostLogin: { + BallPlayerPostLoginEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPostLoginEvent.class); + api.getEventBus().post(event); + break; + } + case BallPlayerPreConnectServer: { + BallPlayerPreConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPreConnectServerEvent.class); + api.getEventBus().post(event); + break; + } + case BallPlayerConnectServer: { + BallPlayerConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerConnectServerEvent.class); + api.getEventBus().post(event); + break; + } + case BallPlayerPostConnectServer: { + BallPlayerPostConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPostConnectServerEvent.class); + api.getEventBus().post(event); + break; + } + case BallPlayerLogout: { + BallPlayerLogoutEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerLogoutEvent.class); + api.getEventBus().post(event); + break; + } + + case BallPlayerInfoUpdate: { + BallPlayerInfoUpdateEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerInfoUpdateEvent.class); + api.getEventBus().post(event); + break; + } + + case ServerOffline: { + ServerOfflineEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), ServerOfflineEvent.class); + api.getEventBus().post(event); + break; + } + case ServerOnline: { + ServerOnlineEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), ServerOnlineEvent.class); + api.getEventBus().post(event); + break; + } + } + } + + @Override + public void message(String pattern, String channel, BallMessage info) { + message(channel, info); + } + + @Override + public void subscribed(String channel, long count) { + BallAPI.getInstance().getLogger().info("已订阅 redis 频道 " + channel); + } + + @Override + public void psubscribed(String pattern, long count) { + BallAPI.getInstance().getLogger().info("已取消订阅 redis 频道(正则) " + pattern); + } + + @Override + public void unsubscribed(String channel, long count) { + BallAPI.getInstance().getLogger().info("已取消订阅 redis 频道 " + channel); + } + + @Override + public void punsubscribed(String pattern, long count) { + BallAPI.getInstance().getLogger().info("已取消订阅 redis 频道(正则) " + pattern); + } +} diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/ListenerPriority.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/ListenerPriority.java deleted file mode 100644 index c589478..0000000 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/ListenerPriority.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.hamster3.mc.plugin.ball.common.listener; - -@SuppressWarnings("unused") -public enum ListenerPriority { - - /** - * Event call is of very low importance and should be run first, to allow - * other plugins to further customise the outcome - */ - LOWEST(0), - /** - * Event call is of low importance - */ - LOW(1), - /** - * Event call is neither important nor unimportant, and may be run - * normally - */ - NORMAL(2), - /** - * Event call is of high importance - */ - HIGH(3), - /** - * Event call is critical and must have the final say in what happens - * to the event - */ - HIGHEST(4), - /** - * Event is listened to purely for monitoring the outcome of an event. - *

- * No modifications to the event should be made under this priority - */ - MONITOR(5); - - private final int slot; - - ListenerPriority(int slot) { - this.slot = slot; - } - - public int getSlot() { - return slot; - } -} diff --git a/build.gradle.kts b/build.gradle.kts index 2ca2d67..319cbca 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "cn.hamster3.mc.plugin" -version = "1.1.0-SNAPSHOT" +version = "1.4.0" subprojects { apply { @@ -64,10 +64,7 @@ subprojects { } repositories { maven { - val releasesRepoUrl = uri("https://maven.airgame.net/maven-releases/") - val snapshotsRepoUrl = uri("https://maven.airgame.net/maven-snapshots/") - - url = if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else releasesRepoUrl + url = uri("https://maven.airgame.net/maven-airgame") credentials { username = rootProject.properties.getOrDefault("maven_username", "").toString() diff --git a/settings.gradle.kts b/settings.gradle.kts index 8325d3e..689e8bc 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,6 +6,6 @@ pluginManagement { } } rootProject.name = "hamster-ball" -include("ball-bukkit") include("ball-common") -include("ball-bungeecord") +include("ball-bukkit") +include("ball-bungee")