From 4c5e9a09be00be9188da38e88691eb8511398f92 Mon Sep 17 00:00:00 2001 From: CarmJos Date: Sat, 26 Feb 2022 00:54:15 +0800 Subject: [PATCH] =?UTF-8?q?[3.1.0]=20=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=20-=20[A]=20=E6=B7=BB=E5=8A=A0=20#7=20=E6=89=80=E6=8F=90?= =?UTF-8?q?=E5=88=B0=E7=9A=84=E5=9C=B0=E6=A0=87=E7=82=B9=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=94=AF=E6=8C=81=E7=8E=A9=E5=AE=B6?= =?UTF-8?q?=E8=87=AA=E8=AE=BE=E5=9C=B0=E6=A0=87=E7=82=B9=E5=B9=B6=E4=BD=9C?= =?UTF-8?q?=E5=87=BA=E9=99=90=E5=88=B6=E3=80=82=20-=20[U]=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E9=A1=B9=E7=9B=AE=E7=BB=93=E6=9E=84=EF=BC=8C=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E9=87=87=E7=94=A8EasyPlugin=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E3=80=82=20-=20[U]=20=E6=9B=B4=E6=8D=A2=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E8=AF=BB=E5=8F=96=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=B8=8E=E8=AF=BB=E5=8F=96=E6=96=B9=E5=BC=8F=E3=80=82?= =?UTF-8?q?=20-=20[A]=20=E4=B8=BA=20setHome=20=E8=A6=86=E7=9B=96=E6=97=A7?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E6=B7=BB=E5=8A=A0=E4=B8=80=E6=9D=A1=E7=8B=AC?= =?UTF-8?q?=E7=AB=8B=E7=9A=84=E6=B6=88=E6=81=AF=EF=BC=8C=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E6=89=8B=E8=AF=AF=E4=BD=BF=E6=97=A7=E5=9C=B0=E5=9D=80=E4=B8=A2?= =?UTF-8?q?=E5=A4=B1=E3=80=82=20-=20[A]=20=E7=A6=BB=E7=BA=BF=E4=B9=9F?= =?UTF-8?q?=E5=B0=86=E4=BC=9A=E4=BF=9D=E5=AD=98=E7=8E=A9=E5=AE=B6=E6=9C=80?= =?UTF-8?q?=E5=90=8E=E5=9C=B0=E5=9D=80=EF=BC=8C=E9=81=BF=E5=85=8D=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E6=AD=BB=E4=BA=A1=E5=90=8E=E6=8E=89=E7=BA=BF=E5=A4=B1?= =?UTF-8?q?=E5=8E=BB=E6=9C=80=E5=90=8E=E5=9C=B0=E5=9D=80=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- pom.xml | 41 ++- .../java/cc/carm/plugin/moeteleport/Main.java | 253 +++++++++--------- .../carm/plugin/moeteleport/MoeTeleport.java | 41 +++ .../moeteleport/command/BackCommand.java | 6 +- .../command/completer/HomeNameCompleter.java | 5 +- .../command/completer/TpRequestCompleter.java | 4 +- .../command/completer/WarpNameCompleter.java | 48 ++++ ...elHomeCommand.java => HomeDelCommand.java} | 12 +- ...tHomeCommand.java => HomeListCommand.java} | 14 +- .../command/home/HomeSetCommand.java | 49 ++++ ...{GoHomeCommand.java => HomeTpCommand.java} | 8 +- .../command/home/SetHomeCommand.java | 44 --- .../command/tpa/TpHandleCommand.java | 20 +- .../moeteleport/command/tpa/TpaCommand.java | 17 +- .../command/warp/WarpDelCommand.java | 40 +++ .../command/warp/WarpInfoCommand.java | 35 +++ .../command/warp/WarpListCommand.java | 58 ++++ .../command/warp/WarpSetCommand.java | 51 ++++ .../command/warp/WarpTpCommand.java | 32 +++ .../configuration/PluginConfig.java | 20 +- .../configuration/PluginMessages.java | 243 ++++++++++++++--- .../configuration/file/FileConfig.java | 64 ----- .../configuration/message/ConfigMessage.java | 32 --- .../message/ConfigMessageList.java | 30 --- .../configuration/messages/MoeMessage.java | 33 +++ .../messages/MoeMessageList.java | 37 +++ .../configuration/values/ConfigValue.java | 58 ---- .../configuration/values/ConfigValueList.java | 71 ----- .../configuration/values/ConfigValueMap.java | 79 ------ .../moeteleport/listener/UserListener.java | 12 +- .../moeteleport/manager/ConfigManager.java | 42 ++- .../moeteleport/manager/RequestManager.java | 74 ++--- .../moeteleport/manager/TeleportManager.java | 21 +- .../moeteleport/manager/UserManager.java | 76 ++++-- .../moeteleport/manager/WarpManager.java | 86 ++++++ .../plugin/moeteleport/model/UserData.java | 12 +- .../plugin/moeteleport/model/WarpInfo.java | 47 ++++ .../moeteleport/storage/DataSerializer.java | 13 + .../moeteleport/storage/DataStorage.java | 18 ++ .../moeteleport/storage/StorageMethod.java | 60 ++--- .../storage/custom/CustomStorage.java | 27 +- .../storage/database/DBConfiguration.java | 2 +- .../storage/database/DBTables.java | 25 +- .../storage/database/MySQLStorage.java | 87 +++++- ...ialXStorage.java => EssentialStorage.java} | 61 ++++- .../moeteleport/storage/file/JSONStorage.java | 81 +++++- .../moeteleport/storage/file/YAMLStorage.java | 81 +++++- .../storage/impl/FileBasedStorage.java | 14 +- .../storage/impl/PluginBasedStorage.java | 7 + .../moeteleport/util/SchedulerUtils.java | 250 ----------------- .../moeteleport/util/UpdateChecker.java | 37 +++ src/main/resources/config.yml | 16 +- src/main/resources/messages.yml | 78 +----- src/main/resources/plugin.yml | 20 +- 55 files changed, 1599 insertions(+), 1096 deletions(-) create mode 100644 src/main/java/cc/carm/plugin/moeteleport/MoeTeleport.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/completer/WarpNameCompleter.java rename src/main/java/cc/carm/plugin/moeteleport/command/home/{DelHomeCommand.java => HomeDelCommand.java} (69%) rename src/main/java/cc/carm/plugin/moeteleport/command/home/{ListHomeCommand.java => HomeListCommand.java} (62%) create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/home/HomeSetCommand.java rename src/main/java/cc/carm/plugin/moeteleport/command/home/{GoHomeCommand.java => HomeTpCommand.java} (82%) delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/home/SetHomeCommand.java create 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/WarpInfoCommand.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpListCommand.java create 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/WarpTpCommand.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/configuration/file/FileConfig.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/configuration/message/ConfigMessage.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/configuration/message/ConfigMessageList.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/configuration/messages/MoeMessage.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/configuration/messages/MoeMessageList.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/configuration/values/ConfigValue.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/configuration/values/ConfigValueList.java delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/configuration/values/ConfigValueMap.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/manager/WarpManager.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/model/WarpInfo.java rename src/main/java/cc/carm/plugin/moeteleport/storage/extension/{EssentialXStorage.java => EssentialStorage.java} (60%) delete mode 100644 src/main/java/cc/carm/plugin/moeteleport/util/SchedulerUtils.java create mode 100644 src/main/java/cc/carm/plugin/moeteleport/util/UpdateChecker.java diff --git a/README.md b/README.md index fdb7a26..09f502d 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,8 @@ ### 优势 - **轻量插件。** 适合小型服务器使用,配置简单方便。 -- **规范开发。** 插件符合开发规范,适合新手开发者学习。 +- **规范开发。** 插件架构符合开发规范,适合新手开发者学习。 + - 自 [v3.0.0]() 版本开始采用了 EasyPlugin 开发,可能与其他主流插件结构有些不同。 - **持续维护。** 新功能需求均可提交,大概率在后续开发中支持。 - 功能需求请 [提交Issues](https://github.com/CarmJos/MoeTeleport/issues/new?assignees=&labels=enhancement&template=feature_issues.md&title=) ,不要在帖子中提交! - 提交与 “传送” 相关联的请求才大概率会被更新支持。 diff --git a/pom.xml b/pom.xml index 37379d6..3cf6821 100644 --- a/pom.xml +++ b/pom.xml @@ -9,11 +9,13 @@ 8 UTF-8 UTF-8 + 1.3.9 + 0.3.8 cc.carm.plugin moeteleport - 3.0.0 + 3.1.0 MoeTeleport 喵喵传送,简单的传送、设置家的插件。 @@ -124,16 +126,30 @@ cc.carm.lib easysql-beecp - 0.3.8 + ${easysql.version} compile true + + cc.carm.lib + easyplugin-main + true + + + + cc.carm.lib + easyplugin-configuration + true + + cc.carm.lib githubreleases4j 1.3.1 compile + + true @@ -141,6 +157,8 @@ minedown 1.7.1-SNAPSHOT compile + + true @@ -148,6 +166,7 @@ bstats-bukkit 3.0.0 compile + true @@ -167,6 +186,20 @@ + + + + + cc.carm.lib + easyplugin-bom + ${easyplugin.version} + pom + import + + + + + @@ -259,6 +292,10 @@ org.json cc.carm.plugin.moeteleport.lib.json + + cc.carm.lib.easyplugin + cc.carm.plugin.ultradepository.lib.easyplugin + cc.carm.lib.easysql cc.carm.plugin.moeteleport.lib.easysql diff --git a/src/main/java/cc/carm/plugin/moeteleport/Main.java b/src/main/java/cc/carm/plugin/moeteleport/Main.java index 837afdd..bfebee2 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/Main.java +++ b/src/main/java/cc/carm/plugin/moeteleport/Main.java @@ -1,126 +1,47 @@ package cc.carm.plugin.moeteleport; +import cc.carm.lib.easyplugin.EasyPlugin; +import cc.carm.lib.easyplugin.i18n.EasyPluginMessageProvider; 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.home.DelHomeCommand; -import cc.carm.plugin.moeteleport.command.home.GoHomeCommand; -import cc.carm.plugin.moeteleport.command.home.ListHomeCommand; -import cc.carm.plugin.moeteleport.command.home.SetHomeCommand; +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.configuration.PluginConfig; import cc.carm.plugin.moeteleport.listener.UserListener; import cc.carm.plugin.moeteleport.manager.ConfigManager; import cc.carm.plugin.moeteleport.manager.RequestManager; import cc.carm.plugin.moeteleport.manager.UserManager; +import cc.carm.plugin.moeteleport.manager.WarpManager; import cc.carm.plugin.moeteleport.storage.DataStorage; import cc.carm.plugin.moeteleport.storage.StorageMethod; -import cc.carm.plugin.moeteleport.util.ColorParser; import cc.carm.plugin.moeteleport.util.JarResourceUtils; -import cc.carm.plugin.moeteleport.util.SchedulerUtils; +import cc.carm.plugin.moeteleport.util.UpdateChecker; import org.bstats.bukkit.Metrics; import org.bstats.charts.SimplePie; import org.bukkit.Bukkit; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.PluginCommand; -import org.bukkit.command.TabCompleter; import org.bukkit.event.Listener; -import org.bukkit.plugin.java.JavaPlugin; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.Arrays; -public class Main extends JavaPlugin { +public class Main extends EasyPlugin { private static Main instance; - private static SchedulerUtils scheduler; - private static DataStorage storage; - + private WarpManager warpManager; private UserManager userManager; private RequestManager requestManager; - @Override - public void onEnable() { + public Main() { + super(new EasyPluginMessageProvider.zh_CN()); instance = this; - scheduler = new SchedulerUtils(this); - outputInfo(); - - log(getName() + " " + getDescription().getVersion() + " &7开始加载..."); - long startTime = System.currentTimeMillis(); - - log("加载配置文件..."); - ConfigManager.initConfig(); - - log("初始化存储方式..."); - StorageMethod storageMethod = StorageMethod.read(PluginConfig.STORAGE_METHOD.get()); - log(" 正在使用 " + storageMethod.name() + " 进行数据存储"); - - storage = storageMethod.createStorage(); - if (!storage.initialize()) { - error("初始化存储失败,请检查配置文件。"); - storage.shutdown(); - setEnabled(false); - return; // 初始化失败,不再继续加载 - } - - - log("加载用户管理器..."); - this.userManager = new UserManager(); - if (Bukkit.getOnlinePlayers().size() > 0) { - log(" 加载现有用户数据..."); - getUserManager().loadAll(); - } - - log("加载请求管理器..."); - this.requestManager = new RequestManager(this); - - log("注册监听器..."); - regListener(new UserListener()); - - log("注册指令..."); - registerCommand("MoeTeleport", new MoeTeleportCommand()); - - registerCommand("back", new BackCommand()); - - registerCommand("home", new GoHomeCommand(), new HomeNameCompleter()); - registerCommand("delHome", new DelHomeCommand(), new HomeNameCompleter()); - registerCommand("setHome", new SetHomeCommand()); - registerCommand("listHome", new ListHomeCommand()); - - registerCommand("tpa", new TpaCommand(), new PlayerNameCompleter()); - registerCommand("tpaHere", new TpaCommand(), new PlayerNameCompleter()); - registerCommand("tpAccept", new TpHandleCommand(), new TpRequestCompleter()); - registerCommand("tpDeny", new TpHandleCommand(), new TpRequestCompleter()); - - if (PluginConfig.METRICS.get()) { - log("启用统计数据..."); - Metrics metrics = new Metrics(this, 14459); - metrics.addCustomChart(new SimplePie("storage_method", storageMethod::name)); - } - - log("加载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。"); - } - - @Override - public void onDisable() { - outputInfo(); - log(getName() + " " + getDescription().getVersion() + " 开始卸载..."); - long startTime = System.currentTimeMillis(); - - log("关闭所有请求..."); - getRequestManager().shutdown(); - - log("保存用户数据..."); - getUserManager().unloadAll(true); - - log("卸载监听器..."); - Bukkit.getServicesManager().unregisterAll(this); - - log("卸载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。"); } /** @@ -132,59 +53,141 @@ public class Main extends JavaPlugin { Bukkit.getPluginManager().registerEvents(listener, getInstance()); } - public void outputInfo() { - String[] pluginInfo = JarResourceUtils.readResource(this.getResource("PLUGIN_INFO")); - if (pluginInfo != null) { - Arrays.stream(pluginInfo).forEach(Main::log); - } + public static void info(String... messages) { + getInstance().log(messages); } - public static void log(String message) { - Bukkit.getConsoleSender().sendMessage(ColorParser.parse("[" + getInstance().getName() + "] " + message)); + public static void serve(String... messages) { + getInstance().error(messages); } - public static void error(String message) { - log("&4[ERROR] &r" + message); - } - - public static void debug(String message) { - if (PluginConfig.DEBUG.get()) { - log("&e[DEBUG] &r" + message); - } + public static void debugging(String... messages) { + getInstance().debug(messages); } public static Main getInstance() { return instance; } - public static SchedulerUtils getScheduler() { - return scheduler; + @Override + protected boolean initialize() { + + info("加载配置文件..."); + if (!ConfigManager.initConfig()) { + serve("配置文件初始化失败,请检查。"); + setEnabled(false); + return false; + } + + info("初始化存储方式..."); + StorageMethod storageMethod = StorageMethod.read(PluginConfig.STORAGE_METHOD.get()); + info(" 正在使用 " + storageMethod.name() + " 进行数据存储"); + + storage = storageMethod.createStorage(); + if (!storage.initialize()) { + serve("初始化存储失败,请检查配置文件。"); + storage.shutdown(); + setEnabled(false); + return false; // 初始化失败,不再继续加载 + } + + info("加载地标管理器..."); + warpManager = new WarpManager(); + + info("加载用户管理器..."); + this.userManager = new UserManager(); + if (Bukkit.getOnlinePlayers().size() > 0) { + info(" 加载现有用户数据..."); + getUserManager().loadAll(); + } + + info("加载请求管理器..."); + this.requestManager = new RequestManager(this); + + info("注册监听器..."); + regListener(new UserListener()); + + info("注册指令..."); + registerCommand("MoeTeleport", new MoeTeleportCommand()); + + registerCommand("back", new BackCommand()); + + 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.get()) { + info("启用统计数据..."); + Metrics metrics = new Metrics(this, 14459); + metrics.addCustomChart(new SimplePie("storage_method", storageMethod::name)); + } + + if (PluginConfig.CHECK_UPDATE.get()) { + info("开始检查更新..."); + UpdateChecker.checkUpdate(); + } else { + info("已禁用检查更新,跳过。"); + } + + return true; } - public static void registerCommand(String commandName, - @NotNull CommandExecutor executor) { - registerCommand(commandName, executor, null); + @Override + protected void shutdown() { + info("关闭所有请求..."); + getRequestManager().shutdown(); + + info("保存用户数据..."); + getUserManager().unloadAll(true); + + info("保存地标数据..."); + getWarpManager().saveWarps(); + + info("终止存储源..."); + getStorage().shutdown(); + + info("卸载监听器..."); + Bukkit.getServicesManager().unregisterAll(this); } - public static void registerCommand(String commandName, - @NotNull CommandExecutor executor, - @Nullable TabCompleter tabCompleter) { - PluginCommand command = Bukkit.getPluginCommand(commandName); - if (command == null) return; - command.setExecutor(executor); - if (tabCompleter != null) command.setTabCompleter(tabCompleter); + @Override + public boolean isDebugging() { + return PluginConfig.DEBUG.get(); } - public static DataStorage getStorage() { + public void outputInfo() { + String[] pluginInfo = JarResourceUtils.readResource(this.getResource("PLUGIN_INFO")); + if (pluginInfo != null) { + Arrays.stream(pluginInfo).forEach(Main::info); + } + } + + protected DataStorage getStorage() { return storage; } - public static UserManager getUserManager() { - return Main.getInstance().userManager; + protected WarpManager getWarpManager() { + return getInstance().warpManager; } - public static RequestManager getRequestManager() { - return Main.getInstance().requestManager; + protected UserManager getUserManager() { + return getInstance().userManager; + } + + protected RequestManager getRequestManager() { + return getInstance().requestManager; } diff --git a/src/main/java/cc/carm/plugin/moeteleport/MoeTeleport.java b/src/main/java/cc/carm/plugin/moeteleport/MoeTeleport.java new file mode 100644 index 0000000..f9d55d9 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/MoeTeleport.java @@ -0,0 +1,41 @@ +package cc.carm.plugin.moeteleport; + +import cc.carm.plugin.moeteleport.manager.RequestManager; +import cc.carm.plugin.moeteleport.manager.UserManager; +import cc.carm.plugin.moeteleport.manager.WarpManager; +import cc.carm.plugin.moeteleport.storage.DataStorage; +import cc.carm.plugin.moeteleport.storage.StorageMethod; + +import java.util.function.Supplier; + +public class MoeTeleport { + + public static void outputInfo() { + Main.getInstance().outputInfo(); + } + + public static DataStorage getStorage() { + return Main.getInstance().getStorage(); + } + + public static WarpManager getWarpManager() { + return Main.getInstance().getWarpManager(); + } + + public static UserManager getUserManager() { + return Main.getInstance().getUserManager(); + } + + public static RequestManager getRequestManager() { + return Main.getInstance().getRequestManager(); + } + + public void registerCustomStorage(DataStorage storage) { + registerCustomStorage(() -> storage); + } + + public void registerCustomStorage(Supplier storageSupplier) { + StorageMethod.CUSTOM.setStorageSupplier(storageSupplier); + } + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/BackCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/BackCommand.java index 7b70b98..a596714 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/BackCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/BackCommand.java @@ -1,6 +1,6 @@ package cc.carm.plugin.moeteleport.command; -import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.MoeTeleport; import cc.carm.plugin.moeteleport.configuration.PluginMessages; import cc.carm.plugin.moeteleport.manager.TeleportManager; import cc.carm.plugin.moeteleport.model.UserData; @@ -16,9 +16,9 @@ public class BackCommand implements CommandExecutor { public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { if (!(sender instanceof Player)) return false; Player player = (Player) sender; - UserData data = Main.getUserManager().getData(player); + UserData data = MoeTeleport.getUserManager().getData(player); if (data.getLastLocation() == null) { - PluginMessages.NO_LAST_LOCATION.send(player); + PluginMessages.Back.NO_LAST_LOCATION.send(player); return true; } TeleportManager.teleport(player, data.getLastLocation(), 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 index 66ac78a..2d0b6c2 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/completer/HomeNameCompleter.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/completer/HomeNameCompleter.java @@ -1,6 +1,6 @@ package cc.carm.plugin.moeteleport.command.completer; -import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.MoeTeleport; import com.google.common.collect.ImmutableList; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -19,7 +19,8 @@ public class HomeNameCompleter implements TabCompleter { 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 Main.getUserManager().getData((Player) sender).getHomeLocations().keySet().stream() + return MoeTeleport.getUserManager().getData((Player) sender) + .getHomeLocations().keySet().stream() .filter(s -> StringUtil.startsWithIgnoreCase(s, args[0])) .limit(10).collect(Collectors.toList()); } else { 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 index 63769e0..a1b1f57 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/completer/TpRequestCompleter.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/completer/TpRequestCompleter.java @@ -1,6 +1,6 @@ package cc.carm.plugin.moeteleport.command.completer; -import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.MoeTeleport; import cc.carm.plugin.moeteleport.model.UserData; import com.google.common.collect.ImmutableList; import org.bukkit.Bukkit; @@ -39,7 +39,7 @@ public class TpRequestCompleter implements TabCompleter { 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 = Main.getUserManager().getData((Player) sender); + 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])) 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 new file mode 100644 index 0000000..8b14eed --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/completer/WarpNameCompleter.java @@ -0,0 +1,48 @@ +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/DelHomeCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeDelCommand.java similarity index 69% rename from src/main/java/cc/carm/plugin/moeteleport/command/home/DelHomeCommand.java rename to src/main/java/cc/carm/plugin/moeteleport/command/home/HomeDelCommand.java index 18fb6e7..0b2f327 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/home/DelHomeCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeDelCommand.java @@ -1,6 +1,6 @@ package cc.carm.plugin.moeteleport.command.home; -import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.MoeTeleport; import cc.carm.plugin.moeteleport.configuration.PluginMessages; import cc.carm.plugin.moeteleport.configuration.location.DataLocation; import cc.carm.plugin.moeteleport.model.UserData; @@ -12,7 +12,7 @@ import org.jetbrains.annotations.NotNull; import java.util.Map; -public class DelHomeCommand implements CommandExecutor { +public class HomeDelCommand implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @@ -21,15 +21,13 @@ public class DelHomeCommand implements CommandExecutor { if (args.length < 1) return false; Player player = (Player) sender; - UserData data = Main.getUserManager().getData(player); + UserData data = MoeTeleport.getUserManager().getData(player); String homeName = args[0]; Map.Entry locationInfo = data.getHomeLocation(homeName); if (locationInfo == null) { - PluginMessages.Home.NOT_FOUND.sendWithPlaceholders(player); + PluginMessages.Home.NOT_FOUND.send(player); } else { - PluginMessages.Home.REMOVED.sendWithPlaceholders(player, - new String[]{"%(name)", "%(location)"}, - new Object[]{locationInfo.getKey(), locationInfo.getValue().toFlatString()}); + PluginMessages.Home.REMOVED.send(player, locationInfo.getKey(), locationInfo.getValue().toFlatString()); data.delHomeLocation(homeName); } return true; diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/home/ListHomeCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeListCommand.java similarity index 62% rename from src/main/java/cc/carm/plugin/moeteleport/command/home/ListHomeCommand.java rename to src/main/java/cc/carm/plugin/moeteleport/command/home/HomeListCommand.java index 09148d2..fdbc184 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/home/ListHomeCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeListCommand.java @@ -1,6 +1,6 @@ package cc.carm.plugin.moeteleport.command.home; -import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.MoeTeleport; import cc.carm.plugin.moeteleport.configuration.PluginMessages; import cc.carm.plugin.moeteleport.model.UserData; import org.bukkit.command.Command; @@ -9,20 +9,16 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -public class ListHomeCommand implements CommandExecutor { +public class HomeListCommand implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { if (!(sender instanceof Player)) return false; Player player = (Player) sender; - UserData data = Main.getUserManager().getData(player); - PluginMessages.Home.HEADER.sendWithPlaceholders(player); - data.getHomeLocations().forEach((name, loc) -> PluginMessages.Home.LIST_OBJECT - .sendWithPlaceholders(player, - new String[]{"%(id)", "%(location)"}, - new Object[]{name, loc.toFlatString()} - )); + 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; } 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 new file mode 100644 index 0000000..926a56f --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeSetCommand.java @@ -0,0 +1,49 @@ +package cc.carm.plugin.moeteleport.command.home; + +import cc.carm.plugin.moeteleport.MoeTeleport; +import cc.carm.plugin.moeteleport.configuration.PluginMessages; +import cc.carm.plugin.moeteleport.configuration.location.DataLocation; +import cc.carm.plugin.moeteleport.model.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/GoHomeCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeTpCommand.java similarity index 82% rename from src/main/java/cc/carm/plugin/moeteleport/command/home/GoHomeCommand.java rename to src/main/java/cc/carm/plugin/moeteleport/command/home/HomeTpCommand.java index d8c2ea9..81fc7e6 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/home/GoHomeCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeTpCommand.java @@ -1,6 +1,6 @@ package cc.carm.plugin.moeteleport.command.home; -import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.MoeTeleport; import cc.carm.plugin.moeteleport.configuration.PluginMessages; import cc.carm.plugin.moeteleport.configuration.location.DataLocation; import cc.carm.plugin.moeteleport.manager.TeleportManager; @@ -13,18 +13,18 @@ import org.jetbrains.annotations.NotNull; import java.util.Map; -public class GoHomeCommand implements CommandExecutor { +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 = Main.getUserManager().getData(player); + 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.sendWithPlaceholders(player); + PluginMessages.Home.NOT_FOUND.send(player); } else { TeleportManager.teleport(player, locationInfo.getValue(), false); } diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/home/SetHomeCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/home/SetHomeCommand.java deleted file mode 100644 index 7f597d3..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/command/home/SetHomeCommand.java +++ /dev/null @@ -1,44 +0,0 @@ -package cc.carm.plugin.moeteleport.command.home; - -import cc.carm.plugin.moeteleport.Main; -import cc.carm.plugin.moeteleport.configuration.PluginMessages; -import cc.carm.plugin.moeteleport.model.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 SetHomeCommand implements CommandExecutor { - - @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, - @NotNull String label, @NotNull String[] args) { - if (!(sender instanceof Player)) return false; - Player player = (Player) sender; - UserData data = Main.getUserManager().getData(player); - String homeName = args.length >= 1 ? args[0] : "home"; - - if (homeName.length() > 30) { - // 限定家的名字长度 - PluginMessages.Home.NAME_TOO_LONG.sendWithPlaceholders(sender); - return true; - } - - int maxHome = Main.getUserManager().getMaxHome(player); - if (data.getHomeLocations().size() >= maxHome && data.getHomeLocation(homeName) == null) { - PluginMessages.Home.OVER_LIMIT.sendWithPlaceholders(sender, - new String[]{"%(max)"}, new Object[]{maxHome} - ); - return true; - } - - data.setHomeLocation(homeName, player.getLocation()); - PluginMessages.Home.SET.sendWithPlaceholders(player, - new String[]{"%(name)"}, new Object[]{homeName} - ); - return true; - } - - -} \ No newline at end of file diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpHandleCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpHandleCommand.java index fd0a6a3..ad2df52 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpHandleCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpHandleCommand.java @@ -1,6 +1,6 @@ package cc.carm.plugin.moeteleport.command.tpa; -import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.MoeTeleport; import cc.carm.plugin.moeteleport.configuration.PluginMessages; import cc.carm.plugin.moeteleport.model.TeleportRequest; import cc.carm.plugin.moeteleport.model.UserData; @@ -20,9 +20,9 @@ public class TpHandleCommand implements CommandExecutor { @NotNull String label, @NotNull String[] args) { if (!(sender instanceof Player)) return false; Player player = (Player) sender; - UserData data = Main.getUserManager().getData(player); + UserData data = MoeTeleport.getUserManager().getData(player); if (data.getReceivedRequests().isEmpty()) { - PluginMessages.Request.NOT_FOUND.sendWithPlaceholders(player); + PluginMessages.Requests.EMPTY_REQUESTS.send(player); return true; } String targetName = args.length > 0 ? args[0] : null; @@ -31,10 +31,7 @@ public class TpHandleCommand implements CommandExecutor { if (targetName != null) { Player target = Bukkit.getPlayer(targetName); if (target == null || !data.getReceivedRequests().containsKey(target.getUniqueId())) { - PluginMessages.Request.NOT_FOUND_PLAYER.sendWithPlaceholders(player, - new String[]{"%(player)"}, - new Object[]{target == null ? targetName : target.getName()} - ); + PluginMessages.Requests.NO_REQUEST_FROM.send(player, target == null ? targetName : target.getName()); } else { handle(data.getReceivedRequests().get(target.getUniqueId()), accept); // 交给Manager处理 } @@ -44,10 +41,7 @@ public class TpHandleCommand implements CommandExecutor { .min(Comparator.comparingLong(TeleportRequest::getActiveTime)) .ifPresent(request -> handle(request, accept)); } else { - PluginMessages.Request.MULTI.sendWithPlaceholders(player, - new String[]{"%(num)", "%(command)"}, - new Object[]{data.getReceivedRequests().size(), command.getName()} - ); + PluginMessages.Requests.MULTI.send(player, data.getReceivedRequests().size(), command.getName()); data.setEnableAutoSelect(true); } } @@ -56,9 +50,9 @@ public class TpHandleCommand implements CommandExecutor { private void handle(TeleportRequest request, boolean accept) { if (accept) { - Main.getRequestManager().acceptRequest(request); + MoeTeleport.getRequestManager().acceptRequest(request); } else { - Main.getRequestManager().denyRequest(request); + MoeTeleport.getRequestManager().denyRequest(request); } } diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpaCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpaCommand.java index 08576d1..9ae64e2 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpaCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/tpa/TpaCommand.java @@ -1,6 +1,6 @@ package cc.carm.plugin.moeteleport.command.tpa; -import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.MoeTeleport; import cc.carm.plugin.moeteleport.configuration.PluginMessages; import cc.carm.plugin.moeteleport.model.TeleportRequest; import org.bukkit.Bukkit; @@ -19,28 +19,25 @@ public class TpaCommand implements CommandExecutor { Player player = (Player) sender; Player target = Bukkit.getPlayer(args[0]); if (target == null) { - PluginMessages.NOT_ONLINE.sendWithPlaceholders(player); + PluginMessages.NOT_ONLINE.send(player); return true; } if (player == target) { // fix #5 - 玩家给自己发送传送请求 - PluginMessages.SELF_REQUEST.sendWithPlaceholders(player); + PluginMessages.Requests.SELF.send(player); return true; } - TeleportRequest request = Main.getUserManager().getData(target).getReceivedRequests().get(player.getUniqueId()); + TeleportRequest request = MoeTeleport.getUserManager().getData(target).getReceivedRequests().get(player.getUniqueId()); if (request != null) { - PluginMessages.Request.DUPLICATE.sendWithPlaceholders(sender, - new String[]{"%(player)", "%(expire)"}, - new Object[]{target.getName(), request.getRemainSeconds()} - ); + PluginMessages.Requests.DUPLICATE.send(sender, target.getName(), request.getRemainSeconds()); return true; } if (command.getName().equalsIgnoreCase("tpa")) { - Main.getRequestManager().sendRequest(player, target, TeleportRequest.RequestType.TPA); + MoeTeleport.getRequestManager().sendRequest(player, target, TeleportRequest.RequestType.TPA); } else { - Main.getRequestManager().sendRequest(player, target, TeleportRequest.RequestType.TPA_HERE); + MoeTeleport.getRequestManager().sendRequest(player, target, TeleportRequest.RequestType.TPA_HERE); } return true; 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 new file mode 100644 index 0000000..6b4be4f --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpDelCommand.java @@ -0,0 +1,40 @@ +package cc.carm.plugin.moeteleport.command.warp; + +import cc.carm.plugin.moeteleport.MoeTeleport; +import cc.carm.plugin.moeteleport.configuration.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/WarpInfoCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpInfoCommand.java new file mode 100644 index 0000000..5495dfe --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpInfoCommand.java @@ -0,0 +1,35 @@ +package cc.carm.plugin.moeteleport.command.warp; + +import cc.carm.plugin.moeteleport.MoeTeleport; +import cc.carm.plugin.moeteleport.configuration.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 WarpInfoCommand implements CommandExecutor { + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, + @NotNull String label, @NotNull String[] args) { + if (!(sender instanceof Player)) 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; + } + + String ownerName = info.getOwnerName(); + if (ownerName != null) { + PluginMessages.Warp.INFO_FULL.send(player, warpName, ownerName, info.getLocation().toFlatString()); + } else { + PluginMessages.Warp.INFO_LOCATION.send(player, warpName, info.getLocation().toFlatString()); + } + return true; + } +} 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 new file mode 100644 index 0000000..bf008a6 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpListCommand.java @@ -0,0 +1,58 @@ +package cc.carm.plugin.moeteleport.command.warp; + +import cc.carm.plugin.moeteleport.MoeTeleport; +import cc.carm.plugin.moeteleport.configuration.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; + +import java.util.ArrayList; + +public class WarpListCommand 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; + + ArrayList warps = new ArrayList<>(MoeTeleport.getWarpManager().listWarps().values()); + if (warps.isEmpty()) { + PluginMessages.Warp.EMPTY.send(player); + return true; + } + + String pageString = args.length > 0 ? args[0] : null; + int page = 1; + if (pageString != null) { + try { + page = Integer.parseInt(pageString); + } catch (Exception ignored) { + } + } + + int maxPage = (int) Math.ceil(warps.size() / 10.0); + int currentPage = Math.min(page, maxPage); + + int startIndex = Math.max(0, (currentPage - 1) * 10); + int endIndex = Math.min(warps.size(), startIndex + 9); + + PluginMessages.Warp.List.HEADER.send(player, 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()); + } else { + PluginMessages.Warp.List.OBJECT.send(player, info.getName(), ownerName, info.getLocation().toFlatString()); + } + } + + return true; + } + + +} 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 new file mode 100644 index 0000000..98c3a92 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpSetCommand.java @@ -0,0 +1,51 @@ +package cc.carm.plugin.moeteleport.command.warp; + +import cc.carm.plugin.moeteleport.MoeTeleport; +import cc.carm.plugin.moeteleport.configuration.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/WarpTpCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpTpCommand.java new file mode 100644 index 0000000..424d676 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpTpCommand.java @@ -0,0 +1,32 @@ +package cc.carm.plugin.moeteleport.command.warp; + +import cc.carm.plugin.moeteleport.MoeTeleport; +import cc.carm.plugin.moeteleport.configuration.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/configuration/PluginConfig.java b/src/main/java/cc/carm/plugin/moeteleport/configuration/PluginConfig.java index d4d16f9..873ac57 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/configuration/PluginConfig.java +++ b/src/main/java/cc/carm/plugin/moeteleport/configuration/PluginConfig.java @@ -1,8 +1,8 @@ package cc.carm.plugin.moeteleport.configuration; -import cc.carm.plugin.moeteleport.configuration.values.ConfigValue; -import cc.carm.plugin.moeteleport.configuration.values.ConfigValueList; -import cc.carm.plugin.moeteleport.configuration.values.ConfigValueMap; +import cc.carm.lib.easyplugin.configuration.values.ConfigValue; +import cc.carm.lib.easyplugin.configuration.values.ConfigValueList; +import cc.carm.lib.easyplugin.configuration.values.ConfigValueMap; public class PluginConfig { @@ -22,8 +22,12 @@ public class PluginConfig { "storage.method", String.class, "YAML" ); - public static final ConfigValueMap PERMISSIONS = new ConfigValueMap<>( - "permissions", Integer::parseInt, String.class + public static final ConfigValueMap HOME_PERMISSIONS = new ConfigValueMap<>( + "permissions.home", Integer::parseInt, String.class + ); + + public static final ConfigValueMap WARP_PERMISSIONS = new ConfigValueMap<>( + "permissions.warp", Integer::parseInt, String.class ); public static final ConfigValueList DANGEROUS_TYPES = new ConfigValueList<>( @@ -35,7 +39,11 @@ public class PluginConfig { ); public static final ConfigValue DEFAULT_HOME = new ConfigValue<>( - "defaultHome", Integer.class, 1 + "defaults.home", Integer.class, 1 + ); + + public static final ConfigValue DEFAULT_WARP = new ConfigValue<>( + "defaults.warp", Integer.class, 0 ); public static final ConfigValue DEATH_GO_BACK = new ConfigValue<>( diff --git a/src/main/java/cc/carm/plugin/moeteleport/configuration/PluginMessages.java b/src/main/java/cc/carm/plugin/moeteleport/configuration/PluginMessages.java index 21932cd..cb791d6 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/configuration/PluginMessages.java +++ b/src/main/java/cc/carm/plugin/moeteleport/configuration/PluginMessages.java @@ -1,57 +1,222 @@ package cc.carm.plugin.moeteleport.configuration; -import cc.carm.plugin.moeteleport.configuration.message.ConfigMessage; -import cc.carm.plugin.moeteleport.configuration.message.ConfigMessageList; +import cc.carm.lib.easyplugin.configuration.language.EasyMessageList; +import cc.carm.lib.easyplugin.configuration.language.MessagesRoot; +import cc.carm.plugin.moeteleport.configuration.messages.MoeMessageList; -public class PluginMessages { +public class PluginMessages extends MessagesRoot { - public static final ConfigMessageList NO_LAST_LOCATION = new ConfigMessageList("no-last-location"); + public static final EasyMessageList NOT_ONLINE = MoeMessageList.builder().contents( + "&f目标玩家并不在线,无法发送请求。" + ).build(); - public static final ConfigMessageList NOT_ONLINE = new ConfigMessageList("not-online"); - public static final ConfigMessageList SELF_REQUEST = new ConfigMessageList("self-request"); + public static class Back { - public static final ConfigMessageList TPA = new ConfigMessageList("tpa"); - public static final ConfigMessageList TPA_HERE = new ConfigMessageList("tpahere"); + public static final EasyMessageList NO_LAST_LOCATION = MoeMessageList.builder().contents( + "&f您当前没有进行任何传送,无法返回上个地点。" + ).build(); - public static final ConfigMessageList TP_ACCEPT = new ConfigMessageList("tpaccept"); - public static final ConfigMessageList TP_DENY = new ConfigMessageList("tpdeny"); + public static final EasyMessageList DEATH_MESSAGE = MoeMessageList.builder().contents( + "&f您可以输入 &5/back &f或 [&d&l点击这里](show_text=点击返回到死亡地点 run_command=/back) &f返回您的死亡地点。" + ).build(); - public static final ConfigMessageList ACCEPTED = new ConfigMessageList("accepted"); - public static final ConfigMessageList DENIED = new ConfigMessageList("denied"); - - public static final ConfigMessageList TELEPORTING = new ConfigMessageList("teleporting"); - public static final ConfigMessageList DANGEROUS = new ConfigMessageList("dangerous"); - public static final ConfigMessageList DANGEROUS_HERE = new ConfigMessageList("dangerous-here"); - - public static final ConfigMessageList NOT_AVAILABLE = new ConfigMessageList("notAvailable"); - - public static final ConfigMessageList DEATH_BACK = new ConfigMessageList("death-back"); - - public static class Request { - public static final ConfigMessageList DUPLICATE = new ConfigMessageList("request-duplicate"); - public static final ConfigMessageList OFFLINE = new ConfigMessageList("offline"); - - public static final ConfigMessageList SENT = new ConfigMessageList("request-sent"); - public static final ConfigMessageList MULTI = new ConfigMessageList("multi-requests"); - public static final ConfigMessageList SENT_TIMEOUT = new ConfigMessageList("request-sent-timeout"); - public static final ConfigMessageList RECEIVED_TIMEOUT = new ConfigMessageList("request-received-timeout"); - - public static final ConfigMessageList NOT_FOUND = new ConfigMessageList("no-request"); - public static final ConfigMessageList NOT_FOUND_PLAYER = new ConfigMessageList("no-request-player"); } + public static class Teleport { + public static final EasyMessageList TELEPORTING = MoeMessageList.builder().contents( + "&f正在将您传送到 &d%(location) &f..." + ).params("location").build(); + + public static final EasyMessageList NOT_SAFE = MoeMessageList.builder().contents( + "&f目标地点 &d%(location) &f并不安全,因此传送被取消。", + "&7如需传送,请告知请求者到达安全位置后重新发送传送请求。" + ).params("location").build(); + + public static final EasyMessageList NOT_AVAILABLE = MoeMessageList.builder().contents( + "&f目标地点暂时无法前往,传送被取消。" + ).build(); + + } + + public static class Requests { + + public static final EasyMessageList SELF = MoeMessageList.builder().contents("&f您不能向自己发送请求。").build(); + + public static final EasyMessageList OFFLINE = MoeMessageList.builder().contents( + "&d%(player) &f离线,相关请求已自动取消。" + ).params("player").build(); + + public static final EasyMessageList MULTI = MoeMessageList.builder().contents( + "&f您当前有&d%(num)条请求&f待处理,请输入 &5/%(command) <玩家名> &f决定回应谁的请求。", + "&f您也可以再次输入 &5/%(command) &f快速回应最近的一条请求。" + ).params("num", "command").build(); + + + public static final EasyMessageList EMPTY_REQUESTS = MoeMessageList.builder() + .contents("&f您当前没有任何待处理的传送请求。") + .build(); + + public static final EasyMessageList NO_REQUEST_FROM = MoeMessageList.builder().contents( + "&f您当前没有收到来自 &d%(player) &f的传送请求。" + ).params("player").build(); + + public static final EasyMessageList SENT = MoeMessageList.builder().contents( + "&f成功向玩家 &d%(player) &f发送传送请求,对方有 &5%(expire)秒 &f的时间回应该请求。" + ).params("player", "expire").build(); + + public static final EasyMessageList DUPLICATE = MoeMessageList.builder().contents( + "&f您已经向 &d%(player) &f发送过传送请求,对方仍有 &5%(expire)秒 &f的时间回应该请求。" + ).params("player", "expire").build(); + + public static final EasyMessageList RECEIVED_TP_HERE = MoeMessageList.builder().contents( + "&d%(player) &f请求传送到您身边,您有 &5%(expire)秒 &f的时间回应。", + " [&a&l[点击同意]](show_text=点击同意请求 run_command=/tpAccept %(player)) &f或输入 &5/tpAccept &f同意该请求。", + " [&c&l[点击拒绝]](show_text=点击拒绝请求 run_command=/tpDeny %(player)) &f或输入 &5/tpDeny &f拒绝该请求。" + ).params("player", "expire").build(); + + public static final EasyMessageList RECEIVED_TP_TO = MoeMessageList.builder().contents( + "&d%(player) &f请求传送您到Ta身边,您有 &5%(expire)秒 &f的时间回应。", + " [&a&l[点击同意]](show_text=点击同意请求 run_command=/tpAccept %(player)) &f或输入 &5/tpAccept &f同意该请求。", + " [&c&l[点击拒绝]](show_text=点击拒绝请求 run_command=/tpDeny %(player)) &f或输入 &5/tpDeny &f拒绝该请求。" + ).params("player", "expire").build(); + + + public static final EasyMessageList ACCEPTED = MoeMessageList.builder().contents( + "&f您同意了 &d%(player) &f的传送请求。" + ).params("player").build(); + + public static final EasyMessageList DENIED = MoeMessageList.builder().contents( + "&f您&d拒绝&f了 &d%(player) &f的传送请求。" + ).params("player").build(); + + public static final EasyMessageList WAS_ACCEPTED = MoeMessageList.builder().contents( + "&d%(player) &f同意了您的传送请求。" + ).params("player").build(); + + public static final EasyMessageList WAS_DENIED = MoeMessageList.builder().contents( + "&d%(player) &f拒绝了您的传送请求。" + ).params("player").build(); + + public static final EasyMessageList SENT_TIMEOUT = MoeMessageList.builder().contents( + "&f发往 &d%(player) &f的传送请求已超时。" + ).params("player").build(); + + public static final EasyMessageList RECEIVED_TIMEOUT = MoeMessageList.builder().contents( + "&f来自 &d%(player) &f的传送请求已超时。" + ).params("player").build(); + + } + + public static class Home { - public static final ConfigMessageList HEADER = new ConfigMessageList("home-list-header"); - public static final ConfigMessage LIST_OBJECT = new ConfigMessage("home-list-object"); - public static final ConfigMessageList OVER_LIMIT = new ConfigMessageList("home-over-limit"); + public static final EasyMessageList NAME_TOO_LONG = MoeMessageList.builder() + .contents("&f您所输入的家的名字太长,家的名称不应当超过 &d32 &f个字符。") + .build(); - public static final ConfigMessageList NAME_TOO_LONG = new ConfigMessageList("name-too-long"); + public static final EasyMessageList OVER_LIMIT = MoeMessageList.builder().contents( + "&f您最多只能设置 &d%(max) &f个家传送点!", + "&7可以输入 &5/delHome <家名称> &7删除之前的家传送点,", + "&7或输入 &5/setHome <家名称> &7覆盖之前的家传送点。" + ).params("max").build(); - public static final ConfigMessageList NOT_FOUND = new ConfigMessageList("home-not-found"); - public static final ConfigMessageList SET = new ConfigMessageList("home-set"); + public static final EasyMessageList NOT_FOUND = MoeMessageList.builder() + .contents("&f您还没有设置这个家,请先输入 &5/setHome <家名称> &f设置一个吧!") + .build(); + + public static final EasyMessageList SET = MoeMessageList.builder().contents( + "&f成功设定名为 &d%(name) &f的家传送点。" + ).params("name").build(); + + public static final EasyMessageList OVERRIDE = MoeMessageList.builder().contents( + "&f成功覆盖名为 &d%(name) &f的家传送点。", + "&8原先位置为 &5%(location) &8。" + ).params("name", "location").build(); + + public static final EasyMessageList REMOVED = MoeMessageList.builder().contents( + "&f成功移除名为 &d%(name) &f的家传送点。", + "&8原先位置为 &5%(location) &8。" + ).params("name", "location").build(); + + public static class List { + + public static final EasyMessageList HEADER = MoeMessageList.builder().contents( + "&f您当前设定的所有家:" + ).build(); + + public static final EasyMessageList OBJECT = MoeMessageList.builder().contents( + "&8# &f%(id) &d%(location) [&7✈](show_text=点击返回家 %(id) run_command=/home %(id))" + ).params("id", "location").build(); + + } + + } + + public static class Warp { + + public static final EasyMessageList EMPTY = MoeMessageList.builder().contents( + "&f当前服务器暂无任何地标点,快设置一个吧!" + ).build(); + + public static final EasyMessageList NOT_OWNER = MoeMessageList.builder().contents( + "&f您不是地标 &d%(name) &f的创建者,无法进行此操作。" + ).params("name").build(); + + public static final EasyMessageList NOT_FOUND = MoeMessageList.builder() + .contents("&f目前暂不存在该地标。") + .build(); + + public static final EasyMessageList NAME_TOO_LONG = MoeMessageList.builder() + .contents("&f您所输入的家的名字太长,地标的名称不应当超过 &d16 &f个字符。") + .build(); + + public static final EasyMessageList OVER_LIMIT = MoeMessageList.builder().contents( + "&f您最多只能设置 &d%(max) &f个地标传送点!", + "&7可以输入 &5/delWarp <地标名称> &7删除之前的地标传送点,", + "&7或输入 &5/setWarp <地标名称> &7覆盖之前的地标传送点。" + ).params("max").build(); + + public static final EasyMessageList INFO_LOCATION = MoeMessageList.builder().contents( + "&f地标点 &d%(name) &f所在位置为 &5%(location) &f。[&7✈](show_text=点击前往&d %(name) run_command=/warp %(name))" + ).params("name", "location").build(); + + public static final EasyMessageList INFO_FULL = MoeMessageList.builder().contents( + "&f地标点 &d%(name) &f由 &5%(owner) &f创建,所在位置为 &d%(location) &f。[&7✈](show_text=点击前往&d %(name) run_command=/warp %(name))" + ).params("name", "owner", "location").build(); + + public static final EasyMessageList SET = MoeMessageList.builder().contents( + "&f成功设定名为 &d%(name) &f的地标传送点。" + ).params("name").build(); + + public static final EasyMessageList OVERRIDE = MoeMessageList.builder().contents( + "&f成功覆盖名为 &d%(name) &f的地标传送点。", + "&8原先位置为 &5%(location) &8。" + ).params("name", "location").build(); + + public static final EasyMessageList REMOVED = MoeMessageList.builder().contents( + "&f成功移除名为 &d%(name) &f的地标传送点。", + "&8原先位置为 &5%(location) &8。" + ).params("name", "location").build(); + + + public static class List { + + public static final EasyMessageList HEADER = MoeMessageList.builder().contents( + "&f当前地标列表 &7(第&f%(current)&8/%(max)&7页):" + ).params("current", "max").build(); + + public static final EasyMessageList OBJECT = MoeMessageList.builder().contents( + "&8# &f%(id) &7[由%(owner)创建]", + "&8- &d%(location) [&7✈](show_text=点击前往&d %(id) run_command=/warp %(id))" + ).params("id", "owner", "location").build(); + + public static final EasyMessageList OBJECT_NO_OWNER = MoeMessageList.builder().contents( + "&8# &f%(id)", + "&8- &d%(location) [&7✈](show_text=点击前往&d %(id) run_command=/warp %(id))" + ).params("id", "location").build(); + + } - public static final ConfigMessageList REMOVED = new ConfigMessageList("home-removed"); } diff --git a/src/main/java/cc/carm/plugin/moeteleport/configuration/file/FileConfig.java b/src/main/java/cc/carm/plugin/moeteleport/configuration/file/FileConfig.java deleted file mode 100644 index cb0b683..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/configuration/file/FileConfig.java +++ /dev/null @@ -1,64 +0,0 @@ -package cc.carm.plugin.moeteleport.configuration.file; - - -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.plugin.java.JavaPlugin; - -import java.io.File; -import java.io.IOException; - -public class FileConfig { - - private final JavaPlugin plugin; - private final String fileName; - - - private File file; - private FileConfiguration config; - - public FileConfig(final JavaPlugin plugin) { - this(plugin, "config.yml"); - } - - public FileConfig(final JavaPlugin plugin, final String name) { - this.plugin = plugin; - this.fileName = name; - initFile(); - } - - private void initFile() { - this.file = new File(plugin.getDataFolder(), fileName); - if (!this.file.exists()) { - if (!this.file.getParentFile().exists()) { - boolean success = this.file.getParentFile().mkdirs(); - } - plugin.saveResource(fileName, true); - } - this.config = YamlConfiguration.loadConfiguration(this.file); - } - - public File getFile() { - return file; - } - - public FileConfiguration getConfig() { - return config; - } - - public void save() { - try { - getConfig().save(getFile()); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public void reload() { - if (getFile().exists()) { - this.config = YamlConfiguration.loadConfiguration(getFile()); - } else { - initFile(); - } - } -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/configuration/message/ConfigMessage.java b/src/main/java/cc/carm/plugin/moeteleport/configuration/message/ConfigMessage.java deleted file mode 100644 index 852b397..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/configuration/message/ConfigMessage.java +++ /dev/null @@ -1,32 +0,0 @@ -package cc.carm.plugin.moeteleport.configuration.message; - -import cc.carm.plugin.moeteleport.configuration.values.ConfigValue; -import cc.carm.plugin.moeteleport.manager.ConfigManager; -import cc.carm.plugin.moeteleport.util.MessageUtil; -import org.bukkit.command.CommandSender; - -import java.util.Collections; - -public class ConfigMessage extends ConfigValue { - - public ConfigMessage(String configSection) { - this(configSection, null); - } - - public ConfigMessage(String configSection, String defaultValue) { - super(ConfigManager.getMessageConfig(), configSection, String.class, defaultValue); - } - - public void send(CommandSender sender) { - MessageUtil.send(sender, get()); - } - - public void sendWithPlaceholders(CommandSender sender) { - MessageUtil.sendWithPlaceholders(sender, get()); - } - - public void sendWithPlaceholders(CommandSender sender, String[] params, Object[] values) { - MessageUtil.sendWithPlaceholders(sender, Collections.singletonList(get()), params, values); - } - -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/configuration/message/ConfigMessageList.java b/src/main/java/cc/carm/plugin/moeteleport/configuration/message/ConfigMessageList.java deleted file mode 100644 index d129568..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/configuration/message/ConfigMessageList.java +++ /dev/null @@ -1,30 +0,0 @@ -package cc.carm.plugin.moeteleport.configuration.message; - -import cc.carm.plugin.moeteleport.configuration.values.ConfigValueList; -import cc.carm.plugin.moeteleport.manager.ConfigManager; -import cc.carm.plugin.moeteleport.util.MessageUtil; -import org.bukkit.command.CommandSender; -import org.jetbrains.annotations.Nullable; - -public class ConfigMessageList extends ConfigValueList { - - public ConfigMessageList(String configSection) { - super(ConfigManager.getMessageConfig(), configSection, String.class); - } - - public ConfigMessageList(String configSection, String[] defaultValue) { - super(ConfigManager.getMessageConfig(), configSection, String.class, defaultValue); - } - - public void send(@Nullable CommandSender sender) { - MessageUtil.send(sender, get()); - } - - public void sendWithPlaceholders(@Nullable CommandSender sender) { - MessageUtil.sendWithPlaceholders(sender, get()); - } - - public void sendWithPlaceholders(@Nullable CommandSender sender, String[] params, Object[] values) { - MessageUtil.sendWithPlaceholders(sender, get(), params, values); - } -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/configuration/messages/MoeMessage.java b/src/main/java/cc/carm/plugin/moeteleport/configuration/messages/MoeMessage.java new file mode 100644 index 0000000..8feecd6 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/configuration/messages/MoeMessage.java @@ -0,0 +1,33 @@ +package cc.carm.plugin.moeteleport.configuration.messages; + +import cc.carm.lib.easyplugin.configuration.language.EasyMessage; +import cc.carm.lib.easyplugin.configuration.language.builder.EasyMessageBuilder; +import de.themoep.minedown.MineDown; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.Nullable; + +public class MoeMessage extends EasyMessage { + + public MoeMessage(@Nullable String defaultValue, @Nullable String[] messageParams) { + super(defaultValue, messageParams); + } + + public static EasyMessageBuilder builder() { + return new EasyMessageBuilder() { + @Override + public MoeMessage build() { + return new MoeMessage(this.content, buildParams()); + } + }; + } + + @Override + public void send(@Nullable CommandSender sender, @Nullable String[] params, @Nullable Object[] values) { + if (sender == null) return; + String message = get(sender, params, values); + if (message.length() < 1) return; + sender.spigot().sendMessage(MineDown.parse(message)); + } + + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/configuration/messages/MoeMessageList.java b/src/main/java/cc/carm/plugin/moeteleport/configuration/messages/MoeMessageList.java new file mode 100644 index 0000000..c45dd36 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/configuration/messages/MoeMessageList.java @@ -0,0 +1,37 @@ +package cc.carm.plugin.moeteleport.configuration.messages; + +import cc.carm.lib.easyplugin.configuration.language.EasyMessageList; +import cc.carm.lib.easyplugin.configuration.language.builder.EasyMessageListBuilder; +import de.themoep.minedown.MineDown; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class MoeMessageList extends EasyMessageList { + + public MoeMessageList(@Nullable String[] defaultValue, @Nullable String[] messageParams) { + super(defaultValue, messageParams); + } + + public static EasyMessageListBuilder builder() { + return new EasyMessageListBuilder() { + @Override + public MoeMessageList build() { + return new MoeMessageList(this.contents, buildParams()); + } + }; + } + + @Override + public void send(@Nullable CommandSender sender, @Nullable String[] params, @Nullable Object[] values) { + if (sender == null) return; + List messages = get(sender, params, values); + if (messages.isEmpty()) return; + if (messages.size() == 1 && messages.get(0).length() == 0) return; //空消息不再发送 + messages.forEach(message -> sender.spigot().sendMessage(MineDown.parse(message))); + + } + + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/configuration/values/ConfigValue.java b/src/main/java/cc/carm/plugin/moeteleport/configuration/values/ConfigValue.java deleted file mode 100644 index 59e251b..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/configuration/values/ConfigValue.java +++ /dev/null @@ -1,58 +0,0 @@ -package cc.carm.plugin.moeteleport.configuration.values; - -import cc.carm.plugin.moeteleport.configuration.file.FileConfig; -import cc.carm.plugin.moeteleport.manager.ConfigManager; -import org.bukkit.configuration.file.FileConfiguration; - -public class ConfigValue { - - FileConfig source; - - String configSection; - Class clazz; - V defaultValue; - - public ConfigValue(String configSection, Class clazz) { - this(configSection, clazz, null); - } - - public ConfigValue(String configSection, Class clazz, V defaultValue) { - this(ConfigManager.getPluginConfig(), configSection, clazz, defaultValue); - } - - public ConfigValue(FileConfig source, String configSection, Class clazz, V defaultValue) { - this.source = source; - this.configSection = configSection; - this.clazz = clazz; - this.defaultValue = defaultValue; - } - - public FileConfiguration getConfiguration() { - return this.source.getConfig(); - } - - public V get() { - if (getConfiguration().contains(this.configSection)) { - Object val = getConfiguration().get(this.configSection, this.defaultValue); - return this.clazz.isInstance(val) ? this.clazz.cast(val) : this.defaultValue; - } else { - // 如果没有默认值,就把配置写进去,便于配置 - return setDefault(); - } - } - - public void set(V value) { - getConfiguration().set(this.configSection, value); - this.save(); - } - - public void save() { - this.source.save(); - } - - public V setDefault() { - set(this.defaultValue); - return this.defaultValue; - } - -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/configuration/values/ConfigValueList.java b/src/main/java/cc/carm/plugin/moeteleport/configuration/values/ConfigValueList.java deleted file mode 100644 index 4233686..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/configuration/values/ConfigValueList.java +++ /dev/null @@ -1,71 +0,0 @@ -package cc.carm.plugin.moeteleport.configuration.values; - -import cc.carm.plugin.moeteleport.configuration.file.FileConfig; -import cc.carm.plugin.moeteleport.manager.ConfigManager; -import org.bukkit.configuration.file.FileConfiguration; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class ConfigValueList { - FileConfig source; - String configSection; - Class clazz; - - V[] defaultValue; - - public ConfigValueList(String configSection, Class clazz) { - this(ConfigManager.getPluginConfig(), configSection, clazz); - } - - public ConfigValueList(String configSection, Class clazz, V[] defaultValue) { - this(ConfigManager.getPluginConfig(), configSection, clazz, defaultValue); - } - - public ConfigValueList(FileConfig configuration, String configSection, Class clazz) { - this(configuration, configSection, clazz, null); - } - - public ConfigValueList(FileConfig configuration, String configSection, Class clazz, V[] defaultValue) { - this.source = configuration; - this.configSection = configSection; - this.clazz = clazz; - this.defaultValue = defaultValue; - } - - public FileConfiguration getConfiguration() { - return this.source.getConfig(); - } - - - public ArrayList get() { - List list = getConfiguration().getList(this.configSection); - if (list == null) { - if (defaultValue != null) { - return new ArrayList<>(Arrays.asList(defaultValue)); - } else { - return new ArrayList<>(); - } - } else { - ArrayList result = new ArrayList<>(); - - for (Object object : list) { - if (this.clazz.isInstance(object)) { - result.add(this.clazz.cast(object)); - } - } - return result; - } - } - - public void set(ArrayList value) { - getConfiguration().set(this.configSection, value); - this.save(); - } - - public void save() { - this.source.save(); - } - -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/configuration/values/ConfigValueMap.java b/src/main/java/cc/carm/plugin/moeteleport/configuration/values/ConfigValueMap.java deleted file mode 100644 index 12e7eba..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/configuration/values/ConfigValueMap.java +++ /dev/null @@ -1,79 +0,0 @@ -package cc.carm.plugin.moeteleport.configuration.values; - -import cc.carm.plugin.moeteleport.configuration.file.FileConfig; -import cc.carm.plugin.moeteleport.manager.ConfigManager; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; -import java.util.function.Function; - -public class ConfigValueMap { - - @NotNull FileConfig source; - @NotNull String configSection; - - @NotNull Function keyCast; - @NotNull Class valueClazz; - - @Nullable LinkedHashMap valueCache; - - public ConfigValueMap(@NotNull String configSection, @NotNull Function keyCast, - @NotNull Class valueClazz) { - this(ConfigManager.getPluginConfig(), configSection, keyCast, valueClazz); - } - - public ConfigValueMap(@NotNull FileConfig configuration, @NotNull String configSection, - @NotNull Function keyCast, @NotNull Class valueClazz) { - this.source = configuration; - this.configSection = configSection; - this.keyCast = keyCast; - this.valueClazz = valueClazz; - } - - - public @NotNull FileConfiguration getConfiguration() { - return this.source.getConfig(); - } - - public void clearCache() { - this.valueCache = null; - } - - @NotNull - public Map get() { - if (valueCache != null) return valueCache; - ConfigurationSection section = getConfiguration().getConfigurationSection(this.configSection); - if (section == null) return new LinkedHashMap<>(); - Set keys = section.getKeys(false); - if (keys.isEmpty()) return new LinkedHashMap<>(); - else { - LinkedHashMap result = new LinkedHashMap<>(); - for (String key : keys) { - K finalKey = keyCast.apply(key); - Object val = section.get(key); - V finalValue = this.valueClazz.isInstance(val) ? this.valueClazz.cast(val) : null; - if (finalKey != null && finalValue != null) { - result.put(finalKey, finalValue); - } - } - this.valueCache = result; - return result; - } - } - - public void set(LinkedHashMap valuesMap) { - this.valueCache = valuesMap; - getConfiguration().createSection(this.configSection, valuesMap); - this.save(); - } - - public void save() { - this.source.save(); - } - -} 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 d289d0c..b4f1d32 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/listener/UserListener.java +++ b/src/main/java/cc/carm/plugin/moeteleport/listener/UserListener.java @@ -1,6 +1,6 @@ package cc.carm.plugin.moeteleport.listener; -import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.MoeTeleport; import cc.carm.plugin.moeteleport.configuration.PluginConfig; import cc.carm.plugin.moeteleport.configuration.PluginMessages; import org.bukkit.entity.Player; @@ -14,22 +14,22 @@ public class UserListener implements Listener { @EventHandler public void onJoin(PlayerJoinEvent event) { - Main.getUserManager().loadData(event.getPlayer().getUniqueId()); + MoeTeleport.getUserManager().loadData(event.getPlayer().getUniqueId()); } @EventHandler public void onQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); - Main.getRequestManager().cancelAllRequests(player); - Main.getUserManager().unloadData(player.getUniqueId()); + MoeTeleport.getRequestManager().cancelAllRequests(player); + MoeTeleport.getUserManager().unloadData(player.getUniqueId()); } @EventHandler public void onDeath(PlayerDeathEvent event) { if (PluginConfig.DEATH_GO_BACK.get()) { Player player = event.getEntity(); - Main.getUserManager().getData(player).setLastLocation(player.getLocation()); - PluginMessages.DEATH_BACK.send(player); + MoeTeleport.getUserManager().getData(player).setLastLocation(player.getLocation()); + PluginMessages.Back.DEATH_MESSAGE.send(player); } } diff --git a/src/main/java/cc/carm/plugin/moeteleport/manager/ConfigManager.java b/src/main/java/cc/carm/plugin/moeteleport/manager/ConfigManager.java index 7cdc6a0..ae97566 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/manager/ConfigManager.java +++ b/src/main/java/cc/carm/plugin/moeteleport/manager/ConfigManager.java @@ -1,17 +1,32 @@ package cc.carm.plugin.moeteleport.manager; +import cc.carm.lib.easyplugin.configuration.file.FileConfig; +import cc.carm.lib.easyplugin.configuration.language.MessagesConfig; +import cc.carm.lib.easyplugin.configuration.language.MessagesInitializer; import cc.carm.plugin.moeteleport.Main; -import cc.carm.plugin.moeteleport.configuration.PluginConfig; -import cc.carm.plugin.moeteleport.configuration.file.FileConfig; +import cc.carm.plugin.moeteleport.configuration.PluginMessages; + +import java.io.IOException; public class ConfigManager { private static FileConfig config; - private static FileConfig messageConfig; + private static MessagesConfig messageConfig; - public static void initConfig() { - ConfigManager.config = new FileConfig(Main.getInstance(), "config.yml"); - ConfigManager.messageConfig = new FileConfig(Main.getInstance(), "messages.yml"); + public static boolean initConfig() { + try { + ConfigManager.config = new FileConfig(Main.getInstance()); + ConfigManager.messageConfig = new MessagesConfig(Main.getInstance()); + + FileConfig.pluginConfiguration = () -> config; + FileConfig.messageConfiguration = () -> messageConfig; + + MessagesInitializer.initialize(messageConfig, PluginMessages.class); + + return true; + } catch (IOException e) { + return false; + } } public static FileConfig getPluginConfig() { @@ -23,14 +38,19 @@ public class ConfigManager { } public static void reload() { - getPluginConfig().reload(); - getMessageConfig().reload(); - PluginConfig.PERMISSIONS.clearCache(); + try { + getPluginConfig().reload(); + getMessageConfig().reload(); + } catch (Exception ignored) { + } } public static void saveConfig() { - getPluginConfig().save(); - getMessageConfig().save(); + try { + getPluginConfig().save(); + getMessageConfig().save(); + } catch (Exception ignored) { + } } 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 d939455..dcce574 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/manager/RequestManager.java +++ b/src/main/java/cc/carm/plugin/moeteleport/manager/RequestManager.java @@ -1,6 +1,7 @@ package cc.carm.plugin.moeteleport.manager; import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.MoeTeleport; import cc.carm.plugin.moeteleport.configuration.PluginConfig; import cc.carm.plugin.moeteleport.configuration.PluginMessages; import cc.carm.plugin.moeteleport.model.TeleportRequest; @@ -33,16 +34,16 @@ public class RequestManager { } public void checkRequests() { - Main.getUserManager().getUserDataMap().values() + MoeTeleport.getUserManager().getUserDataMap().values() .forEach(data -> data.getReceivedRequests().entrySet().stream() .filter(entry -> entry.getValue().isExpired()) - .peek(entry -> PluginMessages.Request.SENT_TIMEOUT.sendWithPlaceholders( - entry.getValue().getSender(), new String[]{"%(player)"}, - new Object[]{entry.getValue().getReceiver().getName()})) - .peek(entry -> PluginMessages.Request.RECEIVED_TIMEOUT.sendWithPlaceholders( - entry.getValue().getReceiver(), new String[]{"%(player)"}, - new Object[]{entry.getValue().getSender().getName()})) - .peek(entry -> Main.getUserManager() + .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()); + }) + .peek(entry -> MoeTeleport.getUserManager() .getData(entry.getValue().getSender()).getSentRequests() .remove(entry.getKey())) .forEach(entry -> data.getReceivedRequests().remove(entry.getKey())) @@ -52,84 +53,59 @@ public class RequestManager { public void sendRequest(Player sender, Player receiver, TeleportRequest.RequestType type) { int expireTime = PluginConfig.EXPIRE_TIME.get(); - PluginMessages.Request.SENT.sendWithPlaceholders(sender, - new String[]{"%(player)", "%(expire)"}, - new Object[]{receiver.getName(), expireTime} - ); + PluginMessages.Requests.SENT.send(sender, receiver.getName(), expireTime); switch (type) { case TPA: { - PluginMessages.TPA.sendWithPlaceholders(receiver, - new String[]{"%(player)", "%(expire)"}, - new Object[]{sender.getName(), expireTime} - ); + PluginMessages.Requests.RECEIVED_TP_HERE.send(receiver, sender.getName(), expireTime); break; } case TPA_HERE: { - PluginMessages.TPA_HERE.sendWithPlaceholders(receiver, - new String[]{"%(player)", "%(expire)"}, - new Object[]{sender.getName(), expireTime} - ); + PluginMessages.Requests.RECEIVED_TP_TO.send(receiver, sender.getName(), expireTime); break; } } TeleportRequest request = new TeleportRequest(sender, receiver, type); - Main.getUserManager().getData(receiver).getReceivedRequests().put(sender.getUniqueId(), request); - Main.getUserManager().getData(sender).getSentRequests().add(receiver.getUniqueId()); + MoeTeleport.getUserManager().getData(receiver).getReceivedRequests().put(sender.getUniqueId(), request); + MoeTeleport.getUserManager().getData(sender).getSentRequests().add(receiver.getUniqueId()); } public void acceptRequest(TeleportRequest request) { - PluginMessages.ACCEPTED.sendWithPlaceholders(request.getSender(), - new String[]{"%(player)"}, - new Object[]{request.getReceiver().getName()} - ); - PluginMessages.TP_ACCEPT.sendWithPlaceholders(request.getReceiver(), - new String[]{"%(player)"}, - new Object[]{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.DENIED.sendWithPlaceholders(request.getSender(), - new String[]{"%(player)"}, - new Object[]{request.getReceiver().getName()} - ); - PluginMessages.TP_DENY.sendWithPlaceholders(request.getReceiver(), - new String[]{"%(player)"}, - new Object[]{request.getSender().getName()} - ); + PluginMessages.Requests.WAS_DENIED.send(request.getSender(), request.getReceiver().getName()); + PluginMessages.Requests.DENIED.send(request.getReceiver(), request.getSender().getName()); removeRequests(request); } public void removeRequests(TeleportRequest request) { - Main.getUserManager().getData(request.getSender()) + MoeTeleport.getUserManager().getData(request.getSender()) .getSentRequests() .remove(request.getReceiver().getUniqueId()); - Main.getUserManager().getData(request.getReceiver()) + MoeTeleport.getUserManager().getData(request.getReceiver()) .getReceivedRequests() .remove(request.getSender().getUniqueId()); } public void cancelAllRequests(Player player) { UUID playerUUID = player.getUniqueId(); - UserData data = Main.getUserManager().getData(player); + UserData data = MoeTeleport.getUserManager().getData(player); data.getReceivedRequests().keySet().stream() - .peek(senderUUID -> PluginMessages.Request.OFFLINE.sendWithPlaceholders( - Bukkit.getPlayer(senderUUID), - new String[]{"%(player)"}, new Object[]{player.getName()} - )).map(senderUUID -> Main.getUserManager().getData(senderUUID)) + .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.Request.OFFLINE.sendWithPlaceholders( - Bukkit.getPlayer(receiverUUID), - new String[]{"%(player)"}, new Object[]{player.getName()} - )).map(receiverUUID -> Main.getUserManager().getData(receiverUUID)) + .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 5b10cdb..65a2c17 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/manager/TeleportManager.java +++ b/src/main/java/cc/carm/plugin/moeteleport/manager/TeleportManager.java @@ -1,6 +1,6 @@ package cc.carm.plugin.moeteleport.manager; -import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.MoeTeleport; import cc.carm.plugin.moeteleport.configuration.PluginConfig; import cc.carm.plugin.moeteleport.configuration.PluginMessages; import cc.carm.plugin.moeteleport.configuration.location.DataLocation; @@ -14,10 +14,7 @@ public class TeleportManager { public static void teleport(Player player, DataLocation targetLocation, boolean onlySafety) { Location location = targetLocation.getBukkitLocation(); if (location == null) { - PluginMessages.NOT_AVAILABLE.sendWithPlaceholders(player, - new String[]{"%(location)"}, - new Object[]{targetLocation.toFlatString()} - ); + PluginMessages.Teleport.NOT_AVAILABLE.send(player, targetLocation.toFlatString()); } else { teleport(player, location, onlySafety); } @@ -26,20 +23,14 @@ public class TeleportManager { public static void teleport(Player player, Location targetLocation, boolean onlySafety) { if (targetLocation.isWorldLoaded()) { if (!onlySafety || TeleportManager.isSafeLocation(targetLocation)) { - Main.getUserManager().getData(player).setLastLocation(player.getLocation()); + MoeTeleport.getUserManager().getData(player).setLastLocation(player.getLocation()); player.teleport(targetLocation); - PluginMessages.TELEPORTING.sendWithPlaceholders(player, - new String[]{"%(location)"}, - new Object[]{new DataLocation(targetLocation).toFlatString()} - ); + PluginMessages.Teleport.TELEPORTING.send(player, new DataLocation(targetLocation).toFlatString()); } else { - PluginMessages.DANGEROUS.send(player); + PluginMessages.Teleport.NOT_SAFE.send(player, new DataLocation(targetLocation).toFlatString()); } } else { - PluginMessages.NOT_AVAILABLE.sendWithPlaceholders(player, - new String[]{"%(location)"}, - new Object[]{new DataLocation(targetLocation).toFlatString()} - ); + PluginMessages.Teleport.NOT_SAFE.send(player, new DataLocation(targetLocation).toFlatString()); } } diff --git a/src/main/java/cc/carm/plugin/moeteleport/manager/UserManager.java b/src/main/java/cc/carm/plugin/moeteleport/manager/UserManager.java index af1951d..fd8e63a 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/manager/UserManager.java +++ b/src/main/java/cc/carm/plugin/moeteleport/manager/UserManager.java @@ -1,17 +1,22 @@ package cc.carm.plugin.moeteleport.manager; import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.MoeTeleport; import cc.carm.plugin.moeteleport.configuration.PluginConfig; import cc.carm.plugin.moeteleport.model.UserData; +import cc.carm.plugin.moeteleport.model.WarpInfo; import cc.carm.plugin.moeteleport.storage.DataStorage; import cc.carm.plugin.moeteleport.util.DataTaskRunner; +import com.google.common.collect.ImmutableMap; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Unmodifiable; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.UUID; public class UserManager { @@ -22,27 +27,39 @@ public class UserManager { this.userDataMap = new HashMap<>(); } + private static int getMaxValue(Player player, Map permissions, int defaultValue) { + int current = defaultValue; + + for (Map.Entry entry : permissions.entrySet()) { + if (entry.getKey() > current && player.hasPermission(entry.getValue())) { + current = entry.getKey(); + } + } + + return current; + } + @NotNull public UserData readData(UUID userUUID) { try { long start = System.currentTimeMillis(); - DataStorage storage = Main.getStorage(); - Main.debug("正通过 " + storage.getClass().getSimpleName() + " 读取 " + userUUID + " 的用户数据...(" + System.currentTimeMillis() + ")"); + DataStorage storage = MoeTeleport.getStorage(); + Main.debugging("正通过 " + storage.getClass().getSimpleName() + " 读取 " + userUUID + " 的用户数据...(" + System.currentTimeMillis() + ")"); UserData data = storage.loadData(userUUID); if (data == null) { - Main.debug("当前还不存在玩家 " + userUUID + " 的数据,视作新档。"); + Main.debugging("当前还不存在玩家 " + userUUID + " 的数据,视作新档。"); return new UserData(userUUID); } - Main.debug("通过 " + storage.getClass().getSimpleName() + "读取 " + userUUID + " 的用户数据完成," + Main.debugging("通过 " + storage.getClass().getSimpleName() + "读取 " + userUUID + " 的用户数据完成," + "耗时 " + (System.currentTimeMillis() - start) + "ms。"); return data; } catch (Exception e) { - Main.error("无法正常读取玩家数据,玩家操作将不会被保存,请检查数据配置!"); - Main.error("Could not load user's data, please check the data configuration!"); + Main.serve("无法正常读取玩家数据,玩家操作将不会被保存,请检查数据配置!"); + Main.serve("Could not load user's data, please check the data configuration!"); e.printStackTrace(); return new UserData(userUUID); } @@ -51,17 +68,17 @@ public class UserManager { public void saveData(UserData data) { try { long start = System.currentTimeMillis(); - DataStorage storage = Main.getStorage(); + DataStorage storage = MoeTeleport.getStorage(); - Main.debug("正通过 " + storage.getClass().getSimpleName() + " 保存 " + data.getUserUUID() + " 的用户数据...(" + System.currentTimeMillis() + ")"); + Main.debugging("正通过 " + storage.getClass().getSimpleName() + " 保存 " + data.getUserUUID() + " 的用户数据...(" + System.currentTimeMillis() + ")"); storage.saveUserData(data); - Main.debug("通过 " + storage.getClass().getSimpleName() + " 保存 " + data.getUserUUID() + " 的用户数据完成," + + Main.debugging("通过 " + storage.getClass().getSimpleName() + " 保存 " + data.getUserUUID() + " 的用户数据完成," + "耗时 " + (System.currentTimeMillis() - start) + "ms。"); } catch (Exception e) { - Main.error("无法正常保存玩家数据,请检查数据配置!"); - Main.error("Could not save user's data, please check the data configuration!"); + Main.serve("无法正常保存玩家数据,请检查数据配置!"); + Main.serve("Could not save user's data, please check the data configuration!"); e.printStackTrace(); } } @@ -107,33 +124,42 @@ public class UserManager { return getUserDataMap().get(player.getUniqueId()); } - public int getMaxHome(Player player) { - Map permissions = PluginConfig.PERMISSIONS.get(); - int current = PluginConfig.DEFAULT_HOME.get(); + public long countUserWarps(UUID userUUID) { + return MoeTeleport.getWarpManager().listWarps().values().stream() + .map(WarpInfo::getOwner).filter(Objects::nonNull) + .filter(ownerUUID -> ownerUUID.equals(userUUID)) + .count(); + } - for (Map.Entry entry : permissions.entrySet()) { - if (entry.getKey() > current && player.hasPermission(entry.getValue())) { - current = entry.getKey(); - } - } - return current; + public int getMaxHome(Player player) { + return getMaxValue(player, PluginConfig.HOME_PERMISSIONS.get(), PluginConfig.DEFAULT_HOME.get()); + } + + public int getMaxWarps(Player player) { + return getMaxValue(player, PluginConfig.WARP_PERMISSIONS.get(), PluginConfig.DEFAULT_WARP.get()); } public void editData(@NotNull DataTaskRunner task) { try { - task.run(Main.getStorage()); + task.run(MoeTeleport.getStorage()); } catch (Exception exception) { - Main.error("无法正常更改玩家数据,请检查数据配置!"); - Main.error("Could not edit user's data, please check the data configuration!"); + Main.serve("无法正常更改玩家数据,请检查数据配置!"); + Main.serve("Could not edit user's data, please check the data configuration!"); exception.printStackTrace(); } } public void editDataAsync(@NotNull DataTaskRunner task) { - Main.getScheduler().runAsync(() -> editData(task)); + Main.getInstance().getScheduler().runAsync(() -> editData(task)); } - public HashMap getUserDataMap() { + @NotNull + @Unmodifiable + public Map listUserData() { + return ImmutableMap.copyOf(getUserDataMap()); + } + + protected @NotNull HashMap getUserDataMap() { return userDataMap; } diff --git a/src/main/java/cc/carm/plugin/moeteleport/manager/WarpManager.java b/src/main/java/cc/carm/plugin/moeteleport/manager/WarpManager.java new file mode 100644 index 0000000..f6f84b8 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/manager/WarpManager.java @@ -0,0 +1,86 @@ +package cc.carm.plugin.moeteleport.manager; + +import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.MoeTeleport; +import cc.carm.plugin.moeteleport.configuration.location.DataLocation; +import cc.carm.plugin.moeteleport.model.WarpInfo; +import com.google.common.collect.ImmutableMap; +import org.bukkit.Location; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Unmodifiable; + +import java.util.Map; +import java.util.UUID; + +public class WarpManager { + + public void saveWarps() { + try { + MoeTeleport.getStorage().saveWarps(); + } catch (Exception exception) { + Main.serve("保存地标数据失败,请检查配置文件。"); + exception.printStackTrace(); + } + } + + public void setWarp(@NotNull String name, @Nullable UUID owner, @NotNull Location location) { + setWarp(name, owner, new DataLocation(location)); + } + + public void setWarp(@NotNull String name, @Nullable UUID owner, @NotNull DataLocation location) { + + try { + MoeTeleport.getStorage().setWarp(name, new WarpInfo(name,owner, location)); + } catch (Exception exception) { + Main.serve("保存地标数据 " + name + " 失败,请检查配置文件。"); + exception.printStackTrace(); + } + + } + + public void setWarpAsync(@NotNull String name, @Nullable UUID owner, @NotNull Location location) { + Main.getInstance().getScheduler().runAsync(() -> setWarp(name, owner, location)); + } + + public void setWarpAsync(@NotNull String name, @Nullable UUID owner, @NotNull DataLocation location) { + Main.getInstance().getScheduler().runAsync(() -> setWarp(name, owner, location)); + } + + public void delWarp(@NotNull String name) { + try { + MoeTeleport.getStorage().delWarp(name); + } catch (Exception exception) { + Main.serve("删除地标数据 " + name + " 失败,请检查配置文件。"); + exception.printStackTrace(); + } + } + + public void delWarpAsync(@NotNull String name) { + Main.getInstance().getScheduler().runAsync(() -> delWarp(name)); + } + + public WarpInfo getWarp(@NotNull String name) { + return listWarps().entrySet().stream() + .filter(entry -> entry.getKey().equalsIgnoreCase(name)) + .map(Map.Entry::getValue) + .findFirst().orElse(null); + } + + public boolean hasWarp(@NotNull String name) { + return MoeTeleport.getStorage().hasWarp(name); + } + + @NotNull + @Unmodifiable + public Map listWarps() { + return ImmutableMap.copyOf(getWarpsMap()); + } + + @NotNull + protected Map getWarpsMap() { + return MoeTeleport.getStorage().getWarps(); + } + + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/model/UserData.java b/src/main/java/cc/carm/plugin/moeteleport/model/UserData.java index 6901bbb..a11218c 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/model/UserData.java +++ b/src/main/java/cc/carm/plugin/moeteleport/model/UserData.java @@ -1,6 +1,6 @@ package cc.carm.plugin.moeteleport.model; -import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.MoeTeleport; import cc.carm.plugin.moeteleport.configuration.location.DataLocation; import org.bukkit.Location; import org.jetbrains.annotations.NotNull; @@ -12,13 +12,11 @@ import java.util.concurrent.ConcurrentHashMap; public class UserData { protected final @NotNull UUID userUUID; - - public boolean enableAutoSelect = false; - private @Nullable Location lastLocation; private final LinkedHashMap homeLocations; - private final HashSet sentRequests = new HashSet<>(); // 记录发出的请求 private final ConcurrentHashMap receivedRequests = new ConcurrentHashMap<>(); // 记录收到的传送请求 + public boolean enableAutoSelect = false; + private @Nullable Location lastLocation; public UserData(@NotNull UUID userUUID) { this(userUUID, null, new LinkedHashMap<>()); @@ -43,13 +41,13 @@ public class UserData { public void setHomeLocation(String homeName, Location location) { delHomeLocation(homeName); getHomeLocations().put(homeName, new DataLocation(location)); - Main.getUserManager().editData((storage) -> storage.setHome(userUUID, homeName, new DataLocation(location))); + MoeTeleport.getUserManager().editData((storage) -> storage.setHome(userUUID, homeName, new DataLocation(location))); } public void delHomeLocation(String homeName) { Map.Entry lastLocation = getHomeLocation(homeName); if (lastLocation != null) getHomeLocations().remove(lastLocation.getKey()); - Main.getUserManager().editData((storage) -> storage.delHome(userUUID, homeName)); + MoeTeleport.getUserManager().editData((storage) -> storage.delHome(userUUID, homeName)); } public Map.Entry getHomeLocation(@Nullable String homeName) { diff --git a/src/main/java/cc/carm/plugin/moeteleport/model/WarpInfo.java b/src/main/java/cc/carm/plugin/moeteleport/model/WarpInfo.java new file mode 100644 index 0000000..1bc14ad --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/model/WarpInfo.java @@ -0,0 +1,47 @@ +package cc.carm.plugin.moeteleport.model; + +import cc.carm.plugin.moeteleport.configuration.location.DataLocation; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +public class WarpInfo { + + private final @NotNull String name; + private final @Nullable UUID owner; + private final @NotNull DataLocation location; + + public WarpInfo(@NotNull String name, @Nullable UUID owner, @NotNull DataLocation location) { + this.name = name; + this.owner = owner; + this.location = location; + } + + public @NotNull String getName() { + return name; + } + + public @Nullable UUID getOwner() { + return owner; + } + + public @Nullable String getOwnerName() { + if (getOwner() != null) { + OfflinePlayer offline = Bukkit.getOfflinePlayer(getOwner()); + if (offline.getName() != null) { + return offline.getName(); + } + } + return null; + } + + + public @NotNull DataLocation getLocation() { + return location; + } + +} + diff --git a/src/main/java/cc/carm/plugin/moeteleport/storage/DataSerializer.java b/src/main/java/cc/carm/plugin/moeteleport/storage/DataSerializer.java index 396b469..c51739c 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/storage/DataSerializer.java +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/DataSerializer.java @@ -1,6 +1,7 @@ package cc.carm.plugin.moeteleport.storage; import cc.carm.plugin.moeteleport.configuration.location.DataLocation; +import cc.carm.plugin.moeteleport.model.WarpInfo; import org.bukkit.Location; import org.jetbrains.annotations.Nullable; @@ -25,5 +26,17 @@ public class DataSerializer { return serializeLocation(Optional.ofNullable(loc).map(DataLocation::new).orElse(null)); } + public static Map serializeWarpMap(WarpInfo info) { + LinkedHashMap after = new LinkedHashMap<>(); + if (info.getOwner() != null) after.put("owner", info.getOwner().toString()); + after.put("world", info.getLocation().getWorldName()); + after.put("x", info.getLocation().getX()); + after.put("y", info.getLocation().getY()); + after.put("z", info.getLocation().getZ()); + after.put("yaw", info.getLocation().getYaw()); + after.put("pitch", info.getLocation().getPitch()); + return after; + } + } diff --git a/src/main/java/cc/carm/plugin/moeteleport/storage/DataStorage.java b/src/main/java/cc/carm/plugin/moeteleport/storage/DataStorage.java index 37e1a52..fc7f61c 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/storage/DataStorage.java +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/DataStorage.java @@ -3,9 +3,11 @@ package cc.carm.plugin.moeteleport.storage; import cc.carm.plugin.moeteleport.configuration.location.DataLocation; import cc.carm.plugin.moeteleport.manager.UserManager; import cc.carm.plugin.moeteleport.model.UserData; +import cc.carm.plugin.moeteleport.model.WarpInfo; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Map; import java.util.UUID; public interface DataStorage { @@ -44,6 +46,22 @@ public interface DataStorage { */ void saveUserData(@NotNull UserData data) throws Exception; + Map getWarps(); + + default void saveWarps() throws Exception { + saveWarps(getWarps()); + } + + void saveWarps(@NotNull Map warps) throws Exception; + + void setWarp(@NotNull String name, @NotNull WarpInfo warpInfo) throws Exception; + + boolean delWarp(@NotNull String name) throws Exception; + + default boolean hasWarp(@NotNull String name) { + return getWarps().containsKey(name); + } + /** * 为某用户设定一个家的位置。 * diff --git a/src/main/java/cc/carm/plugin/moeteleport/storage/StorageMethod.java b/src/main/java/cc/carm/plugin/moeteleport/storage/StorageMethod.java index 6c5762e..e17bb2e 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/storage/StorageMethod.java +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/StorageMethod.java @@ -1,10 +1,10 @@ package cc.carm.plugin.moeteleport.storage; +import cc.carm.plugin.moeteleport.storage.custom.CustomStorage; import cc.carm.plugin.moeteleport.storage.database.MySQLStorage; -import cc.carm.plugin.moeteleport.storage.extension.EssentialXStorage; +import cc.carm.plugin.moeteleport.storage.extension.EssentialStorage; import cc.carm.plugin.moeteleport.storage.file.JSONStorage; import cc.carm.plugin.moeteleport.storage.file.YAMLStorage; -import cc.carm.plugin.moeteleport.storage.custom.CustomStorage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -19,7 +19,7 @@ public enum StorageMethod { JSON(2, new String[]{}, JSONStorage::new), MYSQL(3, new String[]{"my-sql", "mariadb", "sql", "database"}, MySQLStorage::new), - ESSENTIALS(11, new String[]{"essential", "ess", "EssentialsX", "essX"}, EssentialXStorage::new); + ESSENTIALS(11, new String[]{"essential", "ess", "EssentialsX", "essX"}, EssentialStorage::new); private final int id; private final String[] alias; @@ -31,6 +31,32 @@ public enum StorageMethod { this.storageSupplier = storageSupplier; } + public static @NotNull StorageMethod read(String s) { + StorageMethod byName = readByName(s); + if (byName != null) return byName; + StorageMethod byAlias = readByAlias(s); + if (byAlias != null) return byAlias; + try { + return Optional.ofNullable(readByID(Integer.parseInt(s))).orElse(YAML); + } catch (Exception ex) { + return YAML; + } + } + + public static @Nullable StorageMethod readByName(String name) { + return Arrays.stream(values()).filter(value -> value.name().equalsIgnoreCase(name)).findFirst().orElse(null); + } + + public static @Nullable StorageMethod readByAlias(String name) { + return Arrays.stream(values()) + .filter(value -> Arrays.stream(value.getAlias()).anyMatch(alias -> alias.equalsIgnoreCase(name))) + .findFirst().orElse(null); + } + + public static @Nullable StorageMethod readByID(int id) { + return Arrays.stream(values()).filter(value -> value.getID() == id).findFirst().orElse(null); + } + public int getID() { return id; } @@ -50,32 +76,4 @@ public enum StorageMethod { public @NotNull DataStorage createStorage() { return getStorageSupplier().get(); } - - public static @NotNull StorageMethod read(String s) { - StorageMethod byName = readByName(s); - if (byName != null) return byName; - StorageMethod byAlias = readByAlias(s); - if (byAlias != null) return byAlias; - try { - return Optional.ofNullable(readByID(Integer.parseInt(s))).orElse(YAML); - } catch (Exception ex) { - return YAML; - } - } - - - public static @Nullable StorageMethod readByName(String name) { - return Arrays.stream(values()).filter(value -> value.name().equalsIgnoreCase(name)).findFirst().orElse(null); - } - - public static @Nullable StorageMethod readByAlias(String name) { - return Arrays.stream(values()) - .filter(value -> Arrays.stream(value.getAlias()).anyMatch(alias -> alias.equalsIgnoreCase(name))) - .findFirst().orElse(null); - } - - - public static @Nullable StorageMethod readByID(int id) { - return Arrays.stream(values()).filter(value -> value.getID() == id).findFirst().orElse(null); - } } diff --git a/src/main/java/cc/carm/plugin/moeteleport/storage/custom/CustomStorage.java b/src/main/java/cc/carm/plugin/moeteleport/storage/custom/CustomStorage.java index aaedaa2..57dbc1a 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/storage/custom/CustomStorage.java +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/custom/CustomStorage.java @@ -3,11 +3,14 @@ package cc.carm.plugin.moeteleport.storage.custom; import cc.carm.plugin.moeteleport.Main; import cc.carm.plugin.moeteleport.configuration.location.DataLocation; import cc.carm.plugin.moeteleport.model.UserData; +import cc.carm.plugin.moeteleport.model.WarpInfo; import cc.carm.plugin.moeteleport.storage.DataStorage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; +import java.util.HashMap; +import java.util.Map; import java.util.UUID; public class CustomStorage implements DataStorage { @@ -15,8 +18,8 @@ public class CustomStorage implements DataStorage { @Override @TestOnly public boolean initialize() { - Main.error("您选择使用自定义存储,但并没有应用成功。"); - Main.error("You are using CustomStorage, but not overwrite the methods."); + Main.serve("您选择使用自定义存储,但并没有应用成功。"); + Main.serve("You are using CustomStorage, but not overwrite the methods."); return false; } @@ -38,6 +41,26 @@ public class CustomStorage implements DataStorage { } + @Override + public Map getWarps() { + return new HashMap<>(); + } + + @Override + public void saveWarps(@NotNull Map warps) { + + } + + @Override + public void setWarp(@NotNull String name, @NotNull WarpInfo warpInfo) { + + } + + @Override + public boolean delWarp(@NotNull String name) { + return true; + } + @Override public void setHome(@NotNull UUID uuid, @NotNull String homeName, @NotNull DataLocation homeLocation) throws Exception { } diff --git a/src/main/java/cc/carm/plugin/moeteleport/storage/database/DBConfiguration.java b/src/main/java/cc/carm/plugin/moeteleport/storage/database/DBConfiguration.java index 382536e..3977d6f 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/storage/database/DBConfiguration.java +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/database/DBConfiguration.java @@ -1,6 +1,6 @@ package cc.carm.plugin.moeteleport.storage.database; -import cc.carm.plugin.moeteleport.configuration.values.ConfigValue; +import cc.carm.lib.easyplugin.configuration.values.ConfigValue; public class DBConfiguration { diff --git a/src/main/java/cc/carm/plugin/moeteleport/storage/database/DBTables.java b/src/main/java/cc/carm/plugin/moeteleport/storage/database/DBTables.java index b57f7e5..1d38730 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/storage/database/DBTables.java +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/database/DBTables.java @@ -1,6 +1,6 @@ package cc.carm.plugin.moeteleport.storage.database; -import cc.carm.plugin.moeteleport.configuration.values.ConfigValue; +import cc.carm.lib.easyplugin.configuration.values.ConfigValue; public class DBTables { @@ -34,7 +34,7 @@ public class DBTables { ); protected static final String[] TABLE_COLUMNS = new String[]{ - "`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '背包ID'", + "`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY", "`uuid` VARCHAR(36) NOT NULL", // 用户的UUID "`name` VARCHAR(32) NOT NULL", "`world` VARCHAR(128) NOT NULL", @@ -49,4 +49,25 @@ public class DBTables { } + protected static class Warps { + + protected static final ConfigValue TABLE_NAME = new ConfigValue<>( + "storage.mysql.tables.warps", String.class, + "mt_warps" + ); + + protected static final String[] TABLE_COLUMNS = new String[]{ + "`id` INT NOT NULL AUTO_INCREMENT UNIQUE KEY", + "`name` VARCHAR(16) PRIMARY KEY NOT NULL", // 传送点名称 不为空且唯一 + "`owner` VARCHAR(36)", // 用户的UUID + "`world` VARCHAR(128) NOT NULL", + "`x` DOUBLE NOT NULL", + "`y` DOUBLE NOT NULL", + "`z` DOUBLE NOT NULL", + "`yaw` DOUBLE NOT NULL", + "`pitch` DOUBLE NOT NULL" + }; + + } + } \ No newline at end of file diff --git a/src/main/java/cc/carm/plugin/moeteleport/storage/database/MySQLStorage.java b/src/main/java/cc/carm/plugin/moeteleport/storage/database/MySQLStorage.java index 5ddc143..5dfc36f 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/storage/database/MySQLStorage.java +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/database/MySQLStorage.java @@ -2,9 +2,11 @@ package cc.carm.plugin.moeteleport.storage.database; import cc.carm.lib.easysql.EasySQL; import cc.carm.lib.easysql.api.SQLManager; +import cc.carm.lib.easysql.api.util.UUIDUtil; import cc.carm.plugin.moeteleport.Main; import cc.carm.plugin.moeteleport.configuration.location.DataLocation; import cc.carm.plugin.moeteleport.model.UserData; +import cc.carm.plugin.moeteleport.model.WarpInfo; import cc.carm.plugin.moeteleport.storage.DataStorage; import org.bukkit.Location; import org.jetbrains.annotations.NotNull; @@ -12,17 +14,21 @@ import org.jetbrains.annotations.Nullable; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.Map; import java.util.UUID; public class MySQLStorage implements DataStorage { SQLManager sqlManager; + Map warpsMap = new HashMap<>(); + @Override public boolean initialize() { try { - Main.log(" 尝试连接到数据库..."); + Main.info(" 尝试连接到数据库..."); String url = String.format("jdbc:mysql://%s:%s/%s?useSSL=false", DBConfiguration.HOST.get(), DBConfiguration.PORT.get(), DBConfiguration.DATABASE.get() ); @@ -30,14 +36,15 @@ public class MySQLStorage implements DataStorage { DBConfiguration.DRIVER_NAME.get(), url, DBConfiguration.USERNAME.get(), DBConfiguration.PASSWORD.get() ); + this.sqlManager.setDebugMode(() -> Main.getInstance().isDebugging()); } catch (Exception exception) { - Main.error("无法连接到数据库,请检查配置文件。"); + Main.serve("无法连接到数据库,请检查配置文件。"); exception.printStackTrace(); return false; } try { - Main.log(" 创建插件所需表..."); + Main.info(" 创建插件所需表..."); getSQLManager().createTable(DBTables.UserLastLocations.TABLE_NAME.get()) .setColumns(DBTables.UserLastLocations.TABLE_COLUMNS) .build().execute(); @@ -46,18 +53,30 @@ public class MySQLStorage implements DataStorage { .setColumns(DBTables.UserHomes.TABLE_COLUMNS) .build().execute(); + getSQLManager().createTable(DBTables.Warps.TABLE_NAME.get()) + .setColumns(DBTables.Warps.TABLE_COLUMNS) + .build().execute(); + } catch (SQLException exception) { - Main.error("无法创建插件所需的表,请检查数据库权限。"); + Main.serve("无法创建插件所需的表,请检查数据库权限。"); exception.printStackTrace(); return false; } + Main.info(" 加载地标数据..."); + try { + this.warpsMap = loadWarps(); + } catch (Exception e) { + Main.serve("无法加载地标数据,请检查数据库权限和相关表。"); + e.printStackTrace(); + } + return true; } @Override public void shutdown() { - Main.log(" 关闭数据库连接..."); + Main.info(" 关闭数据库连接..."); EasySQL.shutdownManager(getSQLManager()); this.sqlManager = null; } @@ -87,6 +106,16 @@ public class MySQLStorage implements DataStorage { } } + @Override + public Map getWarps() { + return this.warpsMap; + } + + @Override + public void saveWarps(@NotNull Map warps) { + // 单独保存,不需要统一存储 + } + private @NotNull LinkedHashMap loadHomes(@NotNull UUID uuid) throws Exception { return getSQLManager().createQuery().inTable(DBTables.UserHomes.TABLE_NAME.get()) .addCondition("uuid", uuid).build() @@ -127,6 +156,30 @@ public class MySQLStorage implements DataStorage { }); } + private @NotNull Map loadWarps() throws Exception { + return getSQLManager().createQuery().inTable(DBTables.Warps.TABLE_NAME.get()) + .orderBy("id", true).build().executeFunction((query) -> { + LinkedHashMap warps = new LinkedHashMap<>(); + ResultSet resultSet = query.getResultSet(); + if (resultSet == null) return warps; + while (resultSet.next()) { + String uuidString = resultSet.getString("owner"); + UUID uuid = uuidString == null ? null : UUIDUtil.toUUID(uuidString); + String name = resultSet.getString("name"); + DataLocation location = new DataLocation( + resultSet.getString("world"), + resultSet.getDouble("x"), + resultSet.getDouble("y"), + resultSet.getDouble("z"), + resultSet.getFloat("yaw"), + resultSet.getFloat("pitch") + ); + warps.put(name, new WarpInfo(name, uuid, location)); + } + return warps; + }, new LinkedHashMap<>()); + } + @Override public void setHome(@NotNull UUID uuid, @NotNull String homeName, @NotNull DataLocation location) throws Exception { getSQLManager().createReplace(DBTables.UserHomes.TABLE_NAME.get()) @@ -148,6 +201,30 @@ public class MySQLStorage implements DataStorage { .build().executeFunction((i) -> i > 0, false); } + @Override + public void setWarp(@NotNull String name, @NotNull WarpInfo warpInfo) throws Exception { + this.warpsMap.put(name, warpInfo); + DataLocation location = warpInfo.getLocation(); + getSQLManager().createReplace(DBTables.Warps.TABLE_NAME.get()) + .setColumnNames("name", "owner", "world", "x", "y", "z", "yaw", "pitch") + .setParams( + name, warpInfo.getOwner(), location.getWorldName(), + location.getX(), location.getY(), location.getZ(), + location.getYaw(), location.getPitch() + ).execute(); + } + + @Override + public boolean delWarp(@NotNull String name) throws Exception { + String actualName = this.warpsMap.keySet().stream().filter(s -> s.equalsIgnoreCase(name)).findFirst().orElse(null); + if (actualName == null) return false; + + this.warpsMap.remove(actualName); + return getSQLManager().createDelete(DBTables.Warps.TABLE_NAME.get()) + .addCondition("name", actualName).setLimit(1) + .build().executeFunction((i) -> i > 0, false); + } + public SQLManager getSQLManager() { return sqlManager; } diff --git a/src/main/java/cc/carm/plugin/moeteleport/storage/extension/EssentialXStorage.java b/src/main/java/cc/carm/plugin/moeteleport/storage/extension/EssentialStorage.java similarity index 60% rename from src/main/java/cc/carm/plugin/moeteleport/storage/extension/EssentialXStorage.java rename to src/main/java/cc/carm/plugin/moeteleport/storage/extension/EssentialStorage.java index 6789e89..715b870 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/storage/extension/EssentialXStorage.java +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/extension/EssentialStorage.java @@ -2,6 +2,7 @@ package cc.carm.plugin.moeteleport.storage.extension; import cc.carm.plugin.moeteleport.configuration.location.DataLocation; import cc.carm.plugin.moeteleport.model.UserData; +import cc.carm.plugin.moeteleport.model.WarpInfo; import cc.carm.plugin.moeteleport.storage.impl.PluginBasedStorage; import com.earth2me.essentials.Essentials; import com.earth2me.essentials.User; @@ -10,16 +11,17 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.LinkedHashMap; +import java.util.Map; import java.util.UUID; -public class EssentialXStorage extends PluginBasedStorage { - - public EssentialXStorage() { - super("Essentials"); - } +public class EssentialStorage extends PluginBasedStorage { private Essentials essentials; + public EssentialStorage() { + super("Essentials"); + } + @Override public boolean initialize() { return super.initialize() && (this.essentials = (Essentials) getDependPlugin()) != null; @@ -30,6 +32,47 @@ public class EssentialXStorage extends PluginBasedStorage { return new EssentialUserData(uuid, getEssentials()); } + @Override + public Map getWarps() { + Map warps = new LinkedHashMap<>(); + + for (String warpName : getEssentials().getWarps().getList()) { + try { + Location warpLocation = getEssentials().getWarps().getWarp(warpName); + UUID owner = getEssentials().getWarps().getLastOwner(warpName); + warps.put(warpName, new WarpInfo(warpName,owner, new DataLocation(warpLocation))); + } catch (Exception ignore) { + } + } + + return warps; + } + + @Override + public void setWarp(@NotNull String name, @NotNull WarpInfo warpInfo) throws Exception { + User user = getEssentials().getUser(warpInfo.getOwner()); + Location location = warpInfo.getLocation().getBukkitLocation(); + if (location == null) return; + + if (user == null) { + getEssentials().getWarps().setWarp(name, location); + } else { + getEssentials().getWarps().setWarp(user, name, warpInfo.getLocation().getBukkitLocation()); + } + } + + @Override + public boolean delWarp(@NotNull String name) throws Exception { + boolean has = hasWarp(name); + getEssentials().getWarps().removeWarp(name); + return has; + } + + @Override + public boolean hasWarp(@NotNull String name) { + return getEssentials().getWarps().isWarp(name); + } + public Essentials getEssentials() { return essentials; } @@ -71,13 +114,13 @@ public class EssentialXStorage extends PluginBasedStorage { } @Override - public void setLastLocation(@Nullable Location lastLocation) { - getEssUser().setLastLocation(lastLocation); + public @Nullable Location getLastLocation() { + return getEssUser().getLastLocation(); } @Override - public @Nullable Location getLastLocation() { - return getEssUser().getLastLocation(); + public void setLastLocation(@Nullable Location lastLocation) { + getEssUser().setLastLocation(lastLocation); } diff --git a/src/main/java/cc/carm/plugin/moeteleport/storage/file/JSONStorage.java b/src/main/java/cc/carm/plugin/moeteleport/storage/file/JSONStorage.java index 2b0873e..df59761 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/storage/file/JSONStorage.java +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/file/JSONStorage.java @@ -1,8 +1,10 @@ package cc.carm.plugin.moeteleport.storage.file; +import cc.carm.lib.easysql.api.util.UUIDUtil; import cc.carm.plugin.moeteleport.Main; import cc.carm.plugin.moeteleport.configuration.location.DataLocation; import cc.carm.plugin.moeteleport.model.UserData; +import cc.carm.plugin.moeteleport.model.WarpInfo; import cc.carm.plugin.moeteleport.storage.DataSerializer; import cc.carm.plugin.moeteleport.storage.impl.FileBasedStorage; import com.google.gson.Gson; @@ -15,7 +17,9 @@ import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.FileReader; import java.io.FileWriter; +import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.Map; import java.util.UUID; public class JSONStorage extends FileBasedStorage { @@ -23,11 +27,27 @@ public class JSONStorage extends FileBasedStorage { protected static final Gson GSON = new Gson(); protected static final JsonParser PARSER = new JsonParser(); + Map warpsMap = new HashMap<>(); + + @Override + public boolean initialize() { + if (super.initialize()) { + try { + this.warpsMap = loadWarps(); + return true; + } catch (Exception e) { + Main.serve("无法加载地标数据,请检查文件权限和相关配置。"); + e.printStackTrace(); + } + } + return false; + } + @Override public @Nullable UserData loadData(@NotNull UUID uuid) throws Exception { File userDataFile = new File(getDataFolder(), uuid + ".json"); if (!userDataFile.exists()) { - Main.debug("当前文件夾内不存在玩家 " + uuid + " 的数据,视作新档。"); + Main.debugging("当前文件夾内不存在玩家 " + uuid + " 的数据,视作新档。"); return null; } @@ -68,4 +88,63 @@ public class JSONStorage extends FileBasedStorage { writer.close(); } + private @NotNull Map loadWarps() throws Exception { + File warpDataFile = new File(getDataFolder(), "warps.json"); + if (!warpDataFile.exists()) return new LinkedHashMap<>(); + + JsonElement dataElement = PARSER.parse(new FileReader(warpDataFile)); + if (!dataElement.isJsonObject()) throw new NullPointerException(warpDataFile.getName()); + + JsonObject dataObject = dataElement.getAsJsonObject(); + LinkedHashMap warps = new LinkedHashMap<>(); + dataObject.entrySet().forEach(entry -> { + String warpName = entry.getKey(); + if (entry.getValue().isJsonObject()) { + try { + JsonObject warpObject = entry.getValue().getAsJsonObject(); + UUID owner = warpObject.has("owner") ? UUIDUtil.toUUID(warpObject.get("owner").getAsString()) : null; + DataLocation location = new DataLocation( + warpObject.get("world").getAsString(), + warpObject.get("x").getAsDouble(), + warpObject.get("y").getAsDouble(), + warpObject.get("z").getAsDouble(), + warpObject.get("yaw").getAsFloat(), + warpObject.get("pitch").getAsFloat() + ); + warps.put(warpName, new WarpInfo(warpName, owner, location)); + } catch (Exception ignore) { + } + } + }); + return warps; + } + + @Override + public void saveWarps(@NotNull Map warps) throws Exception { + JsonObject dataObject = new JsonObject(); + + warps.forEach((name, info) -> dataObject.add(name, GSON.toJsonTree(DataSerializer.serializeWarpMap(info)))); + + FileWriter writer = new FileWriter(new File(getDataFolder(), "warps.json")); + writer.write(GSON.toJson(dataObject)); + writer.flush(); + writer.close(); + } + + @Override + public Map getWarps() { + return warpsMap; + } + + @Override + public void setWarp(@NotNull String name, @NotNull WarpInfo warpInfo) { + this.warpsMap.put(name, warpInfo); + } + + @Override + public boolean delWarp(@NotNull String name) { + return this.warpsMap.remove(name) != null; + } + + } diff --git a/src/main/java/cc/carm/plugin/moeteleport/storage/file/YAMLStorage.java b/src/main/java/cc/carm/plugin/moeteleport/storage/file/YAMLStorage.java index a4e346d..c95cc2d 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/storage/file/YAMLStorage.java +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/file/YAMLStorage.java @@ -3,19 +3,52 @@ package cc.carm.plugin.moeteleport.storage.file; import cc.carm.plugin.moeteleport.Main; import cc.carm.plugin.moeteleport.configuration.location.DataLocation; import cc.carm.plugin.moeteleport.model.UserData; +import cc.carm.plugin.moeteleport.model.WarpInfo; import cc.carm.plugin.moeteleport.storage.DataSerializer; import cc.carm.plugin.moeteleport.storage.impl.FileBasedStorage; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.LinkedHashMap; +import java.util.Map; import java.util.Optional; import java.util.UUID; public class YAMLStorage extends FileBasedStorage { + Map warpsMap; + + File warpsDataFile; + FileConfiguration warpsConfiguration; + + @Override + public boolean initialize() { + if (super.initialize()) { + try { + this.warpsDataFile = new File(getDataFolder(), "warps.yml"); + if (!this.warpsDataFile.exists()) { + boolean success = warpsDataFile.createNewFile(); + } + this.warpsConfiguration = YamlConfiguration.loadConfiguration(warpsDataFile); + this.warpsMap = loadWarps(); + return true; + } catch (Exception e) { + Main.serve("无法加载地标数据,请检查文件权限和相关配置。"); + e.printStackTrace(); + } + } + return false; + } + + @Override + public void saveWarps(@NotNull Map warps) throws Exception { + this.warpsConfiguration.save(this.warpsDataFile); + } + @Override public @Nullable UserData loadData(@NotNull UUID uuid) { if (getDataFolder() == null || !getDataFolder().exists() || !getDataFolder().isDirectory()) { @@ -23,7 +56,7 @@ public class YAMLStorage extends FileBasedStorage { } File userDataFile = new File(getDataFolder(), uuid + ".yml"); if (!userDataFile.exists()) { - Main.debug("当前文件夾内不存在玩家 " + uuid + " 的数据,视作新档。"); + Main.debugging("当前文件夾内不存在玩家 " + uuid + " 的数据,视作新档。"); return null; } @@ -59,4 +92,50 @@ public class YAMLStorage extends FileBasedStorage { userConfiguration.save(new File(getDataFolder(), data.getUserUUID() + ".yml")); } + private @NotNull Map loadWarps() { + LinkedHashMap warps = new LinkedHashMap<>(); + + ConfigurationSection warpsSection = this.warpsConfiguration.getConfigurationSection("warps"); + if (warpsSection == null) return warps; + + for (String warpName : warpsSection.getKeys(false)) { + ConfigurationSection warpInfoSection = warpsSection.getConfigurationSection(warpName); + if (warpInfoSection == null) continue; + try { + String ownerString = warpInfoSection.getString("owner"); + UUID owner = ownerString == null ? null : UUID.fromString(ownerString); + DataLocation location = new DataLocation( + warpInfoSection.getString("world"), + warpInfoSection.getDouble("x"), + warpInfoSection.getDouble("y"), + warpInfoSection.getDouble("z"), + warpInfoSection.getLong("yaw"), + warpInfoSection.getLong("pitch") + ); + warps.put(warpName, new WarpInfo(warpName, owner, location)); + } catch (Exception ignore) { + } + } + + return warps; + } + + @Override + public Map getWarps() { + return warpsMap; + } + + @Override + public void setWarp(@NotNull String name, @NotNull WarpInfo warpInfo) { + this.warpsMap.put(name, warpInfo); + this.warpsConfiguration.createSection("warps." + name, DataSerializer.serializeWarpMap(warpInfo)); + } + + @Override + public boolean delWarp(@NotNull String name) { + this.warpsConfiguration.set("warps." + name, null); + return this.warpsMap.remove(name) != null; + } + + } diff --git a/src/main/java/cc/carm/plugin/moeteleport/storage/impl/FileBasedStorage.java b/src/main/java/cc/carm/plugin/moeteleport/storage/impl/FileBasedStorage.java index 1bf1e0a..2288480 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/storage/impl/FileBasedStorage.java +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/impl/FileBasedStorage.java @@ -1,8 +1,9 @@ package cc.carm.plugin.moeteleport.storage.impl; +import cc.carm.lib.easyplugin.configuration.values.ConfigValue; import cc.carm.plugin.moeteleport.Main; import cc.carm.plugin.moeteleport.configuration.location.DataLocation; -import cc.carm.plugin.moeteleport.configuration.values.ConfigValue; +import cc.carm.plugin.moeteleport.model.WarpInfo; import cc.carm.plugin.moeteleport.storage.DataStorage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -49,6 +50,17 @@ public abstract class FileBasedStorage implements DataStorage { return true; } + @Override + public void setWarp(@NotNull String name, @NotNull WarpInfo warpInfo) { + // saveWarp 方法即保存所有数据,不需要针对单个数据进行变更。 + } + + @Override + public boolean delWarp(@NotNull String name) { + // saveWarp 方法即保存所有数据,不需要针对单个数据进行变更。 + return true; + } + public @Nullable File getDataFolder() { return dataFolder; } diff --git a/src/main/java/cc/carm/plugin/moeteleport/storage/impl/PluginBasedStorage.java b/src/main/java/cc/carm/plugin/moeteleport/storage/impl/PluginBasedStorage.java index f727e2c..f6beade 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/storage/impl/PluginBasedStorage.java +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/impl/PluginBasedStorage.java @@ -2,11 +2,13 @@ package cc.carm.plugin.moeteleport.storage.impl; import cc.carm.plugin.moeteleport.configuration.location.DataLocation; import cc.carm.plugin.moeteleport.model.UserData; +import cc.carm.plugin.moeteleport.model.WarpInfo; import cc.carm.plugin.moeteleport.storage.DataStorage; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; +import java.util.Map; import java.util.UUID; public abstract class PluginBasedStorage implements DataStorage { @@ -36,6 +38,11 @@ public abstract class PluginBasedStorage implements DataStorage { // 一般都由其他插件自行保存,不需要实现。 } + @Override + public void saveWarps(@NotNull Map warps) { + // 一般都由其他插件自行保存,不需要实现。 + } + @Override public void setHome(@NotNull UUID uuid, @NotNull String homeName, @NotNull DataLocation homeLocation) { // 一般都由其他插件自行保存,不需要实现。 diff --git a/src/main/java/cc/carm/plugin/moeteleport/util/SchedulerUtils.java b/src/main/java/cc/carm/plugin/moeteleport/util/SchedulerUtils.java deleted file mode 100644 index 906df78..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/util/SchedulerUtils.java +++ /dev/null @@ -1,250 +0,0 @@ - - -package cc.carm.plugin.moeteleport.util; - -import java.util.Arrays; -import java.util.LinkedList; -import java.util.Queue; -import java.util.concurrent.Callable; -import org.bukkit.Bukkit; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scheduler.BukkitRunnable; - -public class SchedulerUtils { - private final JavaPlugin plugin; - - public SchedulerUtils(JavaPlugin plugin) { - this.plugin = plugin; - } - - private JavaPlugin getPlugin() { - return this.plugin; - } - - public void run(Runnable runnable) { - Bukkit.getScheduler().runTask(this.getPlugin(), runnable); - } - - public void runAsync(Runnable runnable) { - Bukkit.getScheduler().runTaskAsynchronously(this.getPlugin(), runnable); - } - - public void runLater(long delay, Runnable runnable) { - Bukkit.getScheduler().runTaskLater(this.getPlugin(), runnable, delay); - } - - public void runLaterAsync(long delay, Runnable runnable) { - Bukkit.getScheduler().runTaskLaterAsynchronously(this.getPlugin(), runnable, delay); - } - - public void runAtInterval(long interval, Runnable... tasks) { - this.runAtInterval(0L, interval, tasks); - } - - public void runAtInterval(long delay, long interval, Runnable... tasks) { - (new BukkitRunnable() { - private int index; - - public void run() { - if (this.index >= tasks.length) { - this.cancel(); - } else { - tasks[this.index].run(); - ++this.index; - } - } - }).runTaskTimer(this.getPlugin(), delay, interval); - } - - public void runAtIntervalAsync(long interval, Runnable... tasks) { - this.runAtIntervalAsync(0L, interval, tasks); - } - - public void runAtIntervalAsync(long delay, long interval, Runnable... tasks) { - (new BukkitRunnable() { - private int index; - - public void run() { - if (this.index >= tasks.length) { - this.cancel(); - } else { - tasks[this.index].run(); - ++this.index; - } - } - }).runTaskTimerAsynchronously(this.getPlugin(), delay, interval); - } - - public void repeat(int repetitions, long interval, Runnable task, Runnable onComplete) { - (new BukkitRunnable() { - private int index; - - public void run() { - ++this.index; - if (this.index >= repetitions) { - this.cancel(); - if (onComplete != null) { - onComplete.run(); - } - } else { - task.run(); - } - } - }).runTaskTimer(this.getPlugin(), 0L, interval); - } - - public void repeatAsync(int repetitions, long interval, Runnable task, Runnable onComplete) { - (new BukkitRunnable() { - private int index; - - public void run() { - ++this.index; - if (this.index >= repetitions) { - this.cancel(); - if (onComplete != null) { - onComplete.run(); - } - } else { - task.run(); - } - } - }).runTaskTimerAsynchronously(this.getPlugin(), 0L, interval); - } - - public void repeatWhile(long interval, Callable predicate, Runnable task, Runnable onComplete) { - (new BukkitRunnable() { - public void run() { - try { - if (!(Boolean)predicate.call()) { - this.cancel(); - if (onComplete == null) { - return; - } - - onComplete.run(); - return; - } - - task.run(); - } catch (Exception var2) { - var2.printStackTrace(); - } - - } - }).runTaskTimer(this.getPlugin(), 0L, interval); - } - - public void repeatWhileAsync(long interval, Callable predicate, Runnable task, Runnable onComplete) { - (new BukkitRunnable() { - public void run() { - try { - if (!(Boolean)predicate.call()) { - this.cancel(); - if (onComplete == null) { - return; - } - - onComplete.run(); - return; - } - - task.run(); - } catch (Exception var2) { - var2.printStackTrace(); - } - - } - }).runTaskTimerAsynchronously(this.getPlugin(), 0L, interval); - } - - public class TaskBuilder { - private final Queue taskList = new LinkedList<>(); - - public TaskBuilder() { - } - - public SchedulerUtils.TaskBuilder append(SchedulerUtils.TaskBuilder builder) { - this.taskList.addAll(builder.taskList); - return this; - } - - public SchedulerUtils.TaskBuilder appendDelay(long delay) { - this.taskList.add((onComplete) -> SchedulerUtils.this.runLater(delay, onComplete)); - return this; - } - - public SchedulerUtils.TaskBuilder appendTask(Runnable task) { - this.taskList.add((onComplete) -> { - task.run(); - onComplete.run(); - }); - return this; - } - - public SchedulerUtils.TaskBuilder appendTask(SchedulerUtils.Task task) { - this.taskList.add(task); - return this; - } - - public SchedulerUtils.TaskBuilder appendDelayedTask(long delay, Runnable task) { - this.taskList.add((onComplete) -> SchedulerUtils.this.runLater(delay, () -> { - task.run(); - onComplete.run(); - })); - return this; - } - - public SchedulerUtils.TaskBuilder appendTasks(long delay, long interval, Runnable... tasks) { - this.taskList.add((onComplete) -> { - Runnable[] all = Arrays.copyOf(tasks, tasks.length + 1); - all[all.length - 1] = onComplete; - SchedulerUtils.this.runAtInterval(delay, interval, all); - }); - return this; - } - - public SchedulerUtils.TaskBuilder appendRepeatingTask(int repetitions, long interval, Runnable task) { - this.taskList.add((onComplete) -> SchedulerUtils.this.repeat(repetitions, interval, task, onComplete)); - return this; - } - - public SchedulerUtils.TaskBuilder appendConditionalRepeatingTask(long interval, Callable predicate, Runnable task) { - this.taskList.add((onComplete) -> SchedulerUtils.this.repeatWhile(interval, predicate, task, onComplete)); - return this; - } - - public SchedulerUtils.TaskBuilder waitFor(Callable predicate) { - this.taskList.add((onComplete) -> (new BukkitRunnable() { - public void run() { - try { - if (!(Boolean)predicate.call()) { - return; - } - - this.cancel(); - onComplete.run(); - } catch (Exception var2) { - var2.printStackTrace(); - } - - } - }).runTaskTimer(SchedulerUtils.this.getPlugin(), 0L, 1L)); - return this; - } - - public void runTasks() { - this.startNext(); - } - - private void startNext() { - SchedulerUtils.Task task = this.taskList.poll(); - if (task != null) { - task.start(this::startNext); - } - } - } - - public interface Task { - void start(Runnable onComplete); - } -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/util/UpdateChecker.java b/src/main/java/cc/carm/plugin/moeteleport/util/UpdateChecker.java new file mode 100644 index 0000000..13d6dca --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/util/UpdateChecker.java @@ -0,0 +1,37 @@ +package cc.carm.plugin.moeteleport.util; + +import cc.carm.lib.githubreleases4j.GithubReleases4J; +import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.MoeTeleport; + +public class UpdateChecker { + + public static void checkUpdate() { + Main.getInstance().getScheduler().runAsync(() -> { + + Integer behindVersions = GithubReleases4J.getVersionBehind( + "CarmJos", "MoeTeleport", + Main.getInstance().getDescription().getVersion() + ); + + String downloadURL = GithubReleases4J.getReleasesURL("CarmJos", "MoeTeleport"); + + MoeTeleport.outputInfo(); + if (behindVersions == null) { + Main.serve("检查更新失败,请您定期查看插件是否更新,避免安全问题。"); + Main.serve("下载地址 " + downloadURL); + } else if (behindVersions == 0) { + Main.info("检查完成,当前已是最新版本。"); + } else if (behindVersions > 0) { + Main.info("发现新版本! 目前已落后 " + behindVersions + " 个版本。"); + Main.info("最新版下载地址 " + downloadURL); + } else { + Main.serve("检查更新失败! 当前版本未知,请您使用原生版本以避免安全问题。"); + Main.serve("最新版下载地址 " + downloadURL); + } + + }); + } + + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 0dd5305..274f0c9 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -23,7 +23,7 @@ storage: # 选择 yaml/json 存储方式时的存储路径 # 默认为相对路径,相对于插件生成的配置文件夹下的路径 - # 支持绝对路径,如 “/var/data/ud/"(linux) 或 "D:\data\ud\"(windows) + # 支持绝对路径,如 “/var/data/moe-teleport/"(linux) 或 "D:\data\moe-teleport\"(windows) # 使用绝对路径时请注意权限问题 file-path: data @@ -41,12 +41,20 @@ storage: tables: last-location: "mt_last_locations" home: "mt_homes" + warps: "mt_warps" -# 默认玩家可设置多少家 -defaultHome: 1 + +defaults: + # 默认玩家可设置多少家 + home: 1 + # 默认玩家可设置多少地标 + warp: 0 permissions: - 10: "MoeTeleport.home.vip" # 最多可以设置10个家 + home: + 10: "MoeTeleport.home.vip" # 拥有该权限的玩家最多可以设置10个家 + warp: + 2: "MoeTeleport.home.vip" # 拥有该权限的玩家最多可以设置2个地标 # 传送请求过期时间 expireTime: 30 diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml index 1ae7ba4..df6cecf 100644 --- a/src/main/resources/messages.yml +++ b/src/main/resources/messages.yml @@ -1,74 +1,4 @@ -no-last-location: - - "&f您当前没有进行传送,无法返回上个地点。" - -death-back: - - "&f您可以输入 &5/back &f或 [&d&l点击这里](show_text=点击返回到死亡地点 run_command=/back) &f返回您的死亡地点。" - -not-online: - - "&f目标玩家并不在线,无法发送请求。" - -self-request: - - "&f您不能向自己发送请求。" - -tpa: - - "&d%(player) &f请求传送到您身边,您有 &5%(expire)秒 &f的时间回应。" - - "[&a&l[同意]](show_text=点击同意请求 run_command=/tpAccept %(player)) &f输入 &5/tpAccept &f同意该请求。" - - "[&c&l[拒绝]](show_text=点击拒绝请求 run_command=/tpDeny %(player)) &f输入 &5/tpDeny &f拒绝该请求。" -tpahere: - - "&d%(player) &f请求传送您到Ta身边,您有 &5%(expire)秒 &f的时间回应。" - - "[&a&l[同意]](show_text=点击同意请求 run_command=/tpAccept %(player)) &f输入 &5/tpAccept &f同意该请求。" - - "[&c&l[拒绝]](show_text=点击拒绝请求 run_command=/tpDeny %(player)) &f输入 &5/tpDeny &f拒绝该请求。" -tpaccept: - - "&f您同意了 &d%(player) &f的传送请求。" -tpdeny: - - "&f您&d拒绝&f了 &d%(player) &f的传送请求。" -accepted: - - "&d%(player) &f同意了您的传送请求。" -denied: - - "&d%(player) &f拒绝了您的传送请求。" - - - -offline: - - "&d%(player) &f离线,相关请求已自动取消。" - -request-duplicate: - - "&f您已经向 &d%(player) &f发送过传送请求,对方仍有 &5%(expire)秒 &f的时间回应该请求。" -request-sent: - - "&f成功向玩家 &d%(player) &f发送传送请求,对方有 &5%(expire)秒 &f的时间回应该请求。" -no-request: - - "&f您当前没有任何待处理的传送请求。" -no-request-player: - - "&f您当前没有收到来自 &d%(player) &f的传送请求。" -multi-requests: - - "&f您当前有&d%(num)条请求&f待处理,请输入 &5/%(command) <玩家名> &f决定回应谁的请求。" - - "&f您也可以再次输入 &5/%(command) &f快速回应最近的一条请求。" -request-sent-timeout: - - "&f发往 &d%(player) &f的传送请求已超时。" -request-received-timeout: - - "&f来自 &d%(player) &f的传送请求已超时。" -teleporting: - - "&f正在传送到 &d%(location) &f..." -dangerous: - - "&f目标地点不安全,传送被取消。" -dangerous-here: - - "&f当前地点不安全,传送被取消。" -notAvailable: - - "&f目标地点暂时无法前往,传送被取消。" - -home-list-header: - - "&f您当前设定的所有家:" -home-list-object: "&8# &f%(id) &d%(location) [&7✈](show_text=点击返回家 %(id) run_command=/home %(id))" -home-not-found: - - "&f您还没有设置这个家,请先输入 &5/setHome <家名称> &f设置一个吧!" -name-too-long: - - "&f您所输入的家的名字太长,家的名称不应当超过 &d30 &f个字符。" -home-set: - - "&f成功设定名为 &d%(name) &f的家传送点。" -home-removed: - - "&f成功移除名为 &d%(name) &f的家传送点。" - - "&7原先位置为 &f%(location) &7。" -home-over-limit: - - "&f您最多只能设置 &d%(max) &f个家传送点!" - - "&7可以输入 &5/delHome <家名称> &7删除之前的家传送点," - - "&7或输入 &5/setHome <家名称> &7覆盖之前的家传送点。" +# ${project.name} - ${project.description} +# 项目地址: ${project.url} +# 下载地址: ${project.distributionManagement.downloadUrl} +version: ${project.version} \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index b8565ba..48bf95d 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -52,4 +52,22 @@ commands: description: "设置家的传送点 (不填名称默认为home)" "delHome": usage: "/delHome <名称> " - description: "删除家的传送点。" \ No newline at end of file + 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