1
mirror of https://github.com/carm-outsource/TimeReward.git synced 2026-06-04 15:28:16 +08:00

feat(time): 支持在周期内循环时间发奖

This commit is contained in:
2023-09-07 05:09:21 +08:00
parent 9a85f84119
commit 1078c7e03d
8 changed files with 57 additions and 33 deletions
@@ -4,6 +4,7 @@ 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.RewardsConfig;
import cc.carm.plugin.timereward.data.IntervalType;
import cc.carm.plugin.timereward.data.RewardContents;
import cc.carm.plugin.timereward.user.UserRewardData;
import org.bukkit.Bukkit;
@@ -13,6 +14,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.Unmodifiable;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.CompletableFuture;
@@ -67,11 +69,25 @@ public class RewardManager {
}
public boolean isClaimable(Player player, RewardContents reward) {
UserRewardData user = TimeRewardAPI.getUserManager().get(player);
if (!reward.checkPermission(player)) return false; // 满足权限
return !user.isClaimed(reward) // 未曾领取
&& user.isTimeEnough(reward)// 时间足够
&& reward.checkPermission(player); // 满足权限
UserRewardData user = TimeRewardAPI.getUserManager().get(player);
IntervalType intervalType = reward.getType();
LocalDateTime lastClaimed = user.getClaimedDate(reward);
if (reward.isLoop()) { // 循环奖励
if (lastClaimed == null || intervalType.isPeriodChanged(lastClaimed)) {
// 无上次领取记录或上次领取的时间不在一个周期内,则直接判断时间是否足够一次循环领取的时间
return user.getOnlineDuration(intervalType).getSeconds() > reward.getTime();
} else {
// 有上次领取记录,且在同一周期内,则直接判断相隔时间是否满足一个周期
return Duration.between(lastClaimed, LocalDateTime.now()).getSeconds() > reward.getTime();
}
} else { // 非循环奖励
if (lastClaimed == null || intervalType.isPeriodChanged(lastClaimed)) { // 无上次领取记录,则直接判断时间是否足够领取的时间
return user.getOnlineDuration(intervalType).getSeconds() > reward.getTime();
} else return false; // 有同一周期内的领取记录,则玩家不得重复领取了
}
}
public CompletableFuture<Boolean> claimReward(Player player, RewardContents reward, boolean check) {
@@ -91,7 +107,7 @@ public class RewardManager {
UserRewardData user = TimeRewardAPI.getUserManager().get(player);
Main.getStorage().addClaimedData(player.getUniqueId(), map);
contents.forEach(user::addClaimedReward);
contents.forEach(user::updateClaimed);
return true;
} catch (Exception ex) {