feat: 新增频道分组功能
This commit is contained in:
@@ -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;
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -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区)
|
||||
|
Reference in New Issue
Block a user