diff --git a/hamster-ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/BallBukkitListener.java b/hamster-ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/BallBukkitListener.java index 92af5c0..492a732 100644 --- a/hamster-ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/BallBukkitListener.java +++ b/hamster-ball-bukkit/src/main/java/cn/hamster3/mc/plugin/ball/bukkit/listener/BallBukkitListener.java @@ -12,14 +12,17 @@ import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import cn.hamster3.mc.plugin.core.common.data.DisplayMessage; import cn.hamster3.mc.plugin.core.common.util.CoreUtils; import cn.hamster3.mc.plugin.core.common.util.Pair; +import lombok.AllArgsConstructor; +import lombok.Data; import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.TextReplacementConfig; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.jetbrains.annotations.NotNull; @@ -30,6 +33,7 @@ public class BallBukkitListener implements Listener, BallListener { public static final BallBukkitListener INSTANCE = new BallBukkitListener(); private final HashMap> playerToLocation = new HashMap<>(); + private final HashMap playerToPlayer = new HashMap<>(); private BallBukkitListener() { } @@ -107,17 +111,33 @@ public class BallBukkitListener implements Listener, BallListener { } Location location = toPlayer.getLocation(); for (UUID uuid : event.getSendPlayerUUID()) { - Player player = Bukkit.getPlayer(uuid); - if (player != null) { + Player sendPlayer = Bukkit.getPlayer(uuid); + if (sendPlayer != null) { HamsterBallPlugin.sync(() -> { - player.teleport(location); + sendPlayer.teleport(location); if (event.getDoneMessage() != null) { - Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(player); - event.getDoneMessage().show(audience); + 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 { - playerToLocation.put(uuid, new Pair<>(location, event.getDoneMessage())); + ToPlayerData data = new ToPlayerData( + toPlayer.getUniqueId(), + toPlayer.getLocation(), + event.getDoneMessage(), + event.getDoneTargetMessage() + ); + playerToPlayer.put(uuid, data); } } break; @@ -126,19 +146,43 @@ public class BallBukkitListener implements Listener, BallListener { } @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) - public void onPlayerLogin(PlayerLoginEvent event) { + public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); - Pair pair = playerToLocation.remove(player.getUniqueId()); - if (pair == null) { - return; - } - HamsterBallPlugin.sync(() -> { + UUID uuid = player.getUniqueId(); + Pair pair = playerToLocation.remove(uuid); + if (pair != null) { player.teleport(pair.getKey(), PlayerTeleportEvent.TeleportCause.PLUGIN); if (pair.getValue() != null) { Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(player); pair.getValue().show(audience); } - }); + } + ToPlayerData toPlayerData = playerToPlayer.remove(uuid); + if (toPlayerData != null) { + player.teleport(toPlayerData.location); + if (toPlayerData.doneMessage != null) { + Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(player); + toPlayerData.doneMessage.show(audience, TextReplacementConfig.builder() + .matchLiteral("%player_name%") + .replacement(BallAPI.getInstance().getPlayerName(toPlayerData.toPlayerUUID, "")) + .build()); + } + if (toPlayerData.doneTargetMessage != null) { + Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().player(toPlayerData.toPlayerUUID); + toPlayerData.doneTargetMessage.show(audience, TextReplacementConfig.builder() + .matchLiteral("%player_name%") + .replacement(player.getName()) + .build()); + } + } } + @Data + @AllArgsConstructor + private static class ToPlayerData { + private UUID toPlayerUUID; + private Location location; + private DisplayMessage doneMessage; + private DisplayMessage doneTargetMessage; + } } diff --git a/hamster-ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java b/hamster-ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java index 6a0db5f..eec082f 100644 --- a/hamster-ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java +++ b/hamster-ball-common/src/main/java/cn/hamster3/mc/plugin/ball/common/api/BallAPI.java @@ -563,8 +563,10 @@ public abstract class BallAPI { *

* 支持跨服传送 * - * @param sendPlayer 被传送的玩家 - * @param toPlayer 传送的目标玩家 + * @param sendPlayer 被传送的玩家 + * @param toPlayer 传送的目标玩家 + * @param doneMessage 传送完成后显示的消息,自动将 %player_name% 替换成传送目标玩家的名称 + * @param doneTargetMessage 传送完成后目标玩家显示的消息,自动将 %player_name% 替换成被传送者的名称 */ public void sendPlayerToPlayer(@NotNull UUID sendPlayer, @NotNull UUID toPlayer, @Nullable DisplayMessage doneMessage, @Nullable DisplayMessage doneTargetMessage) { sendBallMessage( @@ -579,9 +581,10 @@ public abstract class BallAPI { *

* 支持跨服传送 * - * @param sendPlayerUUID 被传送的玩家 - * @param toPlayer 传送的目标玩家 - * @param doneMessage 传送完成后显示的消息 + * @param sendPlayerUUID 被传送的玩家 + * @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) { sendBallMessage(