diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index f4939d1..8f387bc 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -35,7 +35,7 @@ jobs:
run: |
mkdir artifacts
cp -vrf target/ artifacts/target/
- cp -vrf asset/*.jar artifacts
+ cp -vrf .asset/*.jar artifacts
- name: "Upload artifact"
uses: actions/upload-artifact@v2
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 570de62..f4fd7ea 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -37,5 +37,5 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ github.event.release.upload_url }}
- asset_path: asset/*.jar
+ asset_path: .asset/*.jar
asset_content_type: application/java-archive
\ No newline at end of file
diff --git a/README.md b/README.md
index ca2dd4c..4b08172 100644
--- a/README.md
+++ b/README.md
@@ -14,17 +14,19 @@
脚本物品插件,给予玩家可执行对应操作的物品,基于EasyPlugin实现。
+本插件由 [ArtStyle(艺式)](https://artstyle.wiki/)、[猫窝](https://maowo.moe) 提供开发资助。
+
## 插件功能与优势
> 加 * 的功能仍在开发中。
- 物品操作绑定,给予玩家可执行对应操作设置的物品,支持PlaceholderAPI变量。
- - 目前支持的操作有:
- - 控制台执行命令
- - 玩家聊天消息 (加/前缀即为以玩家身份执行命令)
- - 为玩家播放音效
- - 给玩家发送消息 (支持RGB颜色,格式为 `&(#颜色代码)` )
- - 拿取对应物品 (若不配置则物品保留可继续使用)
+ - 目前支持的操作有:
+ - 控制台执行命令
+ - 玩家聊天消息 (加/前缀即为以玩家身份执行命令)
+ - 为玩家播放音效
+ - 给玩家发送消息 (支持RGB颜色,格式为 `&(#颜色代码)` )
+ - 拿取对应物品 (若不配置则物品保留可继续使用)
- **允许限定。** 允许给物品对应的指令组设定“总共可执行次数*”、“每日执行次数*”与“允许使用时间”限定。
- **\*详细记录。** 每个物品均有独立ID,并对使用的玩家与执行结果进行详细记录,便于追踪查询。
- **异步存取。** 数据读取与存储均为异步操作,不影响服务器性能。
@@ -33,7 +35,8 @@
## 插件依赖
-- **[必须]** 插件本体基于 [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/)
+ 实现。
- **[自带]** 插件功能基于 [EasyPlugin](https://github.com/CarmJos/EasyPlugin) 实现。
- **[自带]** 数据功能基于 [EasySQL](https://github.com/CarmJos/EasySQL) 实现。
- **[推荐]** 消息变量基于 [PlaceholderAPI](https://www.spigotmc.org/resources/6245/) 实现。
@@ -46,7 +49,7 @@
详见源文件。
-### 消息配置文件 ([messages.yml](src/main/java/cc/carm/plugin/scriptitems/configuration/PluginMessages.java))
+### 消息配置文件 ([messages.yml](src/main/java/cc/carm/plugin/scriptitems/conf/PluginMessages.java))
详见代码源文件,将在首次启动时生成配置。
@@ -100,9 +103,11 @@
> #### 可以用来盈利
> 你可以在分发软件的时候收费,但你必须在收费前向你的客户提供该软件的 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/pom.xml b/pom.xml
index e085edf..7683a30 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,16 +5,20 @@
4.0.0
- 8
- ${java.version}
- ${java.version}
- 1.3.9
- 0.3.8
+ 8
+ ${project.jdk.version}
+ ${project.jdk.version}
+ UTF-8
+ UTF-8
+
+ 1.4.18
+ 0.4.6
+ 2.3.0
cc.carm.plugin
scriptitems
- 1.0.0
+ 1.1.0
ScriptItems
物品操作绑定插件,给予玩家可执行对应操作的物品,基于EasyPlugin实现。
@@ -74,7 +78,7 @@
cc.carm.lib
easysql-beecp
- ${easysql.version}
+ ${deps.easysql.version}
compile
true
@@ -82,23 +86,31 @@
cc.carm.lib
easyplugin-main
- ${easyplugin.version}
+ ${deps.easyplugin.version}
compile
true
cc.carm.lib
- easyplugin-configuration
- ${easyplugin.version}
+ easyplugin-command
+ ${deps.easyplugin.version}
compile
true
cc.carm.lib
- githubreleases4j
- 1.3.1
+ easyplugin-githubchecker
+ ${deps.easyplugin.version}
+ compile
+ true
+
+
+
+ cc.carm.lib
+ mineconfiguration-bukkit
+ ${deps.mineconfig.version}
compile
true
@@ -118,13 +130,6 @@
provided
-
- org.spigotmc
- spigot
- 1.13.2-R0.1-SNAPSHOT
- provided
-
-
me.clip
placeholderapi
@@ -159,7 +164,7 @@
- ${project.basedir}/asset/
+ ${project.basedir}/.asset/
true
**/*
@@ -188,8 +193,8 @@
maven-compiler-plugin
3.8.1
-
- ${java.version}
+
+ ${project.jdk.version}
UTF-8
-parameters
@@ -229,8 +234,7 @@
${project.name}-${project.version}
- ${project.basedir}/asset
- true
+ ${project.basedir}/.asset
cc.carm.lib
diff --git a/src/main/java/cc/carm/plugin/scriptitems/Main.java b/src/main/java/cc/carm/plugin/scriptitems/Main.java
index 42a7def..4acc515 100644
--- a/src/main/java/cc/carm/plugin/scriptitems/Main.java
+++ b/src/main/java/cc/carm/plugin/scriptitems/Main.java
@@ -1,65 +1,59 @@
package cc.carm.plugin.scriptitems;
+import cc.carm.lib.configuration.core.source.ConfigurationProvider;
import cc.carm.lib.easyplugin.EasyPlugin;
-import cc.carm.lib.easyplugin.i18n.EasyPluginMessageProvider;
-import cc.carm.plugin.scriptitems.command.ScriptItemsCommand;
-import cc.carm.plugin.scriptitems.configuration.PluginConfig;
-import cc.carm.plugin.scriptitems.hooker.GHUpdateChecker;
+import cc.carm.lib.easyplugin.updatechecker.GHUpdateChecker;
+import cc.carm.lib.mineconfiguration.bukkit.MineConfiguration;
+import cc.carm.plugin.scriptitems.command.MainCommand;
+import cc.carm.plugin.scriptitems.conf.PluginConfig;
+import cc.carm.plugin.scriptitems.conf.PluginMessages;
import cc.carm.plugin.scriptitems.listener.ItemListener;
-import cc.carm.plugin.scriptitems.manager.ConfigManager;
import cc.carm.plugin.scriptitems.manager.ItemsManager;
-import cc.carm.plugin.scriptitems.util.JarResourceUtils;
import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit;
-import java.util.Optional;
-
public class Main extends EasyPlugin {
private static Main instance;
public Main() {
- super(new EasyPluginMessageProvider.zh_CN());
instance = this;
}
- public static Main getInstance() {
- return instance;
- }
+ protected ConfigurationProvider> configProvider;
+ protected ConfigurationProvider> messageProvider;
- protected ConfigManager configManager;
protected ItemsManager itemsManager;
@Override
protected boolean initialize() {
- info("加载配置文件...");
- this.configManager = new ConfigManager(this);
- 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("加载物品配置...");
this.itemsManager = new ItemsManager();
this.itemsManager.initialize();
info("注册指令...");
- registerCommand("ScriptItems", new ScriptItemsCommand());
+ registerCommand("ScriptItems", new MainCommand(this));
info("注册监听器...");
- regListener(new ItemListener());
+ registerListener(new ItemListener());
- if (PluginConfig.METRICS.get()) {
+ if (PluginConfig.METRICS.getNotNull()) {
info("启用统计数据...");
new Metrics(this, 14615);
}
- if (PluginConfig.CHECK_UPDATE.get()) {
+ if (PluginConfig.CHECK_UPDATE.getNotNull()) {
log("开始检查更新...");
- GHUpdateChecker checker = new GHUpdateChecker(getLogger(), "CarmJos", "CommandItem");
- getScheduler().runAsync(() -> checker.checkUpdate(getDescription().getVersion()));
+ getScheduler().runAsync(GHUpdateChecker.runner(this));
} else {
log("已禁用检查更新,跳过。");
}
@@ -77,12 +71,11 @@ public class Main extends EasyPlugin {
@Override
public boolean isDebugging() {
- return PluginConfig.DEBUG.get();
+ return PluginConfig.DEBUG.getNotNull();
}
- @Override
- public void outputInfo() {
- Optional.ofNullable(JarResourceUtils.readResource(this.getResource("PLUGIN_INFO"))).ifPresent(this::log);
+ public static Main getInstance() {
+ return instance;
}
public static void info(String... messages) {
@@ -96,4 +89,12 @@ public class Main extends EasyPlugin {
public static void debugging(String... messages) {
getInstance().debug(messages);
}
+
+ public ConfigurationProvider> getConfigProvider() {
+ return configProvider;
+ }
+
+ public ConfigurationProvider> getMessageProvider() {
+ return messageProvider;
+ }
}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/ScriptItemsAPI.java b/src/main/java/cc/carm/plugin/scriptitems/ScriptItemsAPI.java
index ec500d4..ba31117 100644
--- a/src/main/java/cc/carm/plugin/scriptitems/ScriptItemsAPI.java
+++ b/src/main/java/cc/carm/plugin/scriptitems/ScriptItemsAPI.java
@@ -1,6 +1,5 @@
package cc.carm.plugin.scriptitems;
-import cc.carm.plugin.scriptitems.manager.ConfigManager;
import cc.carm.plugin.scriptitems.manager.ItemsManager;
import org.bukkit.Material;
import org.bukkit.entity.Player;
@@ -13,10 +12,6 @@ public class ScriptItemsAPI {
return Main.getInstance().itemsManager;
}
- public static ConfigManager getConfigManager() {
- return Main.getInstance().configManager;
- }
-
public static boolean hasEmptySlot(Player player) {
return IntStream.range(0, 36)
.mapToObj(i -> player.getInventory().getItem(i))
diff --git a/src/main/java/cc/carm/plugin/scriptitems/command/MainCommand.java b/src/main/java/cc/carm/plugin/scriptitems/command/MainCommand.java
new file mode 100644
index 0000000..9b8831b
--- /dev/null
+++ b/src/main/java/cc/carm/plugin/scriptitems/command/MainCommand.java
@@ -0,0 +1,43 @@
+package cc.carm.plugin.scriptitems.command;
+
+import cc.carm.lib.easyplugin.command.CommandHandler;
+import cc.carm.plugin.scriptitems.command.sub.ApplyCommand;
+import cc.carm.plugin.scriptitems.command.sub.GetCommand;
+import cc.carm.plugin.scriptitems.command.sub.GiveCommand;
+import cc.carm.plugin.scriptitems.command.sub.ReloadCommand;
+import cc.carm.plugin.scriptitems.conf.PluginMessages;
+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);
+ registerSubCommand(new ReloadCommand(this, "reload"));
+ registerSubCommand(new ApplyCommand(this, "apply"));
+ registerSubCommand(new GetCommand(this, "get"));
+ registerSubCommand(new GiveCommand(this, "give"));
+ }
+
+ @Override
+ public Void noArgs(CommandSender sender) {
+ PluginMessages.USAGE.send(sender);
+ return null;
+ }
+
+ @Override
+ public Void noPermission(CommandSender sender) {
+ PluginMessages.NO_PERMISSION.send(sender);
+ return null;
+ }
+
+ @Override
+ public boolean hasPermission(CommandSender sender) {
+ return sender.hasPermission("ScriptItems.admin");
+ }
+
+ public Void onlyPlay(CommandSender sender) {
+ PluginMessages.ONLY_PLAYER.send(sender);
+ return null;
+ }
+}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/command/ScriptItemsCommand.java b/src/main/java/cc/carm/plugin/scriptitems/command/ScriptItemsCommand.java
deleted file mode 100644
index 7020444..0000000
--- a/src/main/java/cc/carm/plugin/scriptitems/command/ScriptItemsCommand.java
+++ /dev/null
@@ -1,166 +0,0 @@
-package cc.carm.plugin.scriptitems.command;
-
-import cc.carm.plugin.scriptitems.ScriptItemsAPI;
-import cc.carm.plugin.scriptitems.configuration.PluginMessages;
-import cc.carm.plugin.scriptitems.item.ScriptConfiguration;
-import org.bukkit.Bukkit;
-import org.bukkit.Material;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandExecutor;
-import org.bukkit.command.CommandSender;
-import org.bukkit.command.TabCompleter;
-import org.bukkit.entity.HumanEntity;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.util.StringUtil;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.stream.Collectors;
-
-
-public class ScriptItemsCommand implements CommandExecutor, TabCompleter {
-
-
- @Override
- public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command,
- @NotNull String alias, @NotNull String[] args) {
- if (args.length >= 1) {
- String aim = args[0];
- if (aim.equalsIgnoreCase("reload")) {
- try {
- ScriptItemsAPI.getConfigManager().reload();
- sender.sendMessage("配置文件重载完成!");
- } catch (Exception e) {
- sender.sendMessage("配置文件重载失败!");
- e.printStackTrace();
- }
- return true;
- } else if (aim.equalsIgnoreCase("apply")) {
- if (args.length < 2) {
- PluginMessages.USAGE.send(sender);
- return true;
- }
-
- if (!(sender instanceof Player)) {
- PluginMessages.ONLY_PLAYER.send(sender);
- return true;
- }
-
- ScriptConfiguration settings = ScriptItemsAPI.getItemsManager().getItemSettings(args[1]);
- if (settings == null) {
- PluginMessages.NOT_EXISTS.send(sender, args[1]);
- return true;
- }
-
- Player player = (Player) sender;
- ItemStack item = player.getInventory().getItemInMainHand();
- if (item.getType() == Material.AIR) {
- PluginMessages.USE_ITEM.send(sender);
- return true;
- }
-
- ItemStack after = settings.applyItem(item.clone());
- player.getInventory().setItemInMainHand(after);
- PluginMessages.APPLIED.send(sender, item.getType().name(), settings.getName());
-
- return true;
- } else if (aim.equalsIgnoreCase("give")) {
-
- if (args.length < 3) {
- PluginMessages.USAGE.send(sender);
- return true;
- }
-
- Player player = Bukkit.getPlayer(args[1]);
-
- if (player == null) {
- PluginMessages.NOT_ONLINE.send(sender, args[1]);
- return true;
- }
-
- ScriptConfiguration settings = ScriptItemsAPI.getItemsManager().getItemSettings(args[2]);
- if (settings == null) {
- PluginMessages.NOT_EXISTS.send(sender, args[2]);
- return true;
- }
-
- int amount = 1;
- if (args.length >= 4) {
- try {
- amount = Integer.parseInt(args[3]);
- } catch (Exception ignored) {
- amount = -1;
- }
- }
- if (amount < 1) {
- PluginMessages.WRONG_AMOUNT.send(sender);
- return true;
- }
-
- ItemStack item = settings.generateItem(amount);
- if (item == null) {
- PluginMessages.WRONG_ITEM.send(sender);
- return true;
- }
-
- HashMap remain = player.getInventory().addItem(item);
- if (remain.isEmpty()) {
- PluginMessages.GIVEN_ALL.send(sender, player.getName(), amount, settings.getName());
- } else {
- int remainAmount = remain.values().stream().mapToInt(ItemStack::getAmount).sum();
- PluginMessages.GIVEN_SOME.send(sender, player.getName(), amount - remainAmount, settings.getName(), remainAmount);
- }
-
- return true;
- } else {
- PluginMessages.USAGE.send(sender);
- return true;
- }
- } else {
- PluginMessages.USAGE.send(sender);
- return true;
- }
- }
-
-
- @Nullable
- @Override
- public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command,
- @NotNull String alias, @NotNull String[] args) {
- List allCompletes = new ArrayList<>();
- switch (args.length) {
- case 1: {
- allCompletes.add("help");
- allCompletes.add("give");
- if (sender instanceof Player) allCompletes.add("apply");
- allCompletes.add("reload");
- break;
- }
- case 2: {
- String aim = args[0];
- if (aim.equalsIgnoreCase("give")) {
- allCompletes = Bukkit.getOnlinePlayers().stream().map(HumanEntity::getName).collect(Collectors.toList());
- } else if (aim.equalsIgnoreCase("apply")) {
- allCompletes = new ArrayList<>(ScriptItemsAPI.getItemsManager().listItemSettings().keySet());
- }
- break;
- }
- case 3: {
- String aim = args[0];
- if (aim.equalsIgnoreCase("give")) {
- allCompletes = new ArrayList<>(ScriptItemsAPI.getItemsManager().listItemSettings().keySet());
- }
- break;
- }
- }
-
- return allCompletes.stream()
- .filter(s -> StringUtil.startsWithIgnoreCase(s, args[args.length - 1]))
- .limit(10).collect(Collectors.toList());
- }
-
-}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/command/sub/ApplyCommand.java b/src/main/java/cc/carm/plugin/scriptitems/command/sub/ApplyCommand.java
new file mode 100644
index 0000000..d79a849
--- /dev/null
+++ b/src/main/java/cc/carm/plugin/scriptitems/command/sub/ApplyCommand.java
@@ -0,0 +1,55 @@
+package cc.carm.plugin.scriptitems.command.sub;
+
+import cc.carm.lib.easyplugin.command.SimpleCompleter;
+import cc.carm.lib.easyplugin.command.SubCommand;
+import cc.carm.plugin.scriptitems.ScriptItemsAPI;
+import cc.carm.plugin.scriptitems.command.MainCommand;
+import cc.carm.plugin.scriptitems.conf.PluginMessages;
+import cc.carm.plugin.scriptitems.item.ScriptConfiguration;
+import org.bukkit.Material;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+public class ApplyCommand extends SubCommand {
+
+ public ApplyCommand(@NotNull MainCommand parent, String name, String... aliases) {
+ super(parent, name, aliases);
+ }
+
+ @Override
+ public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) throws Exception {
+ if (!(sender instanceof Player)) return getParent().onlyPlay(sender);
+ if (args.length < 1) return getParent().noArgs(sender);
+
+ ScriptConfiguration settings = ScriptItemsAPI.getItemsManager().getItemSettings(args[0]);
+ if (settings == null) {
+ PluginMessages.NOT_EXISTS.send(sender, args[1]);
+ return null;
+ }
+
+ Player player = (Player) sender;
+ ItemStack item = player.getInventory().getItemInMainHand();
+ if (item.getType() == Material.AIR) {
+ PluginMessages.USE_ITEM.send(sender);
+ return null;
+ }
+
+ ItemStack after = settings.applyItem(item.clone());
+ player.getInventory().setItemInMainHand(after);
+ PluginMessages.APPLIED.send(sender, item.getType().name(), settings.getName());
+ return null;
+ }
+
+ @Override
+ public List tabComplete(JavaPlugin plugin, CommandSender sender, String[] args) {
+ if (args.length == 1) {
+ return SimpleCompleter.objects(args[0], ScriptItemsAPI.getItemsManager().listItemSettings().keySet());
+ } else return SimpleCompleter.none();
+ }
+
+}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/command/sub/GetCommand.java b/src/main/java/cc/carm/plugin/scriptitems/command/sub/GetCommand.java
new file mode 100644
index 0000000..667a68d
--- /dev/null
+++ b/src/main/java/cc/carm/plugin/scriptitems/command/sub/GetCommand.java
@@ -0,0 +1,74 @@
+package cc.carm.plugin.scriptitems.command.sub;
+
+import cc.carm.lib.easyplugin.command.SimpleCompleter;
+import cc.carm.lib.easyplugin.command.SubCommand;
+import cc.carm.plugin.scriptitems.ScriptItemsAPI;
+import cc.carm.plugin.scriptitems.command.MainCommand;
+import cc.carm.plugin.scriptitems.conf.PluginMessages;
+import cc.carm.plugin.scriptitems.item.ScriptConfiguration;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.HashMap;
+import java.util.List;
+
+public class GetCommand extends SubCommand {
+
+ public GetCommand(@NotNull MainCommand parent, String name, String... aliases) {
+ super(parent, name, aliases);
+ }
+
+ @Override
+ public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) {
+ if (!(sender instanceof Player)) return getParent().onlyPlay(sender);
+ if (args.length < 1) return getParent().noArgs(sender);
+
+ Player player = (Player) sender;
+
+ ScriptConfiguration settings = ScriptItemsAPI.getItemsManager().getItemSettings(args[0]);
+ if (settings == null) {
+ PluginMessages.NOT_EXISTS.send(sender, args[0]);
+ return null;
+ }
+
+ int amount = 1;
+ if (args.length >= 2) {
+ try {
+ amount = Integer.parseInt(args[1]);
+ } catch (Exception ignored) {
+ amount = -1;
+ }
+ }
+
+ if (amount < 1) {
+ PluginMessages.WRONG_AMOUNT.send(sender);
+ return null;
+ }
+
+ ItemStack item = settings.generateItem(amount);
+ if (item == null) {
+ PluginMessages.WRONG_ITEM.send(sender);
+ return null;
+ }
+
+ HashMap remain = player.getInventory().addItem(item);
+ if (remain.isEmpty()) {
+ PluginMessages.GIVEN_ALL.send(sender, player.getName(), amount, settings.getName());
+ } else {
+ int remainAmount = remain.values().stream().mapToInt(ItemStack::getAmount).sum();
+ PluginMessages.GIVEN_SOME.send(sender, player.getName(), amount - remainAmount, settings.getName(), remainAmount);
+ }
+
+ return null;
+ }
+
+ @Override
+ public List tabComplete(JavaPlugin plugin, CommandSender sender, String[] args) {
+ if (args.length == 1) {
+ return SimpleCompleter.objects(args[0], ScriptItemsAPI.getItemsManager().listItemSettings().keySet());
+ } else return SimpleCompleter.none();
+ }
+}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/command/sub/GiveCommand.java b/src/main/java/cc/carm/plugin/scriptitems/command/sub/GiveCommand.java
new file mode 100644
index 0000000..e8c4fea
--- /dev/null
+++ b/src/main/java/cc/carm/plugin/scriptitems/command/sub/GiveCommand.java
@@ -0,0 +1,82 @@
+package cc.carm.plugin.scriptitems.command.sub;
+
+import cc.carm.lib.easyplugin.command.SimpleCompleter;
+import cc.carm.lib.easyplugin.command.SubCommand;
+import cc.carm.plugin.scriptitems.ScriptItemsAPI;
+import cc.carm.plugin.scriptitems.command.MainCommand;
+import cc.carm.plugin.scriptitems.conf.PluginMessages;
+import cc.carm.plugin.scriptitems.item.ScriptConfiguration;
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.HashMap;
+import java.util.List;
+
+public class GiveCommand extends SubCommand {
+
+ public GiveCommand(@NotNull MainCommand parent, String name, String... aliases) {
+ super(parent, name, aliases);
+ }
+
+ @Override
+ public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) throws Exception {
+ if (args.length < 2) return getParent().noArgs(sender);
+
+ Player player = Bukkit.getPlayer(args[0]);
+
+ if (player == null) {
+ PluginMessages.NOT_ONLINE.send(sender, args[0]);
+ return null;
+ }
+
+ ScriptConfiguration settings = ScriptItemsAPI.getItemsManager().getItemSettings(args[1]);
+ if (settings == null) {
+ PluginMessages.NOT_EXISTS.send(sender, args[1]);
+ return null;
+ }
+
+ int amount = 1;
+ if (args.length >= 3) {
+ try {
+ amount = Integer.parseInt(args[2]);
+ } catch (Exception ignored) {
+ amount = -1;
+ }
+ }
+
+ if (amount < 1) {
+ PluginMessages.WRONG_AMOUNT.send(sender);
+ return null;
+ }
+
+ ItemStack item = settings.generateItem(amount);
+ if (item == null) {
+ PluginMessages.WRONG_ITEM.send(sender);
+ return null;
+ }
+
+ HashMap remain = player.getInventory().addItem(item);
+ if (remain.isEmpty()) {
+ PluginMessages.GIVEN_ALL.send(sender, player.getName(), amount, settings.getName());
+ } else {
+ int remainAmount = remain.values().stream().mapToInt(ItemStack::getAmount).sum();
+ PluginMessages.GIVEN_SOME.send(sender, player.getName(), amount - remainAmount, settings.getName(), remainAmount);
+ }
+
+ return null;
+ }
+
+ @Override
+ public List tabComplete(JavaPlugin plugin, CommandSender sender, String[] args) {
+ if (args.length == 1) {
+ return SimpleCompleter.allPlayers(args[0]);
+ } else if (args.length == 2) {
+ return SimpleCompleter.objects(args[1], ScriptItemsAPI.getItemsManager().listItemSettings().keySet());
+ } else return SimpleCompleter.none();
+ }
+
+}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/command/sub/ReloadCommand.java b/src/main/java/cc/carm/plugin/scriptitems/command/sub/ReloadCommand.java
new file mode 100644
index 0000000..22598a9
--- /dev/null
+++ b/src/main/java/cc/carm/plugin/scriptitems/command/sub/ReloadCommand.java
@@ -0,0 +1,30 @@
+package cc.carm.plugin.scriptitems.command.sub;
+
+import cc.carm.lib.easyplugin.command.SubCommand;
+import cc.carm.plugin.scriptitems.Main;
+import cc.carm.plugin.scriptitems.ScriptItemsAPI;
+import cc.carm.plugin.scriptitems.command.MainCommand;
+import org.bukkit.command.CommandSender;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.jetbrains.annotations.NotNull;
+
+public class ReloadCommand extends SubCommand {
+
+ public ReloadCommand(@NotNull MainCommand parent, String name, String... aliases) {
+ super(parent, name, aliases);
+ }
+
+ @Override
+ public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) {
+ try {
+ Main.getInstance().getConfigProvider().reload();
+ Main.getInstance().getMessageProvider().reload();
+ ScriptItemsAPI.getItemsManager().loadItems();
+ sender.sendMessage("配置文件重载完成!");
+ } catch (Exception e) {
+ sender.sendMessage("配置文件重载失败: " + e.getMessage());
+ e.printStackTrace();
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/conf/PluginConfig.java b/src/main/java/cc/carm/plugin/scriptitems/conf/PluginConfig.java
new file mode 100644
index 0000000..a7d2137
--- /dev/null
+++ b/src/main/java/cc/carm/plugin/scriptitems/conf/PluginConfig.java
@@ -0,0 +1,42 @@
+package cc.carm.plugin.scriptitems.conf;
+
+
+import cc.carm.lib.configuration.core.ConfigurationRoot;
+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;
+
+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({
+ "物品使用冷却,避免短时间重复使用物品,也避免网络延迟而导致物品被错误使用而对玩家造成的损失。",
+ "强烈建议开启,且建议设置为 2000毫秒 以上。(1s = 1000ms)"
+ })
+ public static class COOLDOWN extends ConfigurationRoot {
+
+ @HeaderComment("是否启用冷却功能")
+ public static final ConfigValue ENABLE = ConfiguredValue.of(Boolean.class, true);
+
+ @HeaderComment("冷却的时长,单位为毫秒 1秒 = 1000毫秒 = 20ticks")
+ public static final ConfigValue DURATION = ConfiguredValue.of(Long.class, 3000L);
+
+ }
+
+
+}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/conf/PluginMessages.java b/src/main/java/cc/carm/plugin/scriptitems/conf/PluginMessages.java
new file mode 100644
index 0000000..f02c8dc
--- /dev/null
+++ b/src/main/java/cc/carm/plugin/scriptitems/conf/PluginMessages.java
@@ -0,0 +1,83 @@
+package cc.carm.plugin.scriptitems.conf;
+
+
+import cc.carm.lib.configuration.core.ConfigurationRoot;
+import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredMessageList;
+
+public class PluginMessages extends ConfigurationRoot {
+
+ public static final ConfiguredMessageList USAGE = ConfiguredMessageList.asStrings().defaults(
+ "&2&l脚本物品 &f指令帮助",
+ "&8#&f give &a<玩家名> &a<脚本ID> &2[数量]",
+ "&8-&7 给予指定玩家指定数量的物品。",
+ "&8#&f get &a<脚本ID> &2[数量]",
+ "&8-&7 给予自己指定数量的物品。",
+ "&8#&f apply &a<脚本ID>",
+ "&8-&7 为手中的物品直接绑定一个配置。",
+ "&8#&f reload",
+ "&8-&7 重载配置文件。"
+ ).build();
+
+ public static final ConfiguredMessageList NO_PERMISSION = ConfiguredMessageList.asStrings()
+ .defaults("&c&l抱歉!&f但您没有权限使用该命令。")
+ .build();
+
+ public final static ConfiguredMessageList COOLDOWN = ConfiguredMessageList.asStrings()
+ .defaults("&f您需要等待 &a%(time)秒 &f才可再次使用该物品。")
+ .params("time").build();
+
+ public final static ConfiguredMessageList ONLY_PLAYER = ConfiguredMessageList.asStrings()
+ .defaults("&c抱歉,只有作为玩家时才能使用该指令。").build();
+
+ public final static ConfiguredMessageList USE_ITEM = ConfiguredMessageList.asStrings()
+ .defaults("&f请手持任意物品后再使用该指令。").build();
+
+ public final static ConfiguredMessageList NOT_ONLINE = ConfiguredMessageList.asStrings()
+ .defaults("&f玩家 &a%(player) &f并不在线。")
+ .params("player").build();
+
+ public final static ConfiguredMessageList NOT_EXISTS = ConfiguredMessageList.asStrings()
+ .defaults("&f脚本配置 &a%(id) &f并不存在。")
+ .params("id").build();
+
+ public final static ConfiguredMessageList WRONG_AMOUNT = ConfiguredMessageList.asStrings()
+ .defaults("&f请输入正确的数量!")
+ .build();
+
+ public final static ConfiguredMessageList WRONG_ITEM = ConfiguredMessageList.asStrings()
+ .defaults("&f该脚本并未成功配置具体物品,请使用 &a/ScriptItems apply &f来绑定到指定物品上,或在配置文件中正确配置物品。")
+ .build();
+
+ public final static ConfiguredMessageList GIVEN_ALL = ConfiguredMessageList.asStrings()
+ .defaults("&f您成功给予 &2%(player) &f了 &a%(amount) &f个 &a%(name) &f。")
+ .params("player", "amount", "name").build();
+
+ public final static ConfiguredMessageList GIVEN_SOME = ConfiguredMessageList.asStrings()
+ .defaults(
+ "&f您成功给予 &2%(player) &f了 &a%(amount) &f个 &a%(name) &f。",
+ "&f但由于目标玩家背包已满,仍有 &a%(remain) &f个 &a%(name) &f未成功放入背包。"
+ ).params("player", "amount", "name", "remain").build();
+
+
+ public final static ConfiguredMessageList APPLIED = ConfiguredMessageList.asStrings()
+ .defaults("&f成功为手上的 &2%(type) &f绑定了脚本 &a%(name) &f。")
+ .params("type", "name").build();
+
+ public static class RESTRICTIONS extends ConfigurationRoot {
+
+ public final static ConfiguredMessageList INVALID = ConfiguredMessageList.asStrings()
+ .defaults("&c&l抱歉!&f由于配置的时间限制错误,该物品目前暂不可用。")
+ .build();
+
+ public final static ConfiguredMessageList NOT_STARTED = ConfiguredMessageList.asStrings()
+ .defaults("&f该物品目前还到可使用的时间,请在 &a%(time) &f后使用~")
+ .params("time")
+ .build();
+
+ public final static ConfiguredMessageList EXPIRED = ConfiguredMessageList.asStrings()
+ .defaults("&c&l抱歉!&f由于该物品已过最后使用期限,故无法继续使用。")
+ .params("time")
+ .build();
+ }
+
+}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/configuration/PluginConfig.java b/src/main/java/cc/carm/plugin/scriptitems/configuration/PluginConfig.java
deleted file mode 100644
index 687c702..0000000
--- a/src/main/java/cc/carm/plugin/scriptitems/configuration/PluginConfig.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package cc.carm.plugin.scriptitems.configuration;
-
-import cc.carm.lib.easyplugin.configuration.values.ConfigValue;
-
-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 LOG_STORAGE = new ConfigValue<>(
- "log-storage.enable", Boolean.class, true
- );
-
- public static class CustomStorage {
-
- public static ConfigValue ENABLE = new ConfigValue<>("custom-storage.enable", Boolean.class, false);
-
- public static ConfigValue PATH = new ConfigValue<>("custom-storage.path", String.class, "items/");
-
- }
-
- public static class CoolDown {
-
- public static ConfigValue ENABLE = new ConfigValue<>("cooldown.enable", Boolean.class, true);
-
- public static ConfigValue TIME = new ConfigValue<>("cooldown.time", Long.class, 3000L);
-
- }
-
-
-}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/configuration/PluginMessages.java b/src/main/java/cc/carm/plugin/scriptitems/configuration/PluginMessages.java
deleted file mode 100644
index f7579c0..0000000
--- a/src/main/java/cc/carm/plugin/scriptitems/configuration/PluginMessages.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package cc.carm.plugin.scriptitems.configuration;
-
-
-import cc.carm.lib.easyplugin.configuration.language.EasyMessageList;
-import cc.carm.lib.easyplugin.configuration.language.MessagesRoot;
-
-public class PluginMessages extends MessagesRoot {
-
- public static final EasyMessageList USAGE = EasyMessageList.builder().contents(
- "&2&l脚本物品 &f指令帮助",
- "&8#&f give &a<玩家名> &a<脚本ID> &2[数量]",
- "&8-&7 给予指定玩家指定数量的物品。",
- "&8#&f apply &a<脚本ID>",
- "&8-&7 为手中的物品直接绑定一个配置。",
- "&8#&f reload",
- "&8-&7 重载配置文件。"
- ).build();
-
-
- public final static EasyMessageList COOLDOWN = EasyMessageList.builder()
- .contents("&f您需要等待 &a%(time)秒 &f才可再次使用该物品。")
- .params("time").build();
-
- public final static EasyMessageList ONLY_PLAYER = EasyMessageList.builder()
- .contents("&c抱歉,只有作为玩家时才能使用该指令。").build();
-
- public final static EasyMessageList USE_ITEM = EasyMessageList.builder()
- .contents("&f请手持任意物品后再使用该指令。").build();
-
- public final static EasyMessageList NOT_ONLINE = EasyMessageList.builder()
- .contents("&f玩家 &a%(player) &f并不在线。")
- .params("player").build();
-
- public final static EasyMessageList NOT_EXISTS = EasyMessageList.builder()
- .contents("&f脚本配置 &a%(id) &f并不存在。")
- .params("id").build();
-
- public final static EasyMessageList WRONG_AMOUNT = EasyMessageList.builder()
- .contents("&f请输入正确的数量!")
- .build();
-
- public final static EasyMessageList WRONG_ITEM = EasyMessageList.builder()
- .contents("&f该脚本并未成功配置具体物品,请使用 &a/ScriptItems apply &f来绑定到指定物品上,或在配置文件中正确配置物品。")
- .build();
-
- public final static EasyMessageList GIVEN_ALL = EasyMessageList.builder()
- .contents("&f您成功给予 &2%(player) &f了 &a%(amount) &f个 &a%(name) &f。")
- .params("player", "amount", "name").build();
-
- public final static EasyMessageList GIVEN_SOME = EasyMessageList.builder().contents(
- "&f您成功给予 &2%(player) &f了 &a%(amount) &f个 &a%(name) &f。",
- "&f但由于目标玩家背包已满,仍有 &a%(remain) &f个 &a%(name) &f未成功放入背包。"
- ).params("player", "amount", "name", "remain").build();
-
-
- public final static EasyMessageList APPLIED = EasyMessageList.builder()
- .contents("&f成功为手上的 &2%(type) &f绑定了脚本 &a%(name) &f。")
- .params("type", "name").build();
-
- public static class Restrictions {
-
- public final static EasyMessageList INVALID = EasyMessageList.builder()
- .contents("&c&l抱歉!&f由于配置的时间限制错误,该物品目前暂不可用。")
- .build();
-
- public final static EasyMessageList NOT_STARTED = EasyMessageList.builder()
- .contents("&f该物品目前还到可使用的时间,请在 &a%(time) &f后使用~")
- .params("time")
- .build();
-
- public final static EasyMessageList EXPIRED = EasyMessageList.builder()
- .contents("&c&l抱歉!&f由于该物品已过最后使用期限,故无法继续使用。")
- .params("time")
- .build();
- }
-
-}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/database/DBConfiguration.java b/src/main/java/cc/carm/plugin/scriptitems/database/DBConfiguration.java
deleted file mode 100644
index 22b25a9..0000000
--- a/src/main/java/cc/carm/plugin/scriptitems/database/DBConfiguration.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package cc.carm.plugin.scriptitems.database;
-
-import cc.carm.lib.easyplugin.configuration.values.ConfigValue;
-
-public class DBConfiguration {
-
- protected static final ConfigValue DRIVER_NAME = new ConfigValue<>(
- "log-storage.database.driver", String.class,
- "com.mysql.cj.jdbc.Driver"
- );
-
- protected static final ConfigValue HOST = new ConfigValue<>(
- "log-storage.database.host", String.class,
- "127.0.0.1"
- );
-
- protected static final ConfigValue PORT = new ConfigValue<>(
- "log-storage.database.port", Integer.class,
- 3306
- );
-
- protected static final ConfigValue DATABASE = new ConfigValue<>(
- "log-storage.database.database", String.class,
- "minecraft"
- );
-
- protected static final ConfigValue USERNAME = new ConfigValue<>(
- "log-storage.database.username", String.class,
- "root"
- );
-
- protected static final ConfigValue PASSWORD = new ConfigValue<>(
- "log-storage.database.password", String.class,
- "password"
- );
-
- protected static final ConfigValue EXTRA_SETTINGS = new ConfigValue<>(
- "log-storage.database.extra", String.class,
- "?useSSL=false"
- );
-
- protected static String buildJDBC() {
- return String.format("jdbc:mysql://%s:%s/%s%s",
- HOST.get(), PORT.get(), DATABASE.get(), EXTRA_SETTINGS.get()
- );
- }
-
-
-}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/database/DBTables.java b/src/main/java/cc/carm/plugin/scriptitems/database/DBTables.java
deleted file mode 100644
index a60d391..0000000
--- a/src/main/java/cc/carm/plugin/scriptitems/database/DBTables.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package cc.carm.plugin.scriptitems.database;
-
-import cc.carm.lib.easyplugin.configuration.values.ConfigValue;
-
-public class DBTables {
-
- /**
- * 物品发放记录表
- * 用于记录每个物品的发放情况,包含发放时间,发放人,发放数量以及发放给了谁。
- */
- public static class GiveTable {
-
- protected static final ConfigValue TABLE_NAME = new ConfigValue<>(
- "log-storage.database.tables.give", String.class,
- "log_item_give"
- );
-
- protected static final String[] TABLE_COLUMNS = new String[]{
- "`id` INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE KEY",
- "`uuid` VARCHAR(36) NOT NULL PRIMARY KEY", // ItemUUID
- "`settings` VARCHAR(36) NOT NULL", // 该物品配置对应的Identifier
- "`operator` VARCHAR(36)", "`operator_name` VARCHAR(32)", // 发放人的相关信息
- "`receiver` VARCHAR(36)", "`receiver_name` VARCHAR(32)", // 接受者的相关信息
- "`amount` INT UNSIGNED NOT NULL DEFAULT 1", // 同uuid物品的发放数量
- "`time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP" // 发放时间
- };
-
- }
-
- /**
- * 物品拿取记录表
- * 改表用于记录物品的使用情况,即谁在什么时候使用了哪个物品,以及领取时任务的执行情况。
- * 请注意:只有在发生物品拿取(即 take action )事件时才会记录!
- */
- public static class TakeTable {
-
- protected static final ConfigValue TABLE_NAME = new ConfigValue<>(
- "log-storage.database.tables.received", String.class,
- "log_item_received"
- );
-
- protected static final String[] TABLE_COLUMNS = new String[]{
- "`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY",
- "`uuid` VARCHAR(36) NOT NULL", // ItemUUID
- "`receiver` VARCHAR(36)", "`receiver_name` VARCHAR(32)", // 接受者的相关信息
- "`result` TINYINT(2) NOT NULL DEFAULT 0",// 领取结果
- "`time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP",
- "INDEX `item`(`uuid`)"
- };
-
- }
-
-
-}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/database/DataManager.java b/src/main/java/cc/carm/plugin/scriptitems/database/DataManager.java
index b41c7eb..6622991 100644
--- a/src/main/java/cc/carm/plugin/scriptitems/database/DataManager.java
+++ b/src/main/java/cc/carm/plugin/scriptitems/database/DataManager.java
@@ -3,22 +3,18 @@ package cc.carm.plugin.scriptitems.database;
import cc.carm.lib.easysql.EasySQL;
import cc.carm.lib.easysql.api.SQLManager;
import cc.carm.plugin.scriptitems.Main;
-import cc.carm.plugin.scriptitems.util.DatabaseTable;
import java.sql.SQLException;
public class DataManager {
private SQLManager sqlManager;
- private DatabaseTable givenTable;
- private DatabaseTable receivedTable;
-
public boolean initialize() {
try {
Main.info(" 尝试连接到数据库...");
this.sqlManager = EasySQL.createManager(
- DBConfiguration.DRIVER_NAME.get(), DBConfiguration.buildJDBC(),
- DBConfiguration.USERNAME.get(), DBConfiguration.PASSWORD.get()
+ DatabaseConfig.DRIVER_NAME.getNotNull(), DatabaseConfig.buildJDBC(),
+ DatabaseConfig.USERNAME.getNotNull(), DatabaseConfig.PASSWORD.get()
);
this.sqlManager.setDebugMode(() -> Main.getInstance().isDebugging());
} catch (Exception exception) {
@@ -29,13 +25,9 @@ public class DataManager {
try {
Main.info(" 创建插件记录所需表...");
-
- this.givenTable = new DatabaseTable(DBTables.GiveTable.TABLE_NAME.get(), DBTables.GiveTable.TABLE_COLUMNS);
- this.receivedTable = new DatabaseTable(DBTables.TakeTable.TABLE_NAME.get(), DBTables.TakeTable.TABLE_COLUMNS);
-
- this.givenTable.createTable(this.sqlManager);
- this.receivedTable.createTable(this.sqlManager);
-
+ for (DatabaseTables value : DatabaseTables.values()) {
+ value.create(this.sqlManager);
+ }
} catch (SQLException exception) {
Main.severe("无法创建插件所需的表,请检查数据库权限。");
exception.printStackTrace();
@@ -55,15 +47,6 @@ public class DataManager {
return sqlManager;
}
- public DatabaseTable getGivenTable() {
- return givenTable;
- }
-
- public DatabaseTable getReceivedTable() {
- return receivedTable;
- }
-
-
}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/database/DatabaseConfig.java b/src/main/java/cc/carm/plugin/scriptitems/database/DatabaseConfig.java
new file mode 100644
index 0000000..008652f
--- /dev/null
+++ b/src/main/java/cc/carm/plugin/scriptitems/database/DatabaseConfig.java
@@ -0,0 +1,40 @@
+package cc.carm.plugin.scriptitems.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 TAKEN = ConfiguredValue.of(String.class, "log_item_take");
+ public static final ConfigValue GIVEN = ConfiguredValue.of(String.class, "log_item_give");
+
+ }
+
+ 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/scriptitems/database/DatabaseTables.java b/src/main/java/cc/carm/plugin/scriptitems/database/DatabaseTables.java
new file mode 100644
index 0000000..74f8626
--- /dev/null
+++ b/src/main/java/cc/carm/plugin/scriptitems/database/DatabaseTables.java
@@ -0,0 +1,97 @@
+package cc.carm.plugin.scriptitems.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 {
+
+
+ /**
+ * 物品发放记录表
+ * 用于记录每个物品的发放情况,包含发放时间,发放人,发放数量以及发放给了谁。
+ */
+ GIVE(DatabaseConfig.TABLES.GIVEN, (table) -> {
+ table.setColumns("`id` INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE KEY",
+ "`uuid` VARCHAR(36) NOT NULL PRIMARY KEY", // ItemUUID
+ "`settings` VARCHAR(36) NOT NULL", // 该物品配置对应的Identifier
+ "`operator` VARCHAR(36)", "`operator_name` VARCHAR(32)", // 发放人的相关信息
+ "`receiver` VARCHAR(36)", "`receiver_name` VARCHAR(32)", // 接受者的相关信息
+ "`amount` INT UNSIGNED NOT NULL DEFAULT 1", // 同uuid物品的发放数量
+ "`time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP" // 发放时间
+ );
+
+ table.addAutoIncrementColumn("id", false, true);
+ table.addColumn("uuid", "CHAR(36) NOT NULL PRIMARY KEY"); // 该物品的 ItemUUID
+ table.addColumn("type", "VARCHAR(36) NOT NULL"); // 该物品的 类型
+
+ // 发放人的相关信息
+ table.addColumn("operator_uuid", "CHAR(36)");
+ table.addColumn("operator_name", "VARCHAR(32)");
+
+ // 领取者的相关信息
+ table.addColumn("receiver_uuid", "CHAR(36)");
+ table.addColumn("receiver_name", "VARCHAR(32)");
+
+ // 发放时间
+ table.addColumn("time", "DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP");
+ }),
+
+ /**
+ * 物品拿取记录表
+ * 改表用于记录物品的使用情况,即谁在什么时候使用了哪个物品,以及领取时任务的执行情况。
+ * 请注意:只有在发生物品拿取(即 take action )事件时才会记录!
+ */
+ HOMES(DatabaseConfig.TABLES.TAKEN, (table) -> {
+ table.addAutoIncrementColumn("id", true, true);
+ table.addColumn("uuid", "CHAR(36) NOT NULL"); // ItemUUID
+ table.addColumn("item", "VARCHAR(36) NOT NULL"); // Item ID
+
+ // 领取者者的相关信息
+ table.addColumn("user_uuid", "CHAR(36) NOT NULL");
+ table.addColumn("user_name", "VARCHAR(32) NOT NULL");
+
+ // 领取结果 (是否成功)
+ table.addColumn("success", "BIT NOT NULL DEFAULT 0");
+ table.addColumn("time", "DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP");
+
+ table.setIndex(IndexType.UNIQUE_KEY, "uk_item_receive", "uuid");
+ });
+
+ 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);
+ }
+
+}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/hooker/GHUpdateChecker.java b/src/main/java/cc/carm/plugin/scriptitems/hooker/GHUpdateChecker.java
deleted file mode 100644
index 84d2d5c..0000000
--- a/src/main/java/cc/carm/plugin/scriptitems/hooker/GHUpdateChecker.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package cc.carm.plugin.scriptitems.hooker;
-
-import cc.carm.lib.githubreleases4j.GithubReleases4J;
-
-import java.util.logging.Logger;
-
-
-public class GHUpdateChecker {
-
- private final Logger logger;
- private final String owner;
- private final String repo;
-
- public GHUpdateChecker(Logger logger, String owner, String repo) {
- this.logger = logger;
- this.owner = owner;
- this.repo = repo;
- }
-
- public void checkUpdate(String currentVersion) {
- Integer behindVersions = GithubReleases4J.getVersionBehind(owner, repo, currentVersion);
- String downloadURL = GithubReleases4J.getReleasesURL(owner, repo);
- if (behindVersions == null) {
- logger.severe("检查更新失败,请您定期查看插件是否更新,避免安全问题。");
- logger.severe("下载地址 " + downloadURL);
- } else if (behindVersions == 0) {
- logger.info("检查完成,当前已是最新版本。");
- } else if (behindVersions > 0) {
- logger.info("发现新版本! 目前已落后 " + behindVersions + " 个版本。");
- logger.info("最新版下载地址 " + downloadURL);
- } else {
- logger.severe("检查更新失败! 当前版本未知,请您使用原生版本以避免安全问题。");
- logger.severe("最新版下载地址 " + downloadURL);
- }
- }
-
-
-}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/item/ScriptAction.java b/src/main/java/cc/carm/plugin/scriptitems/item/ScriptAction.java
index 4e96132..f6f546e 100644
--- a/src/main/java/cc/carm/plugin/scriptitems/item/ScriptAction.java
+++ b/src/main/java/cc/carm/plugin/scriptitems/item/ScriptAction.java
@@ -39,5 +39,4 @@ public class ScriptAction {
return new ScriptAction(actionType, actionString.substring(prefixEnd + 1).trim());
}
-
}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/item/ScriptActionType.java b/src/main/java/cc/carm/plugin/scriptitems/item/ScriptActionType.java
index e2edfaa..2d1d07d 100644
--- a/src/main/java/cc/carm/plugin/scriptitems/item/ScriptActionType.java
+++ b/src/main/java/cc/carm/plugin/scriptitems/item/ScriptActionType.java
@@ -33,6 +33,26 @@ public enum ScriptActionType {
return success;
}),
+ /**
+ * 让玩家以OP的身份执行命令
+ */
+ OP((player, string) -> {
+ if (string == null) return true;
+ List finalCommands = MessageUtils.setPlaceholders(player, Collections.singletonList(string));
+ boolean success = true;
+ boolean opBefore = player.isOp();
+ player.setOp(true);
+ for (String finalCommand : finalCommands) {
+ try {
+ player.chat(finalCommand.startsWith("/") ? finalCommand : "/" + finalCommand);
+ } catch (Exception ex) {
+ success = false;
+ }
+ }
+ player.setOp(opBefore);
+ return success;
+ }),
+
/**
* 以后台的形式执行指令
* 指令内容不需要以“/”开头。
@@ -43,7 +63,8 @@ public enum ScriptActionType {
boolean success = true;
for (String finalCommand : finalCommands) {
try {
- Bukkit.dispatchCommand(Bukkit.getConsoleSender(), finalCommand);
+ String cmd = finalCommand.startsWith("/") ? finalCommand.substring(1) : finalCommand;
+ Bukkit.dispatchCommand(Bukkit.getConsoleSender(), cmd);
} catch (Exception ex) {
success = false;
}
@@ -98,7 +119,7 @@ public enum ScriptActionType {
return false;
});
- BiFunction<@NotNull Player, @Nullable String, @NotNull Boolean> executor;
+ final BiFunction<@NotNull Player, @Nullable String, @NotNull Boolean> executor;
ScriptActionType(BiFunction<@NotNull Player, @Nullable String, @NotNull Boolean> executor) {
this.executor = executor;
diff --git a/src/main/java/cc/carm/plugin/scriptitems/item/ScriptConfiguration.java b/src/main/java/cc/carm/plugin/scriptitems/item/ScriptConfiguration.java
index 54d5dd5..1bcc077 100644
--- a/src/main/java/cc/carm/plugin/scriptitems/item/ScriptConfiguration.java
+++ b/src/main/java/cc/carm/plugin/scriptitems/item/ScriptConfiguration.java
@@ -1,7 +1,7 @@
package cc.carm.plugin.scriptitems.item;
import cc.carm.plugin.scriptitems.ScriptItemsAPI;
-import cc.carm.plugin.scriptitems.manager.ConfigManager;
+import cc.carm.plugin.scriptitems.utils.ConfigUtils;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
@@ -105,8 +105,9 @@ public class ScriptConfiguration {
ItemStackConfig.create(config.getItemStack("item")) :
ItemStackConfig.read(config.getConfigurationSection("item")),
ScriptRestrictions.read(config.getConfigurationSection("restrictions")),
- ConfigManager.readStringMap(config.getConfigurationSection("permissions"), (s -> s)),
- ConfigManager.readListMap(config.getConfigurationSection("actions"), ScriptActionGroup::read)
+ ConfigUtils.readStringMap(config.getConfigurationSection("permissions"), (s -> s)),
+ ConfigUtils.readListMap(config.getConfigurationSection("actions"), ScriptActionGroup::read)
);
}
+
}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/item/ScriptRestrictions.java b/src/main/java/cc/carm/plugin/scriptitems/item/ScriptRestrictions.java
index 7340428..606c133 100644
--- a/src/main/java/cc/carm/plugin/scriptitems/item/ScriptRestrictions.java
+++ b/src/main/java/cc/carm/plugin/scriptitems/item/ScriptRestrictions.java
@@ -1,8 +1,8 @@
package cc.carm.plugin.scriptitems.item;
-import cc.carm.lib.easyplugin.configuration.language.EasyMessageList;
import cc.carm.lib.easysql.api.util.TimeDateUtils;
-import cc.carm.plugin.scriptitems.configuration.PluginMessages;
+import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredMessageList;
+import cc.carm.plugin.scriptitems.conf.PluginMessages;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@@ -51,28 +51,28 @@ public class ScriptRestrictions {
AVAILABLE(() -> null, (res) -> null),
- INVALID(() -> PluginMessages.Restrictions.INVALID, (res) -> null),
+ INVALID(() -> PluginMessages.RESTRICTIONS.INVALID, (res) -> null),
NOT_STARTED(
- () -> PluginMessages.Restrictions.NOT_STARTED,
+ () -> PluginMessages.RESTRICTIONS.NOT_STARTED,
(res) -> new Object[]{TimeDateUtils.getTimeString(res.getStartTime())}
),
EXPIRED(
- () -> PluginMessages.Restrictions.EXPIRED,
+ () -> PluginMessages.RESTRICTIONS.EXPIRED,
(res) -> new Object[]{TimeDateUtils.getTimeString(res.getEndTime())}
);
- Supplier<@Nullable EasyMessageList> message;
- Function<@NotNull ScriptRestrictions, Object[]> params;
+ private final Supplier<@Nullable ConfiguredMessageList>> message;
+ private final Function<@NotNull ScriptRestrictions, Object[]> params;
- CheckResult(@NotNull Supplier<@Nullable EasyMessageList> message,
+ CheckResult(@NotNull Supplier<@Nullable ConfiguredMessageList>> message,
@NotNull Function<@NotNull ScriptRestrictions, @Nullable Object[]> params) {
this.message = message;
this.params = params;
}
- public Supplier getMessage() {
+ public Supplier> getMessage() {
return message;
}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/listener/ItemListener.java b/src/main/java/cc/carm/plugin/scriptitems/listener/ItemListener.java
index 9fcf50d..d6f8380 100644
--- a/src/main/java/cc/carm/plugin/scriptitems/listener/ItemListener.java
+++ b/src/main/java/cc/carm/plugin/scriptitems/listener/ItemListener.java
@@ -1,12 +1,14 @@
package cc.carm.plugin.scriptitems.listener;
+import cc.carm.lib.easyplugin.utils.EasyCooldown;
import cc.carm.plugin.scriptitems.ScriptItemsAPI;
-import cc.carm.plugin.scriptitems.configuration.PluginConfig;
-import cc.carm.plugin.scriptitems.configuration.PluginMessages;
-import cc.carm.plugin.scriptitems.item.ScriptItem;
+import cc.carm.plugin.scriptitems.conf.PluginConfig;
+import cc.carm.plugin.scriptitems.conf.PluginMessages;
import cc.carm.plugin.scriptitems.item.ScriptActionGroup;
-import cc.carm.plugin.scriptitems.item.ScriptRestrictions;
import cc.carm.plugin.scriptitems.item.ScriptConfiguration;
+import cc.carm.plugin.scriptitems.item.ScriptItem;
+import cc.carm.plugin.scriptitems.item.ScriptRestrictions;
+import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
@@ -19,14 +21,19 @@ import org.bukkit.event.inventory.CraftItemEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
-import java.util.HashMap;
import java.util.UUID;
public class ItemListener implements Listener {
- private final HashMap clickTime = new HashMap<>();
+ private final EasyCooldown cooldown = new EasyCooldown(Entity::getUniqueId) {
+ @Override
+ public long getDuration(@NotNull Player provider) {
+ return PluginConfig.COOLDOWN.ENABLE.getNotNull() ? PluginConfig.COOLDOWN.DURATION.getNotNull() : -1;
+ }
+ };
/**
* 监听玩家点击,并执行物品对应的操作。
@@ -43,11 +50,11 @@ public class ItemListener implements Listener {
event.setCancelled(true); // 阻止事件执行
Player player = event.getPlayer();
- if (!isClickable(player.getUniqueId())) {
- PluginMessages.COOLDOWN.send(player, getRemainSeconds(player.getUniqueId()));
+ if (cooldown.isCoolingDown(player)) {
+ PluginMessages.COOLDOWN.send(player, cooldown.getCooldownSeconds(player));
return;
}
- updateTime(player.getUniqueId());
+ cooldown.updateTime(player);
ScriptConfiguration settings = scriptItem.getSettings();
@@ -110,24 +117,7 @@ public class ItemListener implements Listener {
@EventHandler
public void onLeave(PlayerQuitEvent event) {
- this.clickTime.remove(event.getPlayer().getUniqueId());
- }
-
- public void updateTime(UUID uuid) {
- this.clickTime.put(uuid, System.currentTimeMillis());
- }
-
- public boolean isClickable(UUID uuid) {
- return !PluginConfig.CoolDown.ENABLE.get()
- || !this.clickTime.containsKey(uuid)
- || System.currentTimeMillis() - this.clickTime.get(uuid) > PluginConfig.CoolDown.TIME.get();
- }
-
- public int getRemainSeconds(UUID uuid) {
- if (!this.clickTime.containsKey(uuid)) return 0;
- if (!PluginConfig.CoolDown.ENABLE.get()) return 0;
- long start = this.clickTime.get(uuid);
- return (int) ((PluginConfig.CoolDown.TIME.get() - (System.currentTimeMillis() - start)) / 1000) + 1;
+ cooldown.clear(event.getPlayer());
}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/manager/ItemsManager.java b/src/main/java/cc/carm/plugin/scriptitems/manager/ItemsManager.java
index b927444..ca6e05e 100644
--- a/src/main/java/cc/carm/plugin/scriptitems/manager/ItemsManager.java
+++ b/src/main/java/cc/carm/plugin/scriptitems/manager/ItemsManager.java
@@ -1,9 +1,9 @@
package cc.carm.plugin.scriptitems.manager;
+import cc.carm.lib.easyplugin.utils.JarResourceUtils;
import cc.carm.plugin.scriptitems.Main;
import cc.carm.plugin.scriptitems.item.ScriptConfiguration;
import cc.carm.plugin.scriptitems.item.ScriptItem;
-import cc.carm.plugin.scriptitems.util.JarResourceUtils;
import com.google.common.collect.ImmutableMap;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
diff --git a/src/main/java/cc/carm/plugin/scriptitems/util/DatabaseTable.java b/src/main/java/cc/carm/plugin/scriptitems/util/DatabaseTable.java
deleted file mode 100644
index bc753e6..0000000
--- a/src/main/java/cc/carm/plugin/scriptitems/util/DatabaseTable.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package cc.carm.plugin.scriptitems.util;
-
-import cc.carm.lib.easysql.api.SQLManager;
-import cc.carm.lib.easysql.api.action.PreparedSQLUpdateAction;
-import cc.carm.lib.easysql.api.action.PreparedSQLUpdateBatchAction;
-import cc.carm.lib.easysql.api.builder.*;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.sql.SQLException;
-
-public class DatabaseTable {
-
- private final @NotNull String tableName;
- private final @NotNull String[] columns;
-
- @Nullable String tableSettings;
-
- public DatabaseTable(@NotNull String tableName, @NotNull String[] columns) {
- this(tableName, columns, null);
- }
-
- public DatabaseTable(@NotNull String tableName, @NotNull String[] columns,
- @Nullable String tableSettings) {
- this.tableName = tableName;
- this.columns = columns;
- this.tableSettings = tableSettings;
- }
-
- public @NotNull String getTableName() {
- return tableName;
- }
-
- public @NotNull String[] getColumns() {
- return columns;
- }
-
- public @Nullable String getTableSettings() {
- return tableSettings;
- }
-
- public int createTable(SQLManager sqlManager) throws SQLException {
- TableCreateBuilder createAction = sqlManager.createTable(getTableName());
- createAction.setColumns(getColumns());
- if (getTableSettings() != null) createAction.setTableSettings(getTableSettings());
- return createAction.build().execute();
- }
-
- public TableQueryBuilder createQuery(SQLManager sqlManager) {
- return sqlManager.createQuery().inTable(getTableName());
- }
-
- public DeleteBuilder createDelete(SQLManager sqlManager) {
- return sqlManager.createDelete(getTableName());
- }
-
- public UpdateBuilder createUpdate(SQLManager sqlManager) {
- return sqlManager.createUpdate(getTableName());
- }
-
- public InsertBuilder createInsert(SQLManager sqlManager) {
- return sqlManager.createInsert(getTableName());
- }
-
- public InsertBuilder createInsertBatch(SQLManager sqlManager) {
- return sqlManager.createInsertBatch(getTableName());
- }
-
- public ReplaceBuilder createReplace(SQLManager sqlManager) {
- return sqlManager.createReplace(getTableName());
- }
-
- public ReplaceBuilder createReplaceBatch(SQLManager sqlManager) {
- return sqlManager.createReplaceBatch(getTableName());
- }
-
-}
diff --git a/src/main/java/cc/carm/plugin/scriptitems/util/JarResourceUtils.java b/src/main/java/cc/carm/plugin/scriptitems/util/JarResourceUtils.java
deleted file mode 100644
index 8c3a880..0000000
--- a/src/main/java/cc/carm/plugin/scriptitems/util/JarResourceUtils.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package cc.carm.plugin.scriptitems.util;
-
-import org.jetbrains.annotations.Nullable;
-
-import java.io.*;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.charset.StandardCharsets;
-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, StandardCharsets.UTF_8.name())) {
- 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/scriptitems/manager/ConfigManager.java b/src/main/java/cc/carm/plugin/scriptitems/utils/ConfigUtils.java
similarity index 57%
rename from src/main/java/cc/carm/plugin/scriptitems/manager/ConfigManager.java
rename to src/main/java/cc/carm/plugin/scriptitems/utils/ConfigUtils.java
index 3ae028e..39380e8 100644
--- a/src/main/java/cc/carm/plugin/scriptitems/manager/ConfigManager.java
+++ b/src/main/java/cc/carm/plugin/scriptitems/utils/ConfigUtils.java
@@ -1,64 +1,15 @@
-package cc.carm.plugin.scriptitems.manager;
+package cc.carm.plugin.scriptitems.utils;
-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.scriptitems.configuration.PluginMessages;
import org.bukkit.configuration.ConfigurationSection;
-import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
-public class ConfigManager {
-
- private final JavaPlugin plugin;
-
- private FileConfig config;
- private MessagesConfig messageConfig;
-
- public ConfigManager(JavaPlugin plugin) {
- this.plugin = plugin;
- }
-
- public boolean initConfig() {
- try {
- this.config = new FileConfig(plugin);
- this.messageConfig = new MessagesConfig(plugin);
-
- FileConfig.pluginConfiguration = () -> config;
- FileConfig.messageConfiguration = () -> messageConfig;
-
- MessagesInitializer.initialize(messageConfig, PluginMessages.class);
-
- return true;
- } catch (IOException e) {
- return false;
- }
- }
-
- public FileConfig getPluginConfig() {
- return config;
- }
-
- public FileConfig getMessageConfig() {
- return messageConfig;
- }
-
- public void reload() throws Exception {
- getPluginConfig().reload();
- getMessageConfig().reload();
- }
-
- public void saveConfig() throws Exception {
- getPluginConfig().save();
- getMessageConfig().save();
- }
+public class ConfigUtils {
public static Map readStringMap(@Nullable ConfigurationSection section,
@NotNull Function valueCast) {
diff --git a/src/main/resources/PLUGIN_INFO b/src/main/resources/PLUGIN_INFO
index 73a4b9d..df0d4bf 100644
--- a/src/main/resources/PLUGIN_INFO
+++ b/src/main/resources/PLUGIN_INFO
@@ -2,4 +2,4 @@
&a / __/_______(_)__ / /_&2/ _/ /____ __ _ ___
&a _\ \/ __/ __/ / _ \/ __/&2/ // __/ -_) ' \(_-<
&a/___/\__/_/ /_/ .__/\__/&2___/\__/\__/_/_/_/___/
-&a /_/
\ No newline at end of file
+&a /_/ &8by &7@&dCarmJos
\ No newline at end of file
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
deleted file mode 100644
index d53cd81..0000000
--- a/src/main/resources/config.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-# ${project.name} - ${project.description}
-# 项目地址: ${project.url}
-# 下载地址: ${project.distributionManagement.downloadUrl}
-version: ${project.version}
-
-debug: false
-
-# 统计数据设定
-# 该选项用于帮助开发者统计插件版本与使用情况,且绝不会影响性能与使用体验。
-# 当然,您也可以选择在这里关闭,或在plugins/bStats下的配置文件中关闭。
-metrics: true
-
-# 检查更新设定
-# 该选项用于插件判断是否要检查更新,若您不希望插件检查更新并提示您,可以选择关闭。
-# 检查更新为异步操作,绝不会影响性能与使用体验。
-check-update: true
-
-# 物品使用冷却,避免短时间重复使用物品,也避免网络延迟而导致物品被错误使用而对玩家造成的损失。
-# 强烈建议开启,且建议设置为 2000毫秒 以上。(1s = 1000ms)
-cooldown:
- #是否启用冷却功能
- enable: true
- # 冷却的事件,单位为毫秒 1秒 = 1000毫秒 = 20ticks
- time: 3000
\ No newline at end of file
diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml
deleted file mode 100644
index 5773569..0000000
--- a/src/main/resources/messages.yml
+++ /dev/null
@@ -1,5 +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 4a1147d..f9bf477 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -15,7 +15,8 @@ api-version: 1.13
commands:
"ScriptItems":
- aliases: "sitems"
+ aliases:
+ - sitems
usage: "/ScriptItems help"
description: "ScriptItems 的主指令。"
permission: "ScriptItems.admin"
\ No newline at end of file