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 2359b8f..1be3b93 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 @@ -3,8 +3,6 @@ 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.common.api.BallAPI; -import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; @@ -55,20 +53,8 @@ public class HamsterBallPlugin extends JavaPlugin { } catch (Exception e) { e.printStackTrace(); } - if (!BallAPI.getInstance().isEnabled()) { - sync(() -> { - logger.info("由于 HamsterBall 未能成功连接, 服务器将立即关闭"); - Bukkit.shutdown(); - }); - return; - } Bukkit.getPluginManager().registerEvents(BallBukkitListener.INSTANCE, this); logger.info("已注册 BallBukkitListener"); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - ServerOnlineEvent.ACTION, - new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()) - ); sync(() -> { if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { PlaceholderHook.INSTANCE.register(); diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/api/BallBukkitAPI.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/api/BallBukkitAPI.java index 4c24ef9..7a54cf5 100644 --- a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/api/BallBukkitAPI.java +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/api/BallBukkitAPI.java @@ -1,10 +1,18 @@ package cn.hamster3.mc.plugin.ball.bukkit.api; import cn.hamster3.mc.plugin.ball.bukkit.HamsterBallPlugin; +import cn.hamster3.mc.plugin.ball.bukkit.event.MessageSendEvent; +import cn.hamster3.mc.plugin.ball.bukkit.event.operate.*; +import cn.hamster3.mc.plugin.ball.bukkit.event.player.*; +import cn.hamster3.mc.plugin.ball.bukkit.event.server.ServerOfflineEvent; +import cn.hamster3.mc.plugin.ball.bukkit.event.server.ServerOnlineEvent; 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.data.BallMessage; +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.entity.BallServerType; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import io.lettuce.core.RedisClient; import org.bukkit.Bukkit; @@ -71,9 +79,167 @@ public class BallBukkitAPI extends BallAPI { super.disable(); } + @Override + public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message, boolean block) { + Bukkit.getPluginManager().callEvent(new MessageSendEvent(Bukkit.isPrimaryThread(), channel, message)); + super.sendBallMessage(channel, message, block); + } + + @Override + protected void onMessage(String channel, BallMessage message) { + if (!BallAPI.BALL_CHANNEL.equals(channel)) { + return; + } + switch (BallActions.valueOf(message.getAction())) { + case BroadcastPlayerMessage: { + Bukkit.getPluginManager().callEvent( + message.getContentAs(BroadcastPlayerMessageEvent.class) + ); + break; + } + case DispatchConsoleCommand: { + Bukkit.getPluginManager().callEvent( + message.getContentAs(DispatchConsoleCommandEvent.class) + ); + break; + } + case DispatchPlayerCommand: { + Bukkit.getPluginManager().callEvent( + message.getContentAs(DispatchPlayerCommandEvent.class) + ); + break; + } + case KickPlayer: { + Bukkit.getPluginManager().callEvent( + message.getContentAs(KickPlayerEvent.class) + ); + break; + } + case SendMessageToPlayer: { + Bukkit.getPluginManager().callEvent( + message.getContentAs(SendMessageToPlayerEvent.class) + ); + break; + } + case SendPlayerToLocation: { + Bukkit.getPluginManager().callEvent( + message.getContentAs(SendPlayerToLocationEvent.class) + ); + break; + } + case SendPlayerToPlayer: { + Bukkit.getPluginManager().callEvent( + message.getContentAs(SendPlayerToPlayerEvent.class) + ); + break; + } + case PlayerInfoUpdate: { + BallPlayerInfoUpdateEvent event = message.getContentAs(BallPlayerInfoUpdateEvent.class); + Bukkit.getPluginManager().callEvent(event); + BallPlayerInfo info = event.getPlayerInfo(); + playerInfo.put(info.getUuid(), info); + break; + } + case PlayerPreLogin: { + Bukkit.getPluginManager().callEvent( + message.getContentAs(BallPlayerPreLoginEvent.class) + ); + break; + } + case PlayerLogin: { + Bukkit.getPluginManager().callEvent( + message.getContentAs(BallPlayerLoginEvent.class) + ); + break; + } + case PlayerPostLogin: { + Bukkit.getPluginManager().callEvent( + message.getContentAs(BallPlayerPostLoginEvent.class) + ); + break; + } + case PlayerPreConnectServer: { + Bukkit.getPluginManager().callEvent( + message.getContentAs(BallPlayerPreConnectServerEvent.class) + ); + break; + } + case PlayerConnectServer: { + Bukkit.getPluginManager().callEvent( + message.getContentAs(BallPlayerConnectServerEvent.class) + ); + break; + } + case PlayerPostConnectServer: { + Bukkit.getPluginManager().callEvent( + message.getContentAs(BallPlayerPostConnectServerEvent.class) + ); + break; + } + case PlayerLogout: { + Bukkit.getPluginManager().callEvent( + message.getContentAs(BallPlayerLogoutEvent.class) + ); + break; + } + case ServerOnline: { + ServerOnlineEvent event = message.getContentAs(ServerOnlineEvent.class); + Bukkit.getPluginManager().callEvent(event); + BallServerInfo info = event.getServerInfo(); + serverInfo.put(info.getId(), info); + switch (info.getType()) { + case GAME: { + playerInfo.forEach((uuid, playerInfo) -> { + if (playerInfo.getGameServer().equals(info.getId())) { + playerInfo.setOnline(false); + } + }); + break; + } + case PROXY: { + playerInfo.forEach((uuid, playerInfo) -> { + if (playerInfo.getProxyServer().equals(info.getId())) { + playerInfo.setOnline(false); + } + }); + break; + } + } + break; + } + case ServerOffline: { + ServerOfflineEvent event = message.getContentAs(ServerOfflineEvent.class); + Bukkit.getPluginManager().callEvent(event); + String serverID = event.getServerInfo().getId(); + BallServerInfo info = serverInfo.remove(serverID); + if (info == null) { + return; + } + switch (info.getType()) { + case GAME: { + playerInfo.forEach((uuid, playerInfo) -> { + if (playerInfo.getGameServer().equals(info.getId())) { + playerInfo.setOnline(false); + } + }); + break; + } + case PROXY: { + playerInfo.forEach((uuid, playerInfo) -> { + if (playerInfo.getProxyServer().equals(info.getId())) { + playerInfo.setOnline(false); + } + }); + break; + } + } + break; + } + } + } + @Override public @NotNull Logger getLogger() { return HamsterBallPlugin.getInstance().getLogger(); } - -} +} \ No newline at end of file diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/MessageReceiveEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/MessageReceiveEvent.java new file mode 100644 index 0000000..3ae79e6 --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/MessageReceiveEvent.java @@ -0,0 +1,30 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event; + +import cn.hamster3.mc.plugin.ball.common.data.BallMessage; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +@Getter +public class MessageReceiveEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @NotNull + private final String channel; + @NotNull + private final BallMessage message; + + public MessageReceiveEvent(@NotNull String channel, @NotNull BallMessage message) { + super(true); + this.channel = channel; + this.message = message; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/MessageSendEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/MessageSendEvent.java new file mode 100644 index 0000000..61633f6 --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/MessageSendEvent.java @@ -0,0 +1,30 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event; + +import cn.hamster3.mc.plugin.ball.common.data.BallMessage; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +@Getter +public class MessageSendEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @NotNull + private final String channel; + @NotNull + private final BallMessage message; + + public MessageSendEvent(boolean isAsync, @NotNull String channel, @NotNull BallMessage message) { + super(isAsync); + this.channel = channel; + this.message = message; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/BroadcastPlayerMessageEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/BroadcastPlayerMessageEvent.java new file mode 100644 index 0000000..3cf1f1c --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/BroadcastPlayerMessageEvent.java @@ -0,0 +1,28 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event.operate; + +import cn.hamster3.mc.plugin.core.common.data.DisplayMessage; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +@Getter +public class BroadcastPlayerMessageEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @NotNull + private final DisplayMessage message; + + public BroadcastPlayerMessageEvent(@NotNull DisplayMessage message) { + super(true); + this.message = message; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } + +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/DispatchConsoleCommandEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/DispatchConsoleCommandEvent.java new file mode 100644 index 0000000..35e8416 --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/DispatchConsoleCommandEvent.java @@ -0,0 +1,34 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event.operate; + +import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +@Getter +public class DispatchConsoleCommandEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @Nullable + private final BallServerType serverType; + @Nullable + private final String serverID; + @NotNull + private final String command; + + public DispatchConsoleCommandEvent(@Nullable BallServerType serverType, @Nullable String serverID, @NotNull String command) { + super(true); + this.serverType = serverType; + this.serverID = serverID; + this.command = command; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/DispatchPlayerCommandEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/DispatchPlayerCommandEvent.java new file mode 100644 index 0000000..92f4726 --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/DispatchPlayerCommandEvent.java @@ -0,0 +1,36 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event.operate; + +import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +@Getter +public class DispatchPlayerCommandEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @Nullable + private final BallServerType serverType; + @Nullable + private final UUID uuid; + @NotNull + private final String command; + + public DispatchPlayerCommandEvent(@Nullable BallServerType serverType, @Nullable UUID uuid, @NotNull String command) { + super(true); + this.serverType = serverType; + this.uuid = uuid; + this.command = command; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/KickPlayerEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/KickPlayerEvent.java new file mode 100644 index 0000000..2ea62a0 --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/KickPlayerEvent.java @@ -0,0 +1,32 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event.operate; + +import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.text.Component; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +@Getter +public class KickPlayerEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @NotNull + private final UUID uuid; + @NotNull + private final Component reason; + + public KickPlayerEvent(@NotNull UUID uuid, @NotNull Component reason) { + super(true); + this.uuid = uuid; + this.reason = reason; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/SendMessageToPlayerEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/SendMessageToPlayerEvent.java new file mode 100644 index 0000000..7852c7a --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/SendMessageToPlayerEvent.java @@ -0,0 +1,33 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event.operate; + +import cn.hamster3.mc.plugin.core.common.data.DisplayMessage; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +import java.util.Set; +import java.util.UUID; + +@Getter +public class SendMessageToPlayerEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @NotNull + private final Set receivers; + @NotNull + private final DisplayMessage message; + + public SendMessageToPlayerEvent(@NotNull Set receivers, @NotNull DisplayMessage message) { + super(true); + this.receivers = receivers; + this.message = message; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/SendPlayerToLocationEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/SendPlayerToLocationEvent.java new file mode 100644 index 0000000..115187b --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/SendPlayerToLocationEvent.java @@ -0,0 +1,38 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event.operate; + +import cn.hamster3.mc.plugin.ball.common.data.BallLocation; +import cn.hamster3.mc.plugin.core.common.data.DisplayMessage; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Set; +import java.util.UUID; + +@Getter +public class SendPlayerToLocationEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @NotNull + private final Set sendPlayer; + @NotNull + private final BallLocation location; + @Nullable + private final DisplayMessage doneMessage; + + public SendPlayerToLocationEvent(@NotNull Set sendPlayer, @NotNull BallLocation location, @Nullable DisplayMessage doneMessage) { + super(true); + this.sendPlayer = sendPlayer; + this.location = location; + this.doneMessage = doneMessage; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/SendPlayerToPlayerEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/SendPlayerToPlayerEvent.java new file mode 100644 index 0000000..1d15f29 --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/operate/SendPlayerToPlayerEvent.java @@ -0,0 +1,41 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event.operate; + +import cn.hamster3.mc.plugin.core.common.data.DisplayMessage; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Set; +import java.util.UUID; + +@Getter +public class SendPlayerToPlayerEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @NotNull + private final Set sendPlayer; + @NotNull + private final UUID toPlayer; + @Nullable + private final DisplayMessage doneMessage; + @Nullable + private final DisplayMessage doneTargetMessage; + + public SendPlayerToPlayerEvent(@NotNull Set sendPlayer, @NotNull UUID toPlayer, @Nullable DisplayMessage doneMessage, @Nullable DisplayMessage doneTargetMessage) { + super(true); + this.sendPlayer = sendPlayer; + this.toPlayer = toPlayer; + this.doneMessage = doneMessage; + this.doneTargetMessage = doneTargetMessage; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } + +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerConnectServerEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerConnectServerEvent.java new file mode 100644 index 0000000..5fd5a5d --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerConnectServerEvent.java @@ -0,0 +1,43 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event.player; + +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * 玩家进入子服 + *

+ * 仅在使用 velocity 代理端时才会触发这个事件 + * + * @see BallPlayerPreConnectServerEvent 玩家准备进入子服 + * @see BallPlayerConnectServerEvent 玩家进入子服 + * @see BallPlayerPostConnectServerEvent 玩家已经进入子服 + */ +@Getter +public class BallPlayerConnectServerEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @NotNull + private final BallPlayerInfo playerInfo; + @Nullable + private final String from; + @NotNull + private final String to; + + public BallPlayerConnectServerEvent(@NotNull BallPlayerInfo playerInfo, @Nullable String from, @NotNull String to) { + super(true); + this.playerInfo = playerInfo; + this.from = from; + this.to = to; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerInfoUpdateEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerInfoUpdateEvent.java new file mode 100644 index 0000000..71d0917 --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerInfoUpdateEvent.java @@ -0,0 +1,30 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event.player; + +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +/** + * 玩家已进入子服 + */ +@Getter +public class BallPlayerInfoUpdateEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @NotNull + private final BallPlayerInfo playerInfo; + + public BallPlayerInfoUpdateEvent(@NotNull BallPlayerInfo playerInfo) { + super(true); + this.playerInfo = playerInfo; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerLoginEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerLoginEvent.java new file mode 100644 index 0000000..e2d34e0 --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerLoginEvent.java @@ -0,0 +1,31 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event.player; + +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +/** + * 玩家连接到代理服务器 + */ +@Getter +public class BallPlayerLoginEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @NotNull + private final BallPlayerInfo playerInfo; + + public BallPlayerLoginEvent(@NotNull BallPlayerInfo playerInfo) { + super(true); + this.playerInfo = playerInfo; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } + +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerLogoutEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerLogoutEvent.java new file mode 100644 index 0000000..fc9a9c2 --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerLogoutEvent.java @@ -0,0 +1,30 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event.player; + +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +/** + * 玩家与代理服务器断开连接 + */ +@Getter +public class BallPlayerLogoutEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @NotNull + private final BallPlayerInfo playerInfo; + + public BallPlayerLogoutEvent(@NotNull BallPlayerInfo playerInfo) { + super(true); + this.playerInfo = playerInfo; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerPostConnectServerEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerPostConnectServerEvent.java new file mode 100644 index 0000000..42d00e1 --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerPostConnectServerEvent.java @@ -0,0 +1,40 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event.player; + +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +/** + * 玩家已经进入子服 + * + * @see BallPlayerPreConnectServerEvent 玩家准备进入子服 + * @see BallPlayerConnectServerEvent 玩家进入子服 + * @see BallPlayerPostConnectServerEvent 玩家已经进入子服 + */ +@Getter +public class BallPlayerPostConnectServerEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @NotNull + private final BallPlayerInfo playerInfo; + @NotNull + private final String from; + @NotNull + private final String to; + + public BallPlayerPostConnectServerEvent(@NotNull BallPlayerInfo playerInfo, @NotNull String from, @NotNull String to) { + super(true); + this.playerInfo = playerInfo; + this.from = from; + this.to = to; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerPostLoginEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerPostLoginEvent.java new file mode 100644 index 0000000..c25fa46 --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerPostLoginEvent.java @@ -0,0 +1,30 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event.player; + +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +/** + * 玩家已连接到代理服务器 + */ +@Getter +public class BallPlayerPostLoginEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @NotNull + private final BallPlayerInfo playerInfo; + + public BallPlayerPostLoginEvent(@NotNull BallPlayerInfo playerInfo) { + super(true); + this.playerInfo = playerInfo; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerPreConnectServerEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerPreConnectServerEvent.java new file mode 100644 index 0000000..fc7d6b6 --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerPreConnectServerEvent.java @@ -0,0 +1,41 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event.player; + +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * 玩家准备进入子服 + * + * @see BallPlayerPreConnectServerEvent 玩家准备进入子服 + * @see BallPlayerConnectServerEvent 玩家进入子服 + * @see BallPlayerPostConnectServerEvent 玩家已经进入子服 + */ +@Getter +public class BallPlayerPreConnectServerEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @NotNull + private final BallPlayerInfo playerInfo; + @Nullable + private final String from; + @NotNull + private final String to; + + public BallPlayerPreConnectServerEvent(@NotNull BallPlayerInfo playerInfo, @Nullable String from, @NotNull String to) { + super(true); + this.playerInfo = playerInfo; + this.from = from; + this.to = to; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerPreLoginEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerPreLoginEvent.java new file mode 100644 index 0000000..b0dce2b --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/player/BallPlayerPreLoginEvent.java @@ -0,0 +1,29 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event.player; + +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +/** + * 玩家准备连接到代理服务器 + */ +@Getter +public class BallPlayerPreLoginEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @NotNull + private final String playerName; + + public BallPlayerPreLoginEvent(@NotNull String playerName) { + super(true); + this.playerName = playerName; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/server/ServerOfflineEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/server/ServerOfflineEvent.java new file mode 100644 index 0000000..a0bc421 --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/server/ServerOfflineEvent.java @@ -0,0 +1,30 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event.server; + +import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +/** + * 服务器离线 + */ +@Getter +public class ServerOfflineEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @NotNull + private final BallServerInfo serverInfo; + + public ServerOfflineEvent(@NotNull BallServerInfo serverInfo) { + super(true); + this.serverInfo = serverInfo; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/server/ServerOnlineEvent.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/server/ServerOnlineEvent.java new file mode 100644 index 0000000..f4dfeb4 --- /dev/null +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/event/server/ServerOnlineEvent.java @@ -0,0 +1,30 @@ +package cn.hamster3.mc.plugin.ball.bukkit.event.server; + +import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +/** + * 服务器上线 + */ +@Getter +public class ServerOnlineEvent extends Event { + @Getter + private static final HandlerList handlerList = new HandlerList(); + + @NotNull + private final BallServerInfo serverInfo; + + public ServerOnlineEvent(@NotNull BallServerInfo serverInfo) { + super(true); + this.serverInfo = serverInfo; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } +} diff --git a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/BallBukkitListener.java b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/BallBukkitListener.java index c1506f1..209f375 100644 --- a/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/BallBukkitListener.java +++ b/ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/BallBukkitListener.java @@ -2,11 +2,9 @@ package cn.hamster3.mc.plugin.ball.bukkit.listener; import cn.hamster3.mc.plugin.ball.bukkit.HamsterBallPlugin; import cn.hamster3.mc.plugin.ball.bukkit.data.BukkitLocation; +import cn.hamster3.mc.plugin.ball.bukkit.event.operate.*; import cn.hamster3.mc.plugin.ball.common.api.BallAPI; -import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo; import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; -import cn.hamster3.mc.plugin.ball.common.event.operate.*; -import cn.hamster3.mc.plugin.ball.common.listener.BallListener; import cn.hamster3.mc.plugin.core.bukkit.api.CoreBukkitAPI; import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import cn.hamster3.mc.plugin.core.common.data.DisplayMessage; @@ -33,7 +31,7 @@ import java.util.HashMap; import java.util.List; import java.util.UUID; -public class BallBukkitListener implements Listener, BallListener { +public class BallBukkitListener implements Listener { public static final BallBukkitListener INSTANCE = new BallBukkitListener(); private final HashMap playerToLocation = new HashMap<>(); @@ -42,108 +40,6 @@ public class BallBukkitListener implements Listener, BallListener { private BallBukkitListener() { } - @Override - public void onMessageReceived(@NotNull BallMessageInfo info) { - switch (info.getAction()) { - case BroadcastPlayerMessageEvent.ACTION: { - BroadcastPlayerMessageEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BroadcastPlayerMessageEvent.class); - DisplayMessage message = event.getMessage(); - Audience audience = CoreAPI.getInstance().getAudienceProvider().all(); - message.show(audience); - break; - } - case DispatchConsoleCommandEvent.ACTION: { - DispatchConsoleCommandEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), DispatchConsoleCommandEvent.class); - if (event.getType() != null && event.getType() != BallServerType.GAME) { - return; - } - if (event.getServerID() != null && !BallAPI.getInstance().isLocalServer(event.getServerID())) { - return; - } - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), event.getCommand()); - break; - } - case DispatchPlayerCommandEvent.ACTION: { - DispatchPlayerCommandEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), DispatchPlayerCommandEvent.class); - if (event.getType() != null && event.getType() != BallServerType.GAME) { - return; - } - if (event.getUuid() != null) { - Player player = Bukkit.getPlayer(event.getUuid()); - if (player == null) { - return; - } - Bukkit.dispatchCommand(player, event.getCommand()); - return; - } - for (Player player : Bukkit.getOnlinePlayers()) { - Bukkit.dispatchCommand(player, event.getCommand()); - } - break; - } - case SendPlayerToLocationEvent.ACTION: { - SendPlayerToLocationEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), SendPlayerToLocationEvent.class); - BukkitLocation location = new BukkitLocation(event.getLocation()); - if (BallAPI.getInstance().isLocalServer(location.getServerID())) { - for (UUID uuid : event.getSendPlayerUUID()) { - Player player = Bukkit.getPlayer(uuid); - if (player != null) { - HamsterBallPlugin.sync(() -> { - player.teleport(location.toBukkitLocation()); - if (event.getDoneMessage() != null) { - Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(player); - event.getDoneMessage().show(audience); - } - }); - } else { - playerToLocation.put(uuid, new ToLocation(location.toBukkitLocation(), event.getDoneMessage())); - } - } - } - break; - } - case SendPlayerToPlayerEvent.ACTION: { - SendPlayerToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), SendPlayerToPlayerEvent.class); - Player toPlayer = Bukkit.getPlayer(event.getToPlayerUUID()); - if (toPlayer == null) { - break; - } - Location location = toPlayer.getLocation(); - for (UUID uuid : event.getSendPlayerUUID()) { - Player sendPlayer = Bukkit.getPlayer(uuid); - if (sendPlayer != null) { - HamsterBallPlugin.sync(() -> { - sendPlayer.teleport(location); - if (event.getDoneMessage() != null) { - Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(sendPlayer); - event.getDoneMessage().show(audience, TextReplacementConfig.builder() - .matchLiteral("%player_name%") - .replacement(toPlayer.getName()) - .build()); - } - if (event.getDoneTargetMessage() != null) { - Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(toPlayer); - event.getDoneTargetMessage().show(audience, TextReplacementConfig.builder() - .matchLiteral("%player_name%") - .replacement(sendPlayer.getName()) - .build()); - } - }); - } else { - ToPlayer data = new ToPlayer( - toPlayer.getUniqueId(), - toPlayer.getLocation(), - event.getDoneMessage(), - event.getDoneTargetMessage() - ); - playerToPlayer.put(uuid, data); - } - } - break; - } - } - } - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); @@ -189,6 +85,102 @@ public class BallBukkitListener implements Listener, BallListener { }); } + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onBroadcastPlayerMessage(BroadcastPlayerMessageEvent event) { + DisplayMessage message = event.getMessage(); + Audience audience = CoreAPI.getInstance().getAudienceProvider().all(); + message.show(audience); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onDispatchConsoleCommand(DispatchConsoleCommandEvent event) { + if (event.getServerType() != null && event.getServerType() != BallServerType.GAME) { + return; + } + if (event.getServerID() != null && !BallAPI.getInstance().isLocalServer(event.getServerID())) { + return; + } + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), event.getCommand()); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onDispatchPlayerCommand(DispatchPlayerCommandEvent event) { + if (event.getServerType() != null && event.getServerType() != BallServerType.GAME) { + return; + } + if (event.getUuid() != null) { + Player player = Bukkit.getPlayer(event.getUuid()); + if (player == null) { + return; + } + Bukkit.dispatchCommand(player, event.getCommand()); + return; + } + for (Player player : Bukkit.getOnlinePlayers()) { + Bukkit.dispatchCommand(player, event.getCommand()); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onSendPlayerToLocation(SendPlayerToLocationEvent event) { + BukkitLocation location = new BukkitLocation(event.getLocation()); + if (BallAPI.getInstance().isLocalServer(location.getServerID())) { + for (UUID uuid : event.getSendPlayer()) { + Player player = Bukkit.getPlayer(uuid); + if (player != null) { + HamsterBallPlugin.sync(() -> { + player.teleport(location.toBukkitLocation()); + if (event.getDoneMessage() != null) { + Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(player); + event.getDoneMessage().show(audience); + } + }); + } else { + playerToLocation.put(uuid, new ToLocation(location.toBukkitLocation(), event.getDoneMessage())); + } + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onSendPlayerToPlayer(SendPlayerToPlayerEvent event) { + Player toPlayer = Bukkit.getPlayer(event.getToPlayer()); + if (toPlayer == null) { + return; + } + Location location = toPlayer.getLocation(); + for (UUID uuid : event.getSendPlayer()) { + Player sendPlayer = Bukkit.getPlayer(uuid); + if (sendPlayer != null) { + HamsterBallPlugin.sync(() -> { + sendPlayer.teleport(location); + if (event.getDoneMessage() != null) { + Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(sendPlayer); + event.getDoneMessage().show(audience, TextReplacementConfig.builder() + .matchLiteral("%player_name%") + .replacement(toPlayer.getName()) + .build()); + } + if (event.getDoneTargetMessage() != null) { + Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(toPlayer); + event.getDoneTargetMessage().show(audience, TextReplacementConfig.builder() + .matchLiteral("%player_name%") + .replacement(sendPlayer.getName()) + .build()); + } + }); + } else { + ToPlayer data = new ToPlayer( + toPlayer.getUniqueId(), + toPlayer.getLocation(), + event.getDoneMessage(), + event.getDoneTargetMessage() + ); + playerToPlayer.put(uuid, data); + } + } + } + @NotNull private List getCachedPlayerMessage(@NotNull UUID uuid) throws SQLException { ArrayList list = new ArrayList<>(); diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/HamsterBallPlugin.java similarity index 77% rename from ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java rename to ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/HamsterBallPlugin.java index b4b27bd..bfc4553 100644 --- a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/HamsterBallPlugin.java +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/HamsterBallPlugin.java @@ -1,11 +1,10 @@ -package cn.hamster3.mc.plugin.core.bungee; +package cn.hamster3.mc.plugin.ball.bungee; +import cn.hamster3.mc.plugin.ball.bungee.api.BallBungeeCordAPI; +import cn.hamster3.mc.plugin.ball.bungee.listener.BallBungeeCordListener; +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.server.ServerOnlineEvent; -import cn.hamster3.mc.plugin.core.bungee.api.BallBungeeCordAPI; -import cn.hamster3.mc.plugin.core.bungee.listener.BallBungeeCordListener; -import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.plugin.Plugin; @@ -45,17 +44,8 @@ public class HamsterBallPlugin extends Plugin { } catch (Exception e) { e.printStackTrace(); } - if (!BallAPI.getInstance().isEnabled()) { - ProxyServer.getInstance().stop("由于 HamsterBall 未能成功连接, 服务器将立即关闭"); - return; - } ProxyServer.getInstance().getPluginManager().registerListener(this, BallBungeeCordListener.INSTANCE); logger.info("已注册 BallBungeeCordListener"); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - ServerOnlineEvent.ACTION, - new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()) - ); BallAPI.getInstance().getAllPlayerInfo().values() .stream() .filter(BallPlayerInfo::isOnline) diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/api/BallBungeeCordAPI.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/api/BallBungeeCordAPI.java new file mode 100644 index 0000000..2fbd2a8 --- /dev/null +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/api/BallBungeeCordAPI.java @@ -0,0 +1,245 @@ +package cn.hamster3.mc.plugin.ball.bungee.api; + +import cn.hamster3.mc.plugin.ball.bungee.HamsterBallPlugin; +import cn.hamster3.mc.plugin.ball.bungee.event.MessageReceiveEvent; +import cn.hamster3.mc.plugin.ball.bungee.event.MessageSendEvent; +import cn.hamster3.mc.plugin.ball.bungee.event.operate.*; +import cn.hamster3.mc.plugin.ball.bungee.event.player.*; +import cn.hamster3.mc.plugin.ball.bungee.event.server.ServerOfflineEvent; +import cn.hamster3.mc.plugin.ball.bungee.event.server.ServerOnlineEvent; +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.data.BallMessage; +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.entity.BallServerType; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; +import cn.hamster3.mc.plugin.core.bungee.util.CoreBungeeCordUtils; +import cn.hamster3.mc.plugin.core.common.api.CoreAPI; +import io.lettuce.core.RedisClient; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.config.Configuration; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.sql.DataSource; +import java.sql.SQLException; +import java.util.Map; +import java.util.logging.Logger; + +public class BallBungeeCordAPI extends BallAPI { + public BallBungeeCordAPI(@NotNull BallServerInfo localServerInfo, @Nullable DataSource datasource, @NotNull RedisClient redisClient, boolean debug) { + super(localServerInfo, datasource, redisClient, debug); + } + + public static BallBungeeCordAPI getInstance() { + return (BallBungeeCordAPI) instance; + } + + public static void init() { + if (instance != null) { + return; + } + HamsterBallPlugin plugin = HamsterBallPlugin.getInstance(); + Configuration config = CoreBungeeCordUtils.getPluginConfig(plugin); + Map env = System.getenv(); + + BallServerInfo serverInfo = new BallServerInfo( + env.getOrDefault("BALL_LOCAL_SERVER_INFO_ID", config.getString("server-info.id")), + env.getOrDefault("BALL_LOCAL_SERVER_INFO_NAME", config.getString("server-info.name")), + BallServerType.PROXY, + env.getOrDefault("BALL_LOCAL_SERVER_IP", config.getString("server-info.host", "0.0.0.0")), + Integer.parseInt( + env.getOrDefault("BALL_LOCAL_SERVER_PORT", config.getString("server-info.port", "25577")) + ) + ); + + DataSource datasource; + if (config.contains("datasource")) { + plugin.getLogger().info("检测到配置文件中包含 datasource 节点,启用自定义数据库连接"); + datasource = BallBungeeCordUtils.getDataSource(config.getSection("datasource")); + } else { + plugin.getLogger().info("未检测到配置文件中的 datasource 节点,复用 HamsterCore 数据库连接"); + datasource = CoreAPI.getInstance().getDataSource(); + } + + RedisClient redisClient = RedisClient.create(config.getString("redis-url", "redis://localhost:6379?clientName=HamsterBall")); + + instance = new BallBungeeCordAPI(serverInfo, datasource, redisClient, config.getBoolean("debug", false)); + } + + @Override + public void enable() throws SQLException, InterruptedException { + super.enable(); + } + + @Override + public void disable() throws SQLException, InterruptedException { + super.disable(); + } + + @Override + public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message, boolean block) { + ProxyServer.getInstance().getPluginManager().callEvent(new MessageSendEvent(channel, message)); + super.sendBallMessage(channel, message, block); + } + + @Override + protected void onMessage(String channel, BallMessage message) { + ProxyServer.getInstance().getPluginManager().callEvent(new MessageReceiveEvent(channel, message)); + if (!BallAPI.BALL_CHANNEL.equals(channel)) { + return; + } + switch (BallActions.valueOf(message.getAction())) { + case BroadcastPlayerMessage: { + ProxyServer.getInstance().getPluginManager().callEvent( + message.getContentAs(BroadcastPlayerMessageEvent.class) + ); + break; + } + case DispatchConsoleCommand: { + ProxyServer.getInstance().getPluginManager().callEvent( + message.getContentAs(DispatchConsoleCommandEvent.class) + ); + break; + } + case DispatchPlayerCommand: { + ProxyServer.getInstance().getPluginManager().callEvent( + message.getContentAs(DispatchPlayerCommandEvent.class) + ); + break; + } + case KickPlayer: { + ProxyServer.getInstance().getPluginManager().callEvent( + message.getContentAs(KickPlayerEvent.class) + ); + break; + } + case SendMessageToPlayer: { + ProxyServer.getInstance().getPluginManager().callEvent( + message.getContentAs(SendMessageToPlayerEvent.class) + ); + break; + } + case SendPlayerToLocation: { + ProxyServer.getInstance().getPluginManager().callEvent( + message.getContentAs(SendPlayerToLocationEvent.class) + ); + break; + } + case SendPlayerToPlayer: { + ProxyServer.getInstance().getPluginManager().callEvent( + message.getContentAs(SendPlayerToPlayerEvent.class) + ); + break; + } + case PlayerInfoUpdate: { + BallPlayerInfoUpdateEvent event = message.getContentAs(BallPlayerInfoUpdateEvent.class); + ProxyServer.getInstance().getPluginManager().callEvent(event); + BallPlayerInfo info = event.getPlayerInfo(); + playerInfo.put(info.getUuid(), info); + break; + } + case PlayerPreLogin: { + ProxyServer.getInstance().getPluginManager().callEvent( + message.getContentAs(BallPlayerPreLoginEvent.class) + ); + break; + } + case PlayerLogin: { + ProxyServer.getInstance().getPluginManager().callEvent( + message.getContentAs(BallPlayerLoginEvent.class) + ); + break; + } + case PlayerPostLogin: { + ProxyServer.getInstance().getPluginManager().callEvent( + message.getContentAs(BallPlayerPostLoginEvent.class) + ); + break; + } + case PlayerPreConnectServer: { + ProxyServer.getInstance().getPluginManager().callEvent( + message.getContentAs(BallPlayerPreConnectServerEvent.class) + ); + break; + } + case PlayerConnectServer: { + ProxyServer.getInstance().getPluginManager().callEvent( + message.getContentAs(BallPlayerConnectServerEvent.class) + ); + break; + } + case PlayerPostConnectServer: { + ProxyServer.getInstance().getPluginManager().callEvent( + message.getContentAs(BallPlayerPostConnectServerEvent.class) + ); + break; + } + case PlayerLogout: { + ProxyServer.getInstance().getPluginManager().callEvent( + message.getContentAs(BallPlayerLogoutEvent.class) + ); + break; + } + case ServerOnline: { + ServerOnlineEvent event = message.getContentAs(ServerOnlineEvent.class); + ProxyServer.getInstance().getPluginManager().callEvent(event); + BallServerInfo info = event.getServerInfo(); + serverInfo.put(info.getId(), info); + switch (info.getType()) { + case GAME: { + playerInfo.forEach((uuid, playerInfo) -> { + if (playerInfo.getGameServer().equals(info.getId())) { + playerInfo.setOnline(false); + } + }); + break; + } + case PROXY: { + playerInfo.forEach((uuid, playerInfo) -> { + if (playerInfo.getProxyServer().equals(info.getId())) { + playerInfo.setOnline(false); + } + }); + break; + } + } + break; + } + case ServerOffline: { + ServerOfflineEvent event = message.getContentAs(ServerOfflineEvent.class); + ProxyServer.getInstance().getPluginManager().callEvent(event); + String serverID = event.getServerInfo().getId(); + BallServerInfo info = serverInfo.remove(serverID); + if (info == null) { + return; + } + switch (info.getType()) { + case GAME: { + playerInfo.forEach((uuid, playerInfo) -> { + if (playerInfo.getGameServer().equals(info.getId())) { + playerInfo.setOnline(false); + } + }); + break; + } + case PROXY: { + playerInfo.forEach((uuid, playerInfo) -> { + if (playerInfo.getProxyServer().equals(info.getId())) { + playerInfo.setOnline(false); + } + }); + break; + } + } + break; + } + } + } + + @Override + public @NotNull Logger getLogger() { + return HamsterBallPlugin.getInstance().getLogger(); + } +} diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/MessageReceiveEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/MessageReceiveEvent.java new file mode 100644 index 0000000..0af7261 --- /dev/null +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/MessageReceiveEvent.java @@ -0,0 +1,19 @@ +package cn.hamster3.mc.plugin.ball.bungee.event; + +import cn.hamster3.mc.plugin.ball.common.data.BallMessage; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; +import org.jetbrains.annotations.NotNull; + +@Getter +public class MessageReceiveEvent extends Event { + @NotNull + private final String channel; + @NotNull + private final BallMessage message; + + public MessageReceiveEvent(@NotNull String channel, @NotNull BallMessage message) { + this.channel = channel; + this.message = message; + } +} \ No newline at end of file diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/MessageSendEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/MessageSendEvent.java new file mode 100644 index 0000000..95bec25 --- /dev/null +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/MessageSendEvent.java @@ -0,0 +1,19 @@ +package cn.hamster3.mc.plugin.ball.bungee.event; + +import cn.hamster3.mc.plugin.ball.common.data.BallMessage; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; +import org.jetbrains.annotations.NotNull; + +@Getter +public class MessageSendEvent extends Event { + @NotNull + private final String channel; + @NotNull + private final BallMessage message; + + public MessageSendEvent(@NotNull String channel, @NotNull BallMessage message) { + this.channel = channel; + this.message = message; + } +} \ No newline at end of file diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/BroadcastPlayerMessageEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/BroadcastPlayerMessageEvent.java new file mode 100644 index 0000000..d24d39c --- /dev/null +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/BroadcastPlayerMessageEvent.java @@ -0,0 +1,14 @@ +package cn.hamster3.mc.plugin.ball.bungee.event.operate; + +import cn.hamster3.mc.plugin.core.common.data.DisplayMessage; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; +import org.jetbrains.annotations.NotNull; + +@Getter +@AllArgsConstructor +public class BroadcastPlayerMessageEvent extends Event { + @NotNull + private final DisplayMessage message; +} \ No newline at end of file diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/DispatchConsoleCommandEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/DispatchConsoleCommandEvent.java new file mode 100644 index 0000000..f16190e --- /dev/null +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/DispatchConsoleCommandEvent.java @@ -0,0 +1,19 @@ +package cn.hamster3.mc.plugin.ball.bungee.event.operate; + +import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +@Getter +@AllArgsConstructor +public class DispatchConsoleCommandEvent extends Event { + @Nullable + private final BallServerType serverType; + @Nullable + private final String serverID; + @NotNull + private final String command; +} \ No newline at end of file diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/DispatchPlayerCommandEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/DispatchPlayerCommandEvent.java new file mode 100644 index 0000000..f256dba --- /dev/null +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/DispatchPlayerCommandEvent.java @@ -0,0 +1,21 @@ +package cn.hamster3.mc.plugin.ball.bungee.event.operate; + +import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +@Getter +@AllArgsConstructor +public class DispatchPlayerCommandEvent extends Event { + @Nullable + private final BallServerType serverType; + @Nullable + private final UUID uuid; + @NotNull + private final String command; +} \ No newline at end of file diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/KickPlayerEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/KickPlayerEvent.java new file mode 100644 index 0000000..9cc3868 --- /dev/null +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/KickPlayerEvent.java @@ -0,0 +1,18 @@ +package cn.hamster3.mc.plugin.ball.bungee.event.operate; + +import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.text.Component; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +@Getter +@AllArgsConstructor +public class KickPlayerEvent extends Event { + @NotNull + private final UUID uuid; + @NotNull + private final Component reason; +} \ No newline at end of file diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/SendMessageToPlayerEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/SendMessageToPlayerEvent.java new file mode 100644 index 0000000..4d3e99f --- /dev/null +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/SendMessageToPlayerEvent.java @@ -0,0 +1,19 @@ +package cn.hamster3.mc.plugin.ball.bungee.event.operate; + +import cn.hamster3.mc.plugin.core.common.data.DisplayMessage; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; +import org.jetbrains.annotations.NotNull; + +import java.util.Set; +import java.util.UUID; + +@Getter +@AllArgsConstructor +public class SendMessageToPlayerEvent extends Event { + @NotNull + private final Set receivers; + @NotNull + private final DisplayMessage message; +} \ No newline at end of file diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/SendPlayerToLocationEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/SendPlayerToLocationEvent.java new file mode 100644 index 0000000..1231276 --- /dev/null +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/SendPlayerToLocationEvent.java @@ -0,0 +1,23 @@ +package cn.hamster3.mc.plugin.ball.bungee.event.operate; + +import cn.hamster3.mc.plugin.ball.common.data.BallLocation; +import cn.hamster3.mc.plugin.core.common.data.DisplayMessage; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Set; +import java.util.UUID; + +@Getter +@AllArgsConstructor +public class SendPlayerToLocationEvent extends Event { + @NotNull + private final Set sendPlayer; + @NotNull + private final BallLocation location; + @Nullable + private final DisplayMessage doneMessage; +} \ No newline at end of file diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/SendPlayerToPlayerEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/SendPlayerToPlayerEvent.java new file mode 100644 index 0000000..5b16e9d --- /dev/null +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/operate/SendPlayerToPlayerEvent.java @@ -0,0 +1,24 @@ +package cn.hamster3.mc.plugin.ball.bungee.event.operate; + +import cn.hamster3.mc.plugin.core.common.data.DisplayMessage; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Set; +import java.util.UUID; + +@Getter +@AllArgsConstructor +public class SendPlayerToPlayerEvent extends Event { + @NotNull + private final Set sendPlayer; + @NotNull + private final UUID toPlayer; + @Nullable + private final DisplayMessage doneMessage; + @Nullable + private final DisplayMessage doneTargetMessage; +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerConnectServerEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerConnectServerEvent.java similarity index 76% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerConnectServerEvent.java rename to ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerConnectServerEvent.java index 4dde9f2..92e2d71 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerConnectServerEvent.java +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerConnectServerEvent.java @@ -1,8 +1,9 @@ -package cn.hamster3.mc.plugin.ball.common.event.player; +package cn.hamster3.mc.plugin.ball.bungee.event.player; import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -15,15 +16,13 @@ import org.jetbrains.annotations.Nullable; * @see BallPlayerConnectServerEvent 玩家进入子服 * @see BallPlayerPostConnectServerEvent 玩家已经进入子服 */ -@Data +@Getter @AllArgsConstructor -public class BallPlayerConnectServerEvent { - public static final String ACTION = "PlayerConnectServer"; - +public class BallPlayerConnectServerEvent extends Event { @NotNull private final BallPlayerInfo playerInfo; @Nullable private final String from; @NotNull private final String to; -} +} \ No newline at end of file diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerInfoUpdateEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerInfoUpdateEvent.java new file mode 100644 index 0000000..606c578 --- /dev/null +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerInfoUpdateEvent.java @@ -0,0 +1,17 @@ +package cn.hamster3.mc.plugin.ball.bungee.event.player; + +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; +import org.jetbrains.annotations.NotNull; + +/** + * 玩家已进入子服 + */ +@Getter +@AllArgsConstructor +public class BallPlayerInfoUpdateEvent extends Event { + @NotNull + private final BallPlayerInfo playerInfo; +} \ No newline at end of file diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerLoginEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerLoginEvent.java new file mode 100644 index 0000000..315c5e2 --- /dev/null +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerLoginEvent.java @@ -0,0 +1,17 @@ +package cn.hamster3.mc.plugin.ball.bungee.event.player; + +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; +import org.jetbrains.annotations.NotNull; + +/** + * 玩家连接到代理服务器 + */ +@Getter +@AllArgsConstructor +public class BallPlayerLoginEvent extends Event { + @NotNull + private final BallPlayerInfo playerInfo; +} \ No newline at end of file diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerLogoutEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerLogoutEvent.java new file mode 100644 index 0000000..6121986 --- /dev/null +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerLogoutEvent.java @@ -0,0 +1,17 @@ +package cn.hamster3.mc.plugin.ball.bungee.event.player; + +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; +import org.jetbrains.annotations.NotNull; + +/** + * 玩家与代理服务器断开连接 + */ +@Getter +@AllArgsConstructor +public class BallPlayerLogoutEvent extends Event { + @NotNull + private BallPlayerInfo playerInfo; +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostConnectServerEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerPostConnectServerEvent.java similarity index 61% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostConnectServerEvent.java rename to ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerPostConnectServerEvent.java index d63ae4e..2854cb9 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostConnectServerEvent.java +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerPostConnectServerEvent.java @@ -1,8 +1,9 @@ -package cn.hamster3.mc.plugin.ball.common.event.player; +package cn.hamster3.mc.plugin.ball.bungee.event.player; import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; import org.jetbrains.annotations.NotNull; /** @@ -12,11 +13,13 @@ import org.jetbrains.annotations.NotNull; * @see BallPlayerConnectServerEvent 玩家进入子服 * @see BallPlayerPostConnectServerEvent 玩家已经进入子服 */ -@Data +@Getter @AllArgsConstructor -public class BallPlayerPostConnectServerEvent { - public static final String ACTION = "PlayerPostConnectServer"; - +public class BallPlayerPostConnectServerEvent extends Event { @NotNull private final BallPlayerInfo playerInfo; -} + @NotNull + private final String from; + @NotNull + private final String to; +} \ No newline at end of file diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerPostLoginEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerPostLoginEvent.java new file mode 100644 index 0000000..cbbb671 --- /dev/null +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerPostLoginEvent.java @@ -0,0 +1,17 @@ +package cn.hamster3.mc.plugin.ball.bungee.event.player; + +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; +import org.jetbrains.annotations.NotNull; + +/** + * 玩家已连接到代理服务器 + */ +@Getter +@AllArgsConstructor +public class BallPlayerPostLoginEvent extends Event { + @NotNull + private final BallPlayerInfo playerInfo; +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreConnectServerEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerPreConnectServerEvent.java similarity index 74% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreConnectServerEvent.java rename to ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerPreConnectServerEvent.java index 9a21b5f..79bbd73 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreConnectServerEvent.java +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerPreConnectServerEvent.java @@ -1,8 +1,9 @@ -package cn.hamster3.mc.plugin.ball.common.event.player; +package cn.hamster3.mc.plugin.ball.bungee.event.player; import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -13,16 +14,13 @@ import org.jetbrains.annotations.Nullable; * @see BallPlayerConnectServerEvent 玩家进入子服 * @see BallPlayerPostConnectServerEvent 玩家已经进入子服 */ -@Data +@Getter @AllArgsConstructor -public class BallPlayerPreConnectServerEvent { - public static final String ACTION = "PlayerPreConnectServer"; - +public class BallPlayerPreConnectServerEvent extends Event { @NotNull private final BallPlayerInfo playerInfo; @Nullable private final String from; @NotNull private final String to; - -} +} \ No newline at end of file diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerPreLoginEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerPreLoginEvent.java new file mode 100644 index 0000000..6b69073 --- /dev/null +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/player/BallPlayerPreLoginEvent.java @@ -0,0 +1,16 @@ +package cn.hamster3.mc.plugin.ball.bungee.event.player; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; +import org.jetbrains.annotations.NotNull; + +/** + * 玩家准备连接到代理服务器 + */ +@Getter +@AllArgsConstructor +public class BallPlayerPreLoginEvent extends Event { + @NotNull + private final String playerName; +} \ No newline at end of file diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/server/ServerOfflineEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/server/ServerOfflineEvent.java new file mode 100644 index 0000000..a2ea9f4 --- /dev/null +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/server/ServerOfflineEvent.java @@ -0,0 +1,17 @@ +package cn.hamster3.mc.plugin.ball.bungee.event.server; + +import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; +import org.jetbrains.annotations.NotNull; + +/** + * 服务器离线 + */ +@Getter +@AllArgsConstructor +public class ServerOfflineEvent extends Event { + @NotNull + private final BallServerInfo serverInfo; +} \ No newline at end of file diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/server/ServerOnlineEvent.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/server/ServerOnlineEvent.java new file mode 100644 index 0000000..2b8e175 --- /dev/null +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/event/server/ServerOnlineEvent.java @@ -0,0 +1,17 @@ +package cn.hamster3.mc.plugin.ball.bungee.event.server; + +import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.md_5.bungee.api.plugin.Event; +import org.jetbrains.annotations.NotNull; + +/** + * 服务器上线 + */ +@Getter +@AllArgsConstructor +public class ServerOnlineEvent extends Event { + @NotNull + private final BallServerInfo serverInfo; +} \ No newline at end of file diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/listener/BallBungeeCordListener.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/listener/BallBungeeCordListener.java new file mode 100644 index 0000000..2b8f575 --- /dev/null +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/listener/BallBungeeCordListener.java @@ -0,0 +1,201 @@ +package cn.hamster3.mc.plugin.ball.bungee.listener; + +import cn.hamster3.mc.plugin.ball.bungee.HamsterBallPlugin; +import cn.hamster3.mc.plugin.ball.bungee.event.operate.*; +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.entity.BallServerType; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; +import cn.hamster3.mc.plugin.ball.common.event.player.*; +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 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.*; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; +import net.md_5.bungee.event.EventPriority; + +import java.util.UUID; + +public final class BallBungeeCordListener implements Listener { + public static final BallBungeeCordListener INSTANCE = new BallBungeeCordListener(); + + private BallBungeeCordListener() { + } + + @EventHandler(priority = EventPriority.HIGH) + public void onPreLogin(PreLoginEvent event) { + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.PlayerPreLogin.name(), + new BallPlayerPreLogin(event.getConnection().getName()) + ); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onLogin(LoginEvent event) { + if (event.isCancelled()) { + return; + } + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.PlayerLogin.name(), + new BallPlayerLogin( + new BallPlayerInfo( + event.getConnection().getUniqueId(), + event.getConnection().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().sendBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.PlayerPostLogin.name(), + new BallPlayerPostLogin(playerInfo) + ); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onServerConnect(ServerConnectEvent event) { + ProxiedPlayer player = event.getPlayer(); + BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); + playerInfo.setGameServer(event.getTarget().getName()); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.PlayerPreConnectServer.name(), + new BallPlayerPreConnectServer(playerInfo, playerInfo.getGameServer(), event.getTarget().getName()) + ); + BallBungeeCordUtils.uploadPlayerInfo(playerInfo); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onServerConnected(ServerConnectedEvent event) { + ProxiedPlayer player = event.getPlayer(); + BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); + String from = playerInfo.getGameServer(); + String to = event.getServer().getInfo().getName(); + playerInfo.setGameServer(to); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.PlayerPostConnectServer.name(), + new BallPlayerPostConnectServer(playerInfo, from, to) + ); + BallBungeeCordUtils.uploadPlayerInfo(playerInfo); + } + + @EventHandler + public void onServerSwitch(ServerSwitchEvent event) { + } + + @EventHandler(priority = EventPriority.HIGH) + public void onServerDisconnect(ServerDisconnectEvent event) { + } + + @EventHandler(priority = EventPriority.HIGH) + public void onPlayerDisconnect(PlayerDisconnectEvent event) { + ProxiedPlayer player = event.getPlayer(); + BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, false); + BallAPI.getInstance().sendBallMessage( + BallAPI.BALL_CHANNEL, + BallActions.PlayerLogout.name(), + new BallPlayerLogout(playerInfo) + ); + BallBungeeCordUtils.uploadPlayerInfo(playerInfo); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onDispatchConsoleCommand(DispatchConsoleCommandEvent event) { + if (event.getServerType() != null && event.getServerType() != BallServerType.PROXY) { + return; + } + 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 onDispatchPlayerCommand(DispatchPlayerCommandEvent event) { + if (event.getServerType() != null && event.getServerType() != 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()); + } + } + + @EventHandler(priority = EventPriority.HIGH) + public void onKickPlayer(KickPlayerEvent event) { + ProxiedPlayer player = ProxyServer.getInstance().getPlayer(event.getUuid()); + BaseComponent[] components = BungeeComponentSerializer.get().serialize(event.getReason()); + player.disconnect(components); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onSendMessageToPlayer(SendMessageToPlayerEvent event) { + for (UUID receiver : event.getReceivers()) { + Audience audience = CoreAPI.getInstance().getAudienceProvider().player(receiver); + event.getMessage().show(audience); + } + } + + @EventHandler(priority = EventPriority.HIGH) + public void onSendPlayerToLocation(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.getSendPlayer()) { + ProxiedPlayer player = ProxyServer.getInstance().getPlayer(uuid); + if (player == null) { + continue; + } + if (player.getServer().getInfo().getName().equals(serverID)) { + continue; + } + player.connect(serverInfo); + } + } + + @EventHandler(priority = EventPriority.HIGH) + public void onSendPlayerToPlayer(SendPlayerToPlayerEvent event) { + UUID toPlayerUUID = event.getToPlayer(); + ProxiedPlayer toPlayer = ProxyServer.getInstance().getPlayer(toPlayerUUID); + if (toPlayer == null) { + HamsterBallPlugin.getInstance().getLogger().warning("试图传送玩家时失败: 目标玩家 " + toPlayerUUID + " 不在线"); + return; + } + ServerInfo toServer = toPlayer.getServer().getInfo(); + for (UUID uuid : event.getSendPlayer()) { + ProxiedPlayer sendPlayer = ProxyServer.getInstance().getPlayer(uuid); + if (sendPlayer.getServer().getInfo().getName().equals(toServer.getName())) { + continue; + } + sendPlayer.connect(toServer); + } + } +} diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/util/BallBungeeCordUtils.java similarity index 94% rename from ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java rename to ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/util/BallBungeeCordUtils.java index 9244d06..e1db2aa 100644 --- a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/util/BallBungeeCordUtils.java +++ b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/ball/bungee/util/BallBungeeCordUtils.java @@ -1,8 +1,9 @@ -package cn.hamster3.mc.plugin.core.bungee.util; +package cn.hamster3.mc.plugin.ball.bungee.util; 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.player.BallPlayerInfoUpdateEvent; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; +import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerInfoUpdate; import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import cn.hamster3.mc.plugin.core.lib.com.zaxxer.hikari.HikariConfig; import cn.hamster3.mc.plugin.core.lib.com.zaxxer.hikari.HikariDataSource; @@ -51,8 +52,8 @@ public final class BallBungeeCordUtils { } BallAPI.getInstance().sendBallMessage( BallAPI.BALL_CHANNEL, - BallPlayerInfoUpdateEvent.ACTION, - new BallPlayerInfoUpdateEvent(playerInfo) + BallActions.PlayerInfoUpdate.name(), + new BallPlayerInfoUpdate(playerInfo) ); }); } diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java deleted file mode 100644 index 1811139..0000000 --- a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/BallBungeeCordAPI.java +++ /dev/null @@ -1,75 +0,0 @@ -package cn.hamster3.mc.plugin.core.bungee.api; - -import cn.hamster3.mc.plugin.ball.common.api.BallAPI; -import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; -import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; -import cn.hamster3.mc.plugin.core.bungee.HamsterBallPlugin; -import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils; -import cn.hamster3.mc.plugin.core.bungee.util.CoreBungeeCordUtils; -import cn.hamster3.mc.plugin.core.common.api.CoreAPI; -import io.lettuce.core.RedisClient; -import net.md_5.bungee.config.Configuration; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import javax.sql.DataSource; -import java.sql.SQLException; -import java.util.Map; -import java.util.logging.Logger; - -public class BallBungeeCordAPI extends BallAPI { - public BallBungeeCordAPI(@NotNull BallServerInfo localServerInfo, @Nullable DataSource datasource, @NotNull RedisClient redisClient, boolean debug) { - super(localServerInfo, datasource, redisClient, debug); - } - - public static BallBungeeCordAPI getInstance() { - return (BallBungeeCordAPI) instance; - } - - public static void init() { - if (instance != null) { - return; - } - HamsterBallPlugin plugin = HamsterBallPlugin.getInstance(); - Configuration config = CoreBungeeCordUtils.getPluginConfig(plugin); - Map env = System.getenv(); - - BallServerInfo serverInfo = new BallServerInfo( - env.getOrDefault("BALL_LOCAL_SERVER_INFO_ID", config.getString("server-info.id")), - env.getOrDefault("BALL_LOCAL_SERVER_INFO_NAME", config.getString("server-info.name")), - BallServerType.PROXY, - env.getOrDefault("BALL_LOCAL_SERVER_IP", config.getString("server-info.host", "0.0.0.0")), - Integer.parseInt( - env.getOrDefault("BALL_LOCAL_SERVER_PORT", config.getString("server-info.port", "25577")) - ) - ); - - DataSource datasource; - if (config.contains("datasource")) { - plugin.getLogger().info("检测到配置文件中包含 datasource 节点,启用自定义数据库连接"); - datasource = BallBungeeCordUtils.getDataSource(config.getSection("datasource")); - } else { - plugin.getLogger().info("未检测到配置文件中的 datasource 节点,复用 HamsterCore 数据库连接"); - datasource = CoreAPI.getInstance().getDataSource(); - } - - RedisClient redisClient = RedisClient.create(config.getString("redis-url", "redis://localhost:6379?clientName=HamsterBall")); - - instance = new BallBungeeCordAPI(serverInfo, datasource, redisClient, config.getBoolean("debug", false)); - } - - @Override - public void enable() throws SQLException, InterruptedException { - super.enable(); - } - - @Override - public void disable() throws SQLException, InterruptedException { - super.disable(); - } - - @Override - public @NotNull Logger getLogger() { - return HamsterBallPlugin.getInstance().getLogger(); - } -} diff --git a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java b/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java deleted file mode 100644 index 35d1724..0000000 --- a/ball-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/listener/BallBungeeCordListener.java +++ /dev/null @@ -1,205 +0,0 @@ -package cn.hamster3.mc.plugin.core.bungee.listener; - -import cn.hamster3.mc.plugin.ball.common.api.BallAPI; -import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo; -import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; -import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; -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.listener.BallListener; -import cn.hamster3.mc.plugin.core.bungee.HamsterBallPlugin; -import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils; -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 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.*; -import net.md_5.bungee.api.plugin.Listener; -import net.md_5.bungee.event.EventHandler; -import net.md_5.bungee.event.EventPriority; -import org.jetbrains.annotations.NotNull; - -import java.util.UUID; - -public final class BallBungeeCordListener implements Listener, BallListener { - public static final BallBungeeCordListener INSTANCE = new BallBungeeCordListener(); - - private BallBungeeCordListener() { - } - - @Override - public void onMessageReceived(@NotNull BallMessageInfo info) { - switch (info.getAction()) { - case DispatchConsoleCommandEvent.ACTION: { - DispatchConsoleCommandEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), DispatchConsoleCommandEvent.class); - 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()); - break; - } - case DispatchPlayerCommandEvent.ACTION: { - DispatchPlayerCommandEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), DispatchPlayerCommandEvent.class); - 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()); - } - break; - } - case KickPlayerEvent.ACTION: { - KickPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), KickPlayerEvent.class); - ProxiedPlayer player = ProxyServer.getInstance().getPlayer(event.getUuid()); - BaseComponent[] components = BungeeComponentSerializer.get().serialize(event.getReason()); - player.disconnect(components); - break; - } - case SendMessageToPlayerEvent.ACTION: { - SendMessageToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), SendMessageToPlayerEvent.class); - for (UUID receiver : event.getReceivers()) { - Audience audience = CoreAPI.getInstance().getAudienceProvider().player(receiver); - event.getMessage().show(audience); - } - break; - } - case SendPlayerToLocationEvent.ACTION: { - SendPlayerToLocationEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), SendPlayerToLocationEvent.class); - String serverID = event.getLocation().getServerID(); - ServerInfo serverInfo = ProxyServer.getInstance().getServerInfo(serverID); - if (serverInfo == null) { - HamsterBallPlugin.getInstance().getLogger().warning("试图传送玩家时失败: 服务器 " + serverID + " 不在线"); - break; - } - 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); - } - break; - } - case SendPlayerToPlayerEvent.ACTION: { - SendPlayerToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), SendPlayerToPlayerEvent.class); - UUID toPlayerUUID = event.getToPlayerUUID(); - ProxiedPlayer toPlayer = ProxyServer.getInstance().getPlayer(toPlayerUUID); - if (toPlayer == null) { - HamsterBallPlugin.getInstance().getLogger().warning("试图传送玩家时失败: 目标玩家 " + toPlayerUUID + " 不在线"); - break; - } - 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); - } - } - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void onPreLogin(PreLoginEvent event) { - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerPreLoginEvent.ACTION, - new BallPlayerPreLoginEvent(event.getConnection().getName()) - ); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onLogin(LoginEvent event) { - if (event.isCancelled()) { - return; - } - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerLoginEvent.ACTION, - new BallPlayerLoginEvent(new BallPlayerInfo( - event.getConnection().getUniqueId(), - event.getConnection().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().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerPostLoginEvent.ACTION, - new BallPlayerPostLoginEvent(playerInfo) - ); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onServerConnect(ServerConnectEvent event) { - ProxiedPlayer player = event.getPlayer(); - BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); - playerInfo.setGameServer(event.getTarget().getName()); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerPreConnectServerEvent.ACTION, - new BallPlayerPreConnectServerEvent(playerInfo, playerInfo.getGameServer(), event.getTarget().getName()) - ); - BallBungeeCordUtils.uploadPlayerInfo(playerInfo); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onServerConnected(ServerConnectedEvent event) { - ProxiedPlayer player = event.getPlayer(); - BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true); - playerInfo.setGameServer(event.getServer().getInfo().getName()); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerPostConnectServerEvent.ACTION, - new BallPlayerPostConnectServerEvent(playerInfo) - ); - BallBungeeCordUtils.uploadPlayerInfo(playerInfo); - } - - @EventHandler - public void onServerSwitch(ServerSwitchEvent event) { - } - - @EventHandler(priority = EventPriority.HIGH) - public void onServerDisconnect(ServerDisconnectEvent event) { - } - - @EventHandler(priority = EventPriority.HIGH) - public void onPlayerDisconnect(PlayerDisconnectEvent event) { - ProxiedPlayer player = event.getPlayer(); - BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, false); - BallAPI.getInstance().sendBallMessage( - BallAPI.BALL_CHANNEL, - BallPlayerLogoutEvent.ACTION, - new BallPlayerLogoutEvent(playerInfo) - ); - BallBungeeCordUtils.uploadPlayerInfo(playerInfo); - } -} diff --git a/ball-bungeecord/src/main/resources/bungee.yml b/ball-bungeecord/src/main/resources/bungee.yml index 72be04a..c618590 100644 --- a/ball-bungeecord/src/main/resources/bungee.yml +++ b/ball-bungeecord/src/main/resources/bungee.yml @@ -1,5 +1,5 @@ name: HamsterBall -main: cn.hamster3.mc.plugin.core.bungee.HamsterBallPlugin +main: cn.hamster3.mc.plugin.ball.bungee.HamsterBallPlugin version: ${version} author: MiniDay 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 e35a81a..e571b64 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 @@ -1,23 +1,20 @@ package cn.hamster3.mc.plugin.ball.common.api; import cn.hamster3.mc.plugin.ball.common.data.BallLocation; -import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo; +import cn.hamster3.mc.plugin.ball.common.data.BallMessage; 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.entity.BallServerType; +import cn.hamster3.mc.plugin.ball.common.event.BallActions; import cn.hamster3.mc.plugin.ball.common.event.operate.*; -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.server.ServerOfflineEvent; -import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; -import cn.hamster3.mc.plugin.ball.common.listener.BallDebugListener; -import cn.hamster3.mc.plugin.ball.common.listener.BallListener; -import cn.hamster3.mc.plugin.ball.common.listener.BallMessageListener; -import cn.hamster3.mc.plugin.ball.common.listener.ListenerPriority; +import cn.hamster3.mc.plugin.ball.common.event.server.ServerOffline; +import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnline; +import cn.hamster3.mc.plugin.ball.common.listener.BallDebugLogListener; import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import cn.hamster3.mc.plugin.core.common.data.DisplayMessage; import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.text.Component; import io.lettuce.core.RedisClient; +import io.lettuce.core.pubsub.RedisPubSubListener; import io.lettuce.core.pubsub.StatefulRedisPubSubConnection; import lombok.Getter; import org.jetbrains.annotations.NotNull; @@ -45,111 +42,32 @@ public abstract class BallAPI { @NotNull protected final Map playerInfo; @NotNull + protected final StatefulRedisPubSubConnection pubConnection; + @NotNull + protected final StatefulRedisPubSubConnection subConnection; + @NotNull private final BallServerInfo localServerInfo; @Nullable private final DataSource datasource; @NotNull private final RedisClient redisClient; - @NotNull - private final StatefulRedisPubSubConnection pubSubConnection; - - @NotNull - private List listeners; - @Getter - private boolean enabled; public BallAPI(@NotNull BallServerInfo localServerInfo, @Nullable DataSource datasource, @NotNull RedisClient redisClient, boolean debug) { this.localServerInfo = localServerInfo; this.datasource = datasource; this.redisClient = redisClient; - pubSubConnection = redisClient.connectPubSub(BallMessageInfo.CODEC); + pubConnection = redisClient.connectPubSub(BallMessage.REDIS_CODEC); + subConnection = redisClient.connectPubSub(BallMessage.REDIS_CODEC); serverInfo = new ConcurrentHashMap<>(); playerInfo = new ConcurrentHashMap<>(); - listeners = new ArrayList<>(); - enabled = false; - initListener(debug); - } - - private void initListener(boolean debug) { - addListener(new BallListener() { - @Override - public ListenerPriority getPriority() { - return ListenerPriority.LOW; - } - - @Override - public void onBallPlayerConnectServer(@NotNull BallPlayerConnectServerEvent event) { - BallPlayerInfo info = event.getPlayerInfo(); - playerInfo.put(info.getUuid(), info); - } - - @Override - public void onBallPlayerInfoUpdate(@NotNull BallPlayerInfoUpdateEvent event) { - BallPlayerInfo info = event.getPlayerInfo(); - playerInfo.put(info.getUuid(), info); - } - - @Override - public void onServerOnline(@NotNull ServerOnlineEvent event) { - BallServerInfo info = event.getServerInfo(); - serverInfo.put(info.getId(), info); - switch (info.getType()) { - case GAME: { - playerInfo.forEach((uuid, playerInfo) -> { - if (playerInfo.getGameServer().equals(info.getId())) { - playerInfo.setOnline(false); - } - }); - break; - } - case PROXY: { - playerInfo.forEach((uuid, playerInfo) -> { - if (playerInfo.getProxyServer().equals(info.getId())) { - playerInfo.setOnline(false); - } - }); - break; - } - } - } - - @Override - public void onServerOffline(@NotNull ServerOfflineEvent event) { - String serverID = event.getServerID(); - BallServerInfo info = serverInfo.remove(serverID); - if (info == null) { - return; - } - switch (info.getType()) { - case GAME: { - playerInfo.forEach((uuid, playerInfo) -> { - if (playerInfo.getGameServer().equals(info.getId())) { - playerInfo.setOnline(false); - } - }); - break; - } - case PROXY: { - playerInfo.forEach((uuid, playerInfo) -> { - if (playerInfo.getProxyServer().equals(info.getId())) { - playerInfo.setOnline(false); - } - }); - break; - } - } - } - }); if (debug) { getLogger().warning("已启用调试模式"); - pubSubConnection.addListener(BallDebugListener.INSTANCE); + subConnection.addListener(BallDebugLogListener.INSTANCE); } + subConnection.addListener(new InnerListener()); } protected void enable() throws SQLException, InterruptedException { - if (enabled) { - return; - } BallServerInfo localInfo = getLocalServerInfo(); try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { @@ -199,6 +117,7 @@ public abstract class BallAPI { } } } + getLogger().info("已加载 " + serverInfo.size() + " 条服务器信息"); try (PreparedStatement statement = connection.prepareStatement( "SELECT * FROM `hamster_ball_player_info`;" )) { @@ -214,15 +133,15 @@ public abstract class BallAPI { } } } + getLogger().info("已加载 " + playerInfo.size() + " 条玩家信息"); } - RedisClient client = getRedisClient(); - pubSubConnection.addListener(BallMessageListener.INSTANCE); - pubSubConnection.async().subscribe("HamsterBall"); - enabled = true; + + subscribe(BALL_CHANNEL); + sendBallMessage(BALL_CHANNEL, new BallMessage(BallActions.ServerOnline.name(), new ServerOnline(getLocalServerInfo())), true); } protected void disable() throws SQLException, InterruptedException { - sendBallMessage(new BallMessageInfo(BALL_CHANNEL, ServerOfflineEvent.ACTION, new ServerOfflineEvent(getLocalServerId())), true); + sendBallMessage(BALL_CHANNEL, new BallMessage(BallActions.ServerOffline.name(), new ServerOffline(getLocalServerInfo())), true); try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { try (PreparedStatement statement = connection.prepareStatement( @@ -239,9 +158,9 @@ public abstract class BallAPI { statement.executeUpdate(); } } - getLogger().info("正在关闭 redission"); + getLogger().info("正在关闭 redis 客户端"); getRedisClient().close(); - getLogger().info("已关闭 redission"); + getLogger().info("已关闭 redis 客户端"); } /** @@ -279,14 +198,13 @@ public abstract class BallAPI { * @param message 消息 */ public void broadcastPlayerMessage(@NotNull DisplayMessage message) { - sendBallMessage(new BallMessageInfo( - BALL_CHANNEL, + sendBallMessage(BALL_CHANNEL, new BallMessage( getLocalServerId(), null, BallServerType.PROXY, - BroadcastPlayerMessageEvent.ACTION, + BallActions.BroadcastPlayerMessage.name(), CoreAPI.getInstance().getGson().toJsonTree( - new BroadcastPlayerMessageEvent(message) + new BroadcastPlayerMessage(message) ) )); } @@ -299,14 +217,13 @@ public abstract class BallAPI { * @param command 命令内容 */ public void dispatchConsoleCommand(@Nullable BallServerType type, @Nullable String serverID, @NotNull String command) { - sendBallMessage(new BallMessageInfo( - BALL_CHANNEL, + sendBallMessage(BALL_CHANNEL, new BallMessage( getLocalServerId(), null, BallServerType.GAME, - DispatchConsoleCommandEvent.ACTION, + BallActions.DispatchConsoleCommand.name(), CoreAPI.getInstance().getGson().toJsonTree( - new DispatchConsoleCommandEvent(type, serverID, command) + new DispatchConsoleCommand(type, serverID, command) ) )); } @@ -319,14 +236,13 @@ public abstract class BallAPI { * @param command 命令内容 */ public void dispatchPlayerCommand(@Nullable BallServerType type, @Nullable UUID uuid, @NotNull String command) { - sendBallMessage(new BallMessageInfo( - BALL_CHANNEL, + sendBallMessage(BALL_CHANNEL, new BallMessage( getLocalServerId(), null, BallServerType.GAME, - DispatchPlayerCommandEvent.ACTION, + BallActions.DispatchPlayerCommand.name(), CoreAPI.getInstance().getGson().toJsonTree( - new DispatchPlayerCommandEvent(type, uuid, command) + new DispatchPlayerCommand(type, uuid, command) ) )); } @@ -348,14 +264,13 @@ public abstract class BallAPI { * @param reason 原因 */ public void kickPlayer(@NotNull UUID uuid, @NotNull Component reason) { - sendBallMessage(new BallMessageInfo( - BALL_CHANNEL, + sendBallMessage(BALL_CHANNEL, new BallMessage( getLocalServerId(), null, BallServerType.PROXY, - KickPlayerEvent.ACTION, + BallActions.KickPlayer.name(), CoreAPI.getInstance().getGson().toJsonTree( - new KickPlayerEvent(uuid, reason) + new KickPlayer(uuid, reason) ) )); } @@ -386,14 +301,13 @@ public abstract class BallAPI { } return; } - sendBallMessage(new BallMessageInfo( - BALL_CHANNEL, + sendBallMessage(BALL_CHANNEL, new BallMessage( getLocalServerId(), null, BallServerType.PROXY, - SendMessageToPlayerEvent.ACTION, + BallActions.SendMessageToPlayer.name(), CoreAPI.getInstance().getGson().toJsonTree( - new SendMessageToPlayerEvent(Collections.singleton(receiver), message) + new SendMessageToPlayer(Collections.singleton(receiver), message) ) )); } @@ -425,14 +339,13 @@ public abstract class BallAPI { } } } - sendBallMessage(new BallMessageInfo( - BALL_CHANNEL, + sendBallMessage(BALL_CHANNEL, new BallMessage( getLocalServerId(), null, BallServerType.PROXY, - SendMessageToPlayerEvent.ACTION, + BallActions.SendMessageToPlayer.name(), CoreAPI.getInstance().getGson().toJsonTree( - new SendMessageToPlayerEvent(new HashSet<>(receivers), message) + new SendMessageToPlayer(new HashSet<>(receivers), message) ) )); } @@ -444,15 +357,15 @@ public abstract class BallAPI { *

* 则会先尝试将玩家连接至目标服务器再进行传送 * - * @param sendPlayerUUID 玩家的uuid - * @param location 坐标 - * @param doneMessage 传送完成后显示的消息 + * @param sendPlayer 玩家的uuid + * @param location 坐标 + * @param doneMessage 传送完成后显示的消息 */ - public void sendPlayerToLocation(@NotNull UUID sendPlayerUUID, @NotNull BallLocation location, @Nullable DisplayMessage doneMessage) { + public void sendPlayerToLocation(@NotNull UUID sendPlayer, @NotNull BallLocation location, @Nullable DisplayMessage doneMessage) { sendBallMessage( BALL_CHANNEL, - SendPlayerToLocationEvent.ACTION, - new SendPlayerToLocationEvent(Collections.singleton(sendPlayerUUID), location, doneMessage) + BallActions.SendPlayerToLocation.name(), + new SendPlayerToLocation(Collections.singleton(sendPlayer), location, doneMessage) ); } @@ -463,15 +376,15 @@ public abstract class BallAPI { *

* 则会先尝试将玩家连接至目标服务器再进行传送 * - * @param sendPlayerUUID 玩家的uuid - * @param location 坐标 - * @param doneMessage 传送完成后显示的消息 + * @param sendPlayer 玩家的uuid + * @param location 坐标 + * @param doneMessage 传送完成后显示的消息 */ - public void sendPlayerToLocation(@NotNull Collection sendPlayerUUID, @NotNull BallLocation location, @Nullable DisplayMessage doneMessage) { + public void sendPlayerToLocation(@NotNull Collection sendPlayer, @NotNull BallLocation location, @Nullable DisplayMessage doneMessage) { sendBallMessage( BALL_CHANNEL, - SendPlayerToLocationEvent.ACTION, - new SendPlayerToLocationEvent(new HashSet<>(sendPlayerUUID), location, doneMessage) + BallActions.SendPlayerToLocation.name(), + new SendPlayerToLocation(new HashSet<>(sendPlayer), location, doneMessage) ); } @@ -488,8 +401,8 @@ public abstract class BallAPI { public void sendPlayerToPlayer(@NotNull UUID sendPlayer, @NotNull UUID toPlayer, @Nullable DisplayMessage doneMessage, @Nullable DisplayMessage doneTargetMessage) { sendBallMessage( BALL_CHANNEL, - SendPlayerToPlayerEvent.ACTION, - new SendPlayerToPlayerEvent(Collections.singleton(sendPlayer), toPlayer, doneMessage, doneTargetMessage) + BallActions.SendPlayerToPlayer.name(), + new SendPlayerToPlayer(Collections.singleton(sendPlayer), toPlayer, doneMessage, doneTargetMessage) ); } @@ -498,16 +411,16 @@ public abstract class BallAPI { *

* 支持跨服传送 * - * @param sendPlayerUUID 被传送的玩家 + * @param sendPlayer 被传送的玩家 * @param toPlayer 传送的目标玩家 * @param doneMessage 传送完成后显示的消息,自动将 %player_name% 替换成传送目标玩家的名称 * @param doneTargetMessage 传送完成后目标玩家显示的消息,自动将 %player_name% 替换成被传送者的名称 */ - public void sendPlayerToPlayer(@NotNull Collection sendPlayerUUID, @NotNull UUID toPlayer, @Nullable DisplayMessage doneMessage, @Nullable DisplayMessage doneTargetMessage) { + public void sendPlayerToPlayer(@NotNull Collection sendPlayer, @NotNull UUID toPlayer, @Nullable DisplayMessage doneMessage, @Nullable DisplayMessage doneTargetMessage) { sendBallMessage( BALL_CHANNEL, - SendPlayerToPlayerEvent.ACTION, - new SendPlayerToPlayerEvent(new HashSet<>(sendPlayerUUID), toPlayer, doneMessage, doneTargetMessage) + BallActions.SendPlayerToPlayer.name(), + new SendPlayerToPlayer(new HashSet<>(sendPlayer), toPlayer, doneMessage, doneTargetMessage) ); } @@ -518,7 +431,7 @@ public abstract class BallAPI { * @param action 执行动作 */ public void sendBallMessage(@NotNull String channel, @NotNull String action) { - sendBallMessage(new BallMessageInfo(channel, action)); + sendBallMessage(channel, new BallMessage(action)); } /** @@ -529,53 +442,48 @@ public abstract class BallAPI { * @param content 附加参数 */ public void sendBallMessage(@NotNull String channel, @NotNull String action, @NotNull Object content) { - sendBallMessage(new BallMessageInfo(channel, action, content)); + sendBallMessage(channel, new BallMessage(action, content)); } /** * 发送自定义消息 * - * @param messageInfo 消息内容 + * @param channel 消息频道 + * @param message 消息内容 */ - public void sendBallMessage(@NotNull BallMessageInfo messageInfo) { - sendBallMessage(messageInfo, false); + public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message) { + sendBallMessage(channel, message, false); } /** * 自定义服务消息信息并发送 * - * @param messageInfo 消息内容 - * @param block 是否阻塞(设置为 true 则必须等待消息写入网络的操作完成后,该方法才会退出) + * @param channel 消息频道 + * @param message 消息内容 + * @param block 是否阻塞(设置为 true 则必须等待消息写入网络的操作完成后,该方法才会退出) */ - public void sendBallMessage(@NotNull BallMessageInfo messageInfo, boolean block) { - String string = CoreAPI.getInstance().getGson().toJson(messageInfo); - try (StatefulRedisPubSubConnection connection = getRedisClient().connectPubSub(BallMessageInfo.CODEC)) { - if (block) { - connection.sync().publish("HamsterBall", messageInfo); - } else { - connection.async().publish("HamsterBall", messageInfo); - } - } - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onMessageSend(messageInfo); - } catch (Exception | Error e) { - e.printStackTrace(); - } + public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message, boolean block) { + if (block) { + pubConnection.sync().publish(channel, message); + } else { + pubConnection.async().publish(channel, message); } } - public void addListener(@NotNull BallListener listener) { - ArrayList newListeners = new ArrayList<>(listeners); - newListeners.add(listener); - newListeners.sort(Comparator.comparing(BallListener::getPriority)); - listeners = newListeners; + public void subscribe(@NotNull String... channel) { + subConnection.sync().subscribe(channel); } - public void removeListener(@NotNull BallListener listener) { - ArrayList newListeners = new ArrayList<>(listeners); - newListeners.remove(listener); - listeners = newListeners; + public void subscribePatterns(@NotNull String patterns) { + subConnection.sync().psubscribe(patterns); + } + + public void unsubscribe(@NotNull String... channel) { + subConnection.sync().unsubscribe(channel); + } + + public void unsubscribePatterns(@NotNull String patterns) { + subConnection.sync().punsubscribe(patterns); } /** @@ -715,10 +623,7 @@ public abstract class BallAPI { return playerInfo; } - @NotNull - public List getListeners() { - return listeners; - } + protected abstract void onMessage(String channel, BallMessage message); @NotNull public abstract Logger getLogger(); @@ -732,4 +637,36 @@ public abstract class BallAPI { public RedisClient getRedisClient() { return redisClient; } + + private class InnerListener implements RedisPubSubListener { + @Override + public void message(String channel, BallMessage message) { + onMessage(channel, message); + } + + @Override + public void message(String pattern, String channel, BallMessage message) { + + } + + @Override + public void subscribed(String channel, long count) { + + } + + @Override + public void psubscribed(String pattern, long count) { + + } + + @Override + public void unsubscribed(String channel, long count) { + + } + + @Override + public void punsubscribed(String pattern, long count) { + + } + } } diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/config/BallConfig.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/config/BallConfig.java deleted file mode 100644 index c6e08bc..0000000 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/config/BallConfig.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.hamster3.mc.plugin.ball.common.config; - -import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; -import lombok.AllArgsConstructor; -import lombok.Data; -import org.jetbrains.annotations.NotNull; - -@Data -@AllArgsConstructor -public class BallConfig { - @NotNull - private BallServerInfo localInfo; - @NotNull - private String host; - private int port; - private int eventLoopThread; -} diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessageInfo.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessage.java similarity index 83% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessageInfo.java rename to ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessage.java index 7d9b7ee..eee92f0 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessageInfo.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/data/BallMessage.java @@ -20,22 +20,22 @@ import java.util.UUID; /** * 服务消息 */ -@Data @SuppressWarnings("unused") -public class BallMessageInfo { +@Data +public class BallMessage { /** * 编解码器 */ - public static final RedisCodec CODEC = new RedisCodec() { + public static final RedisCodec REDIS_CODEC = new RedisCodec() { @Override public String decodeKey(ByteBuffer bytes) { return StringCodec.UTF8.decodeKey(bytes); } @Override - public BallMessageInfo decodeValue(ByteBuffer bytes) { + public BallMessage decodeValue(ByteBuffer bytes) { String string = StringCodec.UTF8.decodeValue(bytes); - return CoreAPI.getInstance().getGson().fromJson(string, BallMessageInfo.class); + return CoreAPI.getInstance().getGson().fromJson(string, BallMessage.class); } @Override @@ -44,7 +44,7 @@ public class BallMessageInfo { } @Override - public ByteBuffer encodeValue(BallMessageInfo value) { + public ByteBuffer encodeValue(BallMessage value) { return StringCodec.UTF8.encodeValue(CoreAPI.getInstance().getGson().toJson(value)); } }; @@ -71,11 +71,6 @@ public class BallMessageInfo { */ @Nullable private BallServerType receiverType; - /** - * 消息的频道 - */ - @NotNull - private String channel; /** * 消息动作 *

@@ -90,22 +85,19 @@ public class BallMessageInfo { */ private JsonElement content; - public BallMessageInfo(@NotNull String channel, @NotNull String action) { + public BallMessage(@NotNull String action) { senderID = BallAPI.getInstance().getLocalServerId(); - this.channel = channel; this.action = action; } - public BallMessageInfo(@NotNull String channel, @NotNull String action, @NotNull Object content) { - this.channel = channel; + public BallMessage(@NotNull String action, @NotNull Object content) { senderID = BallAPI.getInstance().getLocalServerId(); this.action = action; this.content = CoreAPI.getInstance().getGson().toJsonTree(content); } - public BallMessageInfo(@NotNull String channel, @NotNull String senderID, @Nullable String receiverID, - @Nullable BallServerType receiverType, @NotNull String action, @Nullable JsonElement content) { - this.channel = channel; + public BallMessage(@NotNull String senderID, @Nullable String receiverID, + @Nullable BallServerType receiverType, @NotNull String action, @Nullable JsonElement content) { this.senderID = senderID; this.receiverID = receiverID; this.receiverType = receiverType; @@ -121,7 +113,6 @@ public class BallMessageInfo { @NotNull public JsonObject toJson() { JsonObject object = new JsonObject(); - object.addProperty("channel", channel); object.addProperty("senderID", senderID); if (receiverID != null) { object.addProperty("toServer", receiverID); diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/BallActions.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/BallActions.java new file mode 100644 index 0000000..8c0c58d --- /dev/null +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/BallActions.java @@ -0,0 +1,26 @@ +package cn.hamster3.mc.plugin.ball.common.event; + +public enum BallActions { + // Operate + BroadcastPlayerMessage, + DispatchConsoleCommand, + DispatchPlayerCommand, + KickPlayer, + SendMessageToPlayer, + SendPlayerToLocation, + SendPlayerToPlayer, + + // Player + PlayerInfoUpdate, + PlayerPreLogin, + PlayerLogin, + PlayerPostLogin, + PlayerPreConnectServer, + PlayerConnectServer, + PlayerPostConnectServer, + PlayerLogout, + + // Server + ServerOffline, + ServerOnline +} diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/BroadcastPlayerMessageEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/BroadcastPlayerMessage.java similarity index 72% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/BroadcastPlayerMessageEvent.java rename to ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/BroadcastPlayerMessage.java index 6342330..1ef1f64 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/BroadcastPlayerMessageEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/BroadcastPlayerMessage.java @@ -7,10 +7,7 @@ import org.jetbrains.annotations.NotNull; @Data @AllArgsConstructor -public class BroadcastPlayerMessageEvent { - public static final String ACTION = "BroadcastPlayerMessage"; - +public class BroadcastPlayerMessage { @NotNull private final DisplayMessage message; - -} +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchConsoleCommandEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchConsoleCommand.java similarity index 72% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchConsoleCommandEvent.java rename to ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchConsoleCommand.java index a27e40e..a1900a8 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchConsoleCommandEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchConsoleCommand.java @@ -8,13 +8,11 @@ import org.jetbrains.annotations.Nullable; @Data @AllArgsConstructor -public class DispatchConsoleCommandEvent { - public static final String ACTION = "DispatchConsoleCommand"; - +public class DispatchConsoleCommand { @Nullable - private final BallServerType type; + private final BallServerType serverType; @Nullable private final String serverID; @NotNull private final String command; -} +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchPlayerCommandEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchPlayerCommand.java similarity index 73% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchPlayerCommandEvent.java rename to ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchPlayerCommand.java index e13018b..7c90528 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchPlayerCommandEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/DispatchPlayerCommand.java @@ -10,13 +10,11 @@ import java.util.UUID; @Data @AllArgsConstructor -public class DispatchPlayerCommandEvent { - public static final String ACTION = "DispatchPlayerCommand"; - +public class DispatchPlayerCommand { @Nullable - private final BallServerType type; + private final BallServerType serverType; @Nullable private final UUID uuid; @NotNull private final String command; -} +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/KickPlayerEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/KickPlayer.java similarity index 80% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/KickPlayerEvent.java rename to ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/KickPlayer.java index 64bee96..510be3c 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/KickPlayerEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/KickPlayer.java @@ -9,12 +9,9 @@ import java.util.UUID; @Data @AllArgsConstructor -public class KickPlayerEvent { - public static final String ACTION = "KickPlayer"; - +public class KickPlayer { @NotNull private final UUID uuid; @NotNull private final Component reason; - -} +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendMessageToPlayerEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendMessageToPlayer.java similarity index 78% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendMessageToPlayerEvent.java rename to ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendMessageToPlayer.java index 23c48f3..e29e535 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendMessageToPlayerEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendMessageToPlayer.java @@ -10,11 +10,9 @@ import java.util.UUID; @Data @AllArgsConstructor -public class SendMessageToPlayerEvent { - public static final String ACTION = "SendMessageToPlayer"; - +public class SendMessageToPlayer { @NotNull private final Set receivers; @NotNull private final DisplayMessage message; -} +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToLocationEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToLocation.java similarity index 77% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToLocationEvent.java rename to ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToLocation.java index d4519eb..8d2458c 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToLocationEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToLocation.java @@ -12,14 +12,11 @@ import java.util.UUID; @Data @AllArgsConstructor -public class SendPlayerToLocationEvent { - public static final String ACTION = "SendPlayerToLocation"; - +public class SendPlayerToLocation { @NotNull - private final Set sendPlayerUUID; + private final Set sendPlayer; @NotNull private final BallLocation location; @Nullable private final DisplayMessage doneMessage; - -} +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToPlayerEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToPlayer.java similarity index 72% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToPlayerEvent.java rename to ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToPlayer.java index 3af5576..b5fef17 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToPlayerEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/operate/SendPlayerToPlayer.java @@ -11,16 +11,13 @@ import java.util.UUID; @Data @AllArgsConstructor -public class SendPlayerToPlayerEvent { - public static final String ACTION = "SendPlayerToPlayer"; - +public class SendPlayerToPlayer { @NotNull - private final Set sendPlayerUUID; + private final Set sendPlayer; @NotNull - private final UUID toPlayerUUID; + private final UUID toPlayer; @Nullable private final DisplayMessage doneMessage; @Nullable private final DisplayMessage doneTargetMessage; - -} +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerConnectServer.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerConnectServer.java new file mode 100644 index 0000000..807c42a --- /dev/null +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerConnectServer.java @@ -0,0 +1,27 @@ +package cn.hamster3.mc.plugin.ball.common.event.player; + +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * 玩家进入子服 + *

+ * 仅在使用 velocity 代理端时才会触发这个事件 + * + * @see BallPlayerPreConnectServer 玩家准备进入子服 + * @see BallPlayerConnectServer 玩家进入子服 + * @see BallPlayerPostConnectServer 玩家已经进入子服 + */ +@Data +@AllArgsConstructor +public class BallPlayerConnectServer { + @NotNull + private final BallPlayerInfo playerInfo; + @Nullable + private final String from; + @NotNull + private final String to; +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerInfoUpdateEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerInfoUpdate.java similarity index 75% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerInfoUpdateEvent.java rename to ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerInfoUpdate.java index 5df3559..42a76bb 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerInfoUpdateEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerInfoUpdate.java @@ -10,9 +10,7 @@ import org.jetbrains.annotations.NotNull; */ @Data @AllArgsConstructor -public class BallPlayerInfoUpdateEvent { - public static final String ACTION = "PlayerInfoUpdateEvent"; - +public class BallPlayerInfoUpdate { @NotNull private final BallPlayerInfo playerInfo; -} +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLoginEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLogin.java similarity index 78% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLoginEvent.java rename to ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLogin.java index 8605061..e69a58b 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLoginEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLogin.java @@ -10,10 +10,7 @@ import org.jetbrains.annotations.NotNull; */ @Data @AllArgsConstructor -public class BallPlayerLoginEvent { - public static final String ACTION = "PlayerLogin"; - +public class BallPlayerLogin { @NotNull private final BallPlayerInfo playerInfo; - -} +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLogoutEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLogout.java similarity index 78% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLogoutEvent.java rename to ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLogout.java index fdca0b3..ba521e6 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLogoutEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerLogout.java @@ -10,9 +10,7 @@ import org.jetbrains.annotations.NotNull; */ @Data @AllArgsConstructor -public class BallPlayerLogoutEvent { - public static final String ACTION = "PlayerLogout"; - +public class BallPlayerLogout { @NotNull private BallPlayerInfo playerInfo; -} +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostConnectServer.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostConnectServer.java new file mode 100644 index 0000000..370c127 --- /dev/null +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostConnectServer.java @@ -0,0 +1,24 @@ +package cn.hamster3.mc.plugin.ball.common.event.player; + +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.jetbrains.annotations.NotNull; + +/** + * 玩家已经进入子服 + * + * @see BallPlayerPreConnectServer 玩家准备进入子服 + * @see BallPlayerConnectServer 玩家进入子服 + * @see BallPlayerPostConnectServer 玩家已经进入子服 + */ +@Data +@AllArgsConstructor +public class BallPlayerPostConnectServer { + @NotNull + private final BallPlayerInfo playerInfo; + @NotNull + private final String from; + @NotNull + private final String to; +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostLoginEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostLogin.java similarity index 77% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostLoginEvent.java rename to ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostLogin.java index 299fa50..e017f9d 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostLoginEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPostLogin.java @@ -10,9 +10,7 @@ import org.jetbrains.annotations.NotNull; */ @Data @AllArgsConstructor -public class BallPlayerPostLoginEvent { - public static final String ACTION = "PlayerPostLogin"; - +public class BallPlayerPostLogin { @NotNull private final BallPlayerInfo playerInfo; -} +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreConnectServer.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreConnectServer.java new file mode 100644 index 0000000..f5ee4e0 --- /dev/null +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreConnectServer.java @@ -0,0 +1,25 @@ +package cn.hamster3.mc.plugin.ball.common.event.player; + +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * 玩家准备进入子服 + * + * @see BallPlayerPreConnectServer 玩家准备进入子服 + * @see BallPlayerConnectServer 玩家进入子服 + * @see BallPlayerPostConnectServer 玩家已经进入子服 + */ +@Data +@AllArgsConstructor +public class BallPlayerPreConnectServer { + @NotNull + private final BallPlayerInfo playerInfo; + @Nullable + private final String from; + @NotNull + private final String to; +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreLoginEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreLogin.java similarity index 73% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreLoginEvent.java rename to ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreLogin.java index 23ce371..4bc0458 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreLoginEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/player/BallPlayerPreLogin.java @@ -9,9 +9,7 @@ import org.jetbrains.annotations.NotNull; */ @Data @AllArgsConstructor -public class BallPlayerPreLoginEvent { - public static final String ACTION = "PlayerPreLogin"; - +public class BallPlayerPreLogin { @NotNull private final String playerName; -} +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOffline.java similarity index 61% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java rename to ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOffline.java index 2109925..a75957d 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOfflineEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOffline.java @@ -1,5 +1,6 @@ package cn.hamster3.mc.plugin.ball.common.event.server; +import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; import lombok.AllArgsConstructor; import lombok.Data; import org.jetbrains.annotations.NotNull; @@ -9,9 +10,7 @@ import org.jetbrains.annotations.NotNull; */ @Data @AllArgsConstructor -public class ServerOfflineEvent { - public static final String ACTION = "ServerOffline"; - +public class ServerOffline { @NotNull - private final String serverID; -} + private final BallServerInfo serverInfo; +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOnlineEvent.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOnline.java similarity index 77% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOnlineEvent.java rename to ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOnline.java index 1fc203e..896eb16 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOnlineEvent.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/event/server/ServerOnline.java @@ -10,10 +10,7 @@ import org.jetbrains.annotations.NotNull; */ @Data @AllArgsConstructor -public class ServerOnlineEvent { - public static final String ACTION = "ServerOnline"; - +public class ServerOnline { @NotNull private final BallServerInfo serverInfo; - -} +} \ No newline at end of file diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugLogListener.java similarity index 60% rename from ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java rename to ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugLogListener.java index de77072..843b35c 100644 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugListener.java +++ b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallDebugLogListener.java @@ -1,34 +1,33 @@ 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.BallMessageInfo; +import cn.hamster3.mc.plugin.ball.common.data.BallMessage; import io.lettuce.core.pubsub.RedisPubSubListener; -public class BallDebugListener implements RedisPubSubListener { - public static final BallDebugListener INSTANCE = new BallDebugListener(); +public class BallDebugLogListener implements RedisPubSubListener { + public static final BallDebugLogListener INSTANCE = new BallDebugLogListener(); - private BallDebugListener() { + private BallDebugLogListener() { } @Override - public void message(String channel, BallMessageInfo event) { - BallAPI.getInstance().getLogger().info("从 " + channel + " 收到了一条消息: " + event); + public void message(String channel, BallMessage message) { + BallAPI.getInstance().getLogger().info("从 " + channel + " 收到了一条消息: " + message); } @Override - public void message(String pattern, String channel, BallMessageInfo event) { - BallAPI.getInstance().getLogger().info("从 " + pattern + "(" + channel + ") 收到了一条消息: " + event); + public void message(String pattern, String channel, BallMessage message) { + BallAPI.getInstance().getLogger().info("从 " + channel + "(" + pattern + ") 收到了一条消息: " + message); } @Override public void subscribed(String channel, long count) { BallAPI.getInstance().getLogger().info("已订阅 redis 频道: " + channel); - } @Override public void psubscribed(String pattern, long count) { - BallAPI.getInstance().getLogger().info("已取消订阅 redis 频道(正则): " + pattern); + BallAPI.getInstance().getLogger().info("已订阅 redis 频道(正则): " + pattern); } @Override diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallListener.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallListener.java deleted file mode 100644 index a360f1e..0000000 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.hamster3.mc.plugin.ball.common.listener; - -import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo; -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 org.jetbrains.annotations.NotNull; - -public interface BallListener { - /** - * 该监听器的执行优先级 - * - * @return 优先级 - */ - default ListenerPriority getPriority() { - return ListenerPriority.NORMAL; - } - - default void onMessageReceived(@NotNull BallMessageInfo event) { - } - - default void onMessageSend(@NotNull BallMessageInfo event) { - } - - default void onBallPlayerPreLogin(@NotNull BallPlayerPreLoginEvent event) { - } - - default void onBallPlayerLogin(@NotNull BallPlayerLoginEvent event) { - } - - default void onBallPlayerPostLogin(@NotNull BallPlayerPostLoginEvent event) { - } - - default void onBallPlayerPreConnectServer(@NotNull BallPlayerPreConnectServerEvent event) { - } - - default void onBallPlayerConnectServer(@NotNull BallPlayerConnectServerEvent event) { - } - - default void onBallPlayerPostConnectServer(@NotNull BallPlayerPostConnectServerEvent event) { - } - - default void onBallPlayerLogout(@NotNull BallPlayerLogoutEvent event) { - } - - default void onBallPlayerInfoUpdate(@NotNull BallPlayerInfoUpdateEvent event) { - } - - default void onServerOnline(@NotNull ServerOnlineEvent event) { - } - - default void onServerOffline(@NotNull ServerOfflineEvent event) { - } - -} diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallMessageListener.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallMessageListener.java deleted file mode 100644 index 6b0451e..0000000 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/BallMessageListener.java +++ /dev/null @@ -1,167 +0,0 @@ -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.BallMessageInfo; -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 io.lettuce.core.pubsub.RedisPubSubListener; - -public class BallMessageListener implements RedisPubSubListener { - public static final BallMessageListener INSTANCE = new BallMessageListener(); - - private BallMessageListener() { - } - - @Override - public void message(String channel, BallMessageInfo info) { - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onMessageReceived(info); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - if (!BallAPI.BALL_CHANNEL.equals(info.getChannel())) { - return; - } - switch (info.getAction()) { - case BallPlayerPreLoginEvent.ACTION: { - BallPlayerPreLoginEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerPreLoginEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerPreLogin(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerLoginEvent.ACTION: { - BallPlayerLoginEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerLoginEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerLogin(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerPostLoginEvent.ACTION: { - BallPlayerPostLoginEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerPostLoginEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerPostLogin(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerPreConnectServerEvent.ACTION: { - BallPlayerPreConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerPreConnectServerEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerPreConnectServer(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerConnectServerEvent.ACTION: { - BallPlayerConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerConnectServerEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerConnectServer(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerPostConnectServerEvent.ACTION: { - BallPlayerPostConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerPostConnectServerEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerPostConnectServer(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerLogoutEvent.ACTION: { - BallPlayerLogoutEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerLogoutEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerLogout(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case BallPlayerInfoUpdateEvent.ACTION: { - BallPlayerInfoUpdateEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerInfoUpdateEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onBallPlayerInfoUpdate(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case ServerOfflineEvent.ACTION: { - ServerOfflineEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), ServerOfflineEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onServerOffline(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - case ServerOnlineEvent.ACTION: { - ServerOnlineEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), ServerOnlineEvent.class); - for (BallListener listener : BallAPI.getInstance().getListeners()) { - try { - listener.onServerOnline(event); - } catch (Exception | Error e) { - e.printStackTrace(); - } - } - break; - } - } - } - - @Override - public void message(String pattern, String channel, BallMessageInfo info) { - message(channel, info); - } - - @Override - public void subscribed(String channel, long count) { - - } - - @Override - public void psubscribed(String pattern, long count) { - - } - - @Override - public void unsubscribed(String channel, long count) { - - } - - @Override - public void punsubscribed(String pattern, long count) { - - } -} diff --git a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/ListenerPriority.java b/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/ListenerPriority.java deleted file mode 100644 index c589478..0000000 --- a/ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/listener/ListenerPriority.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.hamster3.mc.plugin.ball.common.listener; - -@SuppressWarnings("unused") -public enum ListenerPriority { - - /** - * Event call is of very low importance and should be run first, to allow - * other plugins to further customise the outcome - */ - LOWEST(0), - /** - * Event call is of low importance - */ - LOW(1), - /** - * Event call is neither important nor unimportant, and may be run - * normally - */ - NORMAL(2), - /** - * Event call is of high importance - */ - HIGH(3), - /** - * Event call is critical and must have the final say in what happens - * to the event - */ - HIGHEST(4), - /** - * Event is listened to purely for monitoring the outcome of an event. - *

- * No modifications to the event should be made under this priority - */ - MONITOR(5); - - private final int slot; - - ListenerPriority(int slot) { - this.slot = slot; - } - - public int getSlot() { - return slot; - } -}