fix: 修复了新版玩家信息加载和跨服同步的问题

This commit is contained in:
2024-02-26 00:21:14 +08:00
parent 5af164ed1a
commit 419229ff15
14 changed files with 326 additions and 317 deletions

View File

@@ -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");
}

View File

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

View File

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

View File

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

View File

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

View File

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