diff --git a/src/main/java/org/xgqy/survival/command/TeleportCommandExecutor.java b/src/main/java/org/xgqy/survival/command/TeleportCommandExecutor.java index 823f8f6..81e6923 100644 --- a/src/main/java/org/xgqy/survival/command/TeleportCommandExecutor.java +++ b/src/main/java/org/xgqy/survival/command/TeleportCommandExecutor.java @@ -37,37 +37,40 @@ public class TeleportCommandExecutor implements CommandExecutor { sender.sendMessage(ChatColor.RED + "该玩家不在线!"); return true; } - if (args[1].contains("me")){ - playerto = Bukkit.getPlayer(args[0]); - if(plugin.teleport.getOrDefault(playerto, null) != null){ - sender.sendMessage(ChatColor.RED + "对方已经发送了一个请求,请等待"); - return true; - }if (plugin.Ateleport.getOrDefault(sender, null) != null) { - sender.sendMessage(ChatColor.RED + "你还有一个未处理的请求!"); + if (args.length == 2) { + if (args[1].contains("me")) { + playerto = Bukkit.getPlayer(args[0]); + if (plugin.teleport.getOrDefault(playerto, null) != null) { + sender.sendMessage(ChatColor.RED + "对方已经发送了一个请求,请等待"); + return true; + } + if (plugin.Ateleport.getOrDefault(sender, null) != null) { + sender.sendMessage(ChatColor.RED + "你还有一个未处理的请求!"); + return true; + } + sender.sendMessage(ChatColor.GREEN + "请求已发送"); + playerto.sendMessage(ChatColor.GREEN + "玩家 " + sender.getName() + ChatColor.GREEN + " 向你发来传送请求,输入 /tpacc tome 同意这个请求或 /tpacc detome 来拒绝这个请求,有效期2分钟。"); + BaseComponent[] message = new ComponentBuilder(ChatColor.YELLOW + "玩家 " + sender.getName() + ChatColor.YELLOW + " 向你发来传送请求\n") + .append(new ComponentBuilder(ChatColor.GREEN + "[同意] ").event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tpacc tome")).create()) + .append(new ComponentBuilder(ChatColor.RED + "[拒绝]").event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tpacc detome")).create()) + .create(); + playerto.spigot().sendMessage(message); + plugin.Ateleport.put((Player) sender, playerto); + plugin.teleport.put(playerto, (Player) sender); + new BukkitRunnable() { + @Override + public void run() { + if (plugin.teleportp.getOrDefault(playerto, null) == null) + playerto.sendMessage(ChatColor.RED + "玩家 " + sender.getName() + ChatColor.RED + " 的传送请求已过期"); + if (plugin.teleportp.getOrDefault(playerto, null) == null) + sender.sendMessage(ChatColor.RED + "你向 " + playerto.getName() + ChatColor.RED + " 发送的传送请求已过期"); + plugin.Ateleport.remove((Player) sender); + plugin.teleport.remove(playerto); + plugin.isteleport.remove(playerto); + } + }.runTaskLater(plugin, 40 * 60); return true; } - sender.sendMessage(ChatColor.GREEN + "请求已发送"); - playerto.sendMessage(ChatColor.GREEN + "玩家 " + sender.getName() + ChatColor.GREEN + " 向你发来传送请求,输入 /tpacc tome 同意这个请求或 /tpacc detome 来拒绝这个请求,有效期2分钟。"); - BaseComponent[] message = new ComponentBuilder(ChatColor.YELLOW + "玩家 " + sender.getName() + ChatColor.YELLOW + " 向你发来传送请求\n") - .append(new ComponentBuilder(ChatColor.GREEN + "[同意] ").event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tpacc tome")).create()) - .append(new ComponentBuilder(ChatColor.RED + "[拒绝]").event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tpacc detome")).create()) - .create(); - playerto.spigot().sendMessage(message); - plugin.Ateleport.put((Player) sender, playerto); - plugin.teleport.put(playerto, (Player) sender); - new BukkitRunnable() { - @Override - public void run() { - if (plugin.teleportp.getOrDefault(playerto, null) == null) - playerto.sendMessage(ChatColor.RED + "玩家 " + sender.getName() + ChatColor.RED + " 的传送请求已过期"); - if (plugin.teleportp.getOrDefault(playerto, null) == null) - sender.sendMessage(ChatColor.RED + "你向 " + playerto.getName() + ChatColor.RED + " 发送的传送请求已过期"); - plugin.Ateleport.remove((Player) sender); - plugin.teleport.remove(playerto); - plugin.isteleport.remove(playerto); - } - }.runTaskLater(plugin, 40 * 60); - return true; } playerto = Bukkit.getPlayer(args[0]); if (plugin.teleport.getOrDefault((Player) sender, null) != null) { diff --git a/src/main/java/org/xgqy/survival/command/TpAccCommandExecutor.java b/src/main/java/org/xgqy/survival/command/TpAccCommandExecutor.java index 3e60ee7..55fc389 100644 --- a/src/main/java/org/xgqy/survival/command/TpAccCommandExecutor.java +++ b/src/main/java/org/xgqy/survival/command/TpAccCommandExecutor.java @@ -11,7 +11,7 @@ import org.xgqy.survival.Survival; public class TpAccCommandExecutor implements CommandExecutor { - private Survival plugin; + private final Survival plugin; public TpAccCommandExecutor(Survival plugin) { this.plugin = plugin; @@ -19,76 +19,159 @@ public class TpAccCommandExecutor implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if (sender instanceof Player) { - if (plugin.Ateleport.getOrDefault(sender, null) != null) { - if (args[0].contains("accept")) { - sender.sendMessage(ChatColor.GREEN + "传送成功!"); - plugin.Ateleport.get(sender).sendMessage(ChatColor.GREEN + "传送成功!输入 /tpfin 回到原处,该命令将会在5分钟后过期。"); - plugin.teleportp.put(plugin.Ateleport.get(sender), plugin.Ateleport.get(sender).getLocation()); - plugin.Ateleport.get(sender).teleport(((Player) sender).getLocation()); - plugin.isteleport.put(plugin.Ateleport.get(sender), 1); - new BukkitRunnable() { - @Override - public void run() { - if (plugin.isteleport.get(sender) != 1) - plugin.Ateleport.get(sender).sendMessage(ChatColor.RED + "返回命令已过期,你将无法返回原处!"); - plugin.teleportp.remove(plugin.Ateleport.get(sender)); - plugin.teleport.remove(plugin.Ateleport.get(sender)); - plugin.isteleport.remove(plugin.Ateleport.get(sender)); - plugin.Ateleport.remove(sender); - } - }.runTaskLater(plugin, 5 * 20 * 60); - return true; - } else if (args[0].contains("deny")) { - sender.sendMessage(ChatColor.GREEN + "拒绝成功"); - plugin.Ateleport.get(sender).sendMessage(ChatColor.GREEN + "您的传送请求被拒绝"); - //plugin.teleportp.put(plugin.Ateleport.get(sender),plugin.Ateleport.get(sender).getLocation()); - plugin.teleportp.remove(plugin.Ateleport.get(sender)); - plugin.teleport.remove(plugin.Ateleport.get(sender)); - plugin.isteleport.remove(plugin.Ateleport.get(sender)); - plugin.Ateleport.remove(sender); - - return true; - } else if (args[0].contains("tome")){ - sender.sendMessage(ChatColor.GREEN + "传送成功!"); - plugin.teleport.get(sender).sendMessage(ChatColor.GREEN + "传送成功!输入 /tpfin 回到原处,该命令将会在5分钟后过期。"); - plugin.teleportp.put(plugin.teleport.get(sender), plugin.teleport.get(sender).getLocation()); - plugin.teleport.get(sender).teleport(((Player) sender).getLocation()); - plugin.isteleport.put(plugin.teleport.get(sender), 1); - ((Player)sender).teleport(plugin.Ateleport.get(sender)); - new BukkitRunnable() { - @Override - public void run() { - if (plugin.isteleport.get(sender) != 1) - plugin.teleport.get(sender).sendMessage(ChatColor.RED + "返回命令已过期,你将无法返回原处!"); - plugin.teleportp.remove(plugin.teleport.get(sender)); - plugin.Ateleport.remove(plugin.teleport.get(sender)); - plugin.isteleport.remove(plugin.teleport.get(sender)); - plugin.teleport.remove(sender); - } - }.runTaskLater(plugin, 5 * 20 * 60); - return true; - }else if (args[0].contains("detome")){ - sender.sendMessage(ChatColor.GREEN + "拒绝成功"); - plugin.teleport.get(sender).sendMessage(ChatColor.GREEN + "您的传送请求被拒绝"); - //plugin.teleportp.put(plugin.Ateleport.get(sender),plugin.Ateleport.get(sender).getLocation()); - plugin.teleportp.remove(plugin.teleport.get(sender)); - plugin.Ateleport.remove(plugin.teleport.get(sender)); - plugin.isteleport.remove(plugin.teleport.get(sender)); - plugin.teleport.remove(sender); - return true; - }else { - sender.sendMessage(ChatColor.RED + "参数错误,请输入 /tpacc accept 或 /tpacc deny"); - return true; - } - } else { - sender.sendMessage(ChatColor.RED + "现在没有传送申请或申请已过期"); - return true; - } - } else { - sender.sendMessage(ChatColor.RED + "无法对非玩家类使用"); + // 仅允许玩家执行命令 + if (!(sender instanceof Player player)) { + sender.sendMessage(ChatColor.RED + "无法对非玩家使用此命令"); return true; } - //return true; + + // 检查玩家是否已登录 + if (!plugin.getAccountManager().isLoggedIn(player)) { + player.sendMessage(ChatColor.RED + "请先登录或注册!"); + return true; + } + + // 参数长度校验(必须为1个参数) + if (args.length != 1) { + player.sendMessage(ChatColor.RED + "请输入正确参数!用法: /tpacc "); + return true; + } + + // 处理不同参数逻辑 + String action = args[0]; + switch (action) { + case "accept": + handleAccept(player); + break; + case "deny": + handleDeny(player); + break; + case "tome": + handleTome(player); + break; + case "detome": + handleDetome(player); + break; + default: + player.sendMessage(ChatColor.RED + "参数错误!请使用 /tpacc "); + } + + return true; + } + + /** + * 处理接受对方传送至自己的请求 + */ + private void handleAccept(Player receiver) { + // 获取请求传送的玩家(Ateleport: 接收者 -> 请求者) + Player requester = plugin.Ateleport.get(receiver); + if (requester == null || !requester.isOnline()) { + receiver.sendMessage(ChatColor.RED + "传送请求已过期或不存在"); + return; + } + + // 执行传送逻辑 + receiver.sendMessage(ChatColor.GREEN + "已同意传送请求!"); + requester.sendMessage(ChatColor.GREEN + "对方已同意传送!输入 /tpfin 可在5分钟内返回原处"); + + // 保存请求者原始位置 + plugin.teleportp.put(requester, requester.getLocation()); + // 传送请求者到接收者位置 + requester.teleport(receiver.getLocation()); + plugin.isteleport.put(requester, 1); + + // 5分钟后清理传送状态 + new BukkitRunnable() { + @Override + public void run() { + if (plugin.isteleport.getOrDefault(requester, 0) != 1) { + requester.sendMessage(ChatColor.RED + "返回命令已过期,无法再返回原处"); + } + // 清理相关映射 + plugin.teleportp.remove(requester); + plugin.teleport.remove(requester); + plugin.isteleport.remove(requester); + plugin.Ateleport.remove(receiver); + } + }.runTaskLater(plugin, 5 * 60 * 20); // 5分钟(20tick=1秒) + } + + /** + * 处理拒绝对方传送至自己的请求 + */ + private void handleDeny(Player receiver) { + Player requester = plugin.Ateleport.get(receiver); + if (requester == null || !requester.isOnline()) { + receiver.sendMessage(ChatColor.RED + "传送请求已过期或不存在"); + return; + } + + // 发送拒绝消息 + receiver.sendMessage(ChatColor.GREEN + "已拒绝传送请求"); + requester.sendMessage(ChatColor.RED + "对方已拒绝你的传送请求"); + + // 清理相关映射 + plugin.teleportp.remove(requester); + plugin.teleport.remove(requester); + plugin.isteleport.remove(requester); + plugin.Ateleport.remove(receiver); + } + + /** + * 处理同意自己传送至对方的请求 + */ + private void handleTome(Player requester) { + // 获取请求接收者(teleport: 请求者 -> 接收者) + Player receiver = plugin.teleport.get(requester); + if (receiver == null || !receiver.isOnline()) { + requester.sendMessage(ChatColor.RED + "传送请求已过期或不存在"); + return; + } + + // 执行传送逻辑 + requester.sendMessage(ChatColor.GREEN + "已同意传送至对方!"); + receiver.sendMessage(ChatColor.GREEN + "对方已同意传送至你处"); + + // 保存请求者原始位置 + plugin.teleportp.put(requester, requester.getLocation()); + // 传送请求者到接收者位置 + requester.teleport(receiver.getLocation()); + plugin.isteleport.put(requester, 1); + + // 5分钟后清理传送状态 + new BukkitRunnable() { + @Override + public void run() { + if (plugin.isteleport.getOrDefault(requester, 0) != 1) { + requester.sendMessage(ChatColor.RED + "返回命令已过期,无法再返回原处"); + } + // 清理相关映射 + plugin.teleportp.remove(requester); + plugin.Ateleport.remove(receiver); + plugin.isteleport.remove(requester); + plugin.teleport.remove(requester); + } + }.runTaskLater(plugin, 5 * 60 * 20); + } + + /** + * 处理拒绝自己传送至对方的请求 + */ + private void handleDetome(Player requester) { + Player receiver = plugin.teleport.get(requester); + if (receiver == null || !receiver.isOnline()) { + requester.sendMessage(ChatColor.RED + "传送请求已过期或不存在"); + return; + } + + // 发送拒绝消息 + requester.sendMessage(ChatColor.GREEN + "已拒绝传送至对方"); + receiver.sendMessage(ChatColor.RED + "对方已拒绝传送至你处"); + + // 清理相关映射 + plugin.teleportp.remove(requester); + plugin.Ateleport.remove(receiver); + plugin.isteleport.remove(requester); + plugin.teleport.remove(requester); } } \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index d09a624..1d57e46 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -48,6 +48,20 @@ commands: login: description: to login usage: / + party: + description: to create a party + usage: / + inventory: + description: check inventory of a player + usage: / + permission: permission.settag + permission-message: 无权执行命令 + msg: + description: private chat with friend + usage: / + friend: + description: add friend + usage: / permissions: permission.settag: description: Allows setting player tags