diff --git a/pom.xml b/pom.xml index c5a3dcd..0a25191 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ cc.carm.plugin timereward - 3.1.1 + 3.1.2 TimeReward 在线时长自动领奖插件,通过指令发放奖励,基于EasyPlugin实现。 diff --git a/src/main/java/cc/carm/plugin/timereward/listener/UserListener.java b/src/main/java/cc/carm/plugin/timereward/listener/UserListener.java index 980f866..727da0c 100644 --- a/src/main/java/cc/carm/plugin/timereward/listener/UserListener.java +++ b/src/main/java/cc/carm/plugin/timereward/listener/UserListener.java @@ -1,5 +1,6 @@ package cc.carm.plugin.timereward.listener; +import cc.carm.plugin.timereward.Main; import cc.carm.plugin.timereward.TimeRewardAPI; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -17,6 +18,10 @@ public class UserListener implements Listener { if (player == null || !player.isOnline()) { TimeRewardAPI.getUserManager().unload(data.getUserUUID()); } // 不在线自动卸载 + }).exceptionally(ex -> { + Main.severe("加载用户在线时长数据失败: " + event.getPlayer().getName()); + ex.printStackTrace(); + return null; }); } 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 ba445ce..9cb872a 100644 --- a/src/main/java/cc/carm/plugin/timereward/manager/UserManager.java +++ b/src/main/java/cc/carm/plugin/timereward/manager/UserManager.java @@ -38,13 +38,15 @@ public class UserManager extends UserDataManager { MySQLStorage storage = Main.getStorage(); + @Nullable UserRewardData current = loadData(data.getUserUUID()); // 考虑读取时间差,优先利用数据库的当前数据计算 + TimeRecord oldRecord = current == null ? data.getTimeRecord() : current.getTimeRecord(); + // 只需要保存游玩时间数据,领取数据已经实时保存了 - LocalDate date = LocalDate.now(); - Duration daily = data.getOnlineDuration(IntervalType.DAILY); - Duration weekly = data.getOnlineDuration(IntervalType.WEEKLY); - Duration monthly = data.getOnlineDuration(IntervalType.MONTHLY); - Duration total = data.getOnlineDuration(IntervalType.TOTAL); - TimeRecord newRecord = new TimeRecord(date, daily, weekly, monthly, total); + Duration daily = IntervalType.DAILY.calculate(oldRecord, data.getJoinTime()); + Duration weekly = IntervalType.WEEKLY.calculate(oldRecord, data.getJoinTime()); + Duration monthly = IntervalType.MONTHLY.calculate(oldRecord, data.getJoinTime()); + Duration total = IntervalType.TOTAL.calculate(oldRecord, data.getJoinTime()); + TimeRecord newRecord = new TimeRecord(LocalDate.now(), daily, weekly, monthly, total); storage.savePlayTime(data.getUserUUID(), newRecord); }