feat: 新增频道分组功能

This commit is contained in:
2023-11-19 22:26:32 +08:00
parent f0c88f4469
commit 5616117c94
14 changed files with 358 additions and 147 deletions

View File

@@ -3,6 +3,7 @@ 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.common.api.BallAPI;
import cn.hamster3.mc.plugin.ball.common.event.BallActions;
import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent;
@@ -58,7 +59,13 @@ public class HamsterBallPlugin extends JavaPlugin {
}
Bukkit.getPluginManager().registerEvents(BallBukkitListener.INSTANCE, this);
BallAPI.getInstance().getEventBus().register(BallBukkitListener.INSTANCE);
logger.info("已注册 BallBukkitListener");
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");
}
sync(() -> {
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
PlaceholderHook.INSTANCE.register();
@@ -66,7 +73,7 @@ public class HamsterBallPlugin extends JavaPlugin {
}
BallAPI.getInstance().sendBallMessage(
BallAPI.BALL_CHANNEL, BallActions.ServerOnline.name(),
new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo())
new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()), false
);
});
long time = System.currentTimeMillis() - start;

View File

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

View File

@@ -0,0 +1,85 @@
package cn.hamster3.mc.plugin.ball.bukkit.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.BallPlayerInfoUpdateEvent;
import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerLoginEvent;
import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerLogoutEvent;
import cn.hamster3.mc.plugin.core.common.api.CoreAPI;
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 org.jetbrains.annotations.NotNull;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
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<UUID, String> PLAYER_PROXY_SERVER = new ConcurrentHashMap<>();
private UpdatePlayerInfoListener() {
}
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),
false
);
});
}
@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
);
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);
uploadPlayerInfo(playerInfo);
}
}

View File

@@ -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区