fix: 修复了新版玩家信息加载和跨服同步的问题
This commit is contained in:
@@ -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<UUID> 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<UUID> 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) {
|
||||
|
@@ -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) {
|
||||
|
@@ -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<String, BallMessag
|
||||
return;
|
||||
}
|
||||
eventBus.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);
|
||||
eventBus.post(event);
|
||||
break;
|
||||
}
|
||||
case DispatchConsoleCommand: {
|
||||
DispatchConsoleCommandEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), DispatchConsoleCommandEvent.class);
|
||||
eventBus.post(event);
|
||||
break;
|
||||
}
|
||||
case DispatchPlayerCommand: {
|
||||
DispatchPlayerCommandEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), DispatchPlayerCommandEvent.class);
|
||||
eventBus.post(event);
|
||||
break;
|
||||
}
|
||||
case KickPlayer: {
|
||||
KickPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), KickPlayerEvent.class);
|
||||
eventBus.post(event);
|
||||
break;
|
||||
}
|
||||
case SendMessageToPlayer: {
|
||||
SendMessageToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), SendMessageToPlayerEvent.class);
|
||||
eventBus.post(event);
|
||||
break;
|
||||
}
|
||||
case SendPlayerToLocation: {
|
||||
SendPlayerToLocationEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), SendPlayerToLocationEvent.class);
|
||||
eventBus.post(event);
|
||||
break;
|
||||
}
|
||||
case SendPlayerToPlayer: {
|
||||
SendPlayerToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), SendPlayerToPlayerEvent.class);
|
||||
eventBus.post(event);
|
||||
break;
|
||||
}
|
||||
|
||||
case BallPlayerPreLogin: {
|
||||
BallPlayerPreLoginEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPreLoginEvent.class);
|
||||
eventBus.post(event);
|
||||
break;
|
||||
}
|
||||
case BallPlayerLogin: {
|
||||
BallPlayerLoginEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerLoginEvent.class);
|
||||
eventBus.post(event);
|
||||
break;
|
||||
}
|
||||
case BallPlayerPostLogin: {
|
||||
BallPlayerPostLoginEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPostLoginEvent.class);
|
||||
eventBus.post(event);
|
||||
break;
|
||||
}
|
||||
case BallPlayerPreConnectServer: {
|
||||
BallPlayerPreConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPreConnectServerEvent.class);
|
||||
eventBus.post(event);
|
||||
break;
|
||||
}
|
||||
case BallPlayerConnectServer: {
|
||||
BallPlayerConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerConnectServerEvent.class);
|
||||
eventBus.post(event);
|
||||
break;
|
||||
}
|
||||
case BallPlayerPostConnectServer: {
|
||||
BallPlayerPostConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPostConnectServerEvent.class);
|
||||
eventBus.post(event);
|
||||
break;
|
||||
}
|
||||
case BallPlayerLogout: {
|
||||
BallPlayerLogoutEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerLogoutEvent.class);
|
||||
eventBus.post(event);
|
||||
break;
|
||||
}
|
||||
|
||||
case BallPlayerInfoUpdate: {
|
||||
BallPlayerInfoUpdateEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerInfoUpdateEvent.class);
|
||||
eventBus.post(event);
|
||||
break;
|
||||
}
|
||||
|
||||
case ServerOffline: {
|
||||
ServerOfflineEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), ServerOfflineEvent.class);
|
||||
eventBus.post(event);
|
||||
break;
|
||||
}
|
||||
case ServerOnline: {
|
||||
ServerOnlineEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), ServerOnlineEvent.class);
|
||||
eventBus.post(event);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
Reference in New Issue
Block a user