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.configuration.PluginConfig; import cc.carm.plugin.timereward.data.RewardContents; import cc.carm.plugin.timereward.data.TimeRewardUser; import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class RewardManager { private BukkitRunnable rewardChecker; public void initialize() { this.rewardChecker = new BukkitRunnable() { @Override public void run() { if (Bukkit.getOnlinePlayers().isEmpty()) return; for (Player player : Bukkit.getOnlinePlayers()) { List unclaimedRewards = getUnclaimedRewards(player); if (unclaimedRewards.isEmpty()) continue; Main.getInstance().getScheduler().run(() -> unclaimedRewards.forEach( // 在同步进程中为玩家发放奖励 unclaimedReward -> claimReward(player, unclaimedReward, false) )); } } }; this.rewardChecker.runTaskTimerAsynchronously(Main.getInstance(), 100L, 20L); } public void shutdown() { this.rewardChecker.cancel(); this.rewardChecker = null; } public HashMap readRewards(@NotNull ConfigurationSection section) { HashMap rewards = new HashMap<>(); for (String rewardID : section.getKeys(false)) { ConfigurationSection rewardSection = section.getConfigurationSection(rewardID); if (rewardSection == null) continue; long time = rewardSection.getLong("time"); if (time <= 0) { Main.severe("奖励 " + rewardID + " 的时间配置错误,请检查配置文件。"); continue; } rewards.put(rewardID, new RewardContents( rewardID, time, rewardSection.getString("name"), rewardSection.getString("permission"), rewardSection.getStringList("commands") )); } return rewards; } public Map listRewards() { return new HashMap<>(getRewardsMap()); } protected HashMap getRewardsMap() { return PluginConfig.REWARDS.getOptional().orElse(new HashMap<>()); } public List getUnclaimedRewards(Player player) { TimeRewardUser user = TimeRewardAPI.getUserManager().get(player); return listRewards().values().stream() .filter(reward -> reward.isTimeEnough(user.getAllSeconds())) // 时间足够 .filter(reward -> !user.isClaimed(reward.getRewardID())) // 未曾领取 .filter(reward -> reward.checkPermission(player)) // 满足权限 .collect(Collectors.toList()); } public boolean claimReward(Player player, RewardContents reward, boolean check) { TimeRewardUser user = TimeRewardAPI.getUserManager().get(player); if (check && user.isClaimed(reward.getRewardID())) return false; if (check && !reward.isTimeEnough(user.getAllSeconds())) return false; if (check && !reward.checkPermission(player)) return false; user.addClaimedReward(reward.getRewardID()); List finalCommands = MessageUtils.setCustomParams( reward.getCommands(), "%(reward_name)", reward.getDisplayName() ); TimeRewardAPI.executeCommands(player, finalCommands); // 执行命令 return true; } public boolean claimReward(Player player, RewardContents reward) { return claimReward(player, reward, true); } }