From df0541d4dd7386e7937fd4c5596495c1f49f636b Mon Sep 17 00:00:00 2001 From: carm Date: Sun, 12 Feb 2023 04:20:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(cmd):=20=E4=BC=98=E5=8C=96=E6=8C=87?= =?UTF-8?q?=E4=BB=A4=E5=AE=9E=E7=8E=B0=E6=96=B9=E5=BC=8F=EF=BC=8C=E8=A1=A5?= =?UTF-8?q?=E5=85=A8=E6=8C=87=E4=BB=A4=E7=9B=B8=E5=85=B3=E4=BB=8B=E7=BB=8D?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 11 +- .../java/cc/carm/plugin/moeteleport/Main.java | 85 +++++------ .../moeteleport/command/BackCommand.java | 28 ---- .../moeteleport/command/MainCommand.java | 25 ---- .../moeteleport/command/MainCommands.java | 35 +++++ .../moeteleport/command/MoeCompleter.java | 15 -- .../command/MoeTeleportCommand.java | 22 --- .../command/completer/HomeNameCompleter.java | 31 ---- .../completer/PlayerNameCompleter.java | 47 ------- .../command/completer/TpRequestCompleter.java | 53 ------- .../command/completer/WarpNameCompleter.java | 48 ------- .../command/home/HomeCreateCommand.java | 65 +++++++++ .../command/home/HomeDelCommand.java | 37 ----- .../command/home/HomeDeleteCommand.java | 54 +++++++ .../command/home/HomeListCommand.java | 40 ++++-- .../command/home/HomeSetCommand.java | 49 ------- .../command/home/HomeTeleportCommand.java | 52 +++++++ .../command/home/HomeTpCommand.java | 35 ----- .../command/parent/BackCommand.java | 43 ++++++ .../command/parent/HomeCommands.java | 53 +++++++ .../command/parent/ReloadCommand.java | 41 ++++++ .../command/parent/TeleportCommands.java | 39 ++++++ .../command/parent/WarpCommands.java | 51 +++++++ .../command/sub/HomeSubCommand.java | 40 ++++++ .../command/sub/TeleportSubCommand.java | 43 ++++++ .../command/sub/WarpSubCommand.java | 53 +++++++ .../TeleportHandleCommand.java} | 53 ++++--- .../teleport/TeleportRandomCommand.java | 21 +++ .../teleport/TeleportRequestCommand.java | 73 ++++++++++ .../moeteleport/command/tpa/TpaCommand.java | 46 ------ .../command/warp/WarpCreateCommand.java | 71 ++++++++++ .../command/warp/WarpDelCommand.java | 40 ------ .../command/warp/WarpDeleteCommand.java | 55 ++++++++ .../command/warp/WarpInfoCommand.java | 42 ++++-- .../command/warp/WarpListCommand.java | 44 +++--- .../command/warp/WarpSetCommand.java | 51 ------- .../command/warp/WarpTeleportCommand.java | 50 +++++++ .../command/warp/WarpTpCommand.java | 32 ----- .../plugin/moeteleport/conf/PluginConfig.java | 53 +++++++ .../moeteleport/conf/PluginMessages.java | 132 +++++++++++++++--- .../moeteleport/listener/CommandListener.java | 16 --- .../listener/TeleportListener.java | 6 + .../moeteleport/listener/UserListener.java | 2 +- .../moeteleport/manager/CommandManager.java | 122 ++++++++++++++++ .../moeteleport/manager/RequestManager.java | 22 +-- .../moeteleport/manager/TeleportManager.java | 8 +- .../moeteleport/model/TeleportRequest.java | 2 + src/main/resources/PLUGIN_INFO | 5 +- src/main/resources/plugin.yml | 48 +------ 49 files changed, 1313 insertions(+), 776 deletions(-) delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/BackCommand.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/MainCommand.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/MainCommands.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/MoeCompleter.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/MoeTeleportCommand.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/completer/HomeNameCompleter.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/completer/PlayerNameCompleter.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/completer/TpRequestCompleter.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/completer/WarpNameCompleter.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/home/HomeCreateCommand.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/home/HomeDelCommand.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/home/HomeDeleteCommand.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/home/HomeSetCommand.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/home/HomeTeleportCommand.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/home/HomeTpCommand.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/parent/BackCommand.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/parent/HomeCommands.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/parent/ReloadCommand.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/parent/TeleportCommands.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/parent/WarpCommands.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/sub/HomeSubCommand.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/sub/TeleportSubCommand.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/sub/WarpSubCommand.java rename src/main/java/cc/carm/plugin/moeteleport/command/{tpa/TpHandleCommand.java => teleport/TeleportHandleCommand.java} (50%) create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/teleport/TeleportRandomCommand.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/teleport/TeleportRequestCommand.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpaCommand.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpCreateCommand.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpDelCommand.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpDeleteCommand.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpSetCommand.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpTeleportCommand.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpTpCommand.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/listener/CommandListener.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/listener/TeleportListener.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/manager/CommandManager.java diff --git a/pom.xml b/pom.xml index 11c0d17..6032c06 100644 --- a/pom.xml +++ b/pom.xml @@ -11,9 +11,9 @@ UTF-8 UTF-8 - 1.4.18 + 1.4.19 0.4.6 - 2.3.0 + 2.3.1 cc.carm.plugin @@ -183,6 +183,13 @@ provided + + com.comphenix.protocol + ProtocolLib + 4.8.0 + provided + + org.bstats bstats-bukkit diff --git a/src/main/java/cc/carm/plugin/moeteleport/Main.java b/src/main/java/cc/carm/plugin/moeteleport/Main.java index 54d1e1a..d157fe4 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/Main.java +++ b/src/main/java/cc/carm/plugin/moeteleport/Main.java @@ -4,23 +4,12 @@ import cc.carm.lib.configuration.core.source.ConfigurationProvider; import cc.carm.lib.easyplugin.EasyPlugin; import cc.carm.lib.easyplugin.updatechecker.GHUpdateChecker; import cc.carm.lib.mineconfiguration.bukkit.MineConfiguration; -import cc.carm.plugin.moeteleport.command.BackCommand; -import cc.carm.plugin.moeteleport.command.MoeTeleportCommand; -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.completer.WarpNameCompleter; -import cc.carm.plugin.moeteleport.command.home.HomeDelCommand; -import cc.carm.plugin.moeteleport.command.home.HomeListCommand; -import cc.carm.plugin.moeteleport.command.home.HomeSetCommand; -import cc.carm.plugin.moeteleport.command.home.HomeTpCommand; -import cc.carm.plugin.moeteleport.command.tpa.TpHandleCommand; -import cc.carm.plugin.moeteleport.command.tpa.TpaCommand; -import cc.carm.plugin.moeteleport.command.warp.*; +import cc.carm.plugin.moeteleport.command.MainCommands; import cc.carm.plugin.moeteleport.conf.PluginConfig; import cc.carm.plugin.moeteleport.conf.PluginMessages; -import cc.carm.plugin.moeteleport.listener.CommandListener; +import cc.carm.plugin.moeteleport.listener.TeleportListener; import cc.carm.plugin.moeteleport.listener.UserListener; +import cc.carm.plugin.moeteleport.manager.CommandManager; import cc.carm.plugin.moeteleport.manager.RequestManager; import cc.carm.plugin.moeteleport.manager.UserManager; import cc.carm.plugin.moeteleport.manager.WarpManager; @@ -36,11 +25,11 @@ public class Main extends EasyPlugin { protected ConfigurationProvider configProvider; protected ConfigurationProvider messageProvider; - protected DataStorage storage; protected WarpManager warpManager; protected UserManager userManager; protected RequestManager requestManager; + protected CommandManager commandManager; public Main() { instance = this; @@ -56,11 +45,11 @@ public class Main extends EasyPlugin { this.messageProvider = MineConfiguration.from(this, "messages.yml"); this.messageProvider.initialize(PluginMessages.class); - info("初始化存储方式..."); + log("初始化存储方式..."); StorageMethod storageMethod = StorageMethod.read(PluginConfig.STORAGE.METHOD.get()); try { - info(" 正在使用 " + storageMethod.name() + " 进行数据存储"); + log(" 正在使用 " + storageMethod.name() + " 进行数据存储"); storage = storageMethod.createStorage(); storage.initialize(); } catch (Exception ex) { @@ -70,55 +59,48 @@ public class Main extends EasyPlugin { } - info("加载地标管理器..."); + log("加载地标管理器..."); warpManager = new WarpManager(); - info("加载用户管理器..."); + log("加载用户管理器..."); this.userManager = new UserManager(); if (Bukkit.getOnlinePlayers().size() > 0) { - info(" 加载现有用户数据..."); + log(" 加载现有用户数据..."); this.userManager.loadAll(); } - info("加载请求管理器..."); + log("加载请求管理器..."); this.requestManager = new RequestManager(this); - info("注册监听器..."); + log("注册监听器..."); registerListener(new UserListener()); - registerListener(new CommandListener()); + registerListener(new TeleportListener()); - info("注册指令..."); - registerCommand("MoeTeleport", new MoeTeleportCommand()); + log("注册指令..."); + registerCommand("MoeTeleport", new MainCommands(this)); - registerCommand("back", new BackCommand()); + try { + this.commandManager = new CommandManager(this); + if (PluginConfig.COMMAND.ENABLE.getNotNull()) { + PluginConfig.COMMAND.ALIAS.getNotNull().forEach(commandManager::register); + } + } catch (Exception e) { + log("注册简化指令失败: " + e.getMessage()); + e.printStackTrace(); + } - registerCommand("listHome", new HomeListCommand()); - registerCommand("home", new HomeTpCommand(), new HomeNameCompleter()); - registerCommand("setHome", new HomeSetCommand()); - registerCommand("delHome", new HomeDelCommand(), new HomeNameCompleter()); - - registerCommand("tpa", new TpaCommand(), new PlayerNameCompleter()); - registerCommand("tpaHere", new TpaCommand(), new PlayerNameCompleter()); - registerCommand("tpAccept", new TpHandleCommand(), new TpRequestCompleter()); - registerCommand("tpDeny", new TpHandleCommand(), new TpRequestCompleter()); - - registerCommand("listWarps", new WarpListCommand()); - registerCommand("warpInfo", new WarpInfoCommand(), new WarpNameCompleter(false)); - registerCommand("warp", new WarpTpCommand(), new WarpNameCompleter(false)); - registerCommand("setWarp", new WarpSetCommand()); - registerCommand("delWarp", new WarpDelCommand(), new WarpNameCompleter(true)); if (PluginConfig.METRICS.getNotNull()) { - info("启用统计数据..."); + log("启用统计数据..."); Metrics metrics = new Metrics(this, 14459); metrics.addCustomChart(new SimplePie("storage_method", storageMethod::name)); } if (PluginConfig.CHECK_UPDATE.getNotNull()) { - info("开始检查更新..."); + log("开始检查更新..."); getScheduler().runAsync(GHUpdateChecker.runner(this)); } else { - info("已禁用检查更新,跳过。"); + log("已禁用检查更新,跳过。"); } return true; @@ -126,19 +108,24 @@ public class Main extends EasyPlugin { @Override protected void shutdown() { - info("关闭所有请求..."); + log("清空简化指令..."); + if (this.commandManager != null) { + this.commandManager.unregisterAll(); + } + + log("关闭所有请求..."); this.requestManager.shutdown(); - info("保存用户数据..."); + log("保存用户数据..."); this.userManager.unloadAll(true); - info("保存地标数据..."); + log("保存地标数据..."); this.warpManager.saveWarps(); - info("终止存储源..."); + log("终止存储源..."); this.storage.shutdown(); - info("卸载监听器..."); + log("卸载监听器..."); Bukkit.getServicesManager().unregisterAll(this); } diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/BackCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/BackCommand.java deleted file mode 100644 index 67a3992..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/command/BackCommand.java +++ /dev/null @@ -1,28 +0,0 @@ -package cc.carm.plugin.moeteleport.command; - -import cc.carm.plugin.moeteleport.MoeTeleport; -import cc.carm.plugin.moeteleport.conf.PluginMessages; -import cc.carm.plugin.moeteleport.manager.TeleportManager; -import cc.carm.plugin.moeteleport.storage.UserData; -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; - -public class BackCommand 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 = MoeTeleport.getUserManager().getData(player); - if (data.getLastLocation() == null) { - PluginMessages.Back.NO_LAST_LOCATION.send(player); - return true; - } - TeleportManager.teleport(player, data.getLastLocation(), false); - return true; - } - -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/MainCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/MainCommand.java deleted file mode 100644 index 1f05016..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/command/MainCommand.java +++ /dev/null @@ -1,25 +0,0 @@ -package cc.carm.plugin.moeteleport.command; - -import cc.carm.lib.easyplugin.command.CommandHandler; -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.java.JavaPlugin; -import org.jetbrains.annotations.NotNull; - -public class MainCommand extends CommandHandler { - - public MainCommand(@NotNull JavaPlugin plugin) { - super(plugin); - } - - @Override - public Void noArgs(CommandSender sender) { - return null; - } - - @Override - public Void noPermission(CommandSender sender) { - return null; - } - - -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/MainCommands.java b/src/main/java/cc/carm/plugin/moeteleport/command/MainCommands.java new file mode 100644 index 0000000..ad02a04 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/MainCommands.java @@ -0,0 +1,35 @@ +package cc.carm.plugin.moeteleport.command; + +import cc.carm.lib.easyplugin.command.CommandHandler; +import cc.carm.plugin.moeteleport.command.parent.*; +import cc.carm.plugin.moeteleport.conf.PluginMessages; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +public class MainCommands extends CommandHandler { + + public MainCommands(@NotNull JavaPlugin plugin) { + super(plugin); + + registerHandler(new TeleportCommands(plugin, this, "teleport", "tp")); + registerHandler(new WarpCommands(plugin, this, "warp", "warps")); + registerHandler(new HomeCommands(plugin, this, "home", "homes")); + + registerSubCommand(new BackCommand(this, "back")); + registerSubCommand(new ReloadCommand(this, "reload")); + } + + @Override + public Void noArgs(CommandSender sender) { + PluginMessages.USAGE.COMMAND.send(sender); + return null; + } + + @Override + public Void noPermission(CommandSender sender) { + PluginMessages.NO_PERMISSION.send(sender); + return null; + } + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/MoeCompleter.java b/src/main/java/cc/carm/plugin/moeteleport/command/MoeCompleter.java deleted file mode 100644 index a06ee97..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/command/MoeCompleter.java +++ /dev/null @@ -1,15 +0,0 @@ -package cc.carm.plugin.moeteleport.command; - -import cc.carm.lib.easyplugin.command.SimpleCompleter; -import org.jetbrains.annotations.NotNull; - -import java.util.Collection; -import java.util.List; - -public class MoeCompleter extends SimpleCompleter { - - public static @NotNull List objects(@NotNull String input, Collection objects) { - return objects(input, objects.size(), objects); - } - -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/MoeTeleportCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/MoeTeleportCommand.java deleted file mode 100644 index cd85071..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/command/MoeTeleportCommand.java +++ /dev/null @@ -1,22 +0,0 @@ -package cc.carm.plugin.moeteleport.command; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.jetbrains.annotations.NotNull; - -public class MoeTeleportCommand implements CommandExecutor { - - @Override - public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, - @NotNull String s, @NotNull String[] args) { - if (args.length == 1 && args[0].equalsIgnoreCase("reload")) { - commandSender.sendMessage("Reloading config..."); - ConfigManager.reload(); - commandSender.sendMessage("Config reloaded."); - return true; - } - return false; - } - -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/completer/HomeNameCompleter.java b/src/main/java/cc/carm/plugin/moeteleport/command/completer/HomeNameCompleter.java deleted file mode 100644 index 2d0b6c2..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/command/completer/HomeNameCompleter.java +++ /dev/null @@ -1,31 +0,0 @@ -package cc.carm.plugin.moeteleport.command.completer; - -import cc.carm.plugin.moeteleport.MoeTeleport; -import com.google.common.collect.ImmutableList; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; -import org.bukkit.entity.Player; -import org.bukkit.util.StringUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.stream.Collectors; - -public class HomeNameCompleter implements TabCompleter { - - @Nullable - @Override - public java.util.List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { - if (!(sender instanceof Player)) return ImmutableList.of(); - if (args.length == 1) { - return MoeTeleport.getUserManager().getData((Player) sender) - .getHomeLocations().keySet().stream() - .filter(s -> StringUtil.startsWithIgnoreCase(s, args[0])) - .limit(10).collect(Collectors.toList()); - } else { - return ImmutableList.of(); - } - } - -} \ No newline at end of file diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/completer/PlayerNameCompleter.java b/src/main/java/cc/carm/plugin/moeteleport/command/completer/PlayerNameCompleter.java deleted file mode 100644 index 619bca4..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/command/completer/PlayerNameCompleter.java +++ /dev/null @@ -1,47 +0,0 @@ -package cc.carm.plugin.moeteleport.command.completer; - -import com.google.common.collect.ImmutableList; -import org.bukkit.Bukkit; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; -import org.bukkit.entity.HumanEntity; -import org.bukkit.util.StringUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -public class PlayerNameCompleter implements TabCompleter { - - List indexes; - - public PlayerNameCompleter() { - this(1); - } - - public PlayerNameCompleter(Integer index) { - this(new Integer[]{index}); - } - - public PlayerNameCompleter(Integer[] indexes) { - this.indexes = Arrays.asList(indexes); - } - - @Nullable - @Override - public java.util.List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { - if (args.length >= 1 && indexes.contains(args.length)) { - return Bukkit.getOnlinePlayers().stream() - .map(HumanEntity::getName) - .filter(s -> StringUtil.startsWithIgnoreCase(s, args[args.length - 1])) - .limit(10).collect(Collectors.toList()); - } else { - return ImmutableList.of(); - } - } - - -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/completer/TpRequestCompleter.java b/src/main/java/cc/carm/plugin/moeteleport/command/completer/TpRequestCompleter.java deleted file mode 100644 index 04e4b46..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/command/completer/TpRequestCompleter.java +++ /dev/null @@ -1,53 +0,0 @@ -package cc.carm.plugin.moeteleport.command.completer; - -import cc.carm.plugin.moeteleport.MoeTeleport; -import cc.carm.plugin.moeteleport.storage.UserData; -import com.google.common.collect.ImmutableList; -import org.bukkit.Bukkit; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; -import org.bukkit.entity.HumanEntity; -import org.bukkit.entity.Player; -import org.bukkit.util.StringUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -public class TpRequestCompleter implements TabCompleter { - - List indexes; - - public TpRequestCompleter() { - this(1); - } - - public TpRequestCompleter(Integer index) { - this(new Integer[]{index}); - } - - public TpRequestCompleter(Integer[] indexes) { - this.indexes = Arrays.asList(indexes); - } - - @Nullable - @Override - public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { - if (!(sender instanceof Player)) return ImmutableList.of(); - if (args.length >= 1 && indexes.contains(args.length)) { - UserData data = MoeTeleport.getUserManager().getData((Player) sender); - 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()); - } else { - return ImmutableList.of(); - } - } - - -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/completer/WarpNameCompleter.java b/src/main/java/cc/carm/plugin/moeteleport/command/completer/WarpNameCompleter.java deleted file mode 100644 index 8b14eed..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/command/completer/WarpNameCompleter.java +++ /dev/null @@ -1,48 +0,0 @@ -package cc.carm.plugin.moeteleport.command.completer; - -import cc.carm.plugin.moeteleport.MoeTeleport; -import com.google.common.collect.ImmutableList; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; -import org.bukkit.entity.Player; -import org.bukkit.util.StringUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Map; -import java.util.stream.Collectors; - -public class WarpNameCompleter implements TabCompleter { - - boolean limitOwner; - - public WarpNameCompleter(boolean limitOwner) { - this.limitOwner = limitOwner; - } - - @Nullable - @Override - public java.util.List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, - @NotNull String alias, @NotNull String[] args) { - if (!(sender instanceof Player)) return ImmutableList.of(); - if (args.length == 1) { - if (limitOwner) { - Player player = (Player) sender; - return MoeTeleport.getWarpManager().listWarps().entrySet().stream() - .filter(entry -> entry.getValue().getOwner() != null) - .filter(entry -> entry.getValue().getOwner().equals(player.getUniqueId())) - .map(Map.Entry::getKey) - .filter(s -> StringUtil.startsWithIgnoreCase(s, args[0])) - .limit(10).collect(Collectors.toList()); - } else { - return MoeTeleport.getWarpManager().listWarps().keySet().stream() - .filter(s -> StringUtil.startsWithIgnoreCase(s, args[0])) - .limit(10).collect(Collectors.toList()); - } - } else { - return ImmutableList.of(); - } - } - -} \ No newline at end of file diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeCreateCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeCreateCommand.java new file mode 100644 index 0000000..9c115c7 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeCreateCommand.java @@ -0,0 +1,65 @@ +package cc.carm.plugin.moeteleport.command.home; + +import cc.carm.lib.easyplugin.command.SimpleCompleter; +import cc.carm.plugin.moeteleport.MoeTeleport; +import cc.carm.plugin.moeteleport.command.parent.HomeCommands; +import cc.carm.plugin.moeteleport.command.sub.HomeSubCommand; +import cc.carm.plugin.moeteleport.conf.PluginMessages; +import cc.carm.plugin.moeteleport.conf.location.DataLocation; +import cc.carm.plugin.moeteleport.storage.UserData; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public class HomeCreateCommand extends HomeSubCommand { + public HomeCreateCommand(@NotNull HomeCommands parent, String name, String... aliases) { + super(parent, name, aliases); + } + + @Override + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) throws Exception { + if (!(sender instanceof Player)) { + PluginMessages.NOT_PLAYER.send(sender); + return null; + } + + Player player = (Player) sender; + UserData data = getData(player); + String homeName = args.length >= 1 ? args[0] : "home"; + + if (homeName.length() > 32) { // 超过家的名字长度限定 + PluginMessages.HOME.NAME_TOO_LONG.send(sender); + return null; + } + + Map.Entry lastHomeLocation = data.getHomeLocation(homeName); + + int maxHome = MoeTeleport.getUserManager().getMaxHome(player); + if (data.getHomeLocations().size() >= maxHome && lastHomeLocation == null) { + PluginMessages.HOME.OVER_LIMIT.send(sender, maxHome); + return null; + } + + data.setHomeLocation(homeName, player.getLocation()); + if (lastHomeLocation != null) { + PluginMessages.HOME.OVERRIDE.send(sender, homeName, lastHomeLocation.getValue().toFlatString()); + } else { + PluginMessages.HOME.SET.send(player, homeName); + } + + return null; + } + + @Override + public List tabComplete(JavaPlugin plugin, CommandSender sender, String[] args) { + if (args.length == 1) { + return SimpleCompleter.text(args[args.length - 1], "home", sender.getName()); + } else return Collections.emptyList(); + } + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeDelCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeDelCommand.java deleted file mode 100644 index 4f09c6b..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeDelCommand.java +++ /dev/null @@ -1,37 +0,0 @@ -package cc.carm.plugin.moeteleport.command.home; - -import cc.carm.plugin.moeteleport.MoeTeleport; -import cc.carm.plugin.moeteleport.conf.PluginMessages; -import cc.carm.plugin.moeteleport.conf.location.DataLocation; -import cc.carm.plugin.moeteleport.storage.UserData; -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.Map; - -public class HomeDelCommand 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 (args.length < 1) return false; - - Player player = (Player) sender; - UserData data = MoeTeleport.getUserManager().getData(player); - String homeName = args[0]; - Map.Entry locationInfo = data.getHomeLocation(homeName); - if (locationInfo == null) { - PluginMessages.Home.NOT_FOUND.send(player); - } else { - PluginMessages.Home.REMOVED.send(player, locationInfo.getKey(), locationInfo.getValue().toFlatString()); - data.delHomeLocation(homeName); - } - return true; - } - - -} \ No newline at end of file diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeDeleteCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeDeleteCommand.java new file mode 100644 index 0000000..4e8ec18 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeDeleteCommand.java @@ -0,0 +1,54 @@ +package cc.carm.plugin.moeteleport.command.home; + +import cc.carm.plugin.moeteleport.command.parent.HomeCommands; +import cc.carm.plugin.moeteleport.command.sub.HomeSubCommand; +import cc.carm.plugin.moeteleport.conf.PluginMessages; +import cc.carm.plugin.moeteleport.conf.location.DataLocation; +import cc.carm.plugin.moeteleport.storage.UserData; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public class HomeDeleteCommand extends HomeSubCommand { + + public HomeDeleteCommand(@NotNull HomeCommands parent, String name, String... aliases) { + super(parent, name, aliases); + } + + @Override + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) throws Exception { + if (!(sender instanceof Player)) { + PluginMessages.NOT_PLAYER.send(sender); + return null; + } + + if (args.length < 1) return getParent().noArgs(sender); + + Player player = (Player) sender; + UserData data = getData(player); + String homeName = args[0]; + + Map.Entry locationInfo = data.getHomeLocation(homeName); + if (locationInfo == null) { + PluginMessages.HOME.NOT_FOUND.send(player); + } else { + PluginMessages.HOME.REMOVED.send(player, locationInfo.getKey(), locationInfo.getValue().toFlatString()); + data.delHomeLocation(homeName); + } + + return null; + } + + @Override + public List tabComplete(JavaPlugin plugin, CommandSender sender, String[] args) { + if (args.length == 1) { + return listHomes(sender, args[args.length - 1]); + } else return Collections.emptyList(); + } + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeListCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeListCommand.java index fdeaa93..72d0052 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeListCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeListCommand.java @@ -1,25 +1,37 @@ package cc.carm.plugin.moeteleport.command.home; -import cc.carm.plugin.moeteleport.MoeTeleport; +import cc.carm.plugin.moeteleport.command.parent.HomeCommands; +import cc.carm.plugin.moeteleport.command.sub.HomeSubCommand; import cc.carm.plugin.moeteleport.conf.PluginMessages; import cc.carm.plugin.moeteleport.storage.UserData; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; -public class HomeListCommand implements CommandExecutor { +public class HomeListCommand extends HomeSubCommand { - @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 = MoeTeleport.getUserManager().getData(player); - PluginMessages.Home.List.HEADER.send(player); - data.getHomeLocations().forEach((name, loc) -> PluginMessages.Home.List.OBJECT.send(player, name, loc.toFlatString())); - return true; + public HomeListCommand(@NotNull HomeCommands parent, String name, String... aliases) { + super(parent, name, aliases); } -} \ No newline at end of file + @Override + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) { + if (!(sender instanceof Player)) { + PluginMessages.NOT_PLAYER.send(sender); + return null; + } + + Player player = (Player) sender; + UserData data = getData(player); + + if (data.getHomeLocations().isEmpty()) { + PluginMessages.HOME.EMPTY.send(sender); + return null; + } + + PluginMessages.HOME.LIST.HEADER.send(player); + data.getHomeLocations().forEach((name, loc) -> PluginMessages.HOME.LIST.OBJECT.send(player, name, loc.toFlatString())); + return null; + } +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeSetCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeSetCommand.java deleted file mode 100644 index 6d80e65..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeSetCommand.java +++ /dev/null @@ -1,49 +0,0 @@ -package cc.carm.plugin.moeteleport.command.home; - -import cc.carm.plugin.moeteleport.MoeTeleport; -import cc.carm.plugin.moeteleport.conf.PluginMessages; -import cc.carm.plugin.moeteleport.conf.location.DataLocation; -import cc.carm.plugin.moeteleport.storage.UserData; -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.Map; - -public class HomeSetCommand 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 = MoeTeleport.getUserManager().getData(player); - String homeName = args.length >= 1 ? args[0] : "home"; - - if (homeName.length() > 32) { - // 限定家的名字长度 - PluginMessages.Home.NAME_TOO_LONG.send(sender); - return true; - } - Map.Entry lastHomeLocation = data.getHomeLocation(homeName); - - int maxHome = MoeTeleport.getUserManager().getMaxHome(player); - if (data.getHomeLocations().size() >= maxHome && lastHomeLocation == null) { - PluginMessages.Home.OVER_LIMIT.send(sender, maxHome); - return true; - } - - data.setHomeLocation(homeName, player.getLocation()); - if (lastHomeLocation != null) { - PluginMessages.Home.OVERRIDE.send(sender, homeName, lastHomeLocation.getValue().toFlatString()); - } else { - PluginMessages.Home.SET.send(player, homeName); - } - - return true; - } - - -} \ No newline at end of file diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeTeleportCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeTeleportCommand.java new file mode 100644 index 0000000..58b0585 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeTeleportCommand.java @@ -0,0 +1,52 @@ +package cc.carm.plugin.moeteleport.command.home; + +import cc.carm.plugin.moeteleport.command.parent.HomeCommands; +import cc.carm.plugin.moeteleport.command.sub.HomeSubCommand; +import cc.carm.plugin.moeteleport.conf.PluginMessages; +import cc.carm.plugin.moeteleport.conf.location.DataLocation; +import cc.carm.plugin.moeteleport.manager.TeleportManager; +import cc.carm.plugin.moeteleport.storage.UserData; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public class HomeTeleportCommand extends HomeSubCommand { + + public HomeTeleportCommand(@NotNull HomeCommands parent, String name, String... aliases) { + super(parent, name, aliases); + } + + @Override + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) throws Exception { + if (!(sender instanceof Player)) { + PluginMessages.NOT_PLAYER.send(sender); + return null; + } + + Player player = (Player) sender; + UserData data = getData(player); + String homeName = args.length >= 1 ? args[0] : null; + + Map.Entry locationInfo = data.getHomeLocation(homeName); + if (locationInfo == null) { + PluginMessages.HOME.NOT_FOUND.send(player); + } else { + TeleportManager.teleport(player, locationInfo.getValue(), false); + } + + return null; + } + + @Override + public List tabComplete(JavaPlugin plugin, CommandSender sender, String[] args) { + if (args.length == 1) { + return listHomes(sender, args[args.length - 1]); + } else return Collections.emptyList(); + } + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeTpCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeTpCommand.java deleted file mode 100644 index 82d5712..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeTpCommand.java +++ /dev/null @@ -1,35 +0,0 @@ -package cc.carm.plugin.moeteleport.command.home; - -import cc.carm.plugin.moeteleport.MoeTeleport; -import cc.carm.plugin.moeteleport.conf.PluginMessages; -import cc.carm.plugin.moeteleport.conf.location.DataLocation; -import cc.carm.plugin.moeteleport.manager.TeleportManager; -import cc.carm.plugin.moeteleport.storage.UserData; -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.Map; - -public class HomeTpCommand 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 = MoeTeleport.getUserManager().getData(player); - String homeName = args.length >= 1 ? args[0] : null; - Map.Entry locationInfo = data.getHomeLocation(homeName); - if (locationInfo == null) { - PluginMessages.Home.NOT_FOUND.send(player); - } else { - TeleportManager.teleport(player, locationInfo.getValue(), false); - } - return true; - } - - -} \ No newline at end of file diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/parent/BackCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/parent/BackCommand.java new file mode 100644 index 0000000..0a8a1f9 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/parent/BackCommand.java @@ -0,0 +1,43 @@ +package cc.carm.plugin.moeteleport.command.parent; + +import cc.carm.lib.easyplugin.command.SubCommand; +import cc.carm.plugin.moeteleport.MoeTeleport; +import cc.carm.plugin.moeteleport.command.MainCommands; +import cc.carm.plugin.moeteleport.conf.PluginConfig; +import cc.carm.plugin.moeteleport.conf.PluginMessages; +import cc.carm.plugin.moeteleport.manager.TeleportManager; +import cc.carm.plugin.moeteleport.storage.UserData; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +public class BackCommand extends SubCommand { + + public BackCommand(@NotNull MainCommands parent, String name, String... aliases) { + super(parent, name, aliases); + } + + @Override + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) { + if (!(sender instanceof Player)) { + PluginMessages.NOT_PLAYER.send(sender); + return null; + } + + if (!PluginConfig.BACK.ENABLE.getNotNull()) { + PluginMessages.NOT_ENABLED.send(sender); + return null; + } + + Player player = (Player) sender; + UserData data = MoeTeleport.getUserManager().getData(player); + if (data.getLastLocation() == null) { + PluginMessages.BACK.NO_LAST_LOCATION.send(player); + return null; + } + TeleportManager.teleport(player, data.getLastLocation(), false); + return null; + } + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/parent/HomeCommands.java b/src/main/java/cc/carm/plugin/moeteleport/command/parent/HomeCommands.java new file mode 100644 index 0000000..61c4bd4 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/parent/HomeCommands.java @@ -0,0 +1,53 @@ +package cc.carm.plugin.moeteleport.command.parent; + +import cc.carm.lib.easyplugin.command.CommandHandler; +import cc.carm.plugin.moeteleport.command.MainCommands; +import cc.carm.plugin.moeteleport.command.home.HomeCreateCommand; +import cc.carm.plugin.moeteleport.command.home.HomeDeleteCommand; +import cc.carm.plugin.moeteleport.command.home.HomeListCommand; +import cc.carm.plugin.moeteleport.command.home.HomeTeleportCommand; +import cc.carm.plugin.moeteleport.conf.PluginConfig; +import cc.carm.plugin.moeteleport.conf.PluginMessages; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +public class HomeCommands extends CommandHandler { + + protected final @NotNull MainCommands main; + + public HomeCommands(@NotNull JavaPlugin plugin, @NotNull MainCommands main, + @NotNull String cmd, @NotNull String... aliases) { + super(plugin, cmd, aliases); + this.main = main; + + registerSubCommand(new HomeTeleportCommand(this, "to", "teleport", "tp")); + registerSubCommand(new HomeListCommand(this, "list", "ls")); + registerSubCommand(new HomeCreateCommand(this, "set", "create")); + registerSubCommand(new HomeDeleteCommand(this, "delete", "remove", "del")); + } + + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (!PluginConfig.HOMES.ENABLE.getNotNull()) { + PluginMessages.NOT_ENABLED.send(sender); + return true; + } + + return super.onCommand(sender, command, label, args); + } + + @Override + public Void noArgs(CommandSender sender) { + PluginMessages.USAGE.HOMES.send(sender); + return null; + } + + @Override + public Void noPermission(CommandSender sender) { + return main.noPermission(sender); + } + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/parent/ReloadCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/parent/ReloadCommand.java new file mode 100644 index 0000000..e86c9bb --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/parent/ReloadCommand.java @@ -0,0 +1,41 @@ +package cc.carm.plugin.moeteleport.command.parent; + +import cc.carm.lib.easyplugin.command.SubCommand; +import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.command.MainCommands; +import cc.carm.plugin.moeteleport.conf.PluginMessages; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +public class ReloadCommand extends SubCommand { + + public ReloadCommand(@NotNull MainCommands parent, String name, String... aliases) { + super(parent, name, aliases); + } + + @Override + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) { + + PluginMessages.RELOAD.START.send(sender); + long s1 = System.currentTimeMillis(); + + try { + Main.getInstance().getConfigProvider().reload(); + Main.getInstance().getMessageProvider().reload(); + + PluginMessages.RELOAD.COMPLETE.send(sender, System.currentTimeMillis() - s1); + } catch (Exception ex) { + PluginMessages.RELOAD.ERROR.send(sender); + ex.printStackTrace(); + } + + return null; + } + + @Override + public boolean hasPermission(CommandSender sender) { + return sender.hasPermission("moeteleport.reload"); + } + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/parent/TeleportCommands.java b/src/main/java/cc/carm/plugin/moeteleport/command/parent/TeleportCommands.java new file mode 100644 index 0000000..d11df5f --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/parent/TeleportCommands.java @@ -0,0 +1,39 @@ +package cc.carm.plugin.moeteleport.command.parent; + +import cc.carm.lib.easyplugin.command.CommandHandler; +import cc.carm.plugin.moeteleport.command.MainCommands; +import cc.carm.plugin.moeteleport.command.teleport.TeleportHandleCommand; +import cc.carm.plugin.moeteleport.command.teleport.TeleportRequestCommand; +import cc.carm.plugin.moeteleport.conf.PluginMessages; +import cc.carm.plugin.moeteleport.model.TeleportRequest; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +public class TeleportCommands extends CommandHandler { + + protected final @NotNull MainCommands main; + + public TeleportCommands(@NotNull JavaPlugin plugin, @NotNull MainCommands main, + @NotNull String cmd, @NotNull String... aliases) { + super(plugin, cmd, aliases); + this.main = main; + + registerSubCommand(new TeleportRequestCommand(this, TeleportRequest.RequestType.TPA, "to")); + registerSubCommand(new TeleportRequestCommand(this, TeleportRequest.RequestType.TPA_HERE, "here")); + registerSubCommand(new TeleportHandleCommand(this, true, "accept")); + registerSubCommand(new TeleportHandleCommand(this, false, "deny", "refuse")); + } + + @Override + public Void noArgs(CommandSender sender) { + PluginMessages.USAGE.TELEPORT.send(sender); + return null; + } + + @Override + public Void noPermission(CommandSender sender) { + return main.noPermission(sender); + } + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/parent/WarpCommands.java b/src/main/java/cc/carm/plugin/moeteleport/command/parent/WarpCommands.java new file mode 100644 index 0000000..30f773b --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/parent/WarpCommands.java @@ -0,0 +1,51 @@ +package cc.carm.plugin.moeteleport.command.parent; + +import cc.carm.lib.easyplugin.command.CommandHandler; +import cc.carm.plugin.moeteleport.command.MainCommands; +import cc.carm.plugin.moeteleport.command.warp.*; +import cc.carm.plugin.moeteleport.conf.PluginConfig; +import cc.carm.plugin.moeteleport.conf.PluginMessages; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +public class WarpCommands extends CommandHandler { + + protected final @NotNull MainCommands main; + + public WarpCommands(@NotNull JavaPlugin plugin, @NotNull MainCommands main, + @NotNull String cmd, @NotNull String... aliases) { + super(plugin, cmd, aliases); + this.main = main; + + registerSubCommand(new WarpTeleportCommand(this, "to", "teleport", "tp")); + registerSubCommand(new WarpListCommand(this, "list", "ls")); + registerSubCommand(new WarpInfoCommand(this, "info", "i")); + registerSubCommand(new WarpCreateCommand(this, "set", "create")); + registerSubCommand(new WarpDeleteCommand(this, "delete", "remove", "del")); + + } + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (!PluginConfig.WARPS.ENABLE.getNotNull()) { + PluginMessages.NOT_ENABLED.send(sender); + return true; + } + + return super.onCommand(sender, command, label, args); + } + + @Override + public Void noArgs(CommandSender sender) { + PluginMessages.USAGE.WARPS.send(sender); + return null; + } + + @Override + public Void noPermission(CommandSender sender) { + return main.noPermission(sender); + } + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/sub/HomeSubCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/sub/HomeSubCommand.java new file mode 100644 index 0000000..f94c4b0 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/sub/HomeSubCommand.java @@ -0,0 +1,40 @@ +package cc.carm.plugin.moeteleport.command.sub; + +import cc.carm.lib.easyplugin.command.SubCommand; +import cc.carm.plugin.moeteleport.MoeTeleport; +import cc.carm.plugin.moeteleport.command.parent.HomeCommands; +import cc.carm.plugin.moeteleport.storage.UserData; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +public abstract class HomeSubCommand extends SubCommand { + public HomeSubCommand(@NotNull HomeCommands parent, String name, String... aliases) { + super(parent, name, aliases); + } + + public @NotNull UserData getData(Player player) { + return MoeTeleport.getUserManager().getData(player); + } + + public @Nullable UserData getData(UUID player) { + return MoeTeleport.getUserManager().getData(player); + } + + public @NotNull List listHomes(CommandSender sender, String input) { + if (!(sender instanceof Player)) return Collections.emptyList(); + + return MoeTeleport.getUserManager().getData((Player) sender) + .getHomeLocations().keySet().stream() + .filter(s -> StringUtil.startsWithIgnoreCase(s, input)) + .limit(10).collect(Collectors.toList()); + } + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/sub/TeleportSubCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/sub/TeleportSubCommand.java new file mode 100644 index 0000000..d9065c7 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/sub/TeleportSubCommand.java @@ -0,0 +1,43 @@ +package cc.carm.plugin.moeteleport.command.sub; + +import cc.carm.lib.easyplugin.command.SubCommand; +import cc.carm.plugin.moeteleport.MoeTeleport; +import cc.carm.plugin.moeteleport.command.parent.TeleportCommands; +import cc.carm.plugin.moeteleport.storage.UserData; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.UUID; +import java.util.stream.Collectors; + +public abstract class TeleportSubCommand extends SubCommand { + + public TeleportSubCommand(@NotNull TeleportCommands parent, String name, String... aliases) { + super(parent, name, aliases); + } + + public @NotNull UserData getData(Player player) { + return MoeTeleport.getUserManager().getData(player); + } + + public @Nullable UserData getData(UUID player) { + return MoeTeleport.getUserManager().getData(player); + } + + public @NotNull List listRequests(CommandSender sender, String input) { + if (!(sender instanceof Player)) return Collections.emptyList(); + return getData((Player) sender).getReceivedRequests().keySet().stream() + .map(Bukkit::getPlayer).filter(Objects::nonNull).map(HumanEntity::getName) + .filter(s -> StringUtil.startsWithIgnoreCase(s, input)) + .limit(10).collect(Collectors.toList()); + } + +} \ No newline at end of file diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/sub/WarpSubCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/sub/WarpSubCommand.java new file mode 100644 index 0000000..d7e2fe9 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/sub/WarpSubCommand.java @@ -0,0 +1,53 @@ +package cc.carm.plugin.moeteleport.command.sub; + +import cc.carm.lib.easyplugin.command.SubCommand; +import cc.carm.plugin.moeteleport.MoeTeleport; +import cc.carm.plugin.moeteleport.command.parent.WarpCommands; +import cc.carm.plugin.moeteleport.manager.WarpManager; +import cc.carm.plugin.moeteleport.model.WarpInfo; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Unmodifiable; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public abstract class WarpSubCommand extends SubCommand { + public WarpSubCommand(@NotNull WarpCommands parent, String name, String... aliases) { + super(parent, name, aliases); + } + + public WarpManager getManager() { + return MoeTeleport.getWarpManager(); + } + + @NotNull + @Unmodifiable + public Map listWarps() { + return getManager().listWarps(); + } + + public WarpInfo getWarp(@NotNull String name) { + return getManager().getWarp(name); + } + + public List listWarpNames(CommandSender sender, String input, boolean limitOwner) { + if (limitOwner && sender instanceof Player) { + Player player = (Player) sender; + return listWarps().entrySet().stream() + .filter(entry -> entry.getValue().getOwner() != null) + .filter(entry -> entry.getValue().getOwner().equals(player.getUniqueId())) + .map(Map.Entry::getKey) + .filter(s -> StringUtil.startsWithIgnoreCase(s, input)) + .limit(10).collect(Collectors.toList()); + } else { + return listWarps().keySet().stream() + .filter(s -> StringUtil.startsWithIgnoreCase(s, input)) + .limit(10).collect(Collectors.toList()); + } + } + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpHandleCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/teleport/TeleportHandleCommand.java similarity index 50% rename from src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpHandleCommand.java rename to src/main/java/cc/carm/plugin/moeteleport/command/teleport/TeleportHandleCommand.java index 368afc9..39d480c 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpHandleCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/teleport/TeleportHandleCommand.java @@ -1,54 +1,68 @@ -package cc.carm.plugin.moeteleport.command.tpa; +package cc.carm.plugin.moeteleport.command.teleport; import cc.carm.plugin.moeteleport.MoeTeleport; +import cc.carm.plugin.moeteleport.command.parent.TeleportCommands; +import cc.carm.plugin.moeteleport.command.sub.TeleportSubCommand; import cc.carm.plugin.moeteleport.conf.PluginMessages; import cc.carm.plugin.moeteleport.model.TeleportRequest; import cc.carm.plugin.moeteleport.storage.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.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; +import java.util.Collections; import java.util.Comparator; +import java.util.List; -public class TpHandleCommand implements CommandExecutor { +public class TeleportHandleCommand extends TeleportSubCommand { + + protected final boolean accept; + + public TeleportHandleCommand(@NotNull TeleportCommands parent, boolean accept, String name, String... aliases) { + super(parent, name, aliases); + this.accept = accept; + } @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, - @NotNull String label, @NotNull String[] args) { - if (!(sender instanceof Player)) return false; + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) throws Exception { + if (!(sender instanceof Player)) { + PluginMessages.NOT_PLAYER.send(sender); + return null; + } + Player player = (Player) sender; UserData data = MoeTeleport.getUserManager().getData(player); if (data.getReceivedRequests().isEmpty()) { - PluginMessages.Requests.EMPTY_REQUESTS.send(player); - return true; + PluginMessages.REQUESTS.EMPTY_REQUESTS.send(player); + return null; } + String targetName = args.length > 0 ? args[0] : null; - boolean accept = command.getName().equalsIgnoreCase("tpAccept"); data.setEnableAutoSelect(false); + if (targetName != null) { Player target = Bukkit.getPlayer(targetName); if (target == null || !data.getReceivedRequests().containsKey(target.getUniqueId())) { - PluginMessages.Requests.NO_REQUEST_FROM.send(player, target == null ? targetName : target.getName()); + PluginMessages.REQUESTS.NO_REQUEST_FROM.send(player, target == null ? targetName : target.getName()); } else { - handle(data.getReceivedRequests().get(target.getUniqueId()), accept); // 交给Manager处理 + handle(data.getReceivedRequests().get(target.getUniqueId())); // 交给Manager处理 } } else { if (data.getReceivedRequests().size() == 1 || data.isEnableAutoSelect()) { data.getReceivedRequests().values().stream() .min(Comparator.comparingLong(TeleportRequest::getActiveTime)) - .ifPresent(request -> handle(request, accept)); + .ifPresent(this::handle); } else { - PluginMessages.Requests.MULTI.send(player, data.getReceivedRequests().size(), command.getName()); + PluginMessages.REQUESTS.MULTI.send(player, data.getReceivedRequests().size(), (accept ? "tpaccept" : "tpdeny")); data.setEnableAutoSelect(true); } } - return true; + return null; } - private void handle(TeleportRequest request, boolean accept) { + private void handle(TeleportRequest request) { if (accept) { MoeTeleport.getRequestManager().acceptRequest(request); } else { @@ -56,4 +70,11 @@ public class TpHandleCommand implements CommandExecutor { } } + @Override + public List tabComplete(JavaPlugin plugin, CommandSender sender, String[] args) { + if (args.length == 1) { + return listRequests(sender, args[args.length - 1]); + } else return Collections.emptyList(); + } + } diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/teleport/TeleportRandomCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/teleport/TeleportRandomCommand.java new file mode 100644 index 0000000..64fd237 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/teleport/TeleportRandomCommand.java @@ -0,0 +1,21 @@ +package cc.carm.plugin.moeteleport.command.teleport; + +import cc.carm.plugin.moeteleport.command.parent.TeleportCommands; +import cc.carm.plugin.moeteleport.command.sub.TeleportSubCommand; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +public class TeleportRandomCommand extends TeleportSubCommand { + + public TeleportRandomCommand(@NotNull TeleportCommands parent, String name, String... aliases) { + super(parent, name, aliases); + } + + @Override + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) throws Exception { + //TODO 随机坐标传送 + return null; + } + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/teleport/TeleportRequestCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/teleport/TeleportRequestCommand.java new file mode 100644 index 0000000..1824fb5 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/teleport/TeleportRequestCommand.java @@ -0,0 +1,73 @@ +package cc.carm.plugin.moeteleport.command.teleport; + +import cc.carm.lib.easyplugin.command.SimpleCompleter; +import cc.carm.plugin.moeteleport.MoeTeleport; +import cc.carm.plugin.moeteleport.command.parent.TeleportCommands; +import cc.carm.plugin.moeteleport.command.sub.TeleportSubCommand; +import cc.carm.plugin.moeteleport.conf.PluginMessages; +import cc.carm.plugin.moeteleport.model.TeleportRequest; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; + +public class TeleportRequestCommand extends TeleportSubCommand { + + private final @NotNull TeleportRequest.RequestType type; + + public TeleportRequestCommand(@NotNull TeleportCommands parent, + @NotNull TeleportRequest.RequestType type, + String name, String... aliases) { + super(parent, name, aliases); + this.type = type; + } + + @Override + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) throws Exception { + if (!(sender instanceof Player)) { + PluginMessages.NOT_PLAYER.send(sender); + return null; + } + + if (args.length < 1) return getParent().noArgs(sender); + + Player player = (Player) sender; + Player target = Bukkit.getPlayer(args[0]); + if (target == null) { + PluginMessages.NOT_ONLINE.send(player); + return null; + } + + if (player == target) { + // fix #5 - 玩家给自己发送传送请求 + PluginMessages.REQUESTS.SELF.send(player); + return null; + } + + TeleportRequest request = MoeTeleport.getUserManager().getData(target).getReceivedRequests().get(player.getUniqueId()); + if (request != null) { + PluginMessages.REQUESTS.DUPLICATE.send(sender, target.getName(), request.getRemainSeconds()); + return null; + } + + MoeTeleport.getRequestManager().sendRequest(player, target, type); + return null; + } + + @Override + public List tabComplete(JavaPlugin plugin, CommandSender sender, String[] args) { + if (args.length == 1) { + return SimpleCompleter.objects( + args[args.length - 1], 15, + Bukkit.getOnlinePlayers().stream() + .map(Player::getName) + .filter(s -> !s.equalsIgnoreCase(sender.getName())) + ); + } else return Collections.emptyList(); + } + +} 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 deleted file mode 100644 index 7b30dff..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpaCommand.java +++ /dev/null @@ -1,46 +0,0 @@ -package cc.carm.plugin.moeteleport.command.tpa; - -import cc.carm.plugin.moeteleport.MoeTeleport; -import cc.carm.plugin.moeteleport.conf.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; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -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) || args.length < 1) return false; - Player player = (Player) sender; - Player target = Bukkit.getPlayer(args[0]); - if (target == null) { - PluginMessages.NOT_ONLINE.send(player); - return true; - } - - if (player == target) { - // fix #5 - 玩家给自己发送传送请求 - PluginMessages.Requests.SELF.send(player); - return true; - } - - TeleportRequest request = MoeTeleport.getUserManager().getData(target).getReceivedRequests().get(player.getUniqueId()); - if (request != null) { - PluginMessages.Requests.DUPLICATE.send(sender, target.getName(), request.getRemainSeconds()); - return true; - } - if (command.getName().equalsIgnoreCase("tpa")) { - MoeTeleport.getRequestManager().sendRequest(player, target, TeleportRequest.RequestType.TPA); - } else { - MoeTeleport.getRequestManager().sendRequest(player, target, TeleportRequest.RequestType.TPA_HERE); - } - - return true; - } - -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpCreateCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpCreateCommand.java new file mode 100644 index 0000000..ee7abaf --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpCreateCommand.java @@ -0,0 +1,71 @@ +package cc.carm.plugin.moeteleport.command.warp; + +import cc.carm.lib.easyplugin.command.SimpleCompleter; +import cc.carm.plugin.moeteleport.MoeTeleport; +import cc.carm.plugin.moeteleport.command.parent.WarpCommands; +import cc.carm.plugin.moeteleport.command.sub.WarpSubCommand; +import cc.carm.plugin.moeteleport.conf.PluginMessages; +import cc.carm.plugin.moeteleport.model.WarpInfo; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; + +public class WarpCreateCommand extends WarpSubCommand { + + public WarpCreateCommand(@NotNull WarpCommands parent, String name, String... aliases) { + super(parent, name, aliases); + } + + @Override + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) { + if (!(sender instanceof Player)) { + PluginMessages.NOT_PLAYER.send(sender); + return null; + } + + Player player = (Player) sender; + String warpName = args.length >= 1 ? args[0] : player.getName(); + + if (warpName.length() > 16) { // 超过地标的名字长度限定 + PluginMessages.WARP.NAME_TOO_LONG.send(sender); + return null; + } + + WarpInfo info = getWarp(warpName); + + if (!player.isOp() && !player.hasPermission("MoeTeleport.admin")) { + if (info != null && (info.getOwner() == null || !info.getOwner().equals(player.getUniqueId()))) { + PluginMessages.WARP.NOT_OWNER.send(sender, warpName); + return null; + } + + int maxWarp = MoeTeleport.getUserManager().getMaxWarps(player); + long currentUsed = MoeTeleport.getUserManager().countUserWarps(player.getUniqueId()); + if (currentUsed >= maxWarp && info == null) { + PluginMessages.WARP.OVER_LIMIT.send(sender, maxWarp); + return null; + } + } + + getManager().setWarpAsync(warpName, player.getUniqueId(), player.getLocation()); + if (info != null) { + PluginMessages.WARP.OVERRIDE.send(sender, warpName, info.getLocation().toFlatString()); + } else { + PluginMessages.WARP.SET.send(sender, warpName); + } + + return null; + } + + @Override + public List tabComplete(JavaPlugin plugin, CommandSender sender, String[] args) { + if (args.length == 1) { + return SimpleCompleter.text(args[args.length - 1], sender.getName()); + } else return Collections.emptyList(); + } + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpDelCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpDelCommand.java deleted file mode 100644 index d176191..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpDelCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -package cc.carm.plugin.moeteleport.command.warp; - -import cc.carm.plugin.moeteleport.MoeTeleport; -import cc.carm.plugin.moeteleport.conf.PluginMessages; -import cc.carm.plugin.moeteleport.model.WarpInfo; -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; - -public class WarpDelCommand 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 (args.length < 1) return false; - String warpName = args[0]; - Player player = (Player) sender; - - WarpInfo info = MoeTeleport.getWarpManager().getWarp(warpName); - if (info == null) { - PluginMessages.Warp.NOT_FOUND.send(player); - return true; - } - - if (!player.isOp() && !player.hasPermission("MoeTeleport.admin")) { - if (info.getOwner() == null || !info.getOwner().equals(player.getUniqueId())) { - PluginMessages.Warp.NOT_OWNER.send(player); - return true; - } - } - - MoeTeleport.getWarpManager().delWarpAsync(warpName); - PluginMessages.Warp.REMOVED.send(player, warpName, info.getLocation().toFlatString()); - - return true; - } -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpDeleteCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpDeleteCommand.java new file mode 100644 index 0000000..071737b --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpDeleteCommand.java @@ -0,0 +1,55 @@ +package cc.carm.plugin.moeteleport.command.warp; + +import cc.carm.plugin.moeteleport.command.parent.WarpCommands; +import cc.carm.plugin.moeteleport.command.sub.WarpSubCommand; +import cc.carm.plugin.moeteleport.conf.PluginMessages; +import cc.carm.plugin.moeteleport.model.WarpInfo; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; + +public class WarpDeleteCommand extends WarpSubCommand { + + public WarpDeleteCommand(@NotNull WarpCommands parent, String name, String... aliases) { + super(parent, name, aliases); + } + + @Override + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) throws Exception { + if (args.length < 1) return getParent().noArgs(sender); + + String warpName = args[0]; + + WarpInfo info = getWarp(warpName); + if (info == null) { + PluginMessages.WARP.NOT_FOUND.send(sender, warpName); + return null; + } + + if (sender instanceof Player && !sender.isOp() + && !sender.hasPermission("MoeTeleport.admin")) { + Player player = (Player) sender; + if (info.getOwner() == null || !info.getOwner().equals(player.getUniqueId())) { + PluginMessages.WARP.NOT_OWNER.send(sender); + return null; + } + } + + getManager().delWarpAsync(warpName); + PluginMessages.WARP.REMOVED.send(sender, warpName, info.getLocation().toFlatString()); + + return null; + } + + @Override + public List tabComplete(JavaPlugin plugin, CommandSender sender, String[] args) { + if (args.length == 1) { + return listWarpNames(sender, args[args.length - 1], true); + } else return Collections.emptyList(); + } + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpInfoCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpInfoCommand.java index a1deb22..e50ceb1 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpInfoCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpInfoCommand.java @@ -1,35 +1,47 @@ package cc.carm.plugin.moeteleport.command.warp; -import cc.carm.plugin.moeteleport.MoeTeleport; +import cc.carm.plugin.moeteleport.command.parent.WarpCommands; +import cc.carm.plugin.moeteleport.command.sub.WarpSubCommand; import cc.carm.plugin.moeteleport.conf.PluginMessages; import cc.carm.plugin.moeteleport.model.WarpInfo; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; -public class WarpInfoCommand implements CommandExecutor { +import java.util.Collections; +import java.util.List; + +public class WarpInfoCommand extends WarpSubCommand { + + public WarpInfoCommand(@NotNull WarpCommands parent, String name, String... aliases) { + super(parent, name, aliases); + } @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, - @NotNull String label, @NotNull String[] args) { - if (!(sender instanceof Player)) return false; + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) { String warpName = args[0]; - Player player = (Player) sender; - WarpInfo info = MoeTeleport.getWarpManager().getWarp(warpName); + WarpInfo info = getWarp(warpName); if (info == null) { - PluginMessages.Warp.NOT_FOUND.send(player); - return true; + PluginMessages.WARP.NOT_FOUND.send(sender, warpName); + return null; } String ownerName = info.getOwnerName(); if (ownerName != null) { - PluginMessages.Warp.INFO_FULL.send(player, warpName, ownerName, info.getLocation().toFlatString()); + PluginMessages.WARP.INFO_FULL.send(sender, warpName, ownerName, info.getLocation().toFlatString()); } else { - PluginMessages.Warp.INFO_LOCATION.send(player, warpName, info.getLocation().toFlatString()); + PluginMessages.WARP.INFO_LOCATION.send(sender, warpName, info.getLocation().toFlatString()); } - return true; + + return null; } + + @Override + public List tabComplete(JavaPlugin plugin, CommandSender sender, String[] args) { + if (args.length == 1) { + return listWarpNames(sender, args[args.length - 1], false); + } else return Collections.emptyList(); + } + } diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpListCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpListCommand.java index 97c800a..3eec5b5 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpListCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpListCommand.java @@ -1,28 +1,31 @@ package cc.carm.plugin.moeteleport.command.warp; -import cc.carm.plugin.moeteleport.MoeTeleport; +import cc.carm.lib.easyplugin.command.SimpleCompleter; +import cc.carm.plugin.moeteleport.command.parent.WarpCommands; +import cc.carm.plugin.moeteleport.command.sub.WarpSubCommand; import cc.carm.plugin.moeteleport.conf.PluginMessages; import cc.carm.plugin.moeteleport.model.WarpInfo; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.IntStream; -public class WarpListCommand implements CommandExecutor { +public class WarpListCommand extends WarpSubCommand { + + public WarpListCommand(@NotNull WarpCommands parent, String name, String... aliases) { + super(parent, name, aliases); + } @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; - - ArrayList warps = new ArrayList<>(MoeTeleport.getWarpManager().listWarps().values()); + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) { + ArrayList warps = new ArrayList<>(listWarps().values()); if (warps.isEmpty()) { - PluginMessages.Warp.EMPTY.send(player); - return true; + PluginMessages.WARP.EMPTY.send(sender); + return null; } String pageString = args.length > 0 ? args[0] : null; @@ -40,19 +43,26 @@ public class WarpListCommand implements CommandExecutor { int startIndex = Math.max(0, (currentPage - 1) * 10); int endIndex = Math.min(warps.size(), startIndex + 9); - PluginMessages.Warp.List.HEADER.send(player, currentPage, maxPage); + PluginMessages.WARP.LIST.HEADER.send(sender, currentPage, maxPage); for (int i = startIndex; i < endIndex; i++) { WarpInfo info = warps.get(i); String ownerName = info.getOwnerName(); if (ownerName == null) { - PluginMessages.Warp.List.OBJECT_NO_OWNER.send(player, info.getName(), info.getLocation().toFlatString()); + PluginMessages.WARP.LIST.OBJECT_NO_OWNER.send(sender, info.getName(), info.getLocation().toFlatString()); } else { - PluginMessages.Warp.List.OBJECT.send(player, info.getName(), ownerName, info.getLocation().toFlatString()); + PluginMessages.WARP.LIST.OBJECT.send(sender, info.getName(), ownerName, info.getLocation().toFlatString()); } } - return true; + return null; } + @Override + public List tabComplete(JavaPlugin plugin, CommandSender sender, String[] args) { + if (args.length == 1) { + int maxPage = (int) Math.ceil(listWarps().size() / 10.0); + return SimpleCompleter.objects(args[args.length - 1], IntStream.rangeClosed(1, maxPage).boxed()); + } else return Collections.emptyList(); + } } diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpSetCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpSetCommand.java deleted file mode 100644 index 6e6a2b7..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpSetCommand.java +++ /dev/null @@ -1,51 +0,0 @@ -package cc.carm.plugin.moeteleport.command.warp; - -import cc.carm.plugin.moeteleport.MoeTeleport; -import cc.carm.plugin.moeteleport.conf.PluginMessages; -import cc.carm.plugin.moeteleport.model.WarpInfo; -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; - -public class WarpSetCommand 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; - String warpName = args.length >= 1 ? args[0] : player.getName(); - - if (warpName.length() > 16) { - // 限定家的名字长度 - PluginMessages.Warp.NAME_TOO_LONG.send(sender); - return true; - } - WarpInfo info = MoeTeleport.getWarpManager().getWarp(warpName); - - if (!player.isOp() && !player.hasPermission("MoeTeleport.admin")) { - if (info != null && (info.getOwner() == null || !info.getOwner().equals(player.getUniqueId()))) { - PluginMessages.Warp.NOT_OWNER.send(sender, warpName); - return true; - } - - int maxWarp = MoeTeleport.getUserManager().getMaxWarps(player); - long currentUsed = MoeTeleport.getUserManager().countUserWarps(player.getUniqueId()); - if (currentUsed >= maxWarp && info == null) { - PluginMessages.Warp.OVER_LIMIT.send(sender, maxWarp); - return true; - } - } - - MoeTeleport.getWarpManager().setWarpAsync(warpName, player.getUniqueId(), player.getLocation()); - if (info != null) { - PluginMessages.Warp.OVERRIDE.send(sender, warpName, info.getLocation().toFlatString()); - } else { - PluginMessages.Warp.SET.send(sender, warpName); - } - - return true; - } -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpTeleportCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpTeleportCommand.java new file mode 100644 index 0000000..49afd6f --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpTeleportCommand.java @@ -0,0 +1,50 @@ +package cc.carm.plugin.moeteleport.command.warp; + +import cc.carm.plugin.moeteleport.command.parent.WarpCommands; +import cc.carm.plugin.moeteleport.command.sub.WarpSubCommand; +import cc.carm.plugin.moeteleport.conf.PluginMessages; +import cc.carm.plugin.moeteleport.manager.TeleportManager; +import cc.carm.plugin.moeteleport.model.WarpInfo; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; + +public class WarpTeleportCommand extends WarpSubCommand { + + public WarpTeleportCommand(@NotNull WarpCommands parent, String name, String... aliases) { + super(parent, name, aliases); + } + + @Override + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) { + if (!(sender instanceof Player)) { + PluginMessages.NOT_PLAYER.send(sender); + return null; + } + + if (args.length < 1) return getParent().noArgs(sender); + + Player player = (Player) sender; + + WarpInfo info = getWarp(args[0]); + if (info == null) { + PluginMessages.WARP.NOT_FOUND.send(player, args[0]); + return null; + } + + TeleportManager.teleport(player, info.getLocation(), false); + return null; + } + + @Override + public List tabComplete(JavaPlugin plugin, CommandSender sender, String[] args) { + if (args.length == 1) { + return listWarpNames(sender, args[args.length - 1], false); + } else return Collections.emptyList(); + } + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpTpCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpTpCommand.java deleted file mode 100644 index c60187f..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpTpCommand.java +++ /dev/null @@ -1,32 +0,0 @@ -package cc.carm.plugin.moeteleport.command.warp; - -import cc.carm.plugin.moeteleport.MoeTeleport; -import cc.carm.plugin.moeteleport.conf.PluginMessages; -import cc.carm.plugin.moeteleport.manager.TeleportManager; -import cc.carm.plugin.moeteleport.model.WarpInfo; -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; - -public class WarpTpCommand 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 (args.length < 1) return false; - Player player = (Player) sender; - - WarpInfo info = MoeTeleport.getWarpManager().getWarp(args[0]); - if (info == null) { - PluginMessages.Warp.NOT_FOUND.send(player); - return true; - } - - TeleportManager.teleport(player, info.getLocation(), false); - return true; - } - -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/conf/PluginConfig.java b/src/main/java/cc/carm/plugin/moeteleport/conf/PluginConfig.java index ae3e3a4..7cd9792 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/conf/PluginConfig.java +++ b/src/main/java/cc/carm/plugin/moeteleport/conf/PluginConfig.java @@ -8,6 +8,7 @@ import cc.carm.lib.configuration.core.value.ConfigValue; import cc.carm.lib.configuration.core.value.type.ConfiguredList; import cc.carm.lib.configuration.core.value.type.ConfiguredMap; import cc.carm.lib.configuration.core.value.type.ConfiguredValue; +import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredTitle; public class PluginConfig extends ConfigurationRoot { @@ -27,6 +28,40 @@ public class PluginConfig extends ConfigurationRoot { }) public static final ConfigValue CHECK_UPDATE = ConfiguredValue.of(Boolean.class, true); + @HeaderComment("简化插件指令设定") + public static final class COMMAND extends ConfigurationRoot { + + @HeaderComment({"是否启用简化指令"}) + public static final ConfigValue ENABLE = ConfiguredValue.of(Boolean.class, true); + + @HeaderComment({ + "简化指令表,配置以方便玩家使用。", + "格式: 简短指令: 本插件子指令(不含前缀)", + "如 [back: back] 代表 玩家可以输入/back 代替 /MoeTeleport back", + "注意:简短指令不应当包含空格,且不可与其他插件指令重复,否则将会被覆盖。", + }) + public static final ConfiguredMap ALIAS = ConfiguredMap.builder(String.class, String.class) + .fromString().defaults((map) -> { + map.put("back", "back"); + map.put("tpa", "teleport to"); + map.put("tpaHere", "teleport here"); + + map.put("home", "home to"); + map.put("setHome", "home set"); + map.put("delHome", "home delete"); + map.put("listHomes", "home list"); + map.put("listHome", "home list"); + + map.put("warp", "warp to"); + map.put("setWarp", "warp set"); + map.put("delWarp", "warp delete"); + map.put("warpInfo", "warp info"); + map.put("listWarps", "warp list"); + map.put("listWarp", "warp list"); + }).build(); + + } + @HeaderComment({"存储相关配置", "注意:存储配置不会通过重载指令生效,如有修改请重新启动服务器。"}) public static final class STORAGE extends ConfigurationRoot { @@ -61,6 +96,21 @@ public class PluginConfig extends ConfigurationRoot { } + @HeaderComment("传送引导过程中的标题") + public static final class TITLE { + + public static final ConfiguredTitle CHANNELING = ConfiguredTitle.create().defaults( + "&d&l传送中...", + "&7传送过程中请不要移动" + ).params("location").fadeIn(0).stay(10).fadeOut(0).build(); + + public static final ConfiguredTitle TELEPORTED = ConfiguredTitle.create().defaults( + "&d&l传送完成", + "&7已将您传送到 %(location)" + ).params("location").fadeIn(0).stay(20).fadeOut(10).build(); + + } + @HeaderComment("传送引导特效与音效") public static final ConfigValue EFFECTS = ConfiguredValue.of(Boolean.class, true); @@ -81,6 +131,9 @@ public class PluginConfig extends ConfigurationRoot { @HeaderComment("返回上一传送点的相关配置") public static final class BACK extends ConfigurationRoot { + @HeaderComment("是否启用返回上一传送点功能") + public static final ConfigValue ENABLE = ConfiguredValue.of(Boolean.class, false); + @HeaderComment({"返回死亡点", "开启后将允许玩家输入 /back 返回死亡地点。"}) public static final ConfigValue DEATH = ConfiguredValue.of(Boolean.class, true); diff --git a/src/main/java/cc/carm/plugin/moeteleport/conf/PluginMessages.java b/src/main/java/cc/carm/plugin/moeteleport/conf/PluginMessages.java index e50ccef..f903e43 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/conf/PluginMessages.java +++ b/src/main/java/cc/carm/plugin/moeteleport/conf/PluginMessages.java @@ -35,39 +35,122 @@ public class PluginMessages extends ConfigurationRoot { } + public static final ConfiguredMessageList NO_PERMISSION = list().defaults( + "&c&l抱歉!&f但您没有足够的权限使用该指令。" + ).build(); + public static final ConfiguredMessageList NOT_ONLINE = list().defaults( "&f目标玩家并不在线,无法发送请求。" ).build(); - public static class Back { + public static final ConfiguredMessageList NOT_PLAYER = list().defaults( + "&f该指令请以玩家身份执行。" + ).build(); + + public static final ConfiguredMessageList NOT_ENABLED = list().defaults( + "&f该功能在次服务器中并未被启用。" + ).build(); + + public static class USAGE extends ConfigurationRoot { + + public static final ConfiguredMessageList COMMAND = list().defaults( + "&5&l喵喵传送 &f指令帮助", + "&8#&f teleport help", + "&8-&7 查看传送请求相关帮助。", + "&8#&f warp help", + "&8-&7 查看地标点相关帮助。", + "&8#&f home Help", + "&8-&7 查看家传送点的相关帮助。", + "&8#&f back", + "&8-&7 回到之前的传送位置。" + ).build(); + + public static final ConfiguredMessageList TELEPORT = list().defaults( + "&5&l喵喵传送 &f传送指令帮助", + "&8#&f teleport to &d<目标玩家>", + "&8-&7 请求传送到目标玩家的位置。", + "&8#&f teleport here &d<目标玩家>", + "&8-&7 请求目标玩家传送到自己的位置。", + "&8#&f teleport accept &d[玩家]", + "&8-&7 同意一个传送请求(可具体指定玩家的请求)。", + "&8#&f teleport deny &d[玩家]", + "&8-&7 拒绝一个传送请求(可具体指定玩家的请求)。" + ).build(); + + public static final ConfiguredMessageList WARPS = list().defaults( + "&5&l喵喵传送 &f地标指令帮助", + "&8#&f warp list", + "&8-&7 列出当前所有的地标点。", + "&8#&f warp to &d<地标名>", + "&8-&7 传送到指定的地标点。", + "&8#&f warp set &d[地标名]", + "&8-&7 设定一个地标点。", + "&8-&7&o 若地标点已存在,且您是地标点的设立者,", + "&8-&7&o 则会覆盖原有的地标点位置。", + "&8#&f warp delete &d[地标名]", + "&8-&7 删除一个自己设立的地标点。" + ).build(); + + public static final ConfiguredMessageList HOMES = list().defaults( + "&5&l喵喵传送 &f家指令帮助", + "&8#&f home list", + "&8-&7 列出自己所有的家位置。", + "&8#&f home to &d<家名>", + "&8-&7 传送到指定的地标点。", + "&8#&f home set &d[家名]", + "&8-&7 设定一个家的位置。", + "&8#&f home delete &d[家名]", + "&8-&7 删除一个家的位置。" + ).build(); + + } + + + public static class RELOAD extends ConfigurationRoot { + + public static final ConfiguredMessageList START = list().defaults( + "&f正在重载配置文件..." + ).build(); + + public static final ConfiguredMessageList ERROR = list().defaults( + "&f配置文件&c重载失败!&f详细原因详见后台输出。" + ).build(); + + public static final ConfiguredMessageList COMPLETE = list().defaults( + "&f配置文件重载完成,共耗时 &d%(time)&fms 。" + ).params("time").build(); + + } + + public static class BACK extends ConfigurationRoot { public static final ConfiguredMessageList NO_LAST_LOCATION = list().defaults( "&f您当前没有进行任何传送,无法返回上个地点。" ).build(); public static final ConfiguredMessageList DEATH_MESSAGE = list().defaults( - "&f您可以输入 &5/back &f或 [&d&l点击这里](show_text=点击返回到死亡地点 run_command=/moeteleport:back) &f返回您的死亡地点。" + "&f您可以输入 &5/back &f或 [&d&l点击这里](show_text=点击返回到死亡地点 run_command=/moeteleport back) &f返回您的死亡地点。" ).build(); } - public static class Teleport { + public static class TELEPORT extends ConfigurationRoot { public static final ConfiguredMessageList TELEPORTING = list().defaults( "&f正在将您传送到 &d%(location) &f..." ).params("location").build(); public static final ConfiguredMessageList NOT_SAFE = list().defaults( - "&f目标地点 &d%(location) &f并不安全,因此传送被取消。", - "&7如需传送,请告知请求者到达安全位置后重新发送传送请求。" + "&f目标地点 &d%(location) &f可能并不安全,因此传送被暂缓执行。", + "&7如您确认传送到目标位置,请再次输入接受指令以执行本次传送。" ).params("location").build(); public static final ConfiguredMessageList NOT_AVAILABLE = list().defaults( - "&f目标地点暂时无法前往,传送被取消。" + "&f目标地点丢失,暂时无法前往,传送被取消。" ).build(); } - public static class Requests { + public static class REQUESTS extends ConfigurationRoot { public static final ConfiguredMessageList SELF = list().defaults("&f您不能向自己发送请求。").build(); @@ -80,7 +163,6 @@ public class PluginMessages extends ConfigurationRoot { "&f您也可以再次输入 &5/%(command) &f快速回应最近的一条请求。" ).params("num", "command").build(); - public static final ConfiguredMessageList EMPTY_REQUESTS = list() .defaults("&f您当前没有任何待处理的传送请求。") .build(); @@ -99,14 +181,14 @@ public class PluginMessages extends ConfigurationRoot { public static final ConfiguredMessageList RECEIVED_TP_HERE = list().defaults( "&d%(player) &f请求传送到您身边,您有 &5%(expire)秒 &f的时间回应。", - " [&a&l[点击同意]](show_text=点击同意请求 run_command=/moeteleport:tpaccept %(player)) &f或输入 &5/tpAccept &f同意该请求。", - " [&c&l[点击拒绝]](show_text=点击拒绝请求 run_command=/moeteleport:tpdeny %(player)) &f或输入 &5/tpDeny &f拒绝该请求。" + " [&a&l[点击同意]](show_text=点击同意请求 run_command=/moeteleport teleport accept %(player)) &f或输入 &5/tpAccept &f同意该请求。", + " [&c&l[点击拒绝]](show_text=点击拒绝请求 run_command=/moeteleport teleport deny %(player)) &f或输入 &5/tpDeny &f拒绝该请求。" ).params("player", "expire").build(); public static final ConfiguredMessageList RECEIVED_TP_TO = list().defaults( "&d%(player) &f请求传送您到Ta身边,您有 &5%(expire)秒 &f的时间回应。", - " [&a&l[点击同意]](show_text=点击同意请求 run_command=/moeteleport:tpaccept %(player)) &f或输入 &5/tpAccept &f同意该请求。", - " [&c&l[点击拒绝]](show_text=点击拒绝请求 run_command=/moeteleport:tpdeny %(player)) &f或输入 &5/tpDeny &f拒绝该请求。" + " [&a&l[点击同意]](show_text=点击同意请求 run_command=/moeteleport teleport accept %(player)) &f或输入 &5/tpAccept &f同意该请求。", + " [&c&l[点击拒绝]](show_text=点击拒绝请求 run_command=/moeteleport teleport deny %(player)) &f或输入 &5/tpDeny &f拒绝该请求。" ).params("player", "expire").build(); @@ -137,7 +219,11 @@ public class PluginMessages extends ConfigurationRoot { } - public static class Home { + public static class HOME extends ConfigurationRoot { + + public static final ConfiguredMessageList EMPTY = list().defaults( + "&f您还没有设置任何家的位置,快设置一个吧!" + ).build(); public static final ConfiguredMessageList NAME_TOO_LONG = list() .defaults("&f您所输入的家的名字太长,家的名称不应当超过 &d32 &f个字符。") @@ -167,21 +253,21 @@ public class PluginMessages extends ConfigurationRoot { "&8原先位置为 &5%(location) &8。" ).params("name", "location").build(); - public static class List { + public static class LIST extends ConfigurationRoot { public static final ConfiguredMessageList HEADER = list().defaults( "&f您当前设定的所有家:" ).build(); public static final ConfiguredMessageList OBJECT = list().defaults( - "&8# &f%(id) &d%(location) [&7✈](show_text=点击返回家 %(id) run_command=/moeteleport:home %(id))" + "&8# &f%(id) &d%(location) [&7✈](show_text=点击返回家 %(id) run_command=/moeteleport home to %(id))" ).params("id", "location").build(); } } - public static class Warp { + public static class WARP extends ConfigurationRoot { public static final ConfiguredMessageList EMPTY = list().defaults( "&f当前服务器暂无任何地标点,快设置一个吧!" @@ -192,7 +278,8 @@ public class PluginMessages extends ConfigurationRoot { ).params("name").build(); public static final ConfiguredMessageList NOT_FOUND = list() - .defaults("&f目前暂不存在该地标。") + .defaults("&f目前暂不存在ID为 %(id) 的地标点。") + .params("id") .build(); public static final ConfiguredMessageList NAME_TOO_LONG = list() @@ -206,11 +293,11 @@ public class PluginMessages extends ConfigurationRoot { ).params("max").build(); public static final ConfiguredMessageList INFO_LOCATION = list().defaults( - "&f地标点 &d%(name) &f所在位置为 &5%(location) &f。[&7✈](show_text=点击前往&d %(name) run_command=/moeteleport:warp %(name))" + "&f地标点 &d%(name) &f所在位置为 &5%(location) &f。[&7✈](show_text=点击前往&d %(name) run_command=/moeteleport warp to %(name))" ).params("name", "location").build(); public static final ConfiguredMessageList INFO_FULL = list().defaults( - "&f地标点 &d%(name) &f由 &5%(owner) &f创建,所在位置为 &d%(location) &f。[&7✈](show_text=点击前往&d %(name) run_command=/moeteleport:warp %(name))" + "&f地标点 &d%(name) &f由 &5%(owner) &f创建,所在位置为 &d%(location) &f。[&7✈](show_text=点击前往&d %(name) run_command=/moeteleport warp to %(name))" ).params("name", "owner", "location").build(); public static final ConfiguredMessageList SET = list().defaults( @@ -228,7 +315,7 @@ public class PluginMessages extends ConfigurationRoot { ).params("name", "location").build(); - public static class List { + public static class LIST extends ConfigurationRoot { public static final ConfiguredMessageList HEADER = list().defaults( "&f当前地标列表 &7(第&f%(current)&8/%(max)&7页):" @@ -236,17 +323,16 @@ public class PluginMessages extends ConfigurationRoot { public static final ConfiguredMessageList OBJECT = list().defaults( "&8# &f%(id) &7[由%(owner)创建]", - "&8- &d%(location) [&7✈](show_text=点击前往&d %(id) run_command=/moeteleport:warp %(id))" + "&8- &d%(location) [&7✈](show_text=点击前往&d %(id) run_command=/moeteleport warp to %(id))" ).params("id", "owner", "location").build(); public static final ConfiguredMessageList OBJECT_NO_OWNER = list().defaults( "&8# &f%(id)", - "&8- &d%(location) [&7✈](show_text=点击前往&d %(id) run_command=/moeteleport:warp %(id))" + "&8- &d%(location) [&7✈](show_text=点击前往&d %(id) run_command=/moeteleport warp to %(id))" ).params("id", "location").build(); } - } diff --git a/src/main/java/cc/carm/plugin/moeteleport/listener/CommandListener.java b/src/main/java/cc/carm/plugin/moeteleport/listener/CommandListener.java deleted file mode 100644 index b791213..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/listener/CommandListener.java +++ /dev/null @@ -1,16 +0,0 @@ -package cc.carm.plugin.moeteleport.listener; - -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; - -public class CommandListener implements Listener { - - - @EventHandler - public void onCommand(PlayerCommandPreprocessEvent event) { - - } - - -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/listener/TeleportListener.java b/src/main/java/cc/carm/plugin/moeteleport/listener/TeleportListener.java new file mode 100644 index 0000000..010118c --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/listener/TeleportListener.java @@ -0,0 +1,6 @@ +package cc.carm.plugin.moeteleport.listener; + +import org.bukkit.event.Listener; + +public class TeleportListener implements Listener { +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/listener/UserListener.java b/src/main/java/cc/carm/plugin/moeteleport/listener/UserListener.java index 9b1685c..a0b4a07 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/listener/UserListener.java +++ b/src/main/java/cc/carm/plugin/moeteleport/listener/UserListener.java @@ -29,7 +29,7 @@ public class UserListener implements Listener { if (PluginConfig.BACK.DEATH.getNotNull()) { Player player = event.getEntity(); MoeTeleport.getUserManager().getData(player).setLastLocation(player.getLocation()); - PluginMessages.Back.DEATH_MESSAGE.send(player); + PluginMessages.BACK.DEATH_MESSAGE.send(player); } } diff --git a/src/main/java/cc/carm/plugin/moeteleport/manager/CommandManager.java b/src/main/java/cc/carm/plugin/moeteleport/manager/CommandManager.java new file mode 100644 index 0000000..515e5be --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/manager/CommandManager.java @@ -0,0 +1,122 @@ +package cc.carm.plugin.moeteleport.manager; + +import cc.carm.plugin.moeteleport.Main; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.command.CommandSender; +import org.bukkit.command.SimpleCommandMap; +import org.bukkit.plugin.SimplePluginManager; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Field; +import java.util.*; + +public class CommandManager { + + protected final JavaPlugin plugin; + + protected final SimpleCommandMap commandMap; + protected final Field knownCommandsFiled; + + protected final Map registeredCommands = new HashMap<>(); + + public CommandManager(JavaPlugin plugin) throws Exception { + this.plugin = plugin; + + SimplePluginManager manager = (SimplePluginManager) Bukkit.getPluginManager(); + Field commandMapField = SimplePluginManager.class.getDeclaredField("commandMap"); + commandMapField.setAccessible(true); + this.commandMap = (SimpleCommandMap) commandMapField.get(manager); + + this.knownCommandsFiled = SimpleCommandMap.class.getDeclaredField("knownCommands"); + this.knownCommandsFiled.setAccessible(true); + + } + + @SuppressWarnings("unchecked") + public Map getKnownCommands() { + try { + return (Map) knownCommandsFiled.get(commandMap); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return new HashMap<>(); + } + + public String getPrefix() { + return this.plugin.getName().toLowerCase() + " "; + } + + + public SimpleCommandMap getCommandMap() { + return commandMap; + } + + public void register(String alias, String target) { + AliasCommand current = this.registeredCommands.get(alias); + if (current != null) current.unregister(getCommandMap()); + + AliasCommand cmd = new AliasCommand(alias, this, getPrefix() + target); + this.registeredCommands.put(alias, cmd); + getCommandMap().register(Main.getInstance().getName(), cmd); + } + + public void unregister(String alias) { + AliasCommand current = this.registeredCommands.remove(alias); + if (current != null) { + getKnownCommands().remove(alias); + current.unregister(getCommandMap()); + } + } + + public void unregisterAll() { + registeredCommands.forEach((k, v) -> { + getKnownCommands().remove(k); + v.unregister(getCommandMap()); + }); + registeredCommands.clear(); + } + + public static class AliasCommand extends org.bukkit.command.Command { + + protected final CommandManager commandManager; + protected final String targetCommand; + + public AliasCommand(String name, CommandManager commandManager, String targetCommand) { + super(name); + this.commandManager = commandManager; + this.targetCommand = targetCommand; + } + + public SimpleCommandMap getCommandMap() { + return this.commandManager.getCommandMap(); + } + + protected String buildCommand(String[] args) { + return this.targetCommand + " " + String.join(" ", args); + } + + @Override + public boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, @NotNull String[] args) { + return getCommandMap().dispatch(sender, buildCommand(args)); + } + + @NotNull + @Override + public List tabComplete(@NotNull CommandSender sender, @NotNull String alias, + @NotNull String[] args, @Nullable Location location) throws IllegalArgumentException { + return Optional.ofNullable(getCommandMap().tabComplete(sender, buildCommand(args))).orElse(Collections.emptyList()); + } + + @NotNull + @Override + public List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { + return tabComplete(sender, alias, args, null); + } + + } + + +} 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 539ab21..2989408 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/manager/RequestManager.java +++ b/src/main/java/cc/carm/plugin/moeteleport/manager/RequestManager.java @@ -40,8 +40,8 @@ public class RequestManager { .peek(entry -> { Player sender = entry.getValue().getSender(); Player receiver = entry.getValue().getReceiver(); - PluginMessages.Requests.SENT_TIMEOUT.send(sender, receiver.getName()); - PluginMessages.Requests.RECEIVED_TIMEOUT.send(receiver, sender.getName()); + PluginMessages.REQUESTS.SENT_TIMEOUT.send(sender, receiver.getName()); + PluginMessages.REQUESTS.RECEIVED_TIMEOUT.send(receiver, sender.getName()); }) .peek(entry -> MoeTeleport.getUserManager() .getData(entry.getValue().getSender()).getSentRequests() @@ -53,15 +53,15 @@ public class RequestManager { public void sendRequest(Player sender, Player receiver, TeleportRequest.RequestType type) { int expireTime = PluginConfig.REQUEST.EXPIRE_TIME.getNotNull(); - PluginMessages.Requests.SENT.send(sender, receiver.getName(), expireTime); + PluginMessages.REQUESTS.SENT.send(sender, receiver.getName(), expireTime); switch (type) { case TPA: { - PluginMessages.Requests.RECEIVED_TP_HERE.send(receiver, sender.getName(), expireTime); + PluginMessages.REQUESTS.RECEIVED_TP_HERE.send(receiver, sender.getName(), expireTime); break; } case TPA_HERE: { - PluginMessages.Requests.RECEIVED_TP_TO.send(receiver, sender.getName(), expireTime); + PluginMessages.REQUESTS.RECEIVED_TP_TO.send(receiver, sender.getName(), expireTime); break; } } @@ -73,15 +73,15 @@ public class RequestManager { } public void acceptRequest(TeleportRequest request) { - PluginMessages.Requests.WAS_ACCEPTED.send(request.getSender(), request.getReceiver().getName()); - PluginMessages.Requests.ACCEPTED.send(request.getReceiver(), request.getSender().getName()); + PluginMessages.REQUESTS.WAS_ACCEPTED.send(request.getSender(), request.getReceiver().getName()); + PluginMessages.REQUESTS.ACCEPTED.send(request.getReceiver(), request.getSender().getName()); TeleportManager.teleport(request.getTeleportPlayer(), request.getTeleportLocation(), true); removeRequests(request); } public void denyRequest(TeleportRequest request) { - PluginMessages.Requests.WAS_DENIED.send(request.getSender(), request.getReceiver().getName()); - PluginMessages.Requests.DENIED.send(request.getReceiver(), request.getSender().getName()); + PluginMessages.REQUESTS.WAS_DENIED.send(request.getSender(), request.getReceiver().getName()); + PluginMessages.REQUESTS.DENIED.send(request.getReceiver(), request.getSender().getName()); removeRequests(request); } @@ -98,13 +98,13 @@ public class RequestManager { UUID playerUUID = player.getUniqueId(); UserData data = MoeTeleport.getUserManager().getData(player); data.getReceivedRequests().keySet().stream() - .peek(senderUUID -> PluginMessages.Requests.OFFLINE.send(Bukkit.getPlayer(senderUUID), player.getName())) + .peek(senderUUID -> PluginMessages.REQUESTS.OFFLINE.send(Bukkit.getPlayer(senderUUID), player.getName())) .map(senderUUID -> MoeTeleport.getUserManager().getData(senderUUID)) .filter(Objects::nonNull).map(UserData::getSentRequests) .forEach(receivers -> receivers.remove(playerUUID)); data.getSentRequests().stream() - .peek(receiverUUID -> PluginMessages.Requests.OFFLINE.send(Bukkit.getPlayer(receiverUUID), player.getName())) + .peek(receiverUUID -> PluginMessages.REQUESTS.OFFLINE.send(Bukkit.getPlayer(receiverUUID), player.getName())) .map(receiverUUID -> MoeTeleport.getUserManager().getData(receiverUUID)) .filter(Objects::nonNull).map(UserData::getReceivedRequests) .forEach(senders -> senders.remove(playerUUID)); diff --git a/src/main/java/cc/carm/plugin/moeteleport/manager/TeleportManager.java b/src/main/java/cc/carm/plugin/moeteleport/manager/TeleportManager.java index eb73242..4b0798c 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/manager/TeleportManager.java +++ b/src/main/java/cc/carm/plugin/moeteleport/manager/TeleportManager.java @@ -15,7 +15,7 @@ public class TeleportManager { public static void teleport(Player player, DataLocation targetLocation, boolean onlySafety) { Location location = targetLocation.getBukkitLocation(); if (location == null) { - PluginMessages.Teleport.NOT_AVAILABLE.send(player, targetLocation.toFlatString()); + PluginMessages.TELEPORT.NOT_AVAILABLE.send(player, targetLocation.toFlatString()); } else { teleport(player, location, onlySafety); } @@ -26,12 +26,12 @@ public class TeleportManager { if (!onlySafety || TeleportManager.isSafeLocation(targetLocation)) { MoeTeleport.getUserManager().getData(player).setLastLocation(player.getLocation()); player.teleport(targetLocation); - PluginMessages.Teleport.TELEPORTING.send(player, new DataLocation(targetLocation).toFlatString()); + PluginMessages.TELEPORT.TELEPORTING.send(player, new DataLocation(targetLocation).toFlatString()); } else { - PluginMessages.Teleport.NOT_SAFE.send(player, new DataLocation(targetLocation).toFlatString()); + PluginMessages.TELEPORT.NOT_SAFE.send(player, new DataLocation(targetLocation).toFlatString()); } } else { - PluginMessages.Teleport.NOT_SAFE.send(player, new DataLocation(targetLocation).toFlatString()); + PluginMessages.TELEPORT.NOT_SAFE.send(player, new DataLocation(targetLocation).toFlatString()); } } 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 e6ef481..b389afe 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/model/TeleportRequest.java +++ b/src/main/java/cc/carm/plugin/moeteleport/model/TeleportRequest.java @@ -13,6 +13,8 @@ public class TeleportRequest { final long createTime; + boolean confirmed; // 当目的地危险时,需要确认 + public TeleportRequest(@NotNull Player sender, @NotNull Player receiver, @NotNull RequestType type) { diff --git a/src/main/resources/PLUGIN_INFO b/src/main/resources/PLUGIN_INFO index b7af6c9..4e93acd 100644 --- a/src/main/resources/PLUGIN_INFO +++ b/src/main/resources/PLUGIN_INFO @@ -2,5 +2,6 @@ &d| |___ ___&5|_ _|___| |___ ___ ___ ___| |_ &d| | | | . | -_|&5 | | | -_| | -_| . | . | _| _| &d|_|_|_|___|___|&5 |_| |___|_|___| _|___|_| |_| -&d &5 |_| -&f 查看更多信息请访问项目主页&d https://github.com/CarmJos/MoeTeleport \ No newline at end of file +&8# &dMoe&5Teleport &5 |_| +&f 当前版本 &d${project.version} &f查看更多信息请访问项目主页 +&8 -> &d https://github.com/CarmJos/MoeTeleport \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 6783ff9..7c664e7 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -25,50 +25,4 @@ commands: "MoeTeleport": description: "插件的主命令,用于重载插件或查看插件信息。" permission: "MoeTeleport.admin" - usage: "/MoeTeleport reload" - - "back": - description: 返回传送前的上一个地点。 - - "tpa": - usage: "/tpa <玩家> " - description: 请求传送到一个玩家身边。 - "tpaHere": - usage: "/tpaHere <玩家>" - description: 请求一个玩家传送到自己身边。 - "tpAccept": - usage: "/tpAccept [玩家]" - description: 同意一个请求,可以限定某个玩家。 - "tpDeny": - usage: "/tpDeny [玩家]" - description: 拒绝一个请求,可以限定某个玩家。 - - "home": - usage: "/home [名称] " - description: "返回家所在位置。" - "listHome": - description: "列出所有家的位置。" - "setHome": - usage: "/setHome [名称] " - description: "设置家的传送点 (不填名称默认为home)" - "delHome": - usage: "/delHome <名称> " - description: "删除家的传送点。" - - "warp": - usage: "/warp [名称] " - description: "返回地标点所在位置。" - "warpInfo": - usage: "/warpInfo <名称> " - description: "查看地标点相关信息。" - "listWarps": - aliases: - - warps - usage: “/listWarps [页码]” - description: "列出服务器中所有地标点位置。" - "setWarp": - usage: "/setWarp [名称] " - description: "设置地标传送点 (不填名称默认为自己的游戏ID)" - "delWarp": - usage: "/delWarp <名称> " - description: "删除一个地标传送点。" \ No newline at end of file + usage: "/MoeTeleport reload" \ No newline at end of file