diff --git a/README.md b/README.md index 78d340d..6181c49 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,9 @@ ```text - __ __ _______ _ _ -| \/ | |__ __| | | | | -| \ / | ___ ___| | ___| | ___ _ __ ___ _ __| |_ -| |\/| |/ _ \ / _ \ |/ _ \ |/ _ \ '_ \ / _ \| '__| __| -| | | | (_) | __/ | __/ | __/ |_) | (_) | | | |_ -|_| |_|\___/ \___|_|\___|_|\___| .__/ \___/|_| \__| - | | - |_| + __ ___ ______ __ __ + / |/ /__ __/_ __/__ / /__ ___ ___ ____/ /_ + / /|_/ / _ \/ -_) / / -_) / -_) _ \/ _ \/ __/ __/ +/_/ /_/\___/\__/_/ \__/_/\__/ .__/\___/_/ \__/ + /_/ ``` # MoeTeleport 喵喵传送 @@ -15,36 +12,42 @@ 项目代码符合开发规范,适合新手开发者学习Bukkit,制作属于自己的插件。 -本插件由 [璎珞服务器](https://www.yingluo.world/) 委托本人开发,经过授权后开源。 +本插件由 [**璎珞**服务器](https://www.yingluo.world/) 委托本人开发,经过授权后开源。 + +感谢 [**XingMC**(MagicMC服务器开发者)](https://www.mcbbs.net/?4816320) 为本插件提供后续开发的资金赞助。 ## 功能与优势 ### 当前功能 - 多种存储格式,按需选择。 - - 支持 YAML、JSON 与 MySQL/MariaDB 存储方式 - - 支持直接调用 [EssentialsX](https://github.com/EssentialsX/Essentials) 数据,无缝切换 -- 可点击的消息(如“点击同意”) - - 基于MineDown语法,可自定义配置 + - 支持 YAML、JSON 与 MySQL/MariaDB 存储方式 + - 支持直接调用 [EssentialsX](https://github.com/EssentialsX/Essentials) 数据,无缝切换 +- 可点击的消息(如“点击同意”) + - 基于MineDown语法,可自定义配置 - 玩家间的传送请求 - - 支持指定处理某位玩家的请求 + - 支持指定处理某位玩家的请求 - 设置家与回家 (可以理解为私人地标) - - 支持依照权限设定不同数量的家作为VIP附加内容 + - 支持依照权限设定不同数量的家作为VIP附加内容 - 回到死亡地点、上一传送地点 ### 优势 + - **轻量插件。** 适合小型服务器使用,配置简单方便。 - **规范开发。** 插件架构符合开发规范,适合新手开发者学习。 - - 自 [v3.0.0]() 版本开始采用了 EasyPlugin 开发,可能与其他主流插件结构有些不同。 + - 自 [3.0.0]() 版本开始采用了 EasyPlugin 开发,可能与其他主流插件结构有些不同。 - **持续维护。** 新功能需求均可提交,大概率在后续开发中支持。 - - 功能需求请 [提交Issues](https://github.com/CarmJos/MoeTeleport/issues/new?assignees=&labels=enhancement&template=feature_issues.md&title=) ,不要在帖子中提交! - - 提交与 “传送” 相关联的请求才大概率会被更新支持。 + - + 功能需求请 [提交Issues](https://github.com/CarmJos/MoeTeleport/issues/new?assignees=&labels=enhancement&template=feature_issues.md&title=) + ,不要在帖子中提交! + - 提交与 “传送” 相关联的请求才大概率会被更新支持。 ## [依赖](https://github.com/CarmJos/MoeTeleport/network/dependencies) -- **[必须]** 插件本体基于 [Spigot-API](https://hub.spigotmc.org/stash/projects/SPIGOT) 、[BukkitAPI](http://bukkit.org/) 实现。 +- **[必须]** 插件本体基于 [Spigot-API](https://hub.spigotmc.org/stash/projects/SPIGOT) 、[BukkitAPI](http://bukkit.org/) + 实现。 - **[自带]** 消息格式基于 [MineDown](https://github.com/Phoenix616/MineDown) 实现。 - - 所有 messages.yml 均支持 MineDown 语法。 + - 所有 messages.yml 均支持 MineDown 语法。 - **[推荐]** 变量部分基于 [PlaceholderAPI](https://www.spigotmc.org/resources/6245/) 实现。 详细依赖列表可见 [Dependencies](https://github.com/CarmJos/MoeTeleport/network/dependencies) 。 @@ -93,8 +96,6 @@ 支持 [MineDown 语法](https://wiki.phoenix616.dev/library:minedown:syntax),详见源文件。 - - ### 玩家数据配置文件 (data/\.yml) 本插件采用 `YAML格式` 存储玩家数据。 @@ -108,6 +109,7 @@ homes: ``` ## 使用统计 + [![bStats](https://bstats.org/signatures/bukkit/MoeTeleport.svg)](https://bstats.org/plugin/bukkit/MoeTeleport/14459) ## 支持与捐赠 @@ -123,7 +125,7 @@ homes: 本项目源码采用 [GNU General Public License v3.0](https://opensource.org/licenses/GPL-3.0) 开源协议。
关于 GPL 协议 - + > GNU General Public Licence (GPL) 有可能是开源界最常用的许可模式。GPL 保证了所有开发者的权利,同时为使用者提供了足够的复制,分发,修改的权利: > > #### 可自由复制 @@ -133,9 +135,11 @@ homes: > #### 可以用来盈利 > 你可以在分发软件的时候收费,但你必须在收费前向你的客户提供该软件的 GNU GPL 许可协议,以便让他们知道,他们可以从别的渠道免费得到这份软件,以及你收费的理由。 > #### 可自由修改 -> 如果你想添加或删除某个功能,没问题,如果你想在别的项目中使用部分代码,也没问题,唯一的要求是,使用了这段代码的项目也必须使用 GPL 协议。 +> 如果你想添加或删除某个功能,没问题,如果你想在别的项目中使用部分代码,也没问题,唯一的要求是,使用了这段代码的项目也必须使用 +> GPL 协议。 > -> 需要注意的是,分发的时候,需要明确提供源代码和二进制文件,另外,用于某些程序的某些协议有一些问题和限制,你可以看一下 @PierreJoye 写的 Practical Guide to GPL Compliance 一文。使用 GPL 协议,你必须在源代码代码中包含相应信息,以及协议本身。 +> 需要注意的是,分发的时候,需要明确提供源代码和二进制文件,另外,用于某些程序的某些协议有一些问题和限制,你可以看一下 +> @PierreJoye 写的 Practical Guide to GPL Compliance 一文。使用 GPL 协议,你必须在源代码代码中包含相应信息,以及协议本身。 > > *以上文字来自 [五种开源协议GPL,LGPL,BSD,MIT,Apache](https://www.oschina.net/question/54100_9455) 。*
diff --git a/lib/CMI-API9.3.1.2.jar b/lib/CMI-API9.3.1.2.jar new file mode 100644 index 0000000..f0442eb Binary files /dev/null and b/lib/CMI-API9.3.1.2.jar differ diff --git a/lib/CMILib1.2.4.5.jar b/lib/CMILib1.2.4.5.jar new file mode 100644 index 0000000..87ecf7c Binary files /dev/null and b/lib/CMILib1.2.4.5.jar differ diff --git a/pom.xml b/pom.xml index 8696aad..11c0d17 100644 --- a/pom.xml +++ b/pom.xml @@ -5,17 +5,20 @@ 4.0.0 - 8 - 8 + 8 + ${project.jdk.version} + ${project.jdk.version} UTF-8 UTF-8 - 1.3.9 - 0.3.8 + + 1.4.18 + 0.4.6 + 2.3.0 cc.carm.plugin moeteleport - 3.1.2 + 4.0.0 MoeTeleport 喵喵传送,简单的传送、设置家的插件。 @@ -23,12 +26,12 @@ GitHub Issues - ${project.url}/issues + https://github.com/CarmJos/MoeTeleport/issues GitHub Actions - ${project.url}/actions/workflows/maven.yml + https://github.com/CarmJos/MoeTeleport/actions/workflows/maven.yml @@ -91,7 +94,7 @@ - ${project.url}/releases + https://github.com/CarmJos/MoeTeleport/releases github GitHub Packages @@ -102,19 +105,36 @@ - org.spigotmc - spigot-api - 1.17-R0.1-SNAPSHOT - provided + cc.carm.lib + mineconfiguration-bukkit + ${deps.mineconfig.version} + compile + true - me.clip - placeholderapi - 2.10.9 - provided + cc.carm.lib + easyplugin-main + ${deps.easyplugin.version} + compile + true + + cc.carm.lib + easyplugin-command + ${deps.easyplugin.version} + compile + true + + + + cc.carm.lib + easyplugin-githubchecker + ${deps.easyplugin.version} + compile + true + net.essentialsx @@ -123,44 +143,46 @@ provided + + com.Zrips + CMI-API + 9.3.1.2 + system + ${project.basedir}/lib/CMI-API9.3.1.2.jar + + + + com.Zrips + CMILib + 1.2.4.5 + system + ${project.basedir}/lib/CMILib1.2.4.5.jar + + cc.carm.lib easysql-beecp - ${easysql.version} + ${deps.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 - - de.themoep minedown 1.7.1-SNAPSHOT compile - true + + + org.spigotmc + spigot-api + 1.17-R0.1-SNAPSHOT + provided + + org.bstats bstats-bukkit @@ -169,6 +191,13 @@ true + + me.clip + placeholderapi + 2.10.9 + provided + + junit junit @@ -185,21 +214,6 @@ - - - - - - cc.carm.lib - easyplugin-bom - ${easyplugin.version} - pom - import - - - - - @@ -230,8 +244,8 @@ maven-compiler-plugin 3.8.1 - 1.8 - 1.8 + ${project.jdk.version} + ${project.jdk.version} UTF-8 -parameters diff --git a/src/main/java/cc/carm/plugin/moeteleport/Main.java b/src/main/java/cc/carm/plugin/moeteleport/Main.java index e8bccbf..54d1e1a 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/Main.java +++ b/src/main/java/cc/carm/plugin/moeteleport/Main.java @@ -1,7 +1,9 @@ package cc.carm.plugin.moeteleport; +import cc.carm.lib.configuration.core.source.ConfigurationProvider; import cc.carm.lib.easyplugin.EasyPlugin; -import cc.carm.lib.easyplugin.i18n.EasyPluginMessageProvider; +import cc.carm.lib.easyplugin.updatechecker.GHUpdateChecker; +import cc.carm.lib.mineconfiguration.bukkit.MineConfiguration; import cc.carm.plugin.moeteleport.command.BackCommand; import cc.carm.plugin.moeteleport.command.MoeTeleportCommand; import cc.carm.plugin.moeteleport.command.completer.HomeNameCompleter; @@ -15,73 +17,47 @@ 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.conf.PluginConfig; +import cc.carm.plugin.moeteleport.conf.PluginMessages; +import cc.carm.plugin.moeteleport.listener.CommandListener; 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.JarResourceUtils; -import cc.carm.plugin.moeteleport.util.UpdateChecker; import org.bstats.bukkit.Metrics; import org.bstats.charts.SimplePie; import org.bukkit.Bukkit; -import org.bukkit.event.Listener; - -import java.util.Arrays; public class Main extends EasyPlugin { private static Main instance; + protected ConfigurationProvider configProvider; + protected ConfigurationProvider messageProvider; + + protected DataStorage storage; protected WarpManager warpManager; protected UserManager userManager; protected RequestManager requestManager; public Main() { - super(new EasyPluginMessageProvider.zh_CN()); instance = this; } - /** - * 注册监听器 - * - * @param listener 监听器 - */ - public static void regListener(Listener listener) { - Bukkit.getPluginManager().registerEvents(listener, getInstance()); - } - - public static void info(String... messages) { - getInstance().log(messages); - } - - public static void severe(String... messages) { - getInstance().error(messages); - } - - public static void debugging(String... messages) { - getInstance().debug(messages); - } - - public static Main getInstance() { - return instance; - } - @Override protected boolean initialize() { - info("加载配置文件..."); - if (!ConfigManager.initConfig()) { - severe("配置文件初始化失败,请检查。"); - setEnabled(false); - return false; - } + log("加载插件配置文件..."); + this.configProvider = MineConfiguration.from(this, "config.yml"); + this.configProvider.initialize(PluginConfig.class); + + this.messageProvider = MineConfiguration.from(this, "messages.yml"); + this.messageProvider.initialize(PluginMessages.class); info("初始化存储方式..."); - StorageMethod storageMethod = StorageMethod.read(PluginConfig.STORAGE_METHOD.get()); + StorageMethod storageMethod = StorageMethod.read(PluginConfig.STORAGE.METHOD.get()); try { info(" 正在使用 " + storageMethod.name() + " 进行数据存储"); @@ -108,7 +84,8 @@ public class Main extends EasyPlugin { this.requestManager = new RequestManager(this); info("注册监听器..."); - regListener(new UserListener()); + registerListener(new UserListener()); + registerListener(new CommandListener()); info("注册指令..."); registerCommand("MoeTeleport", new MoeTeleportCommand()); @@ -131,15 +108,15 @@ public class Main extends EasyPlugin { registerCommand("setWarp", new WarpSetCommand()); registerCommand("delWarp", new WarpDelCommand(), new WarpNameCompleter(true)); - if (PluginConfig.METRICS.get()) { + if (PluginConfig.METRICS.getNotNull()) { info("启用统计数据..."); Metrics metrics = new Metrics(this, 14459); metrics.addCustomChart(new SimplePie("storage_method", storageMethod::name)); } - if (PluginConfig.CHECK_UPDATE.get()) { + if (PluginConfig.CHECK_UPDATE.getNotNull()) { info("开始检查更新..."); - UpdateChecker.checkUpdate(); + getScheduler().runAsync(GHUpdateChecker.runner(this)); } else { info("已禁用检查更新,跳过。"); } @@ -167,15 +144,30 @@ public class Main extends EasyPlugin { @Override public boolean isDebugging() { - return PluginConfig.DEBUG.get(); + return PluginConfig.DEBUG.getNotNull(); } - public void outputInfo() { - String[] pluginInfo = JarResourceUtils.readResource(this.getResource("PLUGIN_INFO")); - if (pluginInfo != null) { - Arrays.stream(pluginInfo).forEach(Main::info); - } + public static void info(String... messages) { + getInstance().log(messages); } + public static void severe(String... messages) { + getInstance().error(messages); + } + public static void debugging(String... messages) { + getInstance().debug(messages); + } + + public static Main getInstance() { + return instance; + } + + public ConfigurationProvider getConfigProvider() { + return configProvider; + } + + public ConfigurationProvider getMessageProvider() { + return messageProvider; + } } diff --git a/src/main/java/cc/carm/plugin/moeteleport/MoeTeleport.java b/src/main/java/cc/carm/plugin/moeteleport/MoeTeleport.java index 0ab1062..3d7d0f4 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/MoeTeleport.java +++ b/src/main/java/cc/carm/plugin/moeteleport/MoeTeleport.java @@ -8,10 +8,6 @@ import cc.carm.plugin.moeteleport.storage.StorageMethod; public class MoeTeleport { - public static void outputInfo() { - Main.getInstance().outputInfo(); - } - public static DataStorage getStorage() { return Main.getInstance().storage; } 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 a596714..67a3992 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/BackCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/BackCommand.java @@ -1,9 +1,9 @@ package cc.carm.plugin.moeteleport.command; import cc.carm.plugin.moeteleport.MoeTeleport; -import cc.carm.plugin.moeteleport.configuration.PluginMessages; +import cc.carm.plugin.moeteleport.conf.PluginMessages; import cc.carm.plugin.moeteleport.manager.TeleportManager; -import cc.carm.plugin.moeteleport.model.UserData; +import cc.carm.plugin.moeteleport.storage.UserData; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/MainCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/MainCommand.java new file mode 100644 index 0000000..1f05016 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/MainCommand.java @@ -0,0 +1,25 @@ +package cc.carm.plugin.moeteleport.command; + +import cc.carm.lib.easyplugin.command.CommandHandler; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +public class MainCommand extends CommandHandler { + + public MainCommand(@NotNull JavaPlugin plugin) { + super(plugin); + } + + @Override + public Void noArgs(CommandSender sender) { + return null; + } + + @Override + public Void noPermission(CommandSender sender) { + return null; + } + + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/MoeCompleter.java b/src/main/java/cc/carm/plugin/moeteleport/command/MoeCompleter.java new file mode 100644 index 0000000..a06ee97 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/command/MoeCompleter.java @@ -0,0 +1,15 @@ +package cc.carm.plugin.moeteleport.command; + +import cc.carm.lib.easyplugin.command.SimpleCompleter; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.List; + +public class MoeCompleter extends SimpleCompleter { + + public static @NotNull List objects(@NotNull String input, Collection objects) { + return objects(input, objects.size(), objects); + } + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/MoeTeleportCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/MoeTeleportCommand.java index dad43d3..cd85071 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/MoeTeleportCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/MoeTeleportCommand.java @@ -1,6 +1,5 @@ package cc.carm.plugin.moeteleport.command; -import cc.carm.plugin.moeteleport.manager.ConfigManager; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; 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 a1b1f57..04e4b46 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,7 +1,7 @@ package cc.carm.plugin.moeteleport.command.completer; import cc.carm.plugin.moeteleport.MoeTeleport; -import cc.carm.plugin.moeteleport.model.UserData; +import cc.carm.plugin.moeteleport.storage.UserData; import com.google.common.collect.ImmutableList; import org.bukkit.Bukkit; import org.bukkit.command.Command; diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeDelCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeDelCommand.java index 0b2f327..4f09c6b 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeDelCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeDelCommand.java @@ -1,9 +1,9 @@ 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 cc.carm.plugin.moeteleport.conf.PluginMessages; +import cc.carm.plugin.moeteleport.conf.location.DataLocation; +import cc.carm.plugin.moeteleport.storage.UserData; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeListCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeListCommand.java index fdbc184..fdeaa93 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeListCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeListCommand.java @@ -1,8 +1,8 @@ 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.model.UserData; +import cc.carm.plugin.moeteleport.conf.PluginMessages; +import cc.carm.plugin.moeteleport.storage.UserData; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; 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 index 926a56f..6d80e65 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeSetCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeSetCommand.java @@ -1,9 +1,9 @@ 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 cc.carm.plugin.moeteleport.conf.PluginMessages; +import cc.carm.plugin.moeteleport.conf.location.DataLocation; +import cc.carm.plugin.moeteleport.storage.UserData; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeTpCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeTpCommand.java index 81fc7e6..82d5712 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeTpCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/home/HomeTpCommand.java @@ -1,10 +1,10 @@ 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.conf.PluginMessages; +import cc.carm.plugin.moeteleport.conf.location.DataLocation; import cc.carm.plugin.moeteleport.manager.TeleportManager; -import cc.carm.plugin.moeteleport.model.UserData; +import cc.carm.plugin.moeteleport.storage.UserData; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; 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 ad2df52..368afc9 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,9 +1,9 @@ package cc.carm.plugin.moeteleport.command.tpa; import cc.carm.plugin.moeteleport.MoeTeleport; -import cc.carm.plugin.moeteleport.configuration.PluginMessages; +import cc.carm.plugin.moeteleport.conf.PluginMessages; import cc.carm.plugin.moeteleport.model.TeleportRequest; -import cc.carm.plugin.moeteleport.model.UserData; +import cc.carm.plugin.moeteleport.storage.UserData; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; 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 9ae64e2..7b30dff 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,7 +1,7 @@ package cc.carm.plugin.moeteleport.command.tpa; import cc.carm.plugin.moeteleport.MoeTeleport; -import cc.carm.plugin.moeteleport.configuration.PluginMessages; +import cc.carm.plugin.moeteleport.conf.PluginMessages; import cc.carm.plugin.moeteleport.model.TeleportRequest; import org.bukkit.Bukkit; import org.bukkit.command.Command; 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 index 6b4be4f..d176191 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpDelCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpDelCommand.java @@ -1,7 +1,7 @@ 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.conf.PluginMessages; import cc.carm.plugin.moeteleport.model.WarpInfo; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpInfoCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpInfoCommand.java index 5495dfe..a1deb22 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpInfoCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpInfoCommand.java @@ -1,7 +1,7 @@ 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.conf.PluginMessages; import cc.carm.plugin.moeteleport.model.WarpInfo; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; diff --git a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpListCommand.java b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpListCommand.java index bf008a6..97c800a 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpListCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpListCommand.java @@ -1,7 +1,7 @@ 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.conf.PluginMessages; import cc.carm.plugin.moeteleport.model.WarpInfo; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; 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 index 98c3a92..6e6a2b7 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpSetCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpSetCommand.java @@ -1,7 +1,7 @@ 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.conf.PluginMessages; import cc.carm.plugin.moeteleport.model.WarpInfo; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; 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 index 424d676..c60187f 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpTpCommand.java +++ b/src/main/java/cc/carm/plugin/moeteleport/command/warp/WarpTpCommand.java @@ -1,7 +1,7 @@ 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.conf.PluginMessages; import cc.carm.plugin.moeteleport.manager.TeleportManager; import cc.carm.plugin.moeteleport.model.WarpInfo; import org.bukkit.command.Command; diff --git a/src/main/java/cc/carm/plugin/moeteleport/conf/PluginConfig.java b/src/main/java/cc/carm/plugin/moeteleport/conf/PluginConfig.java new file mode 100644 index 0000000..0d686da --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/conf/PluginConfig.java @@ -0,0 +1,128 @@ +package cc.carm.plugin.moeteleport.conf; + + +import cc.carm.lib.configuration.core.ConfigurationRoot; +import cc.carm.lib.configuration.core.annotation.HeaderComment; +import cc.carm.lib.configuration.core.util.MapFactory; +import cc.carm.lib.configuration.core.value.ConfigValue; +import cc.carm.lib.configuration.core.value.type.ConfiguredList; +import cc.carm.lib.configuration.core.value.type.ConfiguredMap; +import cc.carm.lib.configuration.core.value.type.ConfiguredValue; + +public class PluginConfig extends ConfigurationRoot { + + public static final ConfigValue DEBUG = ConfiguredValue.of(Boolean.class, false); + + @HeaderComment({ + "统计数据设定", + "该选项用于帮助开发者统计插件版本与使用情况,且绝不会影响性能与使用体验。", + "当然,您也可以选择在这里关闭,或在plugins/bStats下的配置文件中关闭。" + }) + public static final ConfigValue METRICS = ConfiguredValue.of(Boolean.class, true); + + @HeaderComment({ + "检查更新设定", + "该选项用于插件判断是否要检查更新,若您不希望插件检查更新并提示您,可以选择关闭。", + "检查更新为异步操作,绝不会影响性能与使用体验。" + }) + public static final ConfigValue CHECK_UPDATE = ConfiguredValue.of(Boolean.class, true); + + @HeaderComment({"存储相关配置", "注意:存储配置不会通过重载指令生效,如有修改请重新启动服务器。"}) + public static final class STORAGE extends ConfigurationRoot { + + @HeaderComment("存储方式,可选 [ yaml | json | mysql | Essential(须安装ess插件) | CMI(须安装CMI插件) | custom(自定义,须重写功能) ]") + public static final ConfigValue METHOD = ConfiguredValue.of(String.class, "YAML"); + + } + + @HeaderComment("传送的相关配置") + public static final class TELEPORTATION extends ConfigurationRoot { + + @HeaderComment("危险的方块类型,将判断目的地脚下的方块的类型是否在这个列表中") + public static final ConfiguredList DANGEROUS_TYPES = ConfiguredList.builder(String.class) + .fromString() + .defaults("LAVA", "AIR") + .build(); + + @HeaderComment("传送的引导时间,单位为秒") + public static final ConfigValue WAIT_TIME = ConfiguredValue.of(Integer.class, 3); + + @HeaderComment("打断传送引导的方式") + public static final class INTERRUPT { + + @HeaderComment("在传送引导时是否会因为移动打断传送") + public static final ConfigValue MOVE = ConfiguredValue.of(Boolean.class, true); + + @HeaderComment("在传送引导时是否会因为攻击/被攻击打断传送") + public static final ConfigValue ATTACK = ConfiguredValue.of(Boolean.class, true); + + @HeaderComment("在传送引导时是否会因为下蹲打断传送") + public static final ConfigValue SNAKE = ConfiguredValue.of(Boolean.class, false); + + } + + + @HeaderComment("传送引导特效与音效") + public static final ConfigValue EFFECTS = ConfiguredValue.of(Boolean.class, true); + + } + + + @HeaderComment("传送请求的相关配置") + public static final class REQUEST extends ConfigurationRoot { + + @HeaderComment("请求的过期时间,单位为秒") + public static final ConfigValue EXPIRE_TIME = ConfiguredValue.of(Integer.class, 30); + + @HeaderComment("一个玩家同时能发出的最大请求数量") + public static final ConfigValue MAX = ConfiguredValue.of(Integer.class, 3); + + } + + @HeaderComment("返回上一传送点的相关配置") + public static final class BACK extends ConfigurationRoot { + + @HeaderComment({"返回死亡点", "开启后将允许玩家输入 /back 返回死亡地点。"}) + public static final ConfigValue DEATH = ConfiguredValue.of(Boolean.class, true); + + } + + @HeaderComment("“家”功能相关配置") + public static final class HOMES extends ConfigurationRoot { + + @HeaderComment("是否启用家功能") + public static final ConfigValue ENABLE = ConfiguredValue.of(Boolean.class, false); + + @HeaderComment("普通玩家可设置多少家") + public static final ConfigValue DEFAULTS = ConfiguredValue.of(Integer.class, 2); + + @HeaderComment("设定权限对应的可设置家的数量。 (数量: 权限)") + public static final ConfiguredMap PERMISSIONS = ConfiguredMap + .builder(Integer.class, String.class) + .fromString() + .parseKey(Integer::parseInt).serializeKey(Object::toString) + .defaults(MapFactory.linkedMap(10, "MoeTeleport.vip").build()) + .build(); + + } + + @HeaderComment("“地标”功能相关配置") + public static final class WARPS extends ConfigurationRoot { + + @HeaderComment("是否启用地标功能") + public static final ConfigValue ENABLE = ConfiguredValue.of(Boolean.class, false); + + @HeaderComment("普通玩家可设置多少地标") + public static final ConfigValue DEFAULTS = ConfiguredValue.of(Integer.class, 0); + + @HeaderComment("设定权限对应的可设置地标的数量。 (数量: 权限)") + public static final ConfiguredMap PERMISSIONS = ConfiguredMap + .builder(Integer.class, String.class) + .fromString() + .parseKey(Integer::parseInt).serializeKey(Object::toString) + .defaults(MapFactory.linkedMap(2, "MoeTeleport.vip").build()) + .build(); + } + + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/configuration/PluginMessages.java b/src/main/java/cc/carm/plugin/moeteleport/conf/PluginMessages.java similarity index 54% rename from src/main/java/cc/carm/plugin/moeteleport/configuration/PluginMessages.java rename to src/main/java/cc/carm/plugin/moeteleport/conf/PluginMessages.java index 71b30a3..8e17860 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/configuration/PluginMessages.java +++ b/src/main/java/cc/carm/plugin/moeteleport/conf/PluginMessages.java @@ -1,38 +1,66 @@ -package cc.carm.plugin.moeteleport.configuration; +package cc.carm.plugin.moeteleport.conf; -import cc.carm.lib.easyplugin.configuration.language.EasyMessageList; -import cc.carm.lib.easyplugin.configuration.language.MessagesRoot; -import cc.carm.plugin.moeteleport.configuration.messages.MoeMessageList; +import cc.carm.lib.configuration.core.ConfigurationRoot; +import cc.carm.lib.mineconfiguration.bukkit.builder.message.CraftMessageListBuilder; +import cc.carm.lib.mineconfiguration.bukkit.builder.message.CraftMessageValueBuilder; +import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredMessage; +import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredMessageList; +import de.themoep.minedown.MineDown; +import me.clip.placeholderapi.PlaceholderAPI; +import net.md_5.bungee.api.chat.BaseComponent; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; -public class PluginMessages extends MessagesRoot { +import java.util.function.BiFunction; - public static final EasyMessageList NOT_ONLINE = MoeMessageList.builder().contents( +public class PluginMessages extends ConfigurationRoot { + + public static @NotNull CraftMessageListBuilder list() { + return ConfiguredMessageList.create(getParser()) + .whenSend((sender, message) -> message.forEach(m -> sender.spigot().sendMessage(m))); + } + + public static @NotNull CraftMessageValueBuilder value() { + return ConfiguredMessage.create(getParser()) + .whenSend((sender, message) -> sender.spigot().sendMessage(message)); + } + + public static @NotNull BiFunction getParser() { + return (sender, message) -> { + if (sender instanceof Player) message = PlaceholderAPI.setPlaceholders((Player) sender, message); + return MineDown.parse(ColorParser.parse(message)); + }; + } + + + public static final ConfiguredMessageList NOT_ONLINE = list().defaults( "&f目标玩家并不在线,无法发送请求。" ).build(); public static class Back { - public static final EasyMessageList NO_LAST_LOCATION = MoeMessageList.builder().contents( + public static final ConfiguredMessageList NO_LAST_LOCATION = list().defaults( "&f您当前没有进行任何传送,无法返回上个地点。" ).build(); - public static final EasyMessageList DEATH_MESSAGE = MoeMessageList.builder().contents( + public static final ConfiguredMessageList DEATH_MESSAGE = list().defaults( "&f您可以输入 &5/back &f或 [&d&l点击这里](show_text=点击返回到死亡地点 run_command=/moeteleport:back) &f返回您的死亡地点。" ).build(); } public static class Teleport { - public static final EasyMessageList TELEPORTING = MoeMessageList.builder().contents( + public static final ConfiguredMessageList TELEPORTING = list().defaults( "&f正在将您传送到 &d%(location) &f..." ).params("location").build(); - public static final EasyMessageList NOT_SAFE = MoeMessageList.builder().contents( + public static final ConfiguredMessageList NOT_SAFE = list().defaults( "&f目标地点 &d%(location) &f并不安全,因此传送被取消。", "&7如需传送,请告知请求者到达安全位置后重新发送传送请求。" ).params("location").build(); - public static final EasyMessageList NOT_AVAILABLE = MoeMessageList.builder().contents( + public static final ConfiguredMessageList NOT_AVAILABLE = list().defaults( "&f目标地点暂时无法前往,传送被取消。" ).build(); @@ -40,68 +68,68 @@ public class PluginMessages extends MessagesRoot { public static class Requests { - public static final EasyMessageList SELF = MoeMessageList.builder().contents("&f您不能向自己发送请求。").build(); + public static final ConfiguredMessageList SELF = list().defaults("&f您不能向自己发送请求。").build(); - public static final EasyMessageList OFFLINE = MoeMessageList.builder().contents( + public static final ConfiguredMessageList OFFLINE = list().defaults( "&d%(player) &f离线,相关请求已自动取消。" ).params("player").build(); - public static final EasyMessageList MULTI = MoeMessageList.builder().contents( + public static final ConfiguredMessageList MULTI = list().defaults( "&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您当前没有任何待处理的传送请求。") + public static final ConfiguredMessageList EMPTY_REQUESTS = list() + .defaults("&f您当前没有任何待处理的传送请求。") .build(); - public static final EasyMessageList NO_REQUEST_FROM = MoeMessageList.builder().contents( + public static final ConfiguredMessageList NO_REQUEST_FROM = list().defaults( "&f您当前没有收到来自 &d%(player) &f的传送请求。" ).params("player").build(); - public static final EasyMessageList SENT = MoeMessageList.builder().contents( + public static final ConfiguredMessageList SENT = list().defaults( "&f成功向玩家 &d%(player) &f发送传送请求,对方有 &5%(expire)秒 &f的时间回应该请求。" ).params("player", "expire").build(); - public static final EasyMessageList DUPLICATE = MoeMessageList.builder().contents( + public static final ConfiguredMessageList DUPLICATE = list().defaults( "&f您已经向 &d%(player) &f发送过传送请求,对方仍有 &5%(expire)秒 &f的时间回应该请求。" ).params("player", "expire").build(); - public static final EasyMessageList RECEIVED_TP_HERE = MoeMessageList.builder().contents( + public static final ConfiguredMessageList RECEIVED_TP_HERE = list().defaults( "&d%(player) &f请求传送到您身边,您有 &5%(expire)秒 &f的时间回应。", " [&a&l[点击同意]](show_text=点击同意请求 run_command=/moeteleport:tpaccept %(player)) &f或输入 &5/tpAccept &f同意该请求。", " [&c&l[点击拒绝]](show_text=点击拒绝请求 run_command=/moeteleport:tpdeny %(player)) &f或输入 &5/tpDeny &f拒绝该请求。" ).params("player", "expire").build(); - public static final EasyMessageList RECEIVED_TP_TO = MoeMessageList.builder().contents( + public static final ConfiguredMessageList RECEIVED_TP_TO = list().defaults( "&d%(player) &f请求传送您到Ta身边,您有 &5%(expire)秒 &f的时间回应。", " [&a&l[点击同意]](show_text=点击同意请求 run_command=/moeteleport:tpaccept %(player)) &f或输入 &5/tpAccept &f同意该请求。", " [&c&l[点击拒绝]](show_text=点击拒绝请求 run_command=/moeteleport:tpdeny %(player)) &f或输入 &5/tpDeny &f拒绝该请求。" ).params("player", "expire").build(); - public static final EasyMessageList ACCEPTED = MoeMessageList.builder().contents( + public static final ConfiguredMessageList ACCEPTED = list().defaults( "&f您同意了 &d%(player) &f的传送请求。" ).params("player").build(); - public static final EasyMessageList DENIED = MoeMessageList.builder().contents( + public static final ConfiguredMessageList DENIED = list().defaults( "&f您&d拒绝&f了 &d%(player) &f的传送请求。" ).params("player").build(); - public static final EasyMessageList WAS_ACCEPTED = MoeMessageList.builder().contents( + public static final ConfiguredMessageList WAS_ACCEPTED = list().defaults( "&d%(player) &f同意了您的传送请求。" ).params("player").build(); - public static final EasyMessageList WAS_DENIED = MoeMessageList.builder().contents( + public static final ConfiguredMessageList WAS_DENIED = list().defaults( "&d%(player) &f拒绝了您的传送请求。" ).params("player").build(); - public static final EasyMessageList SENT_TIMEOUT = MoeMessageList.builder().contents( + public static final ConfiguredMessageList SENT_TIMEOUT = list().defaults( "&f发往 &d%(player) &f的传送请求已超时。" ).params("player").build(); - public static final EasyMessageList RECEIVED_TIMEOUT = MoeMessageList.builder().contents( + public static final ConfiguredMessageList RECEIVED_TIMEOUT = list().defaults( "&f来自 &d%(player) &f的传送请求已超时。" ).params("player").build(); @@ -110,41 +138,41 @@ public class PluginMessages extends MessagesRoot { public static class Home { - public static final EasyMessageList NAME_TOO_LONG = MoeMessageList.builder() - .contents("&f您所输入的家的名字太长,家的名称不应当超过 &d32 &f个字符。") + public static final ConfiguredMessageList NAME_TOO_LONG = list() + .defaults("&f您所输入的家的名字太长,家的名称不应当超过 &d32 &f个字符。") .build(); - public static final EasyMessageList OVER_LIMIT = MoeMessageList.builder().contents( + public static final ConfiguredMessageList OVER_LIMIT = list().defaults( "&f您最多只能设置 &d%(max) &f个家传送点!", "&7可以输入 &5/delHome <家名称> &7删除之前的家传送点,", "&7或输入 &5/setHome <家名称> &7覆盖之前的家传送点。" ).params("max").build(); - public static final EasyMessageList NOT_FOUND = MoeMessageList.builder() - .contents("&f您还没有设置这个家,请先输入 &5/setHome <家名称> &f设置一个吧!") + public static final ConfiguredMessageList NOT_FOUND = list() + .defaults("&f您还没有设置这个家,请先输入 &5/setHome <家名称> &f设置一个吧!") .build(); - public static final EasyMessageList SET = MoeMessageList.builder().contents( + public static final ConfiguredMessageList SET = list().defaults( "&f成功设定名为 &d%(name) &f的家传送点。" ).params("name").build(); - public static final EasyMessageList OVERRIDE = MoeMessageList.builder().contents( + public static final ConfiguredMessageList OVERRIDE = list().defaults( "&f成功覆盖名为 &d%(name) &f的家传送点。", "&8原先位置为 &5%(location) &8。" ).params("name", "location").build(); - public static final EasyMessageList REMOVED = MoeMessageList.builder().contents( + public static final ConfiguredMessageList REMOVED = list().defaults( "&f成功移除名为 &d%(name) &f的家传送点。", "&8原先位置为 &5%(location) &8。" ).params("name", "location").build(); public static class List { - public static final EasyMessageList HEADER = MoeMessageList.builder().contents( + public static final ConfiguredMessageList HEADER = list().defaults( "&f您当前设定的所有家:" ).build(); - public static final EasyMessageList OBJECT = MoeMessageList.builder().contents( + public static final ConfiguredMessageList OBJECT = list().defaults( "&8# &f%(id) &d%(location) [&7✈](show_text=点击返回家 %(id) run_command=/moeteleport:home %(id))" ).params("id", "location").build(); @@ -154,46 +182,46 @@ public class PluginMessages extends MessagesRoot { public static class Warp { - public static final EasyMessageList EMPTY = MoeMessageList.builder().contents( + public static final ConfiguredMessageList EMPTY = list().defaults( "&f当前服务器暂无任何地标点,快设置一个吧!" ).build(); - public static final EasyMessageList NOT_OWNER = MoeMessageList.builder().contents( + public static final ConfiguredMessageList NOT_OWNER = list().defaults( "&f您不是地标 &d%(name) &f的创建者,无法进行此操作。" ).params("name").build(); - public static final EasyMessageList NOT_FOUND = MoeMessageList.builder() - .contents("&f目前暂不存在该地标。") + public static final ConfiguredMessageList NOT_FOUND = list() + .defaults("&f目前暂不存在该地标。") .build(); - public static final EasyMessageList NAME_TOO_LONG = MoeMessageList.builder() - .contents("&f您所输入的家的名字太长,地标的名称不应当超过 &d16 &f个字符。") + public static final ConfiguredMessageList NAME_TOO_LONG = list() + .defaults("&f您所输入的家的名字太长,地标的名称不应当超过 &d16 &f个字符。") .build(); - public static final EasyMessageList OVER_LIMIT = MoeMessageList.builder().contents( + public static final ConfiguredMessageList OVER_LIMIT = list().defaults( "&f您最多只能设置 &d%(max) &f个地标传送点!", "&7可以输入 &5/delWarp <地标名称> &7删除之前的地标传送点,", "&7或输入 &5/setWarp <地标名称> &7覆盖之前的地标传送点。" ).params("max").build(); - public static final EasyMessageList INFO_LOCATION = MoeMessageList.builder().contents( + public static final ConfiguredMessageList INFO_LOCATION = list().defaults( "&f地标点 &d%(name) &f所在位置为 &5%(location) &f。[&7✈](show_text=点击前往&d %(name) run_command=/moeteleport:warp %(name))" ).params("name", "location").build(); - public static final EasyMessageList INFO_FULL = MoeMessageList.builder().contents( + public static final ConfiguredMessageList INFO_FULL = list().defaults( "&f地标点 &d%(name) &f由 &5%(owner) &f创建,所在位置为 &d%(location) &f。[&7✈](show_text=点击前往&d %(name) run_command=/moeteleport:warp %(name))" ).params("name", "owner", "location").build(); - public static final EasyMessageList SET = MoeMessageList.builder().contents( + public static final ConfiguredMessageList SET = list().defaults( "&f成功设定名为 &d%(name) &f的地标传送点。" ).params("name").build(); - public static final EasyMessageList OVERRIDE = MoeMessageList.builder().contents( + public static final ConfiguredMessageList OVERRIDE = list().defaults( "&f成功覆盖名为 &d%(name) &f的地标传送点。", "&8原先位置为 &5%(location) &8。" ).params("name", "location").build(); - public static final EasyMessageList REMOVED = MoeMessageList.builder().contents( + public static final ConfiguredMessageList REMOVED = list().defaults( "&f成功移除名为 &d%(name) &f的地标传送点。", "&8原先位置为 &5%(location) &8。" ).params("name", "location").build(); @@ -201,16 +229,16 @@ public class PluginMessages extends MessagesRoot { public static class List { - public static final EasyMessageList HEADER = MoeMessageList.builder().contents( + public static final ConfiguredMessageList HEADER = list().defaults( "&f当前地标列表 &7(第&f%(current)&8/%(max)&7页):" ).params("current", "max").build(); - public static final EasyMessageList OBJECT = MoeMessageList.builder().contents( + public static final ConfiguredMessageList OBJECT = list().defaults( "&8# &f%(id) &7[由%(owner)创建]", "&8- &d%(location) [&7✈](show_text=点击前往&d %(id) run_command=/moeteleport:warp %(id))" ).params("id", "owner", "location").build(); - public static final EasyMessageList OBJECT_NO_OWNER = MoeMessageList.builder().contents( + public static final ConfiguredMessageList OBJECT_NO_OWNER = list().defaults( "&8# &f%(id)", "&8- &d%(location) [&7✈](show_text=点击前往&d %(id) run_command=/moeteleport:warp %(id))" ).params("id", "location").build(); diff --git a/src/main/java/cc/carm/plugin/moeteleport/configuration/location/DataLocation.java b/src/main/java/cc/carm/plugin/moeteleport/conf/location/DataLocation.java similarity index 98% rename from src/main/java/cc/carm/plugin/moeteleport/configuration/location/DataLocation.java rename to src/main/java/cc/carm/plugin/moeteleport/conf/location/DataLocation.java index c659f26..908b5c5 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/configuration/location/DataLocation.java +++ b/src/main/java/cc/carm/plugin/moeteleport/conf/location/DataLocation.java @@ -1,4 +1,4 @@ -package cc.carm.plugin.moeteleport.configuration.location; +package cc.carm.plugin.moeteleport.conf.location; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; diff --git a/src/main/java/cc/carm/plugin/moeteleport/configuration/PluginConfig.java b/src/main/java/cc/carm/plugin/moeteleport/configuration/PluginConfig.java deleted file mode 100644 index 873ac57..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/configuration/PluginConfig.java +++ /dev/null @@ -1,53 +0,0 @@ -package cc.carm.plugin.moeteleport.configuration; - -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 { - - public static final ConfigValue DEBUG = new ConfigValue<>( - "debug", Boolean.class, false - ); - - public static final ConfigValue METRICS = new ConfigValue<>( - "metrics", Boolean.class, true - ); - - public static final ConfigValue CHECK_UPDATE = new ConfigValue<>( - "check-update", Boolean.class, true - ); - - public static final ConfigValue STORAGE_METHOD = new ConfigValue<>( - "storage.method", String.class, "YAML" - ); - - 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<>( - "dangerous-blocks", String.class, new String[]{"LAVA"} - ); - - public static final ConfigValue EXPIRE_TIME = new ConfigValue<>( - "expireTime", Integer.class, 30 - ); - - public static final ConfigValue DEFAULT_HOME = new ConfigValue<>( - "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<>( - "death-back", Boolean.class, true - ); - -} 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 deleted file mode 100644 index 8feecd6..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/configuration/messages/MoeMessage.java +++ /dev/null @@ -1,33 +0,0 @@ -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 deleted file mode 100644 index c45dd36..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/configuration/messages/MoeMessageList.java +++ /dev/null @@ -1,37 +0,0 @@ -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/effect/TeleportEffect.java b/src/main/java/cc/carm/plugin/moeteleport/effect/TeleportEffect.java new file mode 100644 index 0000000..318dccc --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/effect/TeleportEffect.java @@ -0,0 +1,8 @@ +package cc.carm.plugin.moeteleport.effect; + +public class TeleportEffect { + + + + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/listener/CommandListener.java b/src/main/java/cc/carm/plugin/moeteleport/listener/CommandListener.java new file mode 100644 index 0000000..b791213 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/listener/CommandListener.java @@ -0,0 +1,16 @@ +package cc.carm.plugin.moeteleport.listener; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; + +public class CommandListener implements Listener { + + + @EventHandler + public void onCommand(PlayerCommandPreprocessEvent event) { + + } + + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/listener/UserListener.java b/src/main/java/cc/carm/plugin/moeteleport/listener/UserListener.java index b4f1d32..9b1685c 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/listener/UserListener.java +++ b/src/main/java/cc/carm/plugin/moeteleport/listener/UserListener.java @@ -1,8 +1,8 @@ package cc.carm.plugin.moeteleport.listener; 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.conf.PluginConfig; +import cc.carm.plugin.moeteleport.conf.PluginMessages; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -26,7 +26,7 @@ public class UserListener implements Listener { @EventHandler public void onDeath(PlayerDeathEvent event) { - if (PluginConfig.DEATH_GO_BACK.get()) { + if (PluginConfig.BACK.DEATH.getNotNull()) { Player player = event.getEntity(); 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 deleted file mode 100644 index ae97566..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/manager/ConfigManager.java +++ /dev/null @@ -1,57 +0,0 @@ -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.PluginMessages; - -import java.io.IOException; - -public class ConfigManager { - - private static FileConfig config; - private static MessagesConfig messageConfig; - - 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() { - return config; - } - - public static FileConfig getMessageConfig() { - return messageConfig; - } - - public static void reload() { - try { - getPluginConfig().reload(); - getMessageConfig().reload(); - } catch (Exception ignored) { - } - } - - public static void saveConfig() { - 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 dcce574..539ab21 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/manager/RequestManager.java +++ b/src/main/java/cc/carm/plugin/moeteleport/manager/RequestManager.java @@ -2,10 +2,10 @@ 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.conf.PluginConfig; +import cc.carm.plugin.moeteleport.conf.PluginMessages; import cc.carm.plugin.moeteleport.model.TeleportRequest; -import cc.carm.plugin.moeteleport.model.UserData; +import cc.carm.plugin.moeteleport.storage.UserData; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; @@ -51,7 +51,7 @@ public class RequestManager { } public void sendRequest(Player sender, Player receiver, TeleportRequest.RequestType type) { - int expireTime = PluginConfig.EXPIRE_TIME.get(); + int expireTime = PluginConfig.REQUEST.EXPIRE_TIME.getNotNull(); PluginMessages.Requests.SENT.send(sender, receiver.getName(), expireTime); 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 65a2c17..eb73242 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/manager/TeleportManager.java +++ b/src/main/java/cc/carm/plugin/moeteleport/manager/TeleportManager.java @@ -1,9 +1,9 @@ package cc.carm.plugin.moeteleport.manager; 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; +import cc.carm.plugin.moeteleport.conf.PluginConfig; +import cc.carm.plugin.moeteleport.conf.PluginMessages; +import cc.carm.plugin.moeteleport.conf.location.DataLocation; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; @@ -11,6 +11,7 @@ import org.bukkit.entity.Player; public class TeleportManager { + public static void teleport(Player player, DataLocation targetLocation, boolean onlySafety) { Location location = targetLocation.getBukkitLocation(); if (location == null) { @@ -44,7 +45,7 @@ public class TeleportManager { return false; // not transparent (will suffocate) } Block ground = leg.getRelative(BlockFace.DOWN); - return !PluginConfig.DANGEROUS_TYPES.get().contains(ground.getType().name()); + return !PluginConfig.TELEPORTATION.DANGEROUS_TYPES.getNotNull().contains(ground.getType().name()); } 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 76c25e8..6dca577 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/manager/UserManager.java +++ b/src/main/java/cc/carm/plugin/moeteleport/manager/UserManager.java @@ -2,10 +2,10 @@ 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.conf.PluginConfig; import cc.carm.plugin.moeteleport.model.WarpInfo; import cc.carm.plugin.moeteleport.storage.DataStorage; +import cc.carm.plugin.moeteleport.storage.UserData; import cc.carm.plugin.moeteleport.util.DataTaskRunner; import com.google.common.collect.ImmutableMap; import org.bukkit.Bukkit; @@ -132,11 +132,11 @@ public class UserManager { } public int getMaxHome(Player player) { - return getMaxValue(player, PluginConfig.HOME_PERMISSIONS.get(), PluginConfig.DEFAULT_HOME.get()); + return getMaxValue(player, PluginConfig.HOMES.PERMISSIONS.getNotNull(), PluginConfig.HOMES.DEFAULTS.getNotNull()); } public int getMaxWarps(Player player) { - return getMaxValue(player, PluginConfig.WARP_PERMISSIONS.get(), PluginConfig.DEFAULT_WARP.get()); + return getMaxValue(player, PluginConfig.WARPS.PERMISSIONS.getNotNull(), PluginConfig.WARPS.DEFAULTS.getNotNull()); } public void editData(@NotNull DataTaskRunner task) { diff --git a/src/main/java/cc/carm/plugin/moeteleport/manager/WarpManager.java b/src/main/java/cc/carm/plugin/moeteleport/manager/WarpManager.java index 481ac43..8c37aa9 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/manager/WarpManager.java +++ b/src/main/java/cc/carm/plugin/moeteleport/manager/WarpManager.java @@ -2,7 +2,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.location.DataLocation; +import cc.carm.plugin.moeteleport.conf.location.DataLocation; import cc.carm.plugin.moeteleport.model.WarpInfo; import com.google.common.collect.ImmutableMap; import org.bukkit.Location; diff --git a/src/main/java/cc/carm/plugin/moeteleport/model/TeleportRequest.java b/src/main/java/cc/carm/plugin/moeteleport/model/TeleportRequest.java index ebae564..e6ef481 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/model/TeleportRequest.java +++ b/src/main/java/cc/carm/plugin/moeteleport/model/TeleportRequest.java @@ -1,6 +1,6 @@ package cc.carm.plugin.moeteleport.model; -import cc.carm.plugin.moeteleport.configuration.PluginConfig; +import cc.carm.plugin.moeteleport.conf.PluginConfig; import org.bukkit.Location; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -51,7 +51,7 @@ public class TeleportRequest { } public long getRemainTime() { - return PluginConfig.EXPIRE_TIME.get() * 1000 - getActiveTime(); + return PluginConfig.REQUEST.EXPIRE_TIME.getNotNull() * 1000 - getActiveTime(); } public long getRemainSeconds() { @@ -59,7 +59,7 @@ public class TeleportRequest { } public boolean isExpired() { - return getActiveTime() > PluginConfig.EXPIRE_TIME.get() * 1000; + return getActiveTime() > PluginConfig.REQUEST.EXPIRE_TIME.getNotNull() * 1000; } public enum RequestType { diff --git a/src/main/java/cc/carm/plugin/moeteleport/model/WarpInfo.java b/src/main/java/cc/carm/plugin/moeteleport/model/WarpInfo.java index 1bc14ad..21bbe11 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/model/WarpInfo.java +++ b/src/main/java/cc/carm/plugin/moeteleport/model/WarpInfo.java @@ -1,6 +1,6 @@ package cc.carm.plugin.moeteleport.model; -import cc.carm.plugin.moeteleport.configuration.location.DataLocation; +import cc.carm.plugin.moeteleport.conf.location.DataLocation; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.jetbrains.annotations.NotNull; 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 c51739c..dcccc18 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,6 @@ package cc.carm.plugin.moeteleport.storage; -import cc.carm.plugin.moeteleport.configuration.location.DataLocation; +import cc.carm.plugin.moeteleport.conf.location.DataLocation; import cc.carm.plugin.moeteleport.model.WarpInfo; import org.bukkit.Location; import org.jetbrains.annotations.Nullable; 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 00819ba..2ad4253 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/storage/DataStorage.java +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/DataStorage.java @@ -1,8 +1,7 @@ package cc.carm.plugin.moeteleport.storage; -import cc.carm.plugin.moeteleport.configuration.location.DataLocation; +import cc.carm.plugin.moeteleport.conf.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; 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 badba71..af9a03d 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/storage/StorageMethod.java +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/StorageMethod.java @@ -2,6 +2,7 @@ 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.CMIStorage; import cc.carm.plugin.moeteleport.storage.extension.EssentialStorage; import cc.carm.plugin.moeteleport.storage.file.JSONStorage; import cc.carm.plugin.moeteleport.storage.file.YAMLStorage; @@ -18,7 +19,8 @@ public enum StorageMethod { JSON(2, new String[]{}, JSONStorage.class), MYSQL(3, new String[]{"my-sql", "mariadb", "sql", "database"}, MySQLStorage.class), - ESSENTIALS(11, new String[]{"essential", "ess", "EssentialsX", "essX"}, EssentialStorage.class); + ESSENTIALS(11, new String[]{"essential", "ess", "EssentialsX", "essX"}, EssentialStorage.class), + CMI(12, new String[]{}, CMIStorage.class); private final int id; private final String[] alias; diff --git a/src/main/java/cc/carm/plugin/moeteleport/model/UserData.java b/src/main/java/cc/carm/plugin/moeteleport/storage/UserData.java similarity index 95% rename from src/main/java/cc/carm/plugin/moeteleport/model/UserData.java rename to src/main/java/cc/carm/plugin/moeteleport/storage/UserData.java index a11218c..d2d8114 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/model/UserData.java +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/UserData.java @@ -1,7 +1,8 @@ -package cc.carm.plugin.moeteleport.model; +package cc.carm.plugin.moeteleport.storage; import cc.carm.plugin.moeteleport.MoeTeleport; -import cc.carm.plugin.moeteleport.configuration.location.DataLocation; +import cc.carm.plugin.moeteleport.conf.location.DataLocation; +import cc.carm.plugin.moeteleport.model.TeleportRequest; import org.bukkit.Location; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; 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 f8fc4fe..6ff9d27 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 @@ -1,8 +1,8 @@ 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.conf.location.DataLocation; +import cc.carm.plugin.moeteleport.storage.UserData; import cc.carm.plugin.moeteleport.model.WarpInfo; import cc.carm.plugin.moeteleport.storage.DataStorage; import org.jetbrains.annotations.NotNull; 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 deleted file mode 100644 index 3977d6f..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/storage/database/DBConfiguration.java +++ /dev/null @@ -1,37 +0,0 @@ -package cc.carm.plugin.moeteleport.storage.database; - -import cc.carm.lib.easyplugin.configuration.values.ConfigValue; - -public class DBConfiguration { - - protected static final ConfigValue DRIVER_NAME = new ConfigValue<>( - "storage.mysql.driver", String.class, - "com.mysql.cj.jdbc.Driver" - ); - - protected static final ConfigValue HOST = new ConfigValue<>( - "storage.mysql.host", String.class, - "127.0.0.1" - ); - - protected static final ConfigValue PORT = new ConfigValue<>( - "storage.mysql.port", Integer.class, - 3306 - ); - - protected static final ConfigValue DATABASE = new ConfigValue<>( - "storage.mysql.database", String.class, - "minecraft" - ); - - protected static final ConfigValue USERNAME = new ConfigValue<>( - "storage.mysql.username", String.class, - "root" - ); - - protected static final ConfigValue PASSWORD = new ConfigValue<>( - "storage.mysql.password", String.class, - "password" - ); - -} 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 deleted file mode 100644 index 1d38730..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/storage/database/DBTables.java +++ /dev/null @@ -1,73 +0,0 @@ -package cc.carm.plugin.moeteleport.storage.database; - -import cc.carm.lib.easyplugin.configuration.values.ConfigValue; - -public class DBTables { - - protected static class UserLastLocations { - - protected static final ConfigValue TABLE_NAME = new ConfigValue<>( - "storage.mysql.tables.last-location", String.class, - "mt_user_last_locations" - ); - - protected static final String[] TABLE_COLUMNS = new String[]{ - "`uuid` VARCHAR(36) NOT NULL PRIMARY KEY", // 用户的UUID - "`world` VARCHAR(128) NOT NULL",// 最后地址的所在世界 - "`x` DOUBLE NOT NULL",// 最后地址的X坐标 - "`y` DOUBLE NOT NULL",// 最后地址的Y坐标 - "`z` DOUBLE NOT NULL",// 最后地址的Z坐标 - "`yaw` DOUBLE NOT NULL",// 最后地址的Yaw角度 - "`pitch` DOUBLE NOT NULL",// 最后地址的Pitch角度 - "`update` DATETIME NOT NULL " + - "DEFAULT CURRENT_TIMESTAMP " + - "ON UPDATE CURRENT_TIMESTAMP " - }; - - } - - protected static class UserHomes { - - protected static final ConfigValue TABLE_NAME = new ConfigValue<>( - "storage.mysql.tables.home", String.class, - "mt_user_homes" - ); - - protected static final String[] TABLE_COLUMNS = new String[]{ - "`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY", - "`uuid` VARCHAR(36) NOT NULL", // 用户的UUID - "`name` VARCHAR(32) NOT NULL", - "`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", - "INDEX `user`(`uuid`)", - "UNIQUE KEY `home`(`uuid`,`name`)" - }; - - } - - 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/DatabaseConfig.java b/src/main/java/cc/carm/plugin/moeteleport/storage/database/DatabaseConfig.java new file mode 100644 index 0000000..5f5a49d --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/database/DatabaseConfig.java @@ -0,0 +1,41 @@ +package cc.carm.plugin.moeteleport.storage.database; + +import cc.carm.lib.configuration.core.ConfigurationRoot; +import cc.carm.lib.configuration.core.annotation.ConfigPath; +import cc.carm.lib.configuration.core.annotation.HeaderComment; +import cc.carm.lib.configuration.core.value.ConfigValue; +import cc.carm.lib.configuration.core.value.type.ConfiguredValue; + + +@HeaderComment("选择 database (如mysql) 存储方式时的数据库配置") +@ConfigPath("storage.database") +public class DatabaseConfig extends ConfigurationRoot { + + @ConfigPath("driver") + protected static final ConfigValue DRIVER_NAME = ConfiguredValue.of( + String.class, "com.mysql.jdbc.Driver" + ); + + protected static final ConfigValue HOST = ConfiguredValue.of(String.class, "127.0.0.1"); + protected static final ConfigValue PORT = ConfiguredValue.of(Integer.class, 3306); + protected static final ConfigValue DATABASE = ConfiguredValue.of(String.class, "minecraft"); + protected static final ConfigValue USERNAME = ConfiguredValue.of(String.class, "root"); + protected static final ConfigValue PASSWORD = ConfiguredValue.of(String.class, "password"); + protected static final ConfigValue EXTRA = ConfiguredValue.of(String.class, "?useSSL=false"); + + @HeaderComment("插件相关表的名称") + public static final class TABLES extends ConfigurationRoot { + + public static final ConfigValue LAST_LOCATION = ConfiguredValue.of(String.class, "mt_last_locations"); + public static final ConfigValue HOMES = ConfiguredValue.of(String.class, "mt_homes"); + public static final ConfigValue WARPS = ConfiguredValue.of(String.class, "mt_warps"); + + } + + protected static String buildJDBC() { + return String.format("jdbc:mysql://%s:%s/%s%s", + HOST.getNotNull(), PORT.getNotNull(), DATABASE.getNotNull(), EXTRA.getNotNull() + ); + } + +} \ No newline at end of file diff --git a/src/main/java/cc/carm/plugin/moeteleport/storage/database/DatabaseTables.java b/src/main/java/cc/carm/plugin/moeteleport/storage/database/DatabaseTables.java new file mode 100644 index 0000000..aed3639 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/database/DatabaseTables.java @@ -0,0 +1,96 @@ +package cc.carm.plugin.moeteleport.storage.database; + +import cc.carm.lib.configuration.core.value.ConfigValue; +import cc.carm.lib.easysql.api.SQLManager; +import cc.carm.lib.easysql.api.SQLTable; +import cc.carm.lib.easysql.api.builder.TableCreateBuilder; +import cc.carm.lib.easysql.api.enums.IndexType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.sql.SQLException; +import java.util.function.Consumer; + +public enum DatabaseTables implements SQLTable { + + LAST_LOCATION(DatabaseConfig.TABLES.LAST_LOCATION, (table) -> { + table.addColumn("uuid", "CHAR(36) NOT NULL PRIMARY KEY"); // 用户的UUID + + // 坐标世界与位置 + table.addColumn("world", "VARCHAR(128) NOT NULL"); + table.addColumn("x", "DOUBLE NOT NULL"); + table.addColumn("y", "DOUBLE NOT NULL"); + table.addColumn("z", "DOUBLE NOT NULL"); + table.addColumn("yaw", "DOUBLE NOT NULL"); + table.addColumn("pitch", "DOUBLE NOT NULL"); + + table.addColumn("update", + "DATETIME NOT NULL " + + "DEFAULT CURRENT_TIMESTAMP " + + "ON UPDATE CURRENT_TIMESTAMP" + ); + }), + + HOMES(DatabaseConfig.TABLES.HOMES, (table) -> { + table.addAutoIncrementColumn("id", true, true); + table.addColumn("uuid", "CHAR(36) NOT NULL"); + table.addColumn("name", "VARCHAR(32) NOT NULL"); + + // 坐标世界与位置 + table.addColumn("world", "VARCHAR(128) NOT NULL"); + table.addColumn("x", "DOUBLE NOT NULL"); + table.addColumn("y", "DOUBLE NOT NULL"); + table.addColumn("z", "DOUBLE NOT NULL"); + table.addColumn("yaw", "DOUBLE NOT NULL"); + table.addColumn("pitch", "DOUBLE NOT NULL"); + + table.setIndex(IndexType.INDEX, "idx_homes_user", "uuid"); + table.setIndex(IndexType.UNIQUE_KEY, "uk_homes", "uuid", "name"); + }), + + WRAPS(DatabaseConfig.TABLES.WARPS, (table) -> { + + table.addAutoIncrementColumn("id", true, true); + table.addColumn("name", "VARCHAR(32) NOT NULL"); + table.addColumn("owner", "CHAR(36) NOT NULL"); + + // 坐标世界与位置 + table.addColumn("world", "VARCHAR(128) NOT NULL"); + table.addColumn("x", "DOUBLE NOT NULL"); + table.addColumn("y", "DOUBLE NOT NULL"); + table.addColumn("z", "DOUBLE NOT NULL"); + table.addColumn("yaw", "DOUBLE NOT NULL"); + table.addColumn("pitch", "DOUBLE NOT NULL"); + + table.setIndex(IndexType.UNIQUE_KEY, "uk_wraps", "name"); + }); + + private final Consumer builder; + private final ConfigValue name; + private @Nullable SQLManager manager; + + DatabaseTables(ConfigValue name, + Consumer builder) { + this.name = name; + this.builder = builder; + } + + @Override + public @Nullable SQLManager getSQLManager() { + return this.manager; + } + + @Override + public @NotNull String getTableName() { + return this.name.getNotNull(); + } + + @Override + public boolean create(SQLManager sqlManager) throws SQLException { + if (this.manager == null) this.manager = sqlManager; + + TableCreateBuilder tableBuilder = sqlManager.createTable(getTableName()); + if (builder != null) builder.accept(tableBuilder); + return tableBuilder.build().executeFunction(l -> l > 0, false); + } +} \ 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 45b8978..3809efa 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 @@ -4,10 +4,10 @@ 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.conf.location.DataLocation; import cc.carm.plugin.moeteleport.model.WarpInfo; import cc.carm.plugin.moeteleport.storage.DataStorage; +import cc.carm.plugin.moeteleport.storage.UserData; import org.bukkit.Location; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -27,14 +27,15 @@ public class MySQLStorage implements DataStorage { @Override public void initialize() throws Exception { + + Main.info("加载数据库配置..."); + Main.getInstance().getConfigProvider().initialize(DatabaseConfig.class); + try { Main.info(" 尝试连接到数据库..."); - String url = String.format("jdbc:mysql://%s:%s/%s?useSSL=false", - DBConfiguration.HOST.get(), DBConfiguration.PORT.get(), DBConfiguration.DATABASE.get() - ); this.sqlManager = EasySQL.createManager( - DBConfiguration.DRIVER_NAME.get(), url, - DBConfiguration.USERNAME.get(), DBConfiguration.PASSWORD.get() + DatabaseConfig.DRIVER_NAME.getNotNull(), DatabaseConfig.buildJDBC(), + DatabaseConfig.USERNAME.getNotNull(), DatabaseConfig.PASSWORD.getNotNull() ); this.sqlManager.setDebugMode(() -> Main.getInstance().isDebugging()); } catch (Exception exception) { @@ -43,18 +44,9 @@ public class MySQLStorage implements DataStorage { try { Main.info(" 创建插件所需表..."); - getSQLManager().createTable(DBTables.UserLastLocations.TABLE_NAME.get()) - .setColumns(DBTables.UserLastLocations.TABLE_COLUMNS) - .build().execute(); - - getSQLManager().createTable(DBTables.UserHomes.TABLE_NAME.get()) - .setColumns(DBTables.UserHomes.TABLE_COLUMNS) - .build().execute(); - - getSQLManager().createTable(DBTables.Warps.TABLE_NAME.get()) - .setColumns(DBTables.Warps.TABLE_COLUMNS) - .build().execute(); - + for (DatabaseTables value : DatabaseTables.values()) { + value.create(this.sqlManager); + } } catch (SQLException exception) { throw new Exception("无法创建插件所需的表,请检查数据库权限。", exception); } @@ -74,6 +66,10 @@ public class MySQLStorage implements DataStorage { this.sqlManager = null; } + public SQLManager getSQLManager() { + return sqlManager; + } + @Override public @Nullable UserData loadData(@NotNull UUID uuid) throws Exception { LinkedHashMap homes = loadHomes(uuid); @@ -85,7 +81,7 @@ public class MySQLStorage implements DataStorage { public void saveUserData(@NotNull UserData data) throws Exception { Location location = data.getLastLocation(); if (location != null && location.getWorld() != null) { - getSQLManager().createReplace(DBTables.UserLastLocations.TABLE_NAME.get()) + DatabaseTables.LAST_LOCATION.createReplace() .setColumnNames("uuid", "world", "x", "y", "z", "yaw", "pitch") .setParams( data.getUserUUID(), location.getWorld().getName(), @@ -93,7 +89,7 @@ public class MySQLStorage implements DataStorage { location.getYaw(), location.getPitch() ).execute(); } else { - getSQLManager().createDelete(DBTables.UserLastLocations.TABLE_NAME.get()) + DatabaseTables.LAST_LOCATION.createDelete() .addCondition("uuid", data.getUserUUID()).setLimit(1) .build().execute(); } @@ -110,7 +106,7 @@ public class MySQLStorage implements DataStorage { } private @NotNull LinkedHashMap loadHomes(@NotNull UUID uuid) throws Exception { - return getSQLManager().createQuery().inTable(DBTables.UserHomes.TABLE_NAME.get()) + return DatabaseTables.HOMES.createQuery() .addCondition("uuid", uuid).build() .executeFunction((query) -> { LinkedHashMap homes = new LinkedHashMap<>(); @@ -119,38 +115,24 @@ public class MySQLStorage implements DataStorage { while (resultSet.next()) { String name = resultSet.getString("name"); if (name == null) continue; - homes.put(name, new DataLocation( - resultSet.getString("world"), - resultSet.getDouble("x"), - resultSet.getDouble("y"), - resultSet.getDouble("z"), - resultSet.getFloat("yaw"), - resultSet.getFloat("pitch") - )); + homes.put(name, readLocation(resultSet)); } return homes; }, new LinkedHashMap<>()); } private @Nullable DataLocation loadLastLocation(@NotNull UUID uuid) throws Exception { - return getSQLManager().createQuery().inTable(DBTables.UserLastLocations.TABLE_NAME.get()) + return DatabaseTables.LAST_LOCATION.createQuery() .addCondition("uuid", uuid).setLimit(1).build() .executeFunction((query) -> { ResultSet resultSet = query.getResultSet(); if (resultSet == null || !resultSet.next()) return null; - return new DataLocation( - resultSet.getString("world"), - resultSet.getDouble("x"), - resultSet.getDouble("y"), - resultSet.getDouble("z"), - resultSet.getFloat("yaw"), - resultSet.getFloat("pitch") - ); + return readLocation(resultSet); }); } private @NotNull Map loadWarps() throws Exception { - return getSQLManager().createQuery().inTable(DBTables.Warps.TABLE_NAME.get()) + return DatabaseTables.WRAPS.createQuery() .orderBy("id", true).build().executeFunction((query) -> { LinkedHashMap warps = new LinkedHashMap<>(); ResultSet resultSet = query.getResultSet(); @@ -159,14 +141,7 @@ public class MySQLStorage implements DataStorage { 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") - ); + DataLocation location = readLocation(resultSet); warps.put(name, new WarpInfo(name, uuid, location)); } return warps; @@ -175,7 +150,7 @@ public class MySQLStorage implements DataStorage { @Override public void setHome(@NotNull UUID uuid, @NotNull String homeName, @NotNull DataLocation location) throws Exception { - getSQLManager().createReplace(DBTables.UserHomes.TABLE_NAME.get()) + DatabaseTables.HOMES.createReplace() .setColumnNames("uuid", "name", "world", "x", "y", "z", "yaw", "pitch") .setParams( uuid, homeName, location.getWorldName(), @@ -187,7 +162,7 @@ public class MySQLStorage implements DataStorage { @Override public boolean delHome(@NotNull UUID uuid, @NotNull String homeName) throws Exception { - return getSQLManager().createDelete(DBTables.UserHomes.TABLE_NAME.get()) + return DatabaseTables.HOMES.createDelete() .addCondition("uuid", uuid) .addCondition("name", homeName) .setLimit(1) @@ -198,7 +173,7 @@ public class MySQLStorage implements DataStorage { 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()) + DatabaseTables.WRAPS.createReplace() .setColumnNames("name", "owner", "world", "x", "y", "z", "yaw", "pitch") .setParams( name, warpInfo.getOwner(), location.getWorldName(), @@ -213,13 +188,20 @@ public class MySQLStorage implements DataStorage { if (actualName == null) return false; this.warpsMap.remove(actualName); - return getSQLManager().createDelete(DBTables.Warps.TABLE_NAME.get()) + return DatabaseTables.WRAPS.createDelete() .addCondition("name", actualName).setLimit(1) .build().executeFunction((i) -> i > 0, false); } - public SQLManager getSQLManager() { - return sqlManager; + protected DataLocation readLocation(ResultSet result) throws SQLException { + return new DataLocation( + result.getString("world"), + result.getDouble("x"), + result.getDouble("y"), + result.getDouble("z"), + result.getFloat("yaw"), + result.getFloat("pitch") + ); } diff --git a/src/main/java/cc/carm/plugin/moeteleport/storage/extension/CMIStorage.java b/src/main/java/cc/carm/plugin/moeteleport/storage/extension/CMIStorage.java new file mode 100644 index 0000000..3567194 --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/extension/CMIStorage.java @@ -0,0 +1,124 @@ +package cc.carm.plugin.moeteleport.storage.extension; + +import cc.carm.plugin.moeteleport.conf.location.DataLocation; +import cc.carm.plugin.moeteleport.model.WarpInfo; +import cc.carm.plugin.moeteleport.storage.UserData; +import cc.carm.plugin.moeteleport.storage.impl.PluginBasedStorage; +import com.Zrips.CMI.CMI; +import com.Zrips.CMI.Containers.CMIUser; +import com.Zrips.CMI.Modules.Homes.CmiHome; +import com.Zrips.CMI.Modules.Warps.CmiWarp; +import com.Zrips.CMI.Modules.Warps.WarpManager; +import net.Zrips.CMILib.Container.CMILocation; +import org.bukkit.Location; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.UUID; + +public class CMIStorage extends PluginBasedStorage { + + public CMIStorage() { + super("CMI"); + } + + @Override + public @Nullable UserData loadData(@NotNull UUID uuid) { + return new CMIUserData(uuid); + } + + @Override + public Map getWarps() { + Map warps = new LinkedHashMap<>(); + + cmi().getWarps().forEach((name, warp) -> warps.put(name, new WarpInfo(name, warp.getCreator(), convert(warp.getLoc())))); + + return warps; + } + + @Override + public void setWarp(@NotNull String name, @NotNull WarpInfo warpInfo) throws Exception { + CmiWarp warp = new CmiWarp(name); + + warp.setLoc(convert(warpInfo.getLocation())); + warp.setCreator(warpInfo.getOwner()); + + cmi().addWarp(warp); + } + + @Override + public boolean delWarp(@NotNull String name) throws Exception { + CmiWarp warp = cmi().getWarp(name); + if (warp == null) return false; + cmi().remove(warp); + return true; + } + + @Override + public boolean hasWarp(@NotNull String name) { + return cmi().getWarp(name) != null; + } + + protected WarpManager cmi() { + return CMI.getInstance().getWarpManager(); + } + + public static DataLocation convert(CMILocation loc) { + return new DataLocation(loc.getWorldName(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); + } + + public static CMILocation convert(DataLocation loc) { + return new CMILocation(loc.getWorldName(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); + } + + public static class CMIUserData extends UserData { + + CMIUser cmiUser; + + public CMIUserData(@NotNull UUID userUUID) { + super(userUUID); + this.cmiUser = CMI.getInstance().getPlayerManager().getUser(userUUID); + } + + public CMIUser getCMIUser() { + return cmiUser; + } + + @Override + public LinkedHashMap getHomeLocations() { + LinkedHashMap homes = new LinkedHashMap<>(); + getCMIUser().getHomes().forEach((name, home) -> { + homes.put(name, convert(home.getLoc())); + }); + return homes; + } + + @Override + public void setHomeLocation(String homeName, Location location) { + getCMIUser().addHome(new CmiHome(homeName, new CMILocation(location)), true); + } + + @Override + public void delHomeLocation(String homeName) { + try { + getCMIUser().removeHome(homeName); + } catch (Exception ignored) { + } + } + + @Override + public @Nullable Location getLastLocation() { + return getCMIUser().getLastTeleportLocation(); + } + + @Override + public void setLastLocation(@Nullable Location lastLocation) { + getCMIUser().setLastTeleportLocation(lastLocation); + } + + } + + +} diff --git a/src/main/java/cc/carm/plugin/moeteleport/storage/extension/EssentialStorage.java b/src/main/java/cc/carm/plugin/moeteleport/storage/extension/EssentialStorage.java index a957a7b..6c55c87 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/storage/extension/EssentialStorage.java +++ b/src/main/java/cc/carm/plugin/moeteleport/storage/extension/EssentialStorage.java @@ -1,7 +1,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.conf.location.DataLocation; +import cc.carm.plugin.moeteleport.storage.UserData; import cc.carm.plugin.moeteleport.model.WarpInfo; import cc.carm.plugin.moeteleport.storage.impl.PluginBasedStorage; import com.earth2me.essentials.Essentials; 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 7bfe4c2..370d963 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 @@ -2,8 +2,8 @@ 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.conf.location.DataLocation; +import cc.carm.plugin.moeteleport.storage.UserData; import cc.carm.plugin.moeteleport.model.WarpInfo; import cc.carm.plugin.moeteleport.storage.DataSerializer; import cc.carm.plugin.moeteleport.storage.impl.FileBasedStorage; 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 56ab5bc..40f37b8 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 @@ -1,8 +1,8 @@ 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.conf.location.DataLocation; +import cc.carm.plugin.moeteleport.storage.UserData; import cc.carm.plugin.moeteleport.model.WarpInfo; import cc.carm.plugin.moeteleport.storage.DataSerializer; import cc.carm.plugin.moeteleport.storage.impl.FileBasedStorage; 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 f9e9b0f..cfcb508 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.lib.configuration.core.value.ConfigValue; +import cc.carm.lib.configuration.core.value.type.ConfiguredValue; import cc.carm.plugin.moeteleport.Main; -import cc.carm.plugin.moeteleport.configuration.location.DataLocation; +import cc.carm.plugin.moeteleport.conf.location.DataLocation; import cc.carm.plugin.moeteleport.model.WarpInfo; import cc.carm.plugin.moeteleport.storage.DataStorage; import org.jetbrains.annotations.NotNull; @@ -13,15 +14,25 @@ import java.util.UUID; public abstract class FileBasedStorage implements DataStorage { - private static final ConfigValue FILE_PATH = new ConfigValue<>( - "storage.file-path", String.class, "data" - ); + protected static final ConfigValue FILE_PATH = ConfiguredValue.builder(String.class) + .fromString().defaults("data") + .headerComments( + "选择 yaml/json 存储方式时的存储路径", + "默认为相对路径,相对于插件生成的配置文件夹下的路径", + "支持绝对路径,如 “/var/data/moe-teleport/\"(linux) 或 \"D:\\data\\moe-teleport\\\"(windows)", + "使用绝对路径时请注意权限问题" + ).build(); protected @Nullable File dataFolder; @Override public void initialize() throws Exception { - this.dataFolder = new File(Main.getInstance().getDataFolder(), FILE_PATH.get()); + FILE_PATH.initialize( + Main.getInstance().getConfigProvider(), true, + "storage.file", null, null + ); + + this.dataFolder = new File(Main.getInstance().getDataFolder(), FILE_PATH.getNotNull()); if (!dataFolder.exists()) { if (!dataFolder.mkdir()) { throw new Exception("无法创建数据文件夹!"); 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 efc98fc..b5bb30f 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 @@ -1,7 +1,7 @@ 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.conf.location.DataLocation; +import cc.carm.plugin.moeteleport.storage.UserData; import cc.carm.plugin.moeteleport.model.WarpInfo; import cc.carm.plugin.moeteleport.storage.DataStorage; import org.bukkit.Bukkit; diff --git a/src/main/java/cc/carm/plugin/moeteleport/util/ColorParser.java b/src/main/java/cc/carm/plugin/moeteleport/util/ColorParser.java deleted file mode 100644 index 8a35afb..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/util/ColorParser.java +++ /dev/null @@ -1,31 +0,0 @@ -package cc.carm.plugin.moeteleport.util; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class ColorParser { - - public static String parse(String text) { - return parseColor(parseHexColor(text)); - } - - public static String parseColor(final String text) { - return text.replaceAll("&", "§").replace("§§", "&"); - } - - public static String parseHexColor(String text) { - Pattern pattern = Pattern.compile("&\\((&?#[0-9a-fA-F]{6})\\)"); - Matcher matcher = pattern.matcher(text); - while (matcher.find()) { - String hexColor = text.substring(matcher.start() + 2, matcher.end() - 1); - hexColor = hexColor.replace("&", ""); - StringBuilder bukkitColorCode = new StringBuilder('§' + "x"); - for (int i = 1; i < hexColor.length(); i++) { - bukkitColorCode.append('§').append(hexColor.charAt(i)); - } - text = text.replaceAll("&\\(" + hexColor + "\\)", bukkitColorCode.toString().toLowerCase()); - matcher.reset(text); - } - return text; - } -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/util/JarResourceUtils.java b/src/main/java/cc/carm/plugin/moeteleport/util/JarResourceUtils.java deleted file mode 100644 index bfc118e..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/util/JarResourceUtils.java +++ /dev/null @@ -1,105 +0,0 @@ -package cc.carm.plugin.moeteleport.util; - -import org.jetbrains.annotations.Nullable; - -import java.io.*; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.List; -import java.util.Scanner; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -@SuppressWarnings("ResultOfMethodCallIgnored") -public class JarResourceUtils { - public static final char JAR_SEPARATOR = '/'; - - public static @Nullable String[] readResource(@Nullable InputStream resourceStream) { - if (resourceStream == null) return null; - try (Scanner scanner = new Scanner(resourceStream, "UTF-8")) { - List contents = new ArrayList<>(); - while (scanner.hasNextLine()) { - contents.add(scanner.nextLine()); - } - return contents.toArray(new String[0]); - } catch (Exception e) { - return null; - } - } - - public static void copyFolderFromJar(String folderName, File destFolder, CopyOption option) - throws IOException { - copyFolderFromJar(folderName, destFolder, option, null); - } - - public static void copyFolderFromJar(String folderName, File destFolder, - CopyOption option, PathTrimmer trimmer) throws IOException { - if (!destFolder.exists()) - destFolder.mkdirs(); - - byte[] buffer = new byte[1024]; - - File fullPath; - String path = JarResourceUtils.class.getProtectionDomain().getCodeSource().getLocation().getPath(); - if (trimmer != null) - path = trimmer.trim(path); - try { - if (!path.startsWith("file")) - path = "file://" + path; - - fullPath = new File(new URI(path)); - } catch (URISyntaxException e) { - e.printStackTrace(); - return; - } - - ZipInputStream zis = new ZipInputStream(new FileInputStream(fullPath)); - - ZipEntry entry; - while ((entry = zis.getNextEntry()) != null) { - if (!entry.getName().startsWith(folderName + JAR_SEPARATOR)) - continue; - - String fileName = entry.getName(); - - if (fileName.charAt(fileName.length() - 1) == JAR_SEPARATOR) { - File file = new File(destFolder + File.separator + fileName); - if (file.isFile()) { - file.delete(); - } - file.mkdirs(); - continue; - } - - File file = new File(destFolder + File.separator + fileName); - if (option == CopyOption.COPY_IF_NOT_EXIST && file.exists()) - continue; - - if (!file.getParentFile().exists()) - file.getParentFile().mkdirs(); - - if (!file.exists()) - file.createNewFile(); - FileOutputStream fos = new FileOutputStream(file); - - int len; - while ((len = zis.read(buffer)) > 0) { - fos.write(buffer, 0, len); - } - fos.close(); - } - - zis.closeEntry(); - zis.close(); - } - - public enum CopyOption { - COPY_IF_NOT_EXIST, REPLACE_IF_EXIST - } - - @FunctionalInterface - public interface PathTrimmer { - String trim(String original); - } -} \ No newline at end of file diff --git a/src/main/java/cc/carm/plugin/moeteleport/util/MessageUtil.java b/src/main/java/cc/carm/plugin/moeteleport/util/MessageUtil.java deleted file mode 100644 index ba5a6a2..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/util/MessageUtil.java +++ /dev/null @@ -1,77 +0,0 @@ -package cc.carm.plugin.moeteleport.util; - -import de.themoep.minedown.MineDown; -import me.clip.placeholderapi.PlaceholderAPI; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.Nullable; - -import java.util.*; - -public class MessageUtil { - - public static boolean hasPlaceholderAPI() { - return Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null; - } - - public static void send(@Nullable CommandSender sender, List messages) { - if (messages == null || messages.isEmpty() || sender == null) return; - for (String s : messages) { - sender.spigot().sendMessage(MineDown.parse(s)); - } - } - - public static void send(@Nullable CommandSender sender, String... messages) { - send(sender, Arrays.asList(messages)); - } - - public static void sendWithPlaceholders(CommandSender sender, String... messages) { - sendWithPlaceholders(sender, Arrays.asList(messages)); - } - - public static void sendWithPlaceholders(@Nullable CommandSender sender, List messages) { - if (messages == null || messages.isEmpty() || sender == null) return; - if (hasPlaceholderAPI() && sender instanceof Player) { - send(sender, PlaceholderAPI.setPlaceholders((Player) sender, messages)); - } else { - send(sender, messages); - } - } - - public static void sendWithPlaceholders(@Nullable CommandSender sender, List messages, String param, Object value) { - sendWithPlaceholders(sender, messages, new String[]{param}, new Object[]{value}); - } - - public static void sendWithPlaceholders(@Nullable CommandSender sender, List messages, String[] params, Object[] values) { - sendWithPlaceholders(sender, setCustomParams(messages, params, values)); - } - - public static List setCustomParams(List messages, String param, Object value) { - return setCustomParams(messages, new String[]{param}, new Object[]{value}); - } - - public static List setCustomParams(List messages, String[] params, Object[] values) { - if (params.length != values.length) return messages; - HashMap paramsMap = new HashMap<>(); - for (int i = 0; i < params.length; i++) { - paramsMap.put(params[i], values[i]); - } - return setCustomParams(messages, paramsMap); - } - - - public static List setCustomParams(List messages, HashMap params) { - List list = new ArrayList<>(); - for (String message : messages) { - String afterMessage = message; - for (Map.Entry entry : params.entrySet()) { - afterMessage = afterMessage.replace(entry.getKey(), entry.getValue().toString()); - } - list.add(afterMessage); - } - return list; - } - - -} diff --git a/src/main/java/cc/carm/plugin/moeteleport/util/UpdateChecker.java b/src/main/java/cc/carm/plugin/moeteleport/util/UpdateChecker.java deleted file mode 100644 index 1634a38..0000000 --- a/src/main/java/cc/carm/plugin/moeteleport/util/UpdateChecker.java +++ /dev/null @@ -1,37 +0,0 @@ -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.severe("检查更新失败,请您定期查看插件是否更新,避免安全问题。"); - Main.severe("下载地址 " + downloadURL); - } else if (behindVersions == 0) { - Main.info("检查完成,当前已是最新版本。"); - } else if (behindVersions > 0) { - Main.info("发现新版本! 目前已落后 " + behindVersions + " 个版本。"); - Main.info("最新版下载地址 " + downloadURL); - } else { - Main.severe("检查更新失败! 当前版本未知,请您使用原生版本以避免安全问题。"); - Main.severe("最新版下载地址 " + downloadURL); - } - - }); - } - - -} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml deleted file mode 100644 index c69ac66..0000000 --- a/src/main/resources/config.yml +++ /dev/null @@ -1,69 +0,0 @@ -# ${project.name} - ${project.description} -# 项目地址: ${project.url} -# 下载地址: ${project.distributionManagement.downloadUrl} -version: ${project.version} -debug: false - -# 统计数据设定 -# 该选项用于帮助开发者统计插件版本与使用情况,且绝不会影响性能与使用体验。 -# 当然,您也可以选择在这里关闭,或在plugins/bStats下的配置文件中关闭。 -metrics: true - -# 检查更新设定 -# 该选项用于插件判断是否要检查更新,若您不希望插件检查更新并提示您,可以选择关闭。 -# 检查更新为异步操作,绝不会影响性能与使用体验。 -check-update: true - -# 存储相关配置 -# 注意:存储配置不会通过重载指令生效,如有修改请重新启动服务器。 -storage: - - # 存储方式,可选 [ yaml | json | mysql | Essential(须安装ess插件) ] - method: yaml - - # 选择 yaml/json 存储方式时的存储路径 - # 默认为相对路径,相对于插件生成的配置文件夹下的路径 - # 支持绝对路径,如 “/var/data/moe-teleport/"(linux) 或 "D:\data\moe-teleport\"(windows) - # 使用绝对路径时请注意权限问题 - file-path: data - - # 选择 database 存储方式时的数据库配置 - mysql: - # 数据库驱动路径 - driver: "com.mysql.cj.jdbc.Driver" - # 数据库连接配置 - host: "127.0.0.1" - port: 3306 - database: "minecraft" - username: "username" - password: "password" - # 插件相关表的名称 - tables: - last-location: "mt_last_locations" - home: "mt_homes" - warps: "mt_warps" - - -defaults: - # 默认玩家可设置多少家 - home: 1 - # 默认玩家可设置多少地标 - warp: 0 - -permissions: - home: - 10: "MoeTeleport.home.vip" # 拥有该权限的玩家最多可以设置10个家 - warp: - 2: "MoeTeleport.home.vip" # 拥有该权限的玩家最多可以设置2个地标 - -# 传送请求过期时间 -expireTime: 30 - -# 返回死亡点 -# 开启后将允许玩家输入 /back 返回死亡地点。 -death-back: true - -# 危险的方块类型,将判断目的地脚下的方块的类型是否在这个列表中 -dangerous-blocks: - - LAVA - - AIR diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml deleted file mode 100644 index df6cecf..0000000 --- a/src/main/resources/messages.yml +++ /dev/null @@ -1,4 +0,0 @@ -# ${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 48bf95d..6783ff9 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -10,6 +10,7 @@ api-version: 1.13 softdepend: - PlaceholderAPI - Essentials + - CMI permissions: "MoeTeleport":