diff --git a/README.md b/README.md index 13de605..0e85e7e 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,21 @@ 指令主指令为 `/TimeReward` ```text +# reload +@ 管理指令 (TimeReward.admin) +- 重载插件配置文件。 + +# user <玩家名> +@ 管理指令 (TimeReward.admin) +- 查看用户的在线时长信息与奖励领取情况。 + +# list +@ 管理指令 (TimeReward.admin) +- 列出所有奖励与条件。 + +# test <奖励ID> +@ 管理指令 (TimeReward.admin) +- 测试执行奖励配置的指令。 ``` ## 插件权限 diff --git a/src/main/java/cc/carm/plugin/timereward/Main.java b/src/main/java/cc/carm/plugin/timereward/Main.java index 59ae835..310a920 100644 --- a/src/main/java/cc/carm/plugin/timereward/Main.java +++ b/src/main/java/cc/carm/plugin/timereward/Main.java @@ -3,6 +3,7 @@ package cc.carm.plugin.timereward; import cc.carm.lib.easyplugin.EasyPlugin; import cc.carm.lib.easyplugin.i18n.EasyPluginMessageProvider; import cc.carm.lib.easyplugin.utils.MessageUtils; +import cc.carm.plugin.timereward.command.TimeRewardCommand; import cc.carm.plugin.timereward.configuration.PluginConfig; import cc.carm.plugin.timereward.database.DataManager; import cc.carm.plugin.timereward.hooker.PAPIExpansion; @@ -59,6 +60,8 @@ public class Main extends EasyPlugin { regListener(new UserListener()); log("注册指令..."); + registerCommand("TimeReward", new TimeRewardCommand()); + if (MessageUtils.hasPlaceholderAPI()) { log("注册变量..."); diff --git a/src/main/java/cc/carm/plugin/timereward/command/TimeRewardCommand.java b/src/main/java/cc/carm/plugin/timereward/command/TimeRewardCommand.java new file mode 100644 index 0000000..0dfc047 --- /dev/null +++ b/src/main/java/cc/carm/plugin/timereward/command/TimeRewardCommand.java @@ -0,0 +1,132 @@ +package cc.carm.plugin.timereward.command; + +import cc.carm.plugin.timereward.TimeRewardAPI; +import cc.carm.plugin.timereward.configuration.PluginMessages; +import cc.carm.plugin.timereward.data.RewardContents; +import cc.carm.plugin.timereward.data.TimeRewardUser; +import org.bukkit.Bukkit; +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.util.StringUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class TimeRewardCommand implements CommandExecutor, TabCompleter { + + private boolean help(CommandSender sender) { + PluginMessages.COMMAND_USAGE.send(sender); + return true; + } + + + @Override + public boolean onCommand(CommandSender sender, Command command, String alias, String[] args) { + if (args.length < 1) return help(sender); + String aim = args[0]; + + if (aim.equalsIgnoreCase("reload")) { + sender.sendMessage("§7正在重载配置文件..."); + try { + TimeRewardAPI.getConfigManager().reload(); + sender.sendMessage("§a配置文件重载完成!"); + } catch (Exception e) { + sender.sendMessage("§c配置文件重载失败,错误信息:" + e.getMessage() + " (详见后台"); + e.printStackTrace(); + } + return true; + } else if (aim.equalsIgnoreCase("list")) { + PluginMessages.List.HEADER.send(sender); + for (RewardContents reward : TimeRewardAPI.getRewardManager().listRewards().values()) { + if (reward.getPermission() != null) { + PluginMessages.List.OBJECT_PERM.send(sender, + reward.getRewardID(), reward.getDisplayName(), + reward.getTime(), reward.getPermission() + ); + } else { + PluginMessages.List.OBJECT.send(sender, + reward.getRewardID(), reward.getDisplayName(), reward.getTime() + ); + } + } + return true; + } else if (aim.equalsIgnoreCase("test")) { + if (args.length < 2) return help(sender); + if (!(sender instanceof Player)) { + sender.sendMessage("§c您不是玩家,无法使用此命令!"); + return true; + } + + RewardContents contents = TimeRewardAPI.getRewardManager().getReward(args[1]); + if (contents == null) { + PluginMessages.NOT_EXISTS.send(sender, args[1]); + return true; + } + + PluginMessages.COMMAND_LIST.send(sender, contents.getRewardID()); + + TimeRewardAPI.getRewardManager().executeCommand((Player) sender, contents); + + return true; + } else if (aim.equalsIgnoreCase("user")) { + if (args.length < 2) return help(sender); + Player player = Bukkit.getPlayer(args[1]); + if (player == null) { + PluginMessages.NOT_ONLINE.send(sender, args[1]); + return true; + } + + TimeRewardUser user = TimeRewardAPI.getUserManager().get(player); + PluginMessages.USER_INFO.send(sender, + player.getName(), user.getAllSeconds(), + user.getClaimedRewards().size(), String.join("&8, &f", user.getClaimedRewards()) + ); + + return true; + } + + return help(sender); + } + + @Nullable + @Override + public List onTabComplete( + @NotNull CommandSender sender, @NotNull Command command, + @NotNull String alias, @NotNull String[] args) { + List allCompletes = new ArrayList<>(); + // 玩家指令部分 + if (sender.hasPermission("TimeReward.admin")) { + switch (args.length) { + case 1: { + allCompletes.add("reload"); + allCompletes.add("user"); + allCompletes.add("list"); + if (sender instanceof Player) allCompletes.add("test"); + + break; + } + case 2: { + String aim = args[0]; + if (aim.equalsIgnoreCase("test") && sender instanceof Player) { + allCompletes = new ArrayList<>(TimeRewardAPI.getRewardManager().listRewards().keySet()); + } else if (aim.equalsIgnoreCase("user")) { + allCompletes = Bukkit.getOnlinePlayers().stream().map(HumanEntity::getName).collect(Collectors.toList()); + } + 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/timereward/configuration/PluginMessages.java b/src/main/java/cc/carm/plugin/timereward/configuration/PluginMessages.java index 460611b..7ea2718 100644 --- a/src/main/java/cc/carm/plugin/timereward/configuration/PluginMessages.java +++ b/src/main/java/cc/carm/plugin/timereward/configuration/PluginMessages.java @@ -6,10 +6,59 @@ import cc.carm.lib.easyplugin.configuration.language.MessagesRoot; public class PluginMessages extends MessagesRoot { - public static final EasyMessageList NOT_ONLINE = EasyMessageList.builder() - .contents("&7玩家 &c%(player) &7并不在线。") - .params("player") + public static final EasyMessageList COMMAND_USAGE = new EasyMessageList( + "&6&l在线奖励 &f后台指令帮助", + "&8#&f reload", + "&8-&7 重载插件配置文件。", + "&8#&f user &6<玩家>", + "&8-&7 查看用户的在线时长信息与奖励领取情况。", + "&8#&f list", + "&8-&7 列出所有奖励与条件。", + "&8#&f info &6<奖励ID>", + "&8-&7 查看奖励详情。", + "&8#&f test &6<奖励ID>", + "&8-&7 测试执行奖励配置的指令。" + ); + + + public static class List { + + public static final EasyMessageList HEADER = EasyMessageList.builder() + .contents("&6&l在线奖励 &f奖励列表 &7(共%(amount)个)") + .params("amount").build(); + + public static final EasyMessageList OBJECT = EasyMessageList.builder() + .contents( + "&8# &f%(id) &f%(name)", + "&8- &7领取条件 &f在线&e%(time)&f秒" + ).params("id", "name", "time").build(); + + public static final EasyMessageList OBJECT_PERM = EasyMessageList.builder() + .contents( + "&8# &f%(id) &f%(name)", + "&8- &7领取条件 &f在线&e%(time)&f秒", + "&8- &7需要权限 &f%(permission)" + ).params("id", "name", "time", "permission").build(); + } + + public static final EasyMessageList USER_INFO = EasyMessageList.builder() + .contents( + "&f玩家 &6%(player) &f已在线&e%(time)&f秒,共领取了 &e%(amount)&f 次奖励。", + "&7已领取的奖励列表如下:&r%(rewards) &7。" + ).params("player", "time", "amount", "rewards").build(); + + public static final EasyMessageList COMMAND_LIST = EasyMessageList.builder() + .contents("&f正在执行奖励 %(award) 的指令列表...") + .params("award") .build(); + public static final EasyMessageList NOT_ONLINE = EasyMessageList.builder() + .contents("&f玩家 &e%(player) &f并不在线。") + .params("player") + .build(); + public static final EasyMessageList NOT_EXISTS = EasyMessageList.builder() + .contents("&f奖励 &e%(award) &f并不存在。") + .params("award") + .build(); } diff --git a/src/main/java/cc/carm/plugin/timereward/manager/RewardManager.java b/src/main/java/cc/carm/plugin/timereward/manager/RewardManager.java index af5c8ae..345cb4d 100644 --- a/src/main/java/cc/carm/plugin/timereward/manager/RewardManager.java +++ b/src/main/java/cc/carm/plugin/timereward/manager/RewardManager.java @@ -97,11 +97,16 @@ public class RewardManager { if (check && !reward.checkPermission(player)) return false; user.addClaimedReward(reward.getRewardID()); + executeCommand(player, reward); + return true; + } + + public void executeCommand(Player player, RewardContents reward) { + Main.debugging("正在为玩家 " + player.getName() + " 执行奖励 " + reward.getRewardID() + " 的相关指令。"); List finalCommands = MessageUtils.setCustomParams( - reward.getCommands(), "%(reward_name)", reward.getDisplayName() + reward.getCommands(), "%(name)", reward.getDisplayName() ); TimeRewardAPI.executeCommands(player, finalCommands); // 执行命令 - return true; } public boolean claimReward(Player player, RewardContents reward) { diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index f879ad5..d675d59 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -20,5 +20,5 @@ commands: permissions: "TimeReward.admin": - description: "区域保护插件的管理员权限。" - default: op + description: "在线自动领奖的管理员权限。" + default: op \ No newline at end of file