diff --git a/README.md b/README.md index 198168c..600929a 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,11 @@ - 必须参数 `<参数>` ```text +# claim [奖励ID] +@ 玩家指令 +- 为自己手动领取对应奖励。 +- 若不填写奖励ID,则自动领取全部可领取的奖励。~~~~ + # reload @ 管理指令 (TimeReward.admin) - 重载插件配置文件。 @@ -75,8 +80,9 @@ # %TimeReward_claimed_<奖励ID>% - 得到玩家是否已经领取了某个奖励。 -- * 也可以代表玩家是否可以领取某个奖励 -- * 因为一旦可以领取就会自动领取,变为已领取状态 + +# %TimeReward_claimable_<奖励ID>% +- 得到玩家是否可以领取某个奖励 ``` ## 配置文件 diff --git a/src/main/java/cc/carm/plugin/timereward/Main.java b/src/main/java/cc/carm/plugin/timereward/Main.java index d7bb52c..5096709 100644 --- a/src/main/java/cc/carm/plugin/timereward/Main.java +++ b/src/main/java/cc/carm/plugin/timereward/Main.java @@ -5,7 +5,7 @@ import cc.carm.lib.easyplugin.EasyPlugin; import cc.carm.lib.easyplugin.updatechecker.GHUpdateChecker; import cc.carm.lib.easyplugin.utils.MessageUtils; import cc.carm.lib.mineconfiguration.bukkit.MineConfiguration; -import cc.carm.plugin.timereward.command.TimeRewardCommand; +import cc.carm.plugin.timereward.command.MainCommand; import cc.carm.plugin.timereward.conf.PluginConfig; import cc.carm.plugin.timereward.conf.PluginMessages; import cc.carm.plugin.timereward.hooker.PAPIExpansion; @@ -67,7 +67,7 @@ public class Main extends EasyPlugin { registerListener(new UserListener()); log("注册指令..."); - registerCommand("TimeReward", new TimeRewardCommand()); + registerCommand("TimeReward", new MainCommand(this)); if (MessageUtils.hasPlaceholderAPI()) { log("注册变量..."); diff --git a/src/main/java/cc/carm/plugin/timereward/command/MainCommand.java b/src/main/java/cc/carm/plugin/timereward/command/MainCommand.java new file mode 100644 index 0000000..6ca6808 --- /dev/null +++ b/src/main/java/cc/carm/plugin/timereward/command/MainCommand.java @@ -0,0 +1,37 @@ +package cc.carm.plugin.timereward.command; + +import cc.carm.lib.easyplugin.command.CommandHandler; +import cc.carm.plugin.timereward.command.sub.*; +import cc.carm.plugin.timereward.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 ClaimCommand(this, "claim")); + registerSubCommand(new ListCommand(this, "list")); + registerSubCommand(new UserCommand(this, "user")); + registerSubCommand(new TestCommand(this, "test")); + registerSubCommand(new ReloadCommand(this, "reload")); + } + + @Override + public Void noArgs(CommandSender sender) { + if (sender.hasPermission("TimeReward.admin")) { + PluginMessages.USAGE.ADMIN.send(sender); + } else { + PluginMessages.USAGE.USER.send(sender); + } + return null; + } + + @Override + public Void noPermission(CommandSender sender) { + PluginMessages.NO_PERMISSION.send(sender); + return null; + } +} diff --git a/src/main/java/cc/carm/plugin/timereward/command/TimeRewardCommand.java b/src/main/java/cc/carm/plugin/timereward/command/TimeRewardCommand.java deleted file mode 100644 index a391534..0000000 --- a/src/main/java/cc/carm/plugin/timereward/command/TimeRewardCommand.java +++ /dev/null @@ -1,142 +0,0 @@ -package cc.carm.plugin.timereward.command; - -import cc.carm.plugin.timereward.Main; -import cc.carm.plugin.timereward.TimeRewardAPI; -import cc.carm.plugin.timereward.conf.PluginMessages; -import cc.carm.plugin.timereward.storage.RewardContents; -import cc.carm.plugin.timereward.storage.UserData; -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.Collection; -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(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { - if (sender instanceof Player && !sender.hasPermission("TimeReward.admin")) PluginMessages.NO_PERMISSION.send(sender); - if (args.length < 1) return help(sender); - - String aim = args[0]; - if (aim.equalsIgnoreCase("reload")) { - long s1 = System.currentTimeMillis(); - PluginMessages.RELOAD.START.send(sender); - - try { - Main.getInstance().getConfigProvider().reload(); - Main.getInstance().getMessageProvider().reload(); - - PluginMessages.RELOAD.COMPLETE.send(sender, System.currentTimeMillis() - s1, TimeRewardAPI.getRewardManager().listRewards().size()); - } catch (Exception e) { - PluginMessages.RELOAD.ERROR.send(sender); - e.printStackTrace(); - } - - return true; - } else if (aim.equalsIgnoreCase("list")) { - Collection awards = TimeRewardAPI.getRewardManager().listRewards().values(); - PluginMessages.LIST.HEADER.send(sender, awards.size()); - - for (RewardContents reward : awards) { - 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)) { - PluginMessages.NOT_PLAYER.send(sender); - 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; - } - - UserData user = TimeRewardAPI.getUserManager().getData(player); - PluginMessages.USER_INFO.send(sender, - player.getName(), user.getAllSeconds(), - user.getClaimedRewards().size(), String.join("&8, &f", user.getClaimedRewards()) - ); - - return true; - } - - return help(sender); - } - - @Override - public @Nullable 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; - } - default: { - 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/command/sub/ClaimCommand.java b/src/main/java/cc/carm/plugin/timereward/command/sub/ClaimCommand.java new file mode 100644 index 0000000..a54d1b7 --- /dev/null +++ b/src/main/java/cc/carm/plugin/timereward/command/sub/ClaimCommand.java @@ -0,0 +1,64 @@ +package cc.carm.plugin.timereward.command.sub; + +import cc.carm.lib.easyplugin.command.SubCommand; +import cc.carm.plugin.timereward.Main; +import cc.carm.plugin.timereward.TimeRewardAPI; +import cc.carm.plugin.timereward.command.MainCommand; +import cc.carm.plugin.timereward.conf.PluginMessages; +import cc.carm.plugin.timereward.manager.RewardManager; +import cc.carm.plugin.timereward.storage.RewardContents; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class ClaimCommand extends SubCommand { + + public ClaimCommand(@NotNull MainCommand parent, String identifier, String... aliases) { + super(parent, identifier, aliases); + } + + @Override + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) { + if (!(sender instanceof Player)) { + PluginMessages.NOT_PLAYER.send(sender); + return null; + } + + Player player = (Player) sender; + RewardManager manager = TimeRewardAPI.getRewardManager(); + + @Nullable String rewardID = args.length > 0 ? args[0] : null; + if (rewardID == null) { + + List unclaimedRewards = manager.getUnclaimedRewards(player); + if (unclaimedRewards.isEmpty()) { + PluginMessages.NO_UNCLAIMED_REWARD.send(sender); + return null; + } + + Main.getInstance().getScheduler().run(() -> unclaimedRewards.forEach( + // 在同步进程中为玩家发放奖励 + unclaimedReward -> manager.claimReward(player, unclaimedReward, false) + )); + + } else { + + RewardContents reward = manager.getReward(rewardID); + if (reward == null) { + PluginMessages.NOT_EXISTS.send(sender, rewardID); + return null; + } + + if (!manager.isClaimable(player, reward)) { + PluginMessages.NOT_CLAIMABLE.send(sender, reward.getDisplayName()); + return null; + } + Main.getInstance().getScheduler().run(() -> manager.claimReward(player, reward, false)); + } + return null; + } +} diff --git a/src/main/java/cc/carm/plugin/timereward/command/sub/ListCommand.java b/src/main/java/cc/carm/plugin/timereward/command/sub/ListCommand.java new file mode 100644 index 0000000..8fc901c --- /dev/null +++ b/src/main/java/cc/carm/plugin/timereward/command/sub/ListCommand.java @@ -0,0 +1,45 @@ +package cc.carm.plugin.timereward.command.sub; + +import cc.carm.lib.easyplugin.command.SubCommand; +import cc.carm.plugin.timereward.TimeRewardAPI; +import cc.carm.plugin.timereward.command.MainCommand; +import cc.carm.plugin.timereward.conf.PluginMessages; +import cc.carm.plugin.timereward.storage.RewardContents; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; + +public class ListCommand extends SubCommand { + + public ListCommand(@NotNull MainCommand parent, String identifier, String... aliases) { + super(parent, identifier, aliases); + } + + @Override + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) { + Collection awards = TimeRewardAPI.getRewardManager().listRewards().values(); + PluginMessages.LIST.HEADER.send(sender, awards.size()); + + for (RewardContents reward : awards) { + 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 null; + } + + @Override + public boolean hasPermission(@NotNull CommandSender sender) { + return sender.hasPermission("TimeReward.admin"); + } + +} diff --git a/src/main/java/cc/carm/plugin/timereward/command/sub/ReloadCommand.java b/src/main/java/cc/carm/plugin/timereward/command/sub/ReloadCommand.java new file mode 100644 index 0000000..bd0ed0c --- /dev/null +++ b/src/main/java/cc/carm/plugin/timereward/command/sub/ReloadCommand.java @@ -0,0 +1,41 @@ +package cc.carm.plugin.timereward.command.sub; + +import cc.carm.lib.easyplugin.command.SubCommand; +import cc.carm.plugin.timereward.Main; +import cc.carm.plugin.timereward.TimeRewardAPI; +import cc.carm.plugin.timereward.command.MainCommand; +import cc.carm.plugin.timereward.conf.PluginMessages; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +public class ReloadCommand extends SubCommand { + + public ReloadCommand(@NotNull MainCommand parent, String identifier, String... aliases) { + super(parent, identifier, aliases); + } + + @Override + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) throws Exception { + + long s1 = System.currentTimeMillis(); + PluginMessages.RELOAD.START.send(sender); + + try { + Main.getInstance().getConfigProvider().reload(); + Main.getInstance().getMessageProvider().reload(); + + PluginMessages.RELOAD.COMPLETE.send(sender, System.currentTimeMillis() - s1, TimeRewardAPI.getRewardManager().listRewards().size()); + } catch (Exception e) { + PluginMessages.RELOAD.ERROR.send(sender); + e.printStackTrace(); + } + return null; + } + + @Override + public boolean hasPermission(@NotNull CommandSender sender) { + return sender.hasPermission("TimeReward.admin"); + } + +} \ No newline at end of file diff --git a/src/main/java/cc/carm/plugin/timereward/command/sub/TestCommand.java b/src/main/java/cc/carm/plugin/timereward/command/sub/TestCommand.java new file mode 100644 index 0000000..91ce625 --- /dev/null +++ b/src/main/java/cc/carm/plugin/timereward/command/sub/TestCommand.java @@ -0,0 +1,55 @@ +package cc.carm.plugin.timereward.command.sub; + +import cc.carm.lib.easyplugin.command.SimpleCompleter; +import cc.carm.lib.easyplugin.command.SubCommand; +import cc.carm.plugin.timereward.TimeRewardAPI; +import cc.carm.plugin.timereward.command.MainCommand; +import cc.carm.plugin.timereward.conf.PluginMessages; +import cc.carm.plugin.timereward.storage.RewardContents; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class TestCommand extends SubCommand { + + public TestCommand(@NotNull MainCommand parent, String identifier, String... aliases) { + super(parent, identifier, aliases); + } + + @Override + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) throws Exception { + if (args.length < 1) return getParent().noArgs(sender); + if (!(sender instanceof Player)) { + PluginMessages.NOT_PLAYER.send(sender); + return null; + } + + RewardContents contents = TimeRewardAPI.getRewardManager().getReward(args[0]); + if (contents == null) { + PluginMessages.NOT_EXISTS.send(sender, args[0]); + return null; + } + + PluginMessages.COMMAND_LIST.send(sender, contents.getRewardID()); + + TimeRewardAPI.getRewardManager().executeCommand((Player) sender, contents); + return null; + } + + @Override + public List tabComplete(JavaPlugin plugin, CommandSender sender, String[] args) { + if (args.length == 1) { + return SimpleCompleter.text(args[args.length - 1], TimeRewardAPI.getRewardManager().listRewards().keySet()); + } else return null; + } + + @Override + public boolean hasPermission(@NotNull CommandSender sender) { + return sender.hasPermission("TimeReward.admin"); + } + + +} diff --git a/src/main/java/cc/carm/plugin/timereward/command/sub/UserCommand.java b/src/main/java/cc/carm/plugin/timereward/command/sub/UserCommand.java new file mode 100644 index 0000000..fedff96 --- /dev/null +++ b/src/main/java/cc/carm/plugin/timereward/command/sub/UserCommand.java @@ -0,0 +1,52 @@ +package cc.carm.plugin.timereward.command.sub; + +import cc.carm.lib.easyplugin.command.SimpleCompleter; +import cc.carm.lib.easyplugin.command.SubCommand; +import cc.carm.plugin.timereward.TimeRewardAPI; +import cc.carm.plugin.timereward.command.MainCommand; +import cc.carm.plugin.timereward.conf.PluginMessages; +import cc.carm.plugin.timereward.storage.UserData; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class UserCommand extends SubCommand { + + public UserCommand(@NotNull MainCommand parent, String identifier, String... aliases) { + super(parent, identifier, aliases); + } + + @Override + public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) throws Exception { + if (args.length < 1) return getParent().noArgs(sender); + + Player player = Bukkit.getPlayer(args[0]); + if (player == null) { + PluginMessages.NOT_ONLINE.send(sender, args[0]); + return null; + } + + UserData user = TimeRewardAPI.getUserManager().getData(player); + PluginMessages.USER_INFO.send(sender, + player.getName(), user.getAllSeconds(), + user.getClaimedRewards().size(), String.join("&8, &f", user.getClaimedRewards()) + ); + return null; + } + + @Override + public List tabComplete(JavaPlugin plugin, CommandSender sender, String[] args) { + if (args.length == 1) return SimpleCompleter.onlinePlayers(args[0]); + else return null; + } + + @Override + public boolean hasPermission(@NotNull CommandSender sender) { + return sender.hasPermission("TimeReward.admin"); + } + +} diff --git a/src/main/java/cc/carm/plugin/timereward/conf/FunctionConfig.java b/src/main/java/cc/carm/plugin/timereward/conf/FunctionConfig.java new file mode 100644 index 0000000..76444cf --- /dev/null +++ b/src/main/java/cc/carm/plugin/timereward/conf/FunctionConfig.java @@ -0,0 +1,17 @@ +package cc.carm.plugin.timereward.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 FunctionConfig extends ConfigurationRoot { + + @HeaderComment({ + "是否启用自动领取", + "启用后,玩家将会在满足奖励领取条件时自动领取奖励。", + "若关闭,则玩家需要手动输入指令领取奖励。" + }) + public static final ConfigValue AUTO_CLAIM = ConfiguredValue.of(Boolean.class, true); + +} diff --git a/src/main/java/cc/carm/plugin/timereward/conf/PluginConfig.java b/src/main/java/cc/carm/plugin/timereward/conf/PluginConfig.java index c7fed11..1498fbe 100644 --- a/src/main/java/cc/carm/plugin/timereward/conf/PluginConfig.java +++ b/src/main/java/cc/carm/plugin/timereward/conf/PluginConfig.java @@ -24,9 +24,7 @@ public class PluginConfig extends ConfigurationRoot { }) public static final ConfigValue CHECK_UPDATE = ConfiguredValue.of(Boolean.class, true); - @HeaderComment("数据存储相关设定") - public static final class STORAGE extends ConfigurationRoot { - } + public static final Class FUNCTIONS = FunctionConfig.class; @HeaderComment({"奖励相关设定,包含以下设定:", " [id] 配置键名即奖励ID,支持英文、数字与下划线。", diff --git a/src/main/java/cc/carm/plugin/timereward/conf/PluginMessages.java b/src/main/java/cc/carm/plugin/timereward/conf/PluginMessages.java index c0a99a5..c744b4b 100644 --- a/src/main/java/cc/carm/plugin/timereward/conf/PluginMessages.java +++ b/src/main/java/cc/carm/plugin/timereward/conf/PluginMessages.java @@ -44,6 +44,25 @@ public class PluginMessages extends ConfigurationRoot { }; } + public static final class USAGE extends ConfigurationRoot { + + public static final ConfiguredMessageList ADMIN = list().defaults( + "&6&l在线奖励 &f管理员指令帮助", + "&8#&f reload", + "&8-&7 重载插件配置文件。", + "&8#&f user &6<玩家>", + "&8-&7 查看用户的在线时长信息与奖励领取情况。", + "&8#&f list", + "&8-&7 列出所有奖励与条件。", + "&8#&f test &6<奖励ID>", + "&8-&7 测试执行奖励配置的指令。" + ).build(); + + public static final ConfiguredMessageList USER = list().defaults( + "&6&l在线奖励 &f您可以输入 &e/tr claim &6[奖励ID] &f领取对应奖励。" + ).build(); + } + public static final ConfiguredMessageList NO_PERMISSION = list().defaults( "&c&l抱歉!&f但您没有足够的权限使用该指令。" ).build(); @@ -60,6 +79,14 @@ public class PluginMessages extends ConfigurationRoot { "&f奖励 &e%(award) &f并不存在。" ).params("award").build(); + public static final ConfiguredMessageList NOT_CLAIMABLE = list().defaults( + "&c&l抱歉!&f但您暂时为满足领取奖励 &e%(award) &f的条件。" + ).params("award").build(); + + public static final ConfiguredMessageList NO_UNCLAIMED_REWARD = list().defaults( + "&f您暂时没有未领取的奖励。" + ).build(); + public static final ConfiguredMessageList USER_INFO = list().defaults( "&f玩家 &6%(player) &f已在线&e%(time)&f秒,共领取了 &e%(amount)&f 次奖励。", "&7已领取的奖励列表如下:&r%(rewards) &7。" @@ -69,18 +96,6 @@ public class PluginMessages extends ConfigurationRoot { "&f正在执行奖励 %(award) 的指令列表..." ).params("award").build(); - public static final ConfiguredMessageList COMMAND_USAGE = list().defaults( - "&6&l在线奖励 &f指令帮助", - "&8#&f reload", - "&8-&7 重载插件配置文件。", - "&8#&f user &6<玩家>", - "&8-&7 查看用户的在线时长信息与奖励领取情况。", - "&8#&f list", - "&8-&7 列出所有奖励与条件。", - "&8#&f test &6<奖励ID>", - "&8-&7 测试执行奖励配置的指令。" - ).build(); - public static class LIST extends ConfigurationRoot { diff --git a/src/main/java/cc/carm/plugin/timereward/hooker/PAPIExpansion.java b/src/main/java/cc/carm/plugin/timereward/hooker/PAPIExpansion.java index 5fb9a95..25d126b 100644 --- a/src/main/java/cc/carm/plugin/timereward/hooker/PAPIExpansion.java +++ b/src/main/java/cc/carm/plugin/timereward/hooker/PAPIExpansion.java @@ -19,14 +19,27 @@ public class PAPIExpansion extends EasyPlaceholder { super(plugin, rootIdentifier); handle("time", userHandler(UserData::getAllSeconds)); + handle("reward", rewardHandler(RewardContents::getDisplayName), Collections.singletonList("<奖励ID>") ); + handle("claimed", userHandler((user, args) -> { if (args.length < 1) return "请填写奖励ID"; else return user.isClaimed(args[0]); }), Collections.singletonList("<奖励ID>")); + + handle("claimable", (offlinePlayer, args) -> { + if (offlinePlayer == null || !offlinePlayer.isOnline()) return "加载中..."; + if (args.length < 1) return "请填写奖励ID"; + + RewardContents reward = TimeRewardAPI.getRewardManager().getReward(args[0]); + if (reward == null) return "奖励不存在"; + + return TimeRewardAPI.getRewardManager().isClaimable((Player) offlinePlayer, reward); + }, Collections.singletonList("<奖励ID>")); + handle("version", (player, args) -> getVersion()); } 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 27ca4a3..12aee5d 100644 --- a/src/main/java/cc/carm/plugin/timereward/manager/RewardManager.java +++ b/src/main/java/cc/carm/plugin/timereward/manager/RewardManager.java @@ -3,6 +3,7 @@ package cc.carm.plugin.timereward.manager; import cc.carm.lib.easyplugin.utils.MessageUtils; import cc.carm.plugin.timereward.Main; import cc.carm.plugin.timereward.TimeRewardAPI; +import cc.carm.plugin.timereward.conf.FunctionConfig; import cc.carm.plugin.timereward.conf.PluginConfig; import cc.carm.plugin.timereward.storage.RewardContents; import cc.carm.plugin.timereward.storage.UserData; @@ -26,6 +27,7 @@ public class RewardManager { this.runnable = new BukkitRunnable() { @Override public void run() { + if (!FunctionConfig.AUTO_CLAIM.getNotNull()) return; if (Bukkit.getOnlinePlayers().isEmpty()) return; for (Player player : Bukkit.getOnlinePlayers()) { @@ -61,21 +63,23 @@ public class RewardManager { @Unmodifiable public @NotNull List getUnclaimedRewards(@NotNull Player player) { - UserData user = TimeRewardAPI.getUserManager().getData(player); return listRewards().values().stream() - .filter(reward -> reward.isTimeEnough(user.getAllSeconds())) // 时间足够 - .filter(reward -> !user.isClaimed(reward.getRewardID())) // 未曾领取 - .filter(reward -> reward.checkPermission(player)) // 满足权限 + .filter(reward -> isClaimable(player, reward)) .collect(Collectors.toList()); } - public boolean claimReward(Player player, RewardContents reward, boolean check) { - UserData user = TimeRewardAPI.getUserManager().getData(player); - if (check && user.isClaimed(reward.getRewardID())) return false; - if (check && !reward.isTimeEnough(user.getAllSeconds())) return false; - if (check && !reward.checkPermission(player)) return false; - user.addClaimedReward(reward.getRewardID()); + public boolean isClaimable(Player player, RewardContents reward) { + UserData user = TimeRewardAPI.getUserManager().getData(player); + return !user.isClaimed(reward.getRewardID()) // 未曾领取 + && reward.isTimeEnough(user.getAllSeconds()) // 时间足够 + && reward.checkPermission(player); // 满足权限 + } + + public boolean claimReward(Player player, RewardContents reward, boolean check) { + if (check && !isClaimable(player, reward)) return false; + + TimeRewardAPI.getUserManager().getData(player).addClaimedReward(reward.getRewardID()); executeCommand(player, reward); return true; }