diff --git a/pom.xml b/pom.xml index cf5302b..bfee557 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ cc.carm.plugin timereward - 3.1.5 + 3.1.6 TimeReward 在线时长自动领奖插件,通过指令发放奖励,基于EasyPlugin实现。 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 index c403222..59af465 100644 --- a/src/main/java/cc/carm/plugin/timereward/command/sub/ClaimCommand.java +++ b/src/main/java/cc/carm/plugin/timereward/command/sub/ClaimCommand.java @@ -30,6 +30,11 @@ public class ClaimCommand extends SubCommand { Player player = (Player) sender; RewardManager manager = TimeRewardAPI.getRewardManager(); + if(manager.isClaiming(player.getUniqueId())){ + PluginMessages.ALREADY_CLAIMING.sendTo(sender); + return null; + } + @Nullable String rewardID = args.length > 0 ? args[0] : null; if (rewardID == null) { 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 df14f91..105c6b5 100644 --- a/src/main/java/cc/carm/plugin/timereward/conf/PluginMessages.java +++ b/src/main/java/cc/carm/plugin/timereward/conf/PluginMessages.java @@ -91,6 +91,10 @@ public interface PluginMessages extends Configuration { "&c&l抱歉!&f但您暂时未满足领取奖励 &e%(award) &f的条件。" ).params("award").build(); + ConfiguredMessage ALREADY_CLAIMING = list().defaults( + "&e&l请稍候...&f您当前有正在领取的奖励任务,单次只可领取一份奖励。" + ).build(); + ConfiguredMessage NO_UNCLAIMED_REWARD = list().defaults( "&f您暂时没有未领取的奖励。" ).build(); diff --git a/src/main/java/cc/carm/plugin/timereward/data/IntervalType.java b/src/main/java/cc/carm/plugin/timereward/data/IntervalType.java index 9198e1a..79c7854 100644 --- a/src/main/java/cc/carm/plugin/timereward/data/IntervalType.java +++ b/src/main/java/cc/carm/plugin/timereward/data/IntervalType.java @@ -17,7 +17,7 @@ public enum IntervalType { ), DAILY( - 1, Duration.ofDays(1), time -> DateTimeUtils.sameDay(time.toLocalDate()), + 1, Duration.ofDays(1), time -> !DateTimeUtils.sameDay(time.toLocalDate()), (timeRecord, join) -> { LocalDateTime now = LocalDateTime.now(); if (!now.toLocalDate().isEqual(join.toLocalDate())) { 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 19a3a44..4409e5b 100644 --- a/src/main/java/cc/carm/plugin/timereward/manager/RewardManager.java +++ b/src/main/java/cc/carm/plugin/timereward/manager/RewardManager.java @@ -18,12 +18,15 @@ import java.time.Duration; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; public class RewardManager { protected BukkitRunnable runnable; + protected Map> claiming = new ConcurrentHashMap<>(); + public RewardManager(Main main) { this.runnable = new BukkitRunnable() { @Override @@ -31,6 +34,8 @@ public class RewardManager { if (Bukkit.getOnlinePlayers().isEmpty()) return; for (Player player : Bukkit.getOnlinePlayers()) { + if (isClaiming(player.getUniqueId())) continue; // 如果正在领取奖励,则跳过 + List rewards = getUnclaimedRewards(player).stream() .filter(RewardContents::isAutoClaimed) .collect(Collectors.toList()); @@ -61,6 +66,14 @@ public class RewardManager { return Collections.unmodifiableMap(RewardsConfig.getContents()); } + public boolean isClaiming(@NotNull UUID uuid) { + return claiming.containsKey(uuid) && !claiming.get(uuid).isDone(); + } + + public CompletableFuture getClaiming(@NotNull UUID uuid) { + return claiming.get(uuid); + } + @Unmodifiable public @NotNull List getUnclaimedRewards(@NotNull Player player) { return listRewards().values().stream() @@ -97,22 +110,27 @@ public class RewardManager { } public CompletableFuture claimRewards(Player player, Collection rewards, boolean check) { + CompletableFuture exists = claiming.get(player.getUniqueId()); + if (exists != null) return CompletableFuture.completedFuture(false); // 如果玩家正在领取奖励,则直接返回false + Set contents = rewards.stream() .filter(r -> !check || isClaimable(player, r)) .collect(Collectors.toSet()); + if (contents.isEmpty()) { + return CompletableFuture.completedFuture(true); // 没有可领取的奖励,直接返回true。 + } + Map map = new LinkedHashMap<>(); contents.forEach(reward -> map.put(reward.getRewardID(), LocalDateTime.now())); - return Main.getInstance().supplyAsync(() -> { - try { + UserRewardData user = TimeRewardAPI.getUserManager().get(player); + if (user == null) return CompletableFuture.completedFuture(false); // 玩家数据加载中 - UserRewardData user = TimeRewardAPI.getUserManager().get(player); - if (user == null) return false; // 玩家数据加载中 - + CompletableFuture task = Main.getInstance().supplyAsync(() -> { + try { Main.getStorage().addClaimedData(player.getUniqueId(), map); contents.forEach(user::updateClaimed); - return true; } catch (Exception ex) { Main.severe("为玩家 " + player.getName() + " 领取奖励时发生错误。"); @@ -129,6 +147,12 @@ public class RewardManager { return CompletableFuture.completedFuture(false); } }); + + claiming.put(player.getUniqueId(), task); + + return task.whenComplete((b, t) -> { + claiming.remove(player.getUniqueId()); + }); } public void executeCommand(Player player, RewardContents reward) { diff --git a/src/main/java/cc/carm/plugin/timereward/user/UserRewardData.java b/src/main/java/cc/carm/plugin/timereward/user/UserRewardData.java index 367b3c8..148fcaa 100644 --- a/src/main/java/cc/carm/plugin/timereward/user/UserRewardData.java +++ b/src/main/java/cc/carm/plugin/timereward/user/UserRewardData.java @@ -1,6 +1,6 @@ package cc.carm.plugin.timereward.user; -import cc.carm.lib.easyplugin.user.UserData; +import cc.carm.lib.easyplugin.user.AbstractUserData; import cc.carm.plugin.timereward.data.IntervalType; import cc.carm.plugin.timereward.data.RewardContents; import cc.carm.plugin.timereward.data.TimeRecord; @@ -15,7 +15,7 @@ import java.util.UUID; /** * 用户奖励数据,用于存储用户的奖励的领取情况。 */ -public class UserRewardData extends UserData { +public class UserRewardData extends AbstractUserData { private final @NotNull Map claimedRewards; // 记录已领取的奖励ID @@ -35,7 +35,7 @@ public class UserRewardData extends UserData { } public @NotNull UUID getUserUUID() { - return getKey(); + return key(); } /**