diff --git a/README.md b/README.md index c0bf760..b7cd723 100644 --- a/README.md +++ b/README.md @@ -72,10 +72,13 @@ 变量如下: ```text -# %TimeReward_time_<时间类型>% -- 得到玩家的在线时长(秒)。 +# %TimeReward_<单位>_<时间类型>% +- 得到玩家的在线时长。 +- 单位可选 seconds, minutes, hours, days. - 时间类型可选 TOTAL, DAILY, WEEKLY, MONTHLY 。 + + # %TimeReward_reward_<奖励ID>% - 得到某个奖励配置的名称。 diff --git a/pom.xml b/pom.xml index 416dc98..764ac58 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ cc.carm.plugin timereward - 3.1.3 + 3.1.4 TimeReward 在线时长自动领奖插件,通过指令发放奖励,基于EasyPlugin实现。 diff --git a/src/main/java/cc/carm/plugin/timereward/Main.java b/src/main/java/cc/carm/plugin/timereward/Main.java index bf18e09..ec15168 100644 --- a/src/main/java/cc/carm/plugin/timereward/Main.java +++ b/src/main/java/cc/carm/plugin/timereward/Main.java @@ -17,6 +17,7 @@ import cc.carm.plugin.timereward.storage.database.MySQLStorage; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.entity.Entity; +import org.bukkit.scheduler.BukkitRunnable; import java.io.File; @@ -31,6 +32,8 @@ public class Main extends EasyPlugin { protected UserManager userManager; protected RewardManager rewardManager; + protected BukkitRunnable autoSaveTask; + public Main() { instance = this; } @@ -96,11 +99,32 @@ public class Main extends EasyPlugin { info("已禁用检查更新,跳过。"); } + if (PluginConfig.AUTO_SAVE.resolve() > 0) { + long period = PluginConfig.AUTO_SAVE.resolve() * 20L; + this.autoSaveTask = new BukkitRunnable() { + int i = 0; + + @Override + public void run() { + i = i == Integer.MAX_VALUE ? 0 : i + 1; + debugging("第" + i + "次自动保存用户在线数据..."); + userManager.saveAll(); + } + }; + this.autoSaveTask.runTaskTimerAsynchronously(this, period, period); + } + return true; } @Override protected void shutdown() { + + if (this.autoSaveTask != null && !this.autoSaveTask.isCancelled()) { + this.autoSaveTask.cancel(); + this.autoSaveTask = null; + } + info("终止奖励发放进程..."); this.rewardManager.shutdown(); 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 index 624e63b..991ff3f 100644 --- a/src/main/java/cc/carm/plugin/timereward/command/sub/UserCommand.java +++ b/src/main/java/cc/carm/plugin/timereward/command/sub/UserCommand.java @@ -33,6 +33,11 @@ public class UserCommand extends SubCommand { } UserRewardData user = TimeRewardAPI.getUserManager().get(player); + if (user == null) { + PluginMessages.LOADING.sendTo(sender, args[0]); + return null; + } + PluginMessages.USER_INFO.prepare( player.getName(), user.getOnlineDuration(IntervalType.DAILY).getSeconds(), 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 689659c..63a8788 100644 --- a/src/main/java/cc/carm/plugin/timereward/conf/PluginConfig.java +++ b/src/main/java/cc/carm/plugin/timereward/conf/PluginConfig.java @@ -25,6 +25,13 @@ public interface PluginConfig extends Configuration { "检查更新为异步操作,绝不会影响性能与使用体验。" }) ConfiguredValue CHECK_UPDATE = ConfiguredValue.of(Boolean.class, true); + + @HeaderComments({ + "自动保存设定,用于设置自动保存的时间间隔,单位为秒(小于等于0则关闭)。", + "一般来说,玩家会在退出游戏时进行保存。", + "但如果您希望额外的定期保存数据以避免数据丢失,可以选择开启。", + }) + ConfiguredValue AUTO_SAVE = ConfiguredValue.of(Long.class, 60L); @HeaderComments("周起始日,用于判断周度奖励的结算日期。") ConfiguredValue WEEK_FIRST_DAY = ConfiguredValue.builderOf(DayOfWeek.class) 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 c02b496..df14f91 100644 --- a/src/main/java/cc/carm/plugin/timereward/conf/PluginMessages.java +++ b/src/main/java/cc/carm/plugin/timereward/conf/PluginMessages.java @@ -79,6 +79,10 @@ public interface PluginMessages extends Configuration { "&f玩家 &e%(player) &f并不在线。" ).params("player").build(); + ConfiguredMessage LOADING = list().defaults( + "&e&l请稍候... &f您的在线数据正在加载中。" + ).params("player").build(); + ConfiguredMessage NOT_EXISTS = list().defaults( "&f奖励 &e%(award) &f并不存在。" ).params("award").build(); 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 6c0fdf2..714e134 100644 --- a/src/main/java/cc/carm/plugin/timereward/hooker/PAPIExpansion.java +++ b/src/main/java/cc/carm/plugin/timereward/hooker/PAPIExpansion.java @@ -10,50 +10,21 @@ import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; +import java.time.Duration; import java.util.Collections; import java.util.function.BiFunction; import java.util.function.Function; +import java.util.function.ToLongFunction; public class PAPIExpansion extends EasyPlaceholder { public PAPIExpansion(@NotNull JavaPlugin plugin, @NotNull String rootIdentifier) { super(plugin, rootIdentifier); - handle("seconds", userHandler((user, args) -> { - if (args.length < 1) return "请填写时间类型"; - IntervalType type = IntervalType.parse(args[0]); - - if (type == null) return "时间类型不存在"; - - return user.getOnlineDuration(type).getSeconds(); - }), Collections.singletonList("<时间类型>"), "time"); - - handle("minutes", userHandler((user, args) -> { - if (args.length < 1) return "请填写时间类型"; - IntervalType type = IntervalType.parse(args[0]); - - if (type == null) return "时间类型不存在"; - - return user.getOnlineDuration(type).toMinutes(); - }), Collections.singletonList("<时间类型>")); - - handle("hours", userHandler((user, args) -> { - if (args.length < 1) return "请填写时间类型"; - IntervalType type = IntervalType.parse(args[0]); - - if (type == null) return "时间类型不存在"; - - return user.getOnlineDuration(type).toHours(); - }), Collections.singletonList("<时间类型>")); - - handle("days", userHandler((user, args) -> { - if (args.length < 1) return "请填写时间类型"; - IntervalType type = IntervalType.parse(args[0]); - - if (type == null) return "时间类型不存在"; - - return user.getOnlineDuration(type).toDays(); - }), Collections.singletonList("<时间类型>")); + handle("seconds", timeHandler(Duration::getSeconds), Collections.singletonList("<时间类型>"), "time"); + handle("minutes", timeHandler(Duration::toMinutes), Collections.singletonList("<时间类型>")); + handle("hours", timeHandler(Duration::toHours), Collections.singletonList("<时间类型>")); + handle("days", timeHandler(Duration::toDays), Collections.singletonList("<时间类型>")); handle("reward", rewardHandler(RewardContents::getDisplayName), @@ -89,10 +60,21 @@ public class PAPIExpansion extends EasyPlaceholder { protected PlaceholderHandler userHandler(BiFunction userFunction) { return (player, args) -> { if (player == null || !player.isOnline()) return "加载中..."; - return userFunction.apply(TimeRewardAPI.getUserManager().get((Player) player), args); + UserRewardData data = TimeRewardAPI.getUserManager().get((Player) player); + if (data == null) return "加载中..."; + return userFunction.apply(data, args); }; } + protected PlaceholderHandler timeHandler(ToLongFunction timeFunction) { + return userHandler((user, args) -> { + if (args.length < 1) return "请填写时间类型"; + IntervalType type = IntervalType.parse(args[0]); + if (type == null) return "时间类型不存在"; + return timeFunction.applyAsLong(user.getOnlineDuration(type)); + }); + } + protected PlaceholderHandler rewardHandler(Function function) { return (player, args) -> { if (args.length < 1) return "请填写奖励ID"; 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 a9a541e..19a3a44 100644 --- a/src/main/java/cc/carm/plugin/timereward/manager/RewardManager.java +++ b/src/main/java/cc/carm/plugin/timereward/manager/RewardManager.java @@ -72,6 +72,8 @@ public class RewardManager { if (!reward.checkPermission(player)) return false; // 满足权限 UserRewardData user = TimeRewardAPI.getUserManager().get(player); + if (user == null) return false; // 玩家数据加载中 + IntervalType intervalType = reward.getType(); LocalDateTime lastClaimed = user.getClaimedDate(reward); @@ -106,6 +108,8 @@ public class RewardManager { try { UserRewardData user = TimeRewardAPI.getUserManager().get(player); + if (user == null) return false; // 玩家数据加载中 + Main.getStorage().addClaimedData(player.getUniqueId(), map); contents.forEach(user::updateClaimed); diff --git a/src/main/java/cc/carm/plugin/timereward/manager/UserManager.java b/src/main/java/cc/carm/plugin/timereward/manager/UserManager.java index 9cb872a..bcb60f8 100644 --- a/src/main/java/cc/carm/plugin/timereward/manager/UserManager.java +++ b/src/main/java/cc/carm/plugin/timereward/manager/UserManager.java @@ -23,8 +23,8 @@ public class UserManager extends UserDataManager { super(plugin); } - public @NotNull UserRewardData get(Player player) { - return get(player.getUniqueId()); + public @Nullable UserRewardData get(Player player) { + return getNullable(player.getUniqueId()); } @Override