From 419229ff15c4c6a8ea1d3220021fce5ec2f25f46 Mon Sep 17 00:00:00 2001 From: MiniDay <372403923@qq.com> Date: Mon, 26 Feb 2024 00:21:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BA=86=E6=96=B0?= =?UTF-8?q?=E7=89=88=E7=8E=A9=E5=AE=B6=E4=BF=A1=E6=81=AF=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E5=92=8C=E8=B7=A8=E6=9C=8D=E5=90=8C=E6=AD=A5=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +- .../plugin/ball/bukkit/HamsterBallPlugin.java | 8 +- .../listener/UpdatePlayerInfoListener.java | 2 +- .../ball/bukkit/util/BallBukkitUtils.java | 3 +- .../plugin/ball/bungee/HamsterBallPlugin.java | 27 ++-- .../bungee/listener/BallBungeeListener.java | 137 ++++++++++++------ .../bungee/listener/BallBungeeListenerV2.java | 107 -------------- .../listener/BallBungeeMainListener.java | 60 ++++++++ .../listener/UpdatePlayerInfoListener.java | 15 +- .../ball/bungee/util/BallBungeeCordUtils.java | 5 +- .../mc/plugin/ball/common/api/BallAPI.java | 47 +++--- .../common/listener/BallCommonListener.java | 123 +++++++++++++++- .../common/listener/BallRedisListener.java | 99 ------------- build.gradle.kts | 2 +- 14 files changed, 326 insertions(+), 317 deletions(-) delete mode 100644 ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/listener/BallBungeeListenerV2.java create mode 100644 ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/listener/BallBungeeMainListener.java diff --git a/README.md b/README.md index 953972e..525874e 100644 --- a/README.md +++ b/README.md @@ -51,9 +51,9 @@ repositories { dependencies { // 对于 Bukkit 插件 - compileOnly("cn.hamster3.mc.plugin:ball-bukkit:1.5.2") + compileOnly("cn.hamster3.mc.plugin:ball-bukkit:1.5.3") // 对于 BungeeCord 插件 - compileOnly("cn.hamster3.mc.plugin:ball-bungee:1.5.2") + compileOnly("cn.hamster3.mc.plugin:ball-bungee:1.5.3") } ``` @@ -79,13 +79,13 @@ dependencies { cn.hamster3.mc.plugin ball-bukkit - 1.5.2 + 1.5.3 cn.hamster3.mc.plugin ball-bungee - 1.5.2 + 1.5.3 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 d15dd6d..d701e61 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 @@ -62,7 +62,7 @@ public class HamsterBallPlugin extends JavaPlugin { BallAPI.getInstance().getEventBus().register(BallBukkitListener.INSTANCE); logger.info("已注册监听器 BallBukkitListener"); if (BallAPI.getInstance().getBallConfig().isGameServerUpdatePlayerInfo()) { - BallAPI.getInstance().subscribe(BallAPI.PLAYER_INFO_UPDATE_CHANNEL); + BallAPI.getInstance().subscribe(BallAPI.PLAYER_INFO_CHANNEL); Bukkit.getPluginManager().registerEvents(UpdatePlayerInfoListener.INSTANCE, this); BallAPI.getInstance().getEventBus().register(UpdatePlayerInfoListener.INSTANCE); logger.info("已注册监听器 UpdatePlayerInfoListener"); @@ -76,15 +76,17 @@ public class HamsterBallPlugin extends JavaPlugin { playerInfo.setOnline(false); BallBukkitUtils.uploadPlayerInfo(playerInfo); }); + } else { + BallAPI.getInstance().subscribeIgnorePrefix(BallAPI.PLAYER_INFO_CHANNEL); } sync(() -> { if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { PlaceholderHook.INSTANCE.register(); logger.info("已挂载 PlaceholderAPI 变量"); } - BallAPI.getInstance().sendBallMessage( + BallAPI.getInstance().sendRawBallMessage( BallAPI.BALL_CHANNEL, BallActions.ServerOnline.name(), - new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()), false + new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()) ); }); long time = System.currentTimeMillis() - start; 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 index 75c09bc..38e0a0f 100644 --- 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 @@ -26,7 +26,7 @@ public class UpdatePlayerInfoListener implements Listener { @Subscribe public void onBallPlayerLogin(BallPlayerLoginEvent event) { BallPlayerInfo info = event.getPlayerInfo(); - PLAYER_PROXY_SERVER.put(info.getUuid(), BallAPI.getInstance().getBallConfig().getChannelPrefix() + ":" + info.getProxyServer()); + PLAYER_PROXY_SERVER.put(info.getUuid(), info.getProxyServer()); } @EventHandler(ignoreCancelled = true) 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 cc7b838..a169e35 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 @@ -16,6 +16,7 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; +@SuppressWarnings("CallToPrintStackTrace") public final class BallBukkitUtils { private BallBukkitUtils() { } @@ -65,7 +66,7 @@ public final class BallBukkitUtils { e.printStackTrace(); } BallAPI.getInstance().sendBallMessage( - BallAPI.PLAYER_INFO_UPDATE_CHANNEL, + BallAPI.PLAYER_INFO_CHANNEL, BallActions.BallPlayerInfoUpdate.name(), new BallPlayerInfoUpdateEvent(playerInfo) ); diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/HamsterBallPlugin.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/HamsterBallPlugin.java index ee7da6e..9ce7598 100644 --- a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/HamsterBallPlugin.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/HamsterBallPlugin.java @@ -2,25 +2,24 @@ package cn.hamster3.mc.plugin.ball.bungee; import cn.hamster3.mc.plugin.ball.bungee.api.BallBungeeCordAPI; import cn.hamster3.mc.plugin.ball.bungee.listener.BallBungeeListener; -import cn.hamster3.mc.plugin.ball.bungee.listener.BallBungeeListenerV2; +import cn.hamster3.mc.plugin.ball.bungee.listener.BallBungeeMainListener; import cn.hamster3.mc.plugin.ball.bungee.listener.UpdatePlayerInfoListener; import cn.hamster3.mc.plugin.ball.bungee.util.BallBungeeCordUtils; 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 lombok.Getter; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.plugin.Plugin; import java.util.logging.Logger; +@SuppressWarnings("CallToPrintStackTrace") public class HamsterBallPlugin extends Plugin { + @Getter private static HamsterBallPlugin instance; - public static HamsterBallPlugin getInstance() { - return instance; - } - @Override public void onLoad() { long start = System.currentTimeMillis(); @@ -48,16 +47,21 @@ public class HamsterBallPlugin extends Plugin { } catch (Exception e) { e.printStackTrace(); } - ProxyServer.getInstance().getPluginManager().registerListener(this, BallBungeeListener.INSTANCE); + BallAPI.getInstance().getEventBus().register(BallBungeeListener.INSTANCE); logger.info("已注册监听器 BallBungeeListener"); - BallAPI.getInstance().getEventBus().register(BallBungeeListenerV2.INSTANCE); - logger.info("已注册监听器 BallBungeeListenerV2"); + ProxyServer.getInstance().getPluginManager().registerListener(this, BallBungeeMainListener.INSTANCE); + logger.info("已注册监听器 BallBungeeMainListener"); ProxyServer.getInstance().getPluginManager().registerListener(this, UpdatePlayerInfoListener.INSTANCE); logger.info("已注册监听器 UpdatePlayerInfoListener"); - BallAPI.getInstance().sendBallMessage( + + if (BallAPI.getInstance().getBallConfig().isGameServerUpdatePlayerInfo()) { + BallAPI.getInstance().subscribePatterns("*" + BallAPI.PLAYER_INFO_CHANNEL); + } else { + BallAPI.getInstance().subscribeIgnorePrefix(BallAPI.PLAYER_INFO_CHANNEL); + } + BallAPI.getInstance().sendRawBallMessage( BallAPI.BALL_CHANNEL, BallActions.ServerOnline.name(), - new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()), - false + new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()) ); // 移除失效的在线玩家 BallAPI.getInstance().getAllPlayerInfo().values() @@ -68,7 +72,6 @@ public class HamsterBallPlugin extends Plugin { playerInfo.setOnline(false); BallBungeeCordUtils.uploadPlayerInfo(playerInfo); }); - long time = System.currentTimeMillis() - start; logger.info("仓鼠球启动完成,总计耗时 " + time + " ms"); } diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/listener/BallBungeeListener.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/listener/BallBungeeListener.java index 28fa283..878d004 100644 --- a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/listener/BallBungeeListener.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/listener/BallBungeeListener.java @@ -1,62 +1,107 @@ package cn.hamster3.mc.plugin.ball.bungee.listener; -import cn.hamster3.mc.plugin.ball.bungee.util.BallBungeeCordUtils; +import cn.hamster3.mc.plugin.ball.bungee.HamsterBallPlugin; 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 net.md_5.bungee.api.connection.PendingConnection; +import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; +import cn.hamster3.mc.plugin.ball.common.event.operate.*; +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 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 { +import java.util.UUID; + +public class BallBungeeListener { 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()) { + @Subscribe + public void onDispatchConsoleCommand(DispatchConsoleCommandEvent event) { + if (event.getType() != null && event.getType() != BallServerType.PROXY) { 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 - ); + if (event.getServerID() != null && !BallAPI.getInstance().isLocalServer(event.getServerID())) { + return; + } + ProxyServer server = ProxyServer.getInstance(); + server.getPluginManager().dispatchCommand(server.getConsole(), event.getCommand()); } - @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 - ); + @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/ball/bungee/listener/BallBungeeListenerV2.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/listener/BallBungeeListenerV2.java deleted file mode 100644 index 15b7025..0000000 --- a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/listener/BallBungeeListenerV2.java +++ /dev/null @@ -1,107 +0,0 @@ -package cn.hamster3.mc.plugin.ball.bungee.listener; - -import cn.hamster3.mc.plugin.ball.bungee.HamsterBallPlugin; -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.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/ball/bungee/listener/BallBungeeMainListener.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/listener/BallBungeeMainListener.java new file mode 100644 index 0000000..89019e7 --- /dev/null +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/listener/BallBungeeMainListener.java @@ -0,0 +1,60 @@ +package cn.hamster3.mc.plugin.ball.bungee.listener; + +import cn.hamster3.mc.plugin.ball.bungee.util.BallBungeeCordUtils; +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 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 BallBungeeMainListener implements Listener { + public static final BallBungeeMainListener INSTANCE = new BallBungeeMainListener(); + + private BallBungeeMainListener() { + } + + @EventHandler(priority = EventPriority.HIGH) + public void onPreLogin(PreLoginEvent event) { + BallAPI.getInstance().sendRawBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.BallPlayerPreLogin.name(), + new BallPlayerPreLoginEvent(event.getConnection().getName()) + ); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onLogin(LoginEvent event) { + if (event.isCancelled()) { + return; + } + PendingConnection connection = event.getConnection(); + BallAPI.getInstance().sendRawBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.BallPlayerLogin.name(), + new BallPlayerLoginEvent(new BallPlayerInfo( + connection.getUniqueId(), connection.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().sendRawBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.BallPlayerPostLogin.name(), + new BallPlayerPostLoginEvent(playerInfo) + ); + } +} diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/listener/UpdatePlayerInfoListener.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/listener/UpdatePlayerInfoListener.java index 5155192..049ec28 100644 --- a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/listener/UpdatePlayerInfoListener.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/listener/UpdatePlayerInfoListener.java @@ -26,11 +26,10 @@ public class UpdatePlayerInfoListener implements Listener { ProxiedPlayer player = event.getPlayer(); BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); playerInfo.setGameServer(event.getTarget().getName()); - BallAPI.getInstance().sendBallMessage( + BallAPI.getInstance().sendRawBallMessage( BallAPI.BALL_CHANNEL, BallActions.BallPlayerPreConnectServer.name(), - new BallPlayerPreConnectServerEvent(playerInfo, playerInfo.getGameServer(), event.getTarget().getName()), - false + new BallPlayerPreConnectServerEvent(playerInfo, playerInfo.getGameServer(), event.getTarget().getName()) ); BallBungeeCordUtils.uploadPlayerInfo(playerInfo); } @@ -40,11 +39,10 @@ public class UpdatePlayerInfoListener implements Listener { ProxiedPlayer player = event.getPlayer(); BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); playerInfo.setGameServer(event.getServer().getInfo().getName()); - BallAPI.getInstance().sendBallMessage( + BallAPI.getInstance().sendRawBallMessage( BallAPI.BALL_CHANNEL, BallActions.BallPlayerPostConnectServer.name(), - new BallPlayerPostConnectServerEvent(playerInfo), - false + new BallPlayerPostConnectServerEvent(playerInfo) ); BallBungeeCordUtils.uploadPlayerInfo(playerInfo); } @@ -53,11 +51,10 @@ public class UpdatePlayerInfoListener implements Listener { public void onPlayerDisconnect(PlayerDisconnectEvent event) { ProxiedPlayer player = event.getPlayer(); BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, false); - BallAPI.getInstance().sendBallMessage( + BallAPI.getInstance().sendRawBallMessage( BallAPI.BALL_CHANNEL, BallActions.BallPlayerLogout.name(), - new BallPlayerLogoutEvent(playerInfo), - false + new BallPlayerLogoutEvent(playerInfo) ); BallBungeeCordUtils.uploadPlayerInfo(playerInfo); } diff --git a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/util/BallBungeeCordUtils.java b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/util/BallBungeeCordUtils.java index dd1d7ea..cb78d82 100644 --- a/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/util/BallBungeeCordUtils.java +++ b/ball-bungee/src/main/java/cn/hamster3/mc/plugin/ball/bungee/util/BallBungeeCordUtils.java @@ -18,6 +18,7 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; +@SuppressWarnings("CallToPrintStackTrace") public final class BallBungeeCordUtils { private BallBungeeCordUtils() { } @@ -51,8 +52,8 @@ public final class BallBungeeCordUtils { e.printStackTrace(); } if (!BallAPI.getInstance().getBallConfig().isGameServerUpdatePlayerInfo()) { - BallAPI.getInstance().sendBallMessage( - BallAPI.PLAYER_INFO_UPDATE_CHANNEL, + BallAPI.getInstance().sendRawBallMessage( + BallAPI.PLAYER_INFO_CHANNEL, BallActions.BallPlayerInfoUpdate.name(), new BallPlayerInfoUpdateEvent(playerInfo) ); 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 e98ad47..5874fa2 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 @@ -30,7 +30,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; @Getter -@SuppressWarnings("unused") +@SuppressWarnings({"unused", "CallToPrintStackTrace"}) public abstract class BallAPI { /** * API 使用的通信频道 @@ -39,7 +39,7 @@ public abstract class BallAPI { /** * API 使用的玩家信息更新通信频道 */ - public static final String PLAYER_INFO_UPDATE_CHANNEL = "HamsterBall:PlayerInfo"; + public static final String PLAYER_INFO_CHANNEL = "HamsterBall:PlayerInfo"; /** * API 实例 */ @@ -354,8 +354,8 @@ public abstract class BallAPI { * @param doneMessage 传送完成后显示的消息 */ public void sendPlayerToLocation(@NotNull Collection sendPlayerUUID, @NotNull BallLocation location, @Nullable DisplayMessage doneMessage) { - sendBallMessage(BALL_CHANNEL, BallActions.SendPlayerToLocation.name(), - new SendPlayerToLocationEvent(new HashSet<>(sendPlayerUUID), location, doneMessage), false + sendRawBallMessage(BALL_CHANNEL, BallActions.SendPlayerToLocation.name(), + new SendPlayerToLocationEvent(new HashSet<>(sendPlayerUUID), location, doneMessage) ); } @@ -384,11 +384,10 @@ public abstract class BallAPI { * @param doneTargetMessage 传送完成后目标玩家显示的消息,自动将 %player_name% 替换成被传送者的名称 */ public void sendPlayerToPlayer(@NotNull Collection sendPlayerUUID, @NotNull UUID toPlayer, @Nullable DisplayMessage doneMessage, @Nullable DisplayMessage doneTargetMessage) { - sendBallMessage( + sendRawBallMessage( BALL_CHANNEL, BallActions.SendPlayerToPlayer.name(), - new SendPlayerToPlayerEvent(new HashSet<>(sendPlayerUUID), toPlayer, doneMessage, doneTargetMessage), - false + new SendPlayerToPlayerEvent(new HashSet<>(sendPlayerUUID), toPlayer, doneMessage, doneTargetMessage) ); } @@ -403,14 +402,13 @@ public abstract class BallAPI { } /** - * 发送一条服务消息 + * 发送一条服务消息,不自动添加频道前缀 * * @param channel 消息频道 * @param action 执行动作 - * @param prefix 是否自动为消息频道添加分组前缀 */ - public void sendBallMessage(@NotNull String channel, @NotNull String action, boolean prefix) { - sendBallMessage(channel, new BallMessage(action), prefix); + public void sendRawBallMessage(@NotNull String channel, @NotNull String action) { + sendBallMessage(channel, new BallMessage(action), false); } /** @@ -425,15 +423,14 @@ public abstract class BallAPI { } /** - * 发送一条有附加参数的服务消息 + * 发送一条有附加参数的服务消息,不自动添加频道前缀 * * @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); + public void sendRawBallMessage(@NotNull String channel, @NotNull String action, @NotNull Object content) { + sendBallMessage(channel, new BallMessage(action, content), false); } /** @@ -448,23 +445,23 @@ public abstract class BallAPI { /** * 发送自定义消息 * - * @param message 消息内容 - * @param prefix 是否自动为消息频道添加分组前缀 + * @param message 消息内容 + * @param addPrefix 是否自动为消息频道添加分组前缀 */ - public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message, boolean prefix) { - sendBallMessage(channel, message, prefix, false); + public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message, boolean addPrefix) { + sendBallMessage(channel, message, addPrefix, false); } /** * 自定义服务消息信息并发送 * - * @param channel 消息频道 - * @param message 消息内容 - * @param prefix 是否自动为消息频道添加分组前缀 - * @param block 是否阻塞(设置为 true 则必须等待消息写入网络的操作完成后,该方法才会退出) + * @param channel 消息频道 + * @param message 消息内容 + * @param addPrefix 是否自动为消息频道添加分组前缀 + * @param block 是否阻塞(设置为 true 则必须等待消息写入网络的操作完成后,该方法才会退出) */ - public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message, boolean prefix, boolean block) { - if (prefix) { + public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message, boolean addPrefix, boolean block) { + if (addPrefix) { channel = ballConfig.getChannelPrefix() + channel; } if (block) { 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 index f87e8e7..f1e908b 100644 --- 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 @@ -3,12 +3,14 @@ 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.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 com.google.common.eventbus.Subscribe; -import org.jetbrains.annotations.NotNull; public class BallCommonListener { public static final BallCommonListener INSTANCE = new BallCommonListener(); @@ -17,19 +19,126 @@ public class BallCommonListener { } @Subscribe - public void onBallPlayerConnectServer(@NotNull BallPlayerConnectServerEvent event) { + public void onMessageReceived(MessageReceivedEvent message) { + String channel = message.getChannel(); + if (!BallAPI.BALL_CHANNEL.equals(channel)) { + return; + } + switch (BallActions.valueOf(message.getAction())) { + // operate type + case BroadcastPlayerMessage: { + BroadcastPlayerMessageEvent event = CoreAPI.getInstance().getGson().fromJson(message.getContent(), BroadcastPlayerMessageEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case DispatchConsoleCommand: { + DispatchConsoleCommandEvent event = CoreAPI.getInstance().getGson().fromJson(message.getContent(), DispatchConsoleCommandEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case DispatchPlayerCommand: { + DispatchPlayerCommandEvent event = CoreAPI.getInstance().getGson().fromJson(message.getContent(), DispatchPlayerCommandEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case KickPlayer: { + KickPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(message.getContent(), KickPlayerEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case SendMessageToPlayer: { + SendMessageToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(message.getContent(), SendMessageToPlayerEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case SendPlayerToLocation: { + SendPlayerToLocationEvent event = CoreAPI.getInstance().getGson().fromJson(message.getContent(), SendPlayerToLocationEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case SendPlayerToPlayer: { + SendPlayerToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(message.getContent(), SendPlayerToPlayerEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + + // player type + case BallPlayerPreLogin: { + BallPlayerPreLoginEvent event = CoreAPI.getInstance().getGson().fromJson(message.getContent(), BallPlayerPreLoginEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case BallPlayerLogin: { + BallPlayerLoginEvent event = CoreAPI.getInstance().getGson().fromJson(message.getContent(), BallPlayerLoginEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case BallPlayerPostLogin: { + BallPlayerPostLoginEvent event = CoreAPI.getInstance().getGson().fromJson(message.getContent(), BallPlayerPostLoginEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case BallPlayerPreConnectServer: { + BallPlayerPreConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(message.getContent(), BallPlayerPreConnectServerEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case BallPlayerConnectServer: { + BallPlayerConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(message.getContent(), BallPlayerConnectServerEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case BallPlayerPostConnectServer: { + BallPlayerPostConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(message.getContent(), BallPlayerPostConnectServerEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case BallPlayerLogout: { + BallPlayerLogoutEvent event = CoreAPI.getInstance().getGson().fromJson(message.getContent(), BallPlayerLogoutEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + + // server type + case ServerOffline: { + ServerOfflineEvent event = CoreAPI.getInstance().getGson().fromJson(message.getContent(), ServerOfflineEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + case ServerOnline: { + ServerOnlineEvent event = CoreAPI.getInstance().getGson().fromJson(message.getContent(), ServerOnlineEvent.class); + BallAPI.getInstance().getEventBus().post(event); + break; + } + } + } + + @Subscribe + public void handlePlayerInfo(MessageReceivedEvent message) { + if (!message.getChannel().contains(BallAPI.PLAYER_INFO_CHANNEL)) { + return; + } + if (BallActions.valueOf(message.getAction()) != BallActions.BallPlayerInfoUpdate) { + return; + } + BallPlayerInfoUpdateEvent event = CoreAPI.getInstance().getGson().fromJson(message.getContent(), BallPlayerInfoUpdateEvent.class); + BallAPI.getInstance().getEventBus().post(event); + } + + @Subscribe + public void onBallPlayerConnectServer(BallPlayerConnectServerEvent event) { BallPlayerInfo info = event.getPlayerInfo(); BallAPI.getInstance().getAllPlayerInfo().put(info.getUuid(), info); } @Subscribe - public void onBallPlayerInfoUpdate(@NotNull BallPlayerInfoUpdateEvent event) { + public void onBallPlayerInfoUpdate(BallPlayerInfoUpdateEvent event) { BallPlayerInfo info = event.getPlayerInfo(); BallAPI.getInstance().getAllPlayerInfo().put(info.getUuid(), info); } @Subscribe - public void onServerOnline(@NotNull ServerOnlineEvent event) { + public void onServerOnline(ServerOnlineEvent event) { BallServerInfo info = event.getServerInfo(); BallAPI.getInstance().getAllServerInfo().put(info.getId(), info); switch (info.getType()) { @@ -53,7 +162,7 @@ public class BallCommonListener { } @Subscribe - public void onServerOffline(@NotNull ServerOfflineEvent event) { + public void onServerOffline(ServerOfflineEvent event) { String serverID = event.getServerID(); BallServerInfo info = BallAPI.getInstance().getAllServerInfo().remove(serverID); if (info == null) { 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 index 07abcda..3a80313 100644 --- 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 @@ -2,13 +2,7 @@ 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 cn.hamster3.mc.plugin.core.lib.io.lettuce.core.pubsub.RedisPubSubListener; import com.google.common.eventbus.EventBus; @@ -32,99 +26,6 @@ public class BallRedisListener implements RedisPubSubListener