From b15a7a71fce4daea74a3967d9f18e7b14f7c423f Mon Sep 17 00:00:00 2001 From: CarmJos Date: Mon, 28 Feb 2022 17:55:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=A5=96=E5=8A=B1=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E8=AF=BB=E5=8F=96=E4=B8=8E=E5=A5=96=E5=8A=B1=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cc/carm/plugin/timereward/Main.java | 4 + .../carm/plugin/timereward/TimeRewardAPI.java | 23 +++- .../configuration/PluginConfig.java | 10 ++ .../timereward/data/RewardContents.java | 14 +++ .../timereward/data/TimeRewardUser.java | 3 +- .../timereward/listener/UserListener.java | 4 +- .../timereward/manager/RewardManager.java | 102 ++++++++++++++++++ .../timereward/manager/UserManager.java | 32 +++--- 8 files changed, 171 insertions(+), 21 deletions(-) diff --git a/src/main/java/cc/carm/plugin/timereward/Main.java b/src/main/java/cc/carm/plugin/timereward/Main.java index 973e063..034e634 100644 --- a/src/main/java/cc/carm/plugin/timereward/Main.java +++ b/src/main/java/cc/carm/plugin/timereward/Main.java @@ -49,6 +49,7 @@ public class Main extends EasyPlugin { log("加载奖励管理器..."); this.rewardManager = new RewardManager(); + this.rewardManager.initialize(); log("注册监听器..."); regListener(new UserListener()); @@ -61,6 +62,9 @@ public class Main extends EasyPlugin { @Override protected void shutdown() { + info("终止发奖励进程..."); + this.rewardManager.shutdown(); + info("卸载监听器..."); Bukkit.getServicesManager().unregisterAll(this); diff --git a/src/main/java/cc/carm/plugin/timereward/TimeRewardAPI.java b/src/main/java/cc/carm/plugin/timereward/TimeRewardAPI.java index 60f4aa1..278e7a9 100644 --- a/src/main/java/cc/carm/plugin/timereward/TimeRewardAPI.java +++ b/src/main/java/cc/carm/plugin/timereward/TimeRewardAPI.java @@ -1,8 +1,14 @@ package cc.carm.plugin.timereward; +import cc.carm.lib.easyplugin.utils.ColorParser; +import cc.carm.lib.easyplugin.utils.MessageUtils; import cc.carm.plugin.timereward.manager.ConfigManager; import cc.carm.plugin.timereward.manager.RewardManager; import cc.carm.plugin.timereward.manager.UserManager; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.List; public class TimeRewardAPI { @@ -14,9 +20,24 @@ public class TimeRewardAPI { return Main.getInstance().configManager; } - public static RewardManager getRewardManager(){ + public static RewardManager getRewardManager() { return Main.getInstance().rewardManager; } + + public static void executeCommands(Player player, List commands) { + if (commands == null || commands.isEmpty()) return; + for (String command : commands) { + try { + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), parseCommand(player, command)); + } catch (Exception exception) { + exception.printStackTrace(); + } + } + } + + private static String parseCommand(Player player, String command) { + return MessageUtils.setPlaceholders(player, ColorParser.parse(command)); + } } diff --git a/src/main/java/cc/carm/plugin/timereward/configuration/PluginConfig.java b/src/main/java/cc/carm/plugin/timereward/configuration/PluginConfig.java index c937671..81bc5f9 100644 --- a/src/main/java/cc/carm/plugin/timereward/configuration/PluginConfig.java +++ b/src/main/java/cc/carm/plugin/timereward/configuration/PluginConfig.java @@ -1,12 +1,22 @@ package cc.carm.plugin.timereward.configuration; +import cc.carm.lib.easyplugin.configuration.cast.ConfigSectionCast; import cc.carm.lib.easyplugin.configuration.values.ConfigValue; +import cc.carm.plugin.timereward.TimeRewardAPI; +import cc.carm.plugin.timereward.data.RewardContents; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; public class PluginConfig { public static final ConfigValue DEBUG = new ConfigValue<>( "debug", Boolean.class, false ); + public static final ConfigSectionCast> REWARDS = new ConfigSectionCast<>( + "rewards", TimeRewardAPI.getRewardManager()::readRewards, new LinkedHashMap<>() + ); } diff --git a/src/main/java/cc/carm/plugin/timereward/data/RewardContents.java b/src/main/java/cc/carm/plugin/timereward/data/RewardContents.java index 5b57bbb..19215cc 100644 --- a/src/main/java/cc/carm/plugin/timereward/data/RewardContents.java +++ b/src/main/java/cc/carm/plugin/timereward/data/RewardContents.java @@ -1,5 +1,7 @@ package cc.carm.plugin.timereward.data; +import cc.carm.lib.easyplugin.utils.ColorParser; +import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -38,6 +40,10 @@ public class RewardContents { return name; } + public @NotNull String getDisplayName() { + return ColorParser.parseColor(getName() == null ? getRewardID() : getName()); + } + public @Nullable String getPermission() { return permission; } @@ -46,6 +52,14 @@ public class RewardContents { return commands; } + public boolean checkPermission(@NotNull Player player) { + return permission == null || player.hasPermission(permission); + } + + public boolean isTimeEnough(long requireSeconds) { + return getTime() >= requireSeconds; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/cc/carm/plugin/timereward/data/TimeRewardUser.java b/src/main/java/cc/carm/plugin/timereward/data/TimeRewardUser.java index 7925f2d..80a61f8 100644 --- a/src/main/java/cc/carm/plugin/timereward/data/TimeRewardUser.java +++ b/src/main/java/cc/carm/plugin/timereward/data/TimeRewardUser.java @@ -28,7 +28,6 @@ public class TimeRewardUser { this(userUUID, claimedRewards, storedSeconds, System.currentTimeMillis()); } - public TimeRewardUser(UUID userUUID, Set<@NotNull String> claimedRewards, long storedSeconds, long joinMillis) { this.userUUID = userUUID; @@ -81,7 +80,7 @@ public class TimeRewardUser { return this.claimedRewards.contains(rewardId); } - public boolean claimReward(@NotNull String rewardId) { + public boolean addClaimedReward(@NotNull String rewardId) { if (isClaimed(rewardId)) return false; // 已经领取过了 this.claimedRewards.add(rewardId); return true; 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 ead428e..cfb37f2 100644 --- a/src/main/java/cc/carm/plugin/timereward/listener/UserListener.java +++ b/src/main/java/cc/carm/plugin/timereward/listener/UserListener.java @@ -10,12 +10,12 @@ public class UserListener implements Listener { @EventHandler public void onJoin(PlayerJoinEvent event) { - TimeRewardAPI.getUserManager().loadData(event.getPlayer().getUniqueId()); + TimeRewardAPI.getUserManager().load(event.getPlayer().getUniqueId()); } @EventHandler public void onQuit(PlayerQuitEvent event) { - TimeRewardAPI.getUserManager().unloadData(event.getPlayer().getUniqueId()); + TimeRewardAPI.getUserManager().unload(event.getPlayer().getUniqueId()); } } 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 42d54ae..3be373d 100644 --- a/src/main/java/cc/carm/plugin/timereward/manager/RewardManager.java +++ b/src/main/java/cc/carm/plugin/timereward/manager/RewardManager.java @@ -1,6 +1,108 @@ 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); + } + } \ No newline at end of file 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 de0b198..fdb7c2c 100644 --- a/src/main/java/cc/carm/plugin/timereward/manager/UserManager.java +++ b/src/main/java/cc/carm/plugin/timereward/manager/UserManager.java @@ -24,7 +24,7 @@ public class UserManager { } @NotNull - public TimeRewardUser readData(UUID userUUID) { + public TimeRewardUser read(UUID userUUID) { try { long start = System.currentTimeMillis(); DataManager storage = Main.getDataManager(); @@ -47,7 +47,7 @@ public class UserManager { } } - public void saveData(TimeRewardUser user) { + public void save(TimeRewardUser user) { try { long start = System.currentTimeMillis(); DataManager dataManager = Main.getDataManager(); @@ -64,30 +64,30 @@ public class UserManager { } } - public void loadData(UUID userUUID) { - getUsersMap().put(userUUID, readData(userUUID)); + public void load(UUID userUUID) { + getUsersMap().put(userUUID, read(userUUID)); } - public void unloadData(UUID userUUID) { - unloadData(userUUID, true); + public void unload(UUID userUUID) { + unload(userUUID, true); } - public void unloadData(UUID userUUID, boolean save) { - TimeRewardUser data = getData(userUUID); + public void unload(UUID userUUID, boolean save) { + TimeRewardUser data = get(userUUID); if (data == null) return; - if (save) saveData(data); + if (save) save(data); getUsersMap().remove(userUUID); } public void loadAll() { for (Player player : Bukkit.getOnlinePlayers()) { if (getUsersMap().containsKey(player.getUniqueId())) continue; - loadData(player.getUniqueId()); + load(player.getUniqueId()); } } public void saveAll() { - getUsersMap().values().forEach(this::saveData); + getUsersMap().values().forEach(this::save); } public void unloadAll(boolean save) { @@ -96,18 +96,18 @@ public class UserManager { } @Nullable - public TimeRewardUser getData(UUID userUUID) { + public TimeRewardUser get(UUID userUUID) { return getUsersMap().get(userUUID); } @NotNull - public TimeRewardUser getData(Player player) { + public TimeRewardUser get(Player player) { return getUsersMap().get(player.getUniqueId()); } public void editData(@NotNull UUID uuid, @NotNull DataTaskRunner task) { - TimeRewardUser user = getData(uuid); - if (user == null) user = readData(uuid); // 不在线则加载数据 + TimeRewardUser user = get(uuid); + if (user == null) user = read(uuid); // 不在线则加载数据 try { task.run(user, Main.getDataManager()); } catch (Exception exception) { @@ -123,7 +123,7 @@ public class UserManager { @NotNull @Unmodifiable - public Map listUsers() { + public Map list() { return new HashMap<>(getUsersMap()); }