mirror of
https://github.com/carm-outsource/TimeReward.git
synced 2024-09-19 19:25:49 +00:00
完成奖励配置读取与奖励判断
This commit is contained in:
parent
ca5859e5bc
commit
b15a7a71fc
@ -49,6 +49,7 @@ public class Main extends EasyPlugin {
|
|||||||
|
|
||||||
log("加载奖励管理器...");
|
log("加载奖励管理器...");
|
||||||
this.rewardManager = new RewardManager();
|
this.rewardManager = new RewardManager();
|
||||||
|
this.rewardManager.initialize();
|
||||||
|
|
||||||
log("注册监听器...");
|
log("注册监听器...");
|
||||||
regListener(new UserListener());
|
regListener(new UserListener());
|
||||||
@ -61,6 +62,9 @@ public class Main extends EasyPlugin {
|
|||||||
@Override
|
@Override
|
||||||
protected void shutdown() {
|
protected void shutdown() {
|
||||||
|
|
||||||
|
info("终止发奖励进程...");
|
||||||
|
this.rewardManager.shutdown();
|
||||||
|
|
||||||
info("卸载监听器...");
|
info("卸载监听器...");
|
||||||
Bukkit.getServicesManager().unregisterAll(this);
|
Bukkit.getServicesManager().unregisterAll(this);
|
||||||
|
|
||||||
|
@ -1,8 +1,14 @@
|
|||||||
package cc.carm.plugin.timereward;
|
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.ConfigManager;
|
||||||
import cc.carm.plugin.timereward.manager.RewardManager;
|
import cc.carm.plugin.timereward.manager.RewardManager;
|
||||||
import cc.carm.plugin.timereward.manager.UserManager;
|
import cc.carm.plugin.timereward.manager.UserManager;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class TimeRewardAPI {
|
public class TimeRewardAPI {
|
||||||
|
|
||||||
@ -14,9 +20,24 @@ public class TimeRewardAPI {
|
|||||||
return Main.getInstance().configManager;
|
return Main.getInstance().configManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static RewardManager getRewardManager(){
|
public static RewardManager getRewardManager() {
|
||||||
return Main.getInstance().rewardManager;
|
return Main.getInstance().rewardManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void executeCommands(Player player, List<String> 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));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,22 @@
|
|||||||
package cc.carm.plugin.timereward.configuration;
|
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.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 class PluginConfig {
|
||||||
|
|
||||||
public static final ConfigValue<Boolean> DEBUG = new ConfigValue<>(
|
public static final ConfigValue<Boolean> DEBUG = new ConfigValue<>(
|
||||||
"debug", Boolean.class, false
|
"debug", Boolean.class, false
|
||||||
);
|
);
|
||||||
|
public static final ConfigSectionCast<HashMap<String, RewardContents>> REWARDS = new ConfigSectionCast<>(
|
||||||
|
"rewards", TimeRewardAPI.getRewardManager()::readRewards, new LinkedHashMap<>()
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package cc.carm.plugin.timereward.data;
|
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.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
@ -38,6 +40,10 @@ public class RewardContents {
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public @NotNull String getDisplayName() {
|
||||||
|
return ColorParser.parseColor(getName() == null ? getRewardID() : getName());
|
||||||
|
}
|
||||||
|
|
||||||
public @Nullable String getPermission() {
|
public @Nullable String getPermission() {
|
||||||
return permission;
|
return permission;
|
||||||
}
|
}
|
||||||
@ -46,6 +52,14 @@ public class RewardContents {
|
|||||||
return commands;
|
return commands;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean checkPermission(@NotNull Player player) {
|
||||||
|
return permission == null || player.hasPermission(permission);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isTimeEnough(long requireSeconds) {
|
||||||
|
return getTime() >= requireSeconds;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
if (this == o) return true;
|
if (this == o) return true;
|
||||||
|
@ -28,7 +28,6 @@ public class TimeRewardUser {
|
|||||||
this(userUUID, claimedRewards, storedSeconds, System.currentTimeMillis());
|
this(userUUID, claimedRewards, storedSeconds, System.currentTimeMillis());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public TimeRewardUser(UUID userUUID, Set<@NotNull String> claimedRewards,
|
public TimeRewardUser(UUID userUUID, Set<@NotNull String> claimedRewards,
|
||||||
long storedSeconds, long joinMillis) {
|
long storedSeconds, long joinMillis) {
|
||||||
this.userUUID = userUUID;
|
this.userUUID = userUUID;
|
||||||
@ -81,7 +80,7 @@ public class TimeRewardUser {
|
|||||||
return this.claimedRewards.contains(rewardId);
|
return this.claimedRewards.contains(rewardId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean claimReward(@NotNull String rewardId) {
|
public boolean addClaimedReward(@NotNull String rewardId) {
|
||||||
if (isClaimed(rewardId)) return false; // 已经领取过了
|
if (isClaimed(rewardId)) return false; // 已经领取过了
|
||||||
this.claimedRewards.add(rewardId);
|
this.claimedRewards.add(rewardId);
|
||||||
return true;
|
return true;
|
||||||
|
@ -10,12 +10,12 @@ public class UserListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onJoin(PlayerJoinEvent event) {
|
public void onJoin(PlayerJoinEvent event) {
|
||||||
TimeRewardAPI.getUserManager().loadData(event.getPlayer().getUniqueId());
|
TimeRewardAPI.getUserManager().load(event.getPlayer().getUniqueId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onQuit(PlayerQuitEvent event) {
|
public void onQuit(PlayerQuitEvent event) {
|
||||||
TimeRewardAPI.getUserManager().unloadData(event.getPlayer().getUniqueId());
|
TimeRewardAPI.getUserManager().unload(event.getPlayer().getUniqueId());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,108 @@
|
|||||||
package cc.carm.plugin.timereward.manager;
|
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 {
|
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<RewardContents> 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<String, RewardContents> readRewards(@NotNull ConfigurationSection section) {
|
||||||
|
HashMap<String, RewardContents> 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<String, RewardContents> listRewards() {
|
||||||
|
return new HashMap<>(getRewardsMap());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected HashMap<String, RewardContents> getRewardsMap() {
|
||||||
|
return PluginConfig.REWARDS.getOptional().orElse(new HashMap<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<RewardContents> 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<String> 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -24,7 +24,7 @@ public class UserManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public TimeRewardUser readData(UUID userUUID) {
|
public TimeRewardUser read(UUID userUUID) {
|
||||||
try {
|
try {
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
DataManager storage = Main.getDataManager();
|
DataManager storage = Main.getDataManager();
|
||||||
@ -47,7 +47,7 @@ public class UserManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void saveData(TimeRewardUser user) {
|
public void save(TimeRewardUser user) {
|
||||||
try {
|
try {
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
DataManager dataManager = Main.getDataManager();
|
DataManager dataManager = Main.getDataManager();
|
||||||
@ -64,30 +64,30 @@ public class UserManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadData(UUID userUUID) {
|
public void load(UUID userUUID) {
|
||||||
getUsersMap().put(userUUID, readData(userUUID));
|
getUsersMap().put(userUUID, read(userUUID));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void unloadData(UUID userUUID) {
|
public void unload(UUID userUUID) {
|
||||||
unloadData(userUUID, true);
|
unload(userUUID, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void unloadData(UUID userUUID, boolean save) {
|
public void unload(UUID userUUID, boolean save) {
|
||||||
TimeRewardUser data = getData(userUUID);
|
TimeRewardUser data = get(userUUID);
|
||||||
if (data == null) return;
|
if (data == null) return;
|
||||||
if (save) saveData(data);
|
if (save) save(data);
|
||||||
getUsersMap().remove(userUUID);
|
getUsersMap().remove(userUUID);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadAll() {
|
public void loadAll() {
|
||||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||||
if (getUsersMap().containsKey(player.getUniqueId())) continue;
|
if (getUsersMap().containsKey(player.getUniqueId())) continue;
|
||||||
loadData(player.getUniqueId());
|
load(player.getUniqueId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void saveAll() {
|
public void saveAll() {
|
||||||
getUsersMap().values().forEach(this::saveData);
|
getUsersMap().values().forEach(this::save);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void unloadAll(boolean save) {
|
public void unloadAll(boolean save) {
|
||||||
@ -96,18 +96,18 @@ public class UserManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public TimeRewardUser getData(UUID userUUID) {
|
public TimeRewardUser get(UUID userUUID) {
|
||||||
return getUsersMap().get(userUUID);
|
return getUsersMap().get(userUUID);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public TimeRewardUser getData(Player player) {
|
public TimeRewardUser get(Player player) {
|
||||||
return getUsersMap().get(player.getUniqueId());
|
return getUsersMap().get(player.getUniqueId());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void editData(@NotNull UUID uuid, @NotNull DataTaskRunner task) {
|
public void editData(@NotNull UUID uuid, @NotNull DataTaskRunner task) {
|
||||||
TimeRewardUser user = getData(uuid);
|
TimeRewardUser user = get(uuid);
|
||||||
if (user == null) user = readData(uuid); // 不在线则加载数据
|
if (user == null) user = read(uuid); // 不在线则加载数据
|
||||||
try {
|
try {
|
||||||
task.run(user, Main.getDataManager());
|
task.run(user, Main.getDataManager());
|
||||||
} catch (Exception exception) {
|
} catch (Exception exception) {
|
||||||
@ -123,7 +123,7 @@ public class UserManager {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Unmodifiable
|
@Unmodifiable
|
||||||
public Map<UUID, TimeRewardUser> listUsers() {
|
public Map<UUID, TimeRewardUser> list() {
|
||||||
return new HashMap<>(getUsersMap());
|
return new HashMap<>(getUsersMap());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user