From fe243c9214486bf4698d86895a8ab9a7c6af7ff2 Mon Sep 17 00:00:00 2001 From: CarmJos Date: Fri, 17 Dec 2021 10:37:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90TPA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cc/carm/plugin/moeteleport/Main.java | 3 + .../HomeNameCompleter.java | 2 +- .../PlayerNameCompleter.java | 2 +- .../TpRequestCompleter.java | 4 +- .../command/tpa/TpAcceptCommand.java | 29 +++++ .../command/tpa/TpDenyCommand.java | 29 +++++ .../moeteleport/command/tpa/TpaCommand.java | 12 +- .../command/tpa/TpaHereCommand.java | 12 +- .../configuration/PluginMessages.java | 2 + .../moeteleport/manager/RequestManager.java | 120 ++++++++---------- .../moeteleport/model/TeleportRequest.java | 30 +++-- .../plugin/moeteleport/model/UserData.java | 9 +- src/main/resources/messages.yml | 3 + 13 files changed, 174 insertions(+), 83 deletions(-) rename src/main/java/cc/carm/plugin/moeteleport/command/{home => completer}/HomeNameCompleter.java (94%) rename src/main/java/cc/carm/plugin/moeteleport/command/{tpa => completer}/PlayerNameCompleter.java (95%) rename src/main/java/cc/carm/plugin/moeteleport/command/{tpa => completer}/TpRequestCompleter.java (93%) diff --git a/src/main/java/cc/carm/plugin/moeteleport/Main.java b/src/main/java/cc/carm/plugin/moeteleport/Main.java index fa0dc73..3f20828 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/Main.java +++ b/src/main/java/cc/carm/plugin/moeteleport/Main.java @@ -1,6 +1,9 @@ package cc.carm.plugin.moeteleport; import cc.carm.plugin.moeteleport.command.BackCommand; +import cc.carm.plugin.moeteleport.command.completer.HomeNameCompleter; +import cc.carm.plugin.moeteleport.command.completer.PlayerNameCompleter; +import cc.carm.plugin.moeteleport.command.completer.TpRequestCompleter; import cc.carm.plugin.moeteleport.command.home.*; import cc.carm.plugin.moeteleport.command.tpa.*; import cc.carm.plugin.moeteleport.listener.UserListener; diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeNameCompleter.java b/src/main/java/cc/carm/plugin/moeteleport/command/completer/HomeNameCompleter.java similarity index 94% rename from src/main/java/cc/carm/plugin/moeteleport/command/home/HomeNameCompleter.java rename to src/main/java/cc/carm/plugin/moeteleport/command/completer/HomeNameCompleter.java index 354ab18..ea2fe7b 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeNameCompleter.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/completer/HomeNameCompleter.java @@ -1,4 +1,4 @@ -package cc.carm.plugin.moeteleport.command.home; +package cc.carm.plugin.moeteleport.command.completer; import cc.carm.plugin.moeteleport.Main; import com.google.common.collect.ImmutableList; diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/PlayerNameCompleter.java b/src/main/java/cc/carm/plugin/moeteleport/command/completer/PlayerNameCompleter.java similarity index 95% rename from src/main/java/cc/carm/plugin/moeteleport/command/tpa/PlayerNameCompleter.java rename to src/main/java/cc/carm/plugin/moeteleport/command/completer/PlayerNameCompleter.java index 4e39e04..d7c7514 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/PlayerNameCompleter.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/completer/PlayerNameCompleter.java @@ -1,4 +1,4 @@ -package cc.carm.plugin.moeteleport.command.tpa; +package cc.carm.plugin.moeteleport.command.completer; import com.google.common.collect.ImmutableList; import org.bukkit.Bukkit; diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpRequestCompleter.java b/src/main/java/cc/carm/plugin/moeteleport/command/completer/TpRequestCompleter.java similarity index 93% rename from src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpRequestCompleter.java rename to src/main/java/cc/carm/plugin/moeteleport/command/completer/TpRequestCompleter.java index 0b88ad3..4853ae0 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpRequestCompleter.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/completer/TpRequestCompleter.java @@ -1,4 +1,4 @@ -package cc.carm.plugin.moeteleport.command.tpa; +package cc.carm.plugin.moeteleport.command.completer; import cc.carm.plugin.moeteleport.Main; import cc.carm.plugin.moeteleport.model.UserData; @@ -40,7 +40,7 @@ public class TpRequestCompleter implements TabCompleter { if (!(sender instanceof Player)) return ImmutableList.of(); if (args.length >= 1 && indexes.contains(args.length)) { UserData data = Main.getUserManager().getData((Player) sender); - return data.getReceivedRequests().stream() + return data.getReceivedRequests().keySet().stream() .map(Bukkit::getPlayer).filter(Objects::nonNull).map(HumanEntity::getName) .filter(s -> StringUtil.startsWithIgnoreCase(s, args[args.length - 1])) .limit(10).collect(Collectors.toList()); diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpAcceptCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpAcceptCommand.java index 0d9eb80..1b5327d 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpAcceptCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpAcceptCommand.java @@ -1,17 +1,46 @@ package cc.carm.plugin.moeteleport.command.tpa; +import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.configuration.PluginMessages; +import cc.carm.plugin.moeteleport.model.TeleportRequest; +import cc.carm.plugin.moeteleport.model.UserData; +import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import java.util.Comparator; + public class TpAcceptCommand implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { if (!(sender instanceof Player)) return false; Player player = (Player) sender; + UserData data = Main.getUserManager().getData(player); + if (data.getReceivedRequests().isEmpty()) { + PluginMessages.Request.NOT_FOUND.sendWithPlaceholders(player); + return true; + } + String targetName = args.length > 0 ? args[0] : null; + if (targetName != null) { + Player target = Bukkit.getPlayer(targetName); + if (target == null || !data.getReceivedRequests().containsKey(target.getUniqueId())) { + PluginMessages.Request.NOT_FOUND_PLAYER.sendWithPlaceholders(player, + new String[]{"%(player)"}, + new Object[]{target == null ? targetName : target.getName()} + ); + } else { + TeleportRequest request = data.getReceivedRequests().get(target.getUniqueId()); + Main.getRequestManager().acceptRequest(request); // 交给Manager处理 + } + } else { + data.getReceivedRequests().values().stream() + .min(Comparator.comparingLong(TeleportRequest::getActiveTime)) + .ifPresent(request -> Main.getRequestManager().acceptRequest(request)); + } return true; } diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpDenyCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpDenyCommand.java index dd7aba5..9880c03 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpDenyCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpDenyCommand.java @@ -1,17 +1,46 @@ package cc.carm.plugin.moeteleport.command.tpa; +import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.configuration.PluginMessages; +import cc.carm.plugin.moeteleport.model.TeleportRequest; +import cc.carm.plugin.moeteleport.model.UserData; +import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import java.util.Comparator; + public class TpDenyCommand implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { if (!(sender instanceof Player)) return false; Player player = (Player) sender; + UserData data = Main.getUserManager().getData(player); + if (data.getReceivedRequests().isEmpty()) { + PluginMessages.Request.NOT_FOUND.sendWithPlaceholders(player); + return true; + } + String targetName = args.length > 0 ? args[0] : null; + if (targetName != null) { + Player target = Bukkit.getPlayer(targetName); + if (target == null || !data.getReceivedRequests().containsKey(target.getUniqueId())) { + PluginMessages.Request.NOT_FOUND_PLAYER.sendWithPlaceholders(player, + new String[]{"%(player)"}, + new Object[]{target == null ? targetName : target.getName()} + ); + } else { + TeleportRequest request = data.getReceivedRequests().get(target.getUniqueId()); + Main.getRequestManager().denyRequest(request); // 交给Manager处理 + } + } else { + data.getReceivedRequests().values().stream() + .min(Comparator.comparingLong(TeleportRequest::getActiveTime)) + .ifPresent(request -> Main.getRequestManager().denyRequest(request)); + } return true; } diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpaCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpaCommand.java index a315c37..965bcdf 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpaCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpaCommand.java @@ -1,5 +1,9 @@ package cc.carm.plugin.moeteleport.command.tpa; +import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.configuration.PluginMessages; +import cc.carm.plugin.moeteleport.model.TeleportRequest; +import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -10,8 +14,14 @@ public class TpaCommand implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if (!(sender instanceof Player)) return false; + if (!(sender instanceof Player) || args.length < 1) return false; Player player = (Player) sender; + Player target = Bukkit.getPlayer(args[0]); + if (target == null) { + PluginMessages.NOT_ONLINE.sendWithPlaceholders(player); + return true; + } + Main.getRequestManager().sendRequest(player, target, TeleportRequest.RequestType.TPA); return true; } diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpaHereCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpaHereCommand.java index 4cfabde..da42a03 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpaHereCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpaHereCommand.java @@ -1,5 +1,9 @@ package cc.carm.plugin.moeteleport.command.tpa; +import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.configuration.PluginMessages; +import cc.carm.plugin.moeteleport.model.TeleportRequest; +import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -10,8 +14,14 @@ public class TpaHereCommand implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if (!(sender instanceof Player)) return false; + if (!(sender instanceof Player) || args.length < 1) return false; Player player = (Player) sender; + Player target = Bukkit.getPlayer(args[0]); + if (target == null) { + PluginMessages.NOT_ONLINE.sendWithPlaceholders(player); + return true; + } + Main.getRequestManager().sendRequest(player, target, TeleportRequest.RequestType.TPA_HERE); return true; } diff --git a/src/main/java/cc/carm/plugin/moeteleport/configuration/PluginMessages.java b/src/main/java/cc/carm/plugin/moeteleport/configuration/PluginMessages.java index 0a579a4..7dfd350 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/configuration/PluginMessages.java +++ b/src/main/java/cc/carm/plugin/moeteleport/configuration/PluginMessages.java @@ -7,6 +7,8 @@ public class PluginMessages { public static final ConfigMessageList NO_LAST_LOCATION = new ConfigMessageList("no-last-location"); + public static final ConfigMessageList NOT_ONLINE = new ConfigMessageList("not-online"); + public static final ConfigMessageList TPA = new ConfigMessageList("tpa"); public static final ConfigMessageList TPA_HERE = new ConfigMessageList("tpahere"); diff --git a/src/main/java/cc/carm/plugin/moeteleport/manager/RequestManager.java b/src/main/java/cc/carm/plugin/moeteleport/manager/RequestManager.java index fa8ca38..72f25e2 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/manager/RequestManager.java +++ b/src/main/java/cc/carm/plugin/moeteleport/manager/RequestManager.java @@ -9,11 +9,8 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; -import java.util.HashSet; import java.util.Objects; -import java.util.Set; import java.util.UUID; -import java.util.stream.Collectors; public class RequestManager { @@ -37,7 +34,7 @@ public class RequestManager { public void checkRequests() { Main.getUserManager().getUserDataMap().values() - .forEach(data -> data.getSentRequests().entrySet().stream() + .forEach(data -> data.getReceivedRequests().entrySet().stream() .filter(entry -> entry.getValue().isExpired()) .peek(entry -> PluginMessages.Request.SENT_TIMEOUT.sendWithPlaceholders( entry.getValue().getSender(), new String[]{"%(player)"}, @@ -49,55 +46,74 @@ public class RequestManager { ); } - public void sendTpaRequest(Player sender, Player receiver) { + public void sendRequest(Player sender, Player receiver, TeleportRequest.RequestType type) { int expireTime = PluginConfig.EXPIRE_TIME.get(); PluginMessages.Request.SENT.sendWithPlaceholders(sender, new String[]{"%(player)", "%(expire)"}, new Object[]{receiver, expireTime} ); - PluginMessages.TPA.sendWithPlaceholders(receiver, - new String[]{"%(player)", "%(expire)"}, - new Object[]{sender.getName(), expireTime} - ); + switch (type) { + case TPA: { + PluginMessages.TPA.sendWithPlaceholders(receiver, + new String[]{"%(player)", "%(expire)"}, + new Object[]{sender.getName(), expireTime} + ); + break; + } + case TPA_HERE: { + PluginMessages.TPA_HERE.sendWithPlaceholders(receiver, + new String[]{"%(player)", "%(expire)"}, + new Object[]{sender.getName(), expireTime} + ); + break; + } + } - TeleportRequest request = new TeleportRequest(sender, receiver, sender); + TeleportRequest request = new TeleportRequest(sender, receiver, type); + Main.getUserManager().getData(receiver).getReceivedRequests().put(sender.getUniqueId(), request); + Main.getUserManager().getData(sender).getSentRequests().add(receiver.getUniqueId()); - Main.getUserManager().getData(sender).getSentRequests().put(receiver.getUniqueId(), request); - Main.getUserManager().getData(receiver).getReceivedRequests().add(sender.getUniqueId()); } - public void sendTpaHereRequest(Player sender, Player receiver) { - int expireTime = PluginConfig.EXPIRE_TIME.get(); - - PluginMessages.Request.SENT.sendWithPlaceholders(sender, - new String[]{"%(player)", "%(expire)"}, - new Object[]{receiver, expireTime} + public void acceptRequest(TeleportRequest request) { + PluginMessages.ACCEPTED.sendWithPlaceholders(request.getSender(), + new String[]{"%(player)"}, + new Object[]{request.getReceiver().getName()} ); - PluginMessages.TPA_HERE.sendWithPlaceholders(receiver, - new String[]{"%(player)", "%(expire)"}, - new Object[]{sender.getName(), expireTime} + PluginMessages.TP_ACCEPT.sendWithPlaceholders(request.getReceiver(), + new String[]{"%(player)"}, + new Object[]{request.getSender().getName()} ); + TeleportManager.teleport(request.getTeleportPlayer(), request.getTeleportLocation()); + removeRequests(request); + } - TeleportRequest request = new TeleportRequest(sender, receiver, receiver); - - Main.getUserManager().getData(sender).getSentRequests().put(receiver.getUniqueId(), request); - Main.getUserManager().getData(receiver).getReceivedRequests().add(sender.getUniqueId()); + public void denyRequest(TeleportRequest request) { + PluginMessages.DENIED.sendWithPlaceholders(request.getSender(), + new String[]{"%(player)"}, + new Object[]{request.getReceiver().getName()} + ); + PluginMessages.TP_DENY.sendWithPlaceholders(request.getReceiver(), + new String[]{"%(player)"}, + new Object[]{request.getSender().getName()} + ); + removeRequests(request); + } + public void removeRequests(TeleportRequest request) { + Main.getUserManager().getData(request.getSender()) + .getSentRequests() + .remove(request.getReceiver().getUniqueId()); + Main.getUserManager().getData(request.getReceiver()) + .getReceivedRequests() + .remove(request.getSender().getUniqueId()); } public void cancelAllRequests(Player player) { UUID playerUUID = player.getUniqueId(); UserData data = Main.getUserManager().getData(player); - data.getSentRequests().keySet().stream() - .peek(receiverUUID -> PluginMessages.Request.OFFLINE.sendWithPlaceholders( - Bukkit.getPlayer(receiverUUID), - new String[]{"%(player)"}, new Object[]{player.getName()} - )).map(receiverUUID -> Main.getUserManager().getData(receiverUUID)) - .filter(Objects::nonNull).map(UserData::getReceivedRequests) - .forEach(senders -> senders.remove(playerUUID)); - - data.getReceivedRequests().stream() + data.getReceivedRequests().keySet().stream() .peek(senderUUID -> PluginMessages.Request.OFFLINE.sendWithPlaceholders( Bukkit.getPlayer(senderUUID), new String[]{"%(player)"}, new Object[]{player.getName()} @@ -105,38 +121,14 @@ public class RequestManager { .filter(Objects::nonNull).map(UserData::getSentRequests) .forEach(receivers -> receivers.remove(playerUUID)); - data.getSentRequests().clear(); - data.getReceivedRequests().clear(); - } - - public Set getRequestedPlayers(Player player) { - UserData data = Main.getUserManager().getData(player); - HashSet relatedUUIDs = new HashSet<>(); - relatedUUIDs.addAll(data.getReceivedRequests()); - relatedUUIDs.addAll(data.getSentRequests().keySet()); - - return relatedUUIDs.stream() - .map(Bukkit::getPlayer) - .filter(Objects::nonNull) - .collect(Collectors.toSet()); - } - - /** - * 取消某玩家所有相关的传送请求 - * - * @param player 玩家 - */ - public void clearAllRequests(Player player) { - UUID playerUUID = player.getUniqueId(); - UserData data = Main.getUserManager().getData(player); - data.getSentRequests().keySet().stream() - .map(receiver -> Main.getUserManager().getData(receiver)) + data.getSentRequests().stream() + .peek(receiverUUID -> PluginMessages.Request.OFFLINE.sendWithPlaceholders( + Bukkit.getPlayer(receiverUUID), + new String[]{"%(player)"}, new Object[]{player.getName()} + )).map(receiverUUID -> Main.getUserManager().getData(receiverUUID)) .filter(Objects::nonNull).map(UserData::getReceivedRequests) .forEach(senders -> senders.remove(playerUUID)); - data.getReceivedRequests().stream() - .map(sender -> Main.getUserManager().getData(sender)) - .filter(Objects::nonNull).map(UserData::getSentRequests) - .forEach(receivers -> receivers.remove(playerUUID)); + data.getSentRequests().clear(); data.getReceivedRequests().clear(); } diff --git a/src/main/java/cc/carm/plugin/moeteleport/model/TeleportRequest.java b/src/main/java/cc/carm/plugin/moeteleport/model/TeleportRequest.java index 6abf3f8..e05c4fb 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/model/TeleportRequest.java +++ b/src/main/java/cc/carm/plugin/moeteleport/model/TeleportRequest.java @@ -11,19 +11,16 @@ public class TeleportRequest { final @NotNull Player sender; final @NotNull Player receiver; - /** - * 用于记录需要被传送的玩家 - */ - final @NotNull Player teleportPlayer; + final @NotNull RequestType type; final long createTime; public TeleportRequest(@NotNull Player sender, @NotNull Player receiver, - @NotNull Player teleportPlayer) { + @NotNull RequestType type) { this.sender = sender; this.receiver = receiver; - this.teleportPlayer = teleportPlayer; + this.type = type; this.createTime = System.currentTimeMillis(); } @@ -36,13 +33,25 @@ public class TeleportRequest { } public @NotNull Player getTeleportPlayer() { - return teleportPlayer; + return getType() == RequestType.TPA ? getSender() : getReceiver(); + } + + public @NotNull Location getTeleportLocation() { + return getType() == RequestType.TPA_HERE ? getSender().getLocation() : getReceiver().getLocation(); + } + + public @NotNull RequestType getType() { + return type; } public long getCreateTime() { return createTime; } + public long getActiveTime() { + return System.currentTimeMillis() - getCreateTime(); + } + /** * 尝试对玩家进行传送 @@ -61,7 +70,12 @@ public class TeleportRequest { } public boolean isExpired() { - return (System.currentTimeMillis() - getCreateTime()) > PluginConfig.EXPIRE_TIME.get() * 10000; + return getActiveTime() > PluginConfig.EXPIRE_TIME.get() * 10000; + } + + public enum RequestType { + TPA, + TPA_HERE } diff --git a/src/main/java/cc/carm/plugin/moeteleport/model/UserData.java b/src/main/java/cc/carm/plugin/moeteleport/model/UserData.java index d8d017a..4fd3272 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/model/UserData.java +++ b/src/main/java/cc/carm/plugin/moeteleport/model/UserData.java @@ -23,8 +23,8 @@ public class UserData { private LinkedHashMap homeLocations; - private ConcurrentHashMap sentRequests; // 记录发出的请求 - private HashSet receivedRequests; // 记录收到的传送请求 + private HashSet sentRequests; // 记录发出的请求 + private ConcurrentHashMap receivedRequests; // 记录收到的传送请求 public UserData(@NotNull File dataFolder, @NotNull UUID uuid) { this(new File(dataFolder, uuid + ".yml")); @@ -95,12 +95,11 @@ public class UserData { } } - - public ConcurrentHashMap getSentRequests() { + public HashSet getSentRequests() { return sentRequests; } - public HashSet getReceivedRequests() { + public ConcurrentHashMap getReceivedRequests() { return receivedRequests; } diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml index 2352c29..8c68b91 100644 --- a/src/main/resources/messages.yml +++ b/src/main/resources/messages.yml @@ -1,5 +1,8 @@ no-last-location: - "&f您当前没有进行传送,无法返回上个地点。" + +not-online: + - "&f目标玩家并不在线,无法发送请求。" tpa: - "&6%(player) &f请求传送到您身边,您有%(expire)秒的时间回应。" - "&a&l[同意] &f输入 &e/tpaccept &f同意该请求。"