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-02 17:14:00 +08:00
parent e1f4172a7f
commit dd80c5c9f7
24 changed files with 589 additions and 372 deletions
@@ -3,9 +3,9 @@ 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.PluginConfig;
import cc.carm.plugin.timereward.conf.RewardsConfig;
import cc.carm.plugin.timereward.data.RewardContents;
import cc.carm.plugin.timereward.data.UserData;
import cc.carm.plugin.timereward.user.UserRewardData;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
@@ -13,9 +13,9 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.Unmodifiable;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
public class RewardManager {
@@ -34,10 +34,8 @@ public class RewardManager {
.collect(Collectors.toList());
if (rewards.isEmpty()) continue;
main.getScheduler().run(() -> rewards.forEach(r -> {
// 在同步进程中为玩家发放奖励
claimReward(player, r, true); // 二次检查避免重复发奖
}));
//为玩家发放奖励
claimRewards(player, rewards, true); // 二次检查避免重复发奖
}
}
};
@@ -50,7 +48,7 @@ public class RewardManager {
}
protected Map<String, RewardContents> getRewards() {
return PluginConfig.REWARDS.getNotNull().getContents();
return RewardsConfig.getContents();
}
public @Nullable RewardContents getReward(String rewardID) {
@@ -58,7 +56,7 @@ public class RewardManager {
}
public Map<String, RewardContents> listRewards() {
return Collections.unmodifiableMap(PluginConfig.REWARDS.getNotNull().getContents());
return Collections.unmodifiableMap(RewardsConfig.getContents());
}
@Unmodifiable
@@ -69,18 +67,48 @@ public class RewardManager {
}
public boolean isClaimable(Player player, RewardContents reward) {
UserData user = TimeRewardAPI.getUserManager().getData(player);
return !user.isClaimed(reward.getRewardID()) // 未曾领取
&& reward.isTimeEnough(user.getAllSeconds()) // 时间足够
UserRewardData user = TimeRewardAPI.getUserManager().get(player);
return !user.isClaimed(reward) // 未曾领取
&& user.isTimeEnough(reward)// 时间足够
&& reward.checkPermission(player); // 满足权限
}
public boolean claimReward(Player player, RewardContents reward, boolean check) {
if (check && !isClaimable(player, reward)) return false;
public CompletableFuture<Boolean> claimReward(Player player, RewardContents reward, boolean check) {
return claimRewards(player, Collections.singletonList(reward), check);
}
TimeRewardAPI.getUserManager().getData(player).addClaimedReward(reward.getRewardID());
executeCommand(player, reward);
return true;
public CompletableFuture<Boolean> claimRewards(Player player, Collection<RewardContents> rewards, boolean check) {
Set<RewardContents> contents = rewards.stream()
.filter(r -> !check || isClaimable(player, r))
.collect(Collectors.toSet());
Map<String, LocalDateTime> map = new LinkedHashMap<>();
contents.forEach(reward -> map.put(reward.getRewardID(), LocalDateTime.now()));
return Main.getInstance().supplyAsync(() -> {
try {
UserRewardData user = TimeRewardAPI.getUserManager().get(player);
Main.getStorage().addClaimedData(player.getUniqueId(), map);
contents.forEach(user::addClaimedReward);
return true;
} catch (Exception ex) {
Main.severe("为玩家 " + player.getName() + " 领取奖励时发生错误。");
ex.printStackTrace();
return false;
}
}).thenCompose(result -> {
if (result) {
return Main.getInstance().supplySync(() -> {
rewards.forEach(reward -> executeCommand(player, reward));
return true;
});
} else {
return CompletableFuture.completedFuture(false);
}
});
}
public void executeCommand(Player player, RewardContents reward) {
@@ -91,8 +119,4 @@ public class RewardManager {
TimeRewardAPI.executeCommands(player, finalCommands); // 执行命令
}
public boolean claimReward(Player player, RewardContents reward) {
return claimReward(player, reward, true);
}
}