From ca3cc334ff45c809da4ee6c51a9f04832c8b7a75 Mon Sep 17 00:00:00 2001 From: yaohunya <1763917516@qq.com> Date: Sun, 13 Jul 2025 05:48:35 +0800 Subject: [PATCH] 1.2.5 --- .../yaohun/consumereward/ConsumeReward.java | 31 +++++ .../yaohun/consumereward/data/PlayerData.java | 107 +++++++++++------- .../yaohun/consumereward/gui/RewardGui.java | 28 ++++- .../consumereward/manage/PlayerManager.java | 8 ++ .../yaohun/consumereward/util/StackUtil.java | 3 + src/main/resources/plugin.yml | 2 +- 6 files changed, 135 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/yaohun/consumereward/ConsumeReward.java b/src/main/java/com/yaohun/consumereward/ConsumeReward.java index dab1a53..72b777c 100644 --- a/src/main/java/com/yaohun/consumereward/ConsumeReward.java +++ b/src/main/java/com/yaohun/consumereward/ConsumeReward.java @@ -52,6 +52,8 @@ public class ConsumeReward extends JavaPlugin { sender.sendMessage(""); sender.sendMessage("§e------- ======= §6累积消费礼包 §e======= -------"); sender.sendMessage("§2/"+label+" open §f- §2打开界面"); + sender.sendMessage("§2/"+label+" reset §e[玩家名] §f- §2重置玩家数据"); + sender.sendMessage("§2/"+label+" §e[奖励Key] §2<玩家名> §f- §2设置玩家领取状态"); sender.sendMessage("§2/"+label+" reload §f- §2重载配置文件"); sender.sendMessage("§2/"+label+" convert §f- §c导入旧版奖励领取数据"); sender.sendMessage("§e------- ======= §6累积消费礼包 §e======= -------"); @@ -60,9 +62,38 @@ public class ConsumeReward extends JavaPlugin { } if("reload".equalsIgnoreCase(args[0])){ Config.reloadConfig(this); + playerManager.saveAllPlayerData(); sender.sendMessage("[消费奖励] 配置文件已重载."); return true; } + if("reset".equalsIgnoreCase(args[0])){ + if(args.length == 1){ + sender.sendMessage("[消费奖励] 缺少玩家名参数."); + return true; + } + String playerName = args[1]; + PlayerData playerData = playerManager.getPlayerData(playerName); + playerData.carryOutRound(); + sender.sendMessage("[消费奖励] 玩家 "+playerName+" 已完成重置."); + return true; + } + if(args.length == 2) { + String rewardKey = args[0]; + if(Config.getRewardData(rewardKey) == null){ + sender.sendMessage("[消费奖励] 奖励代号 "+rewardKey+" 不存在."); + return true; + } + String playerName = args[1]; + PlayerData playerData = playerManager.getPlayerData(playerName); + if(playerData.isReceive(rewardKey)){ + playerData.removeRewardReceive(rewardKey); + sender.sendMessage("[消费奖励] 玩家: "+playerName+" 奖励: "+rewardKey+" [SET] NO"); + } else { + playerData.addRewardReceive(rewardKey); + sender.sendMessage("[消费奖励] 玩家: "+playerName+" 奖励: "+rewardKey+" [SET] YES"); + } + return true; + } if("convert".equalsIgnoreCase(args[0])){ // 转换后的 map: 玩家名 -> 参与的 key 列表 Map> playerToKeys = new TreeMap<>(); diff --git a/src/main/java/com/yaohun/consumereward/data/PlayerData.java b/src/main/java/com/yaohun/consumereward/data/PlayerData.java index 5fbc32f..bc33590 100644 --- a/src/main/java/com/yaohun/consumereward/data/PlayerData.java +++ b/src/main/java/com/yaohun/consumereward/data/PlayerData.java @@ -1,50 +1,65 @@ package com.yaohun.consumereward.data; +import com.yaohun.aurechargedata.api.ConsumeAPI; +import com.yaohun.aurechargedata.util.TimeType; +import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; -import java.io.File; -import java.io.IOException; -import java.util.List; - -import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; import java.io.IOException; import java.util.*; +/** + * 玩家数据类:用于管理每个玩家在消费奖励系统中的轮次、记录消费值以及已领取的奖励 + */ public class PlayerData { - /** - * 玩家数据类,用于管理玩家的奖励接收情况 - */ + // 玩家名称 private final String playerName; + // 玩家当前所在的消费轮次 private int roundAmount; - + // 玩家该轮次记录下来的消费总额 private int recordConsume; - - /** - * 存储玩家已接收的奖励列表 - * 使用 Set 而不是 List 来提升 contains 方法的性能,因为 Set 的查找效率更高 - */ + // 玩家已领取的奖励Key集合(使用LinkedHashSet确保顺序 + 去重) private final Set rewardList; /** - * 构造玩家数据对象,根据玩家名称加载其奖励接收数据 + * 构造方法:从本地配置文件加载指定玩家的数据 * - * @param playerName 玩家名称,用于标识和加载玩家数据 + * @param playerName 玩家名称 */ public PlayerData(String playerName) { this.playerName = playerName; - // 加载玩家的奖励数据文件 File file = new File("plugins/AuData/ConsumeReward", playerName + ".yml"); YamlConfiguration config = YamlConfiguration.loadConfiguration(file); + this.roundAmount = config.getInt("RoundAmount"); this.recordConsume = config.getInt("RecordConsume"); + // 保持插入顺序、防止重复 List rewards = config.getStringList("RewardsReceive"); - // 使用 LinkedHashSet 保持插入顺序,避免重复 this.rewardList = new LinkedHashSet<>(rewards); } + /** + * 执行“新一轮”操作: + * - 轮次数+1 + * - 记录新的年度消费值 + * - 清空已领取奖励记录 + * - 保存数据到文件 + */ + public void carryOutRound() { + setRoundAmount(getRoundAmount() + 1); + int consumeValue = ConsumeAPI.getConsumeData(playerName, TimeType.ANNUAL); + setRecordConsume(consumeValue); + // 清空奖励记录 + setRewardList(new ArrayList<>()); + + savePlayerData(); + Bukkit.getLogger().info("[消费奖励 - 重置] " + playerName + " 已执行累积消费重置."); + } + + // Getter 方法 public String getPlayerName() { return playerName; @@ -54,60 +69,72 @@ public class PlayerData { return roundAmount; } - public void setRoundAmount(int roundAmount) { - this.roundAmount = roundAmount; - } - public int getRecordConsume() { return recordConsume; } + public Set getRewardList() { + return rewardList; + } + + // Setter 方法 + + public void setRoundAmount(int roundAmount) { + this.roundAmount = roundAmount; + } + public void setRecordConsume(int recordConsume) { this.recordConsume = recordConsume; } /** - * 检查玩家是否已经接收了指定的奖励 + * 替换奖励领取列表(避免重复) * - * @param rewardKey 奖励的唯一键,用于标识特定的奖励 - * @return 如果玩家已经接收了指定的奖励,则返回 true;否则返回 false + * @param rewardList 新的奖励列表 + */ + public void setRewardList(List rewardList) { + this.rewardList.clear(); + this.rewardList.addAll(new LinkedHashSet<>(rewardList)); + } + + // 奖励记录操作 + + /** + * 检查玩家是否已经领取了某个奖励 + * + * @param rewardKey 奖励唯一标识 + * @return 是否已领取 */ public boolean isReceive(String rewardKey) { return rewardList.contains(rewardKey); } /** - * 向玩家的奖励列表中添加一个新的奖励 + * 添加一项已领取的奖励 * - * @param rewardKey 新增奖励的唯一键,用于标识特定的奖励 + * @param rewardKey 奖励唯一标识 */ public void addRewardReceive(String rewardKey) { rewardList.add(rewardKey); } /** - * 设置玩家的奖励列表,替换现有的奖励列表 + * 移除一项已领取的奖励(如回滚操作) * - * @param rewardList 新的奖励列表,不含重复项 + * @param rewardKey 奖励唯一标识 */ - public void setRewardList(List rewardList) { - this.rewardList.clear(); - // 使用 LinkedHashSet 包装列表以避免重复项,并保持插入顺序 - this.rewardList.addAll(new LinkedHashSet<>(rewardList)); - } - - public Set getRewardList() { - return rewardList; + public void removeRewardReceive(String rewardKey) { + rewardList.remove(rewardKey); } /** - * 保存玩家的奖励接收数据到文件 - * 将 Set 类型的 rewardList 转换回 List 类型以保存到 YAML 文件中 + * 保存当前玩家数据到本地配置文件(YAML) */ public void savePlayerData() { File file = new File("plugins/AuData/ConsumeReward", playerName + ".yml"); YamlConfiguration config = YamlConfiguration.loadConfiguration(file); - // 将 Set 转换回 List 以保存 + config.set("RoundAmount", roundAmount); + config.set("RecordConsume", recordConsume); config.set("RewardsReceive", new ArrayList<>(rewardList)); try { config.save(file); diff --git a/src/main/java/com/yaohun/consumereward/gui/RewardGui.java b/src/main/java/com/yaohun/consumereward/gui/RewardGui.java index 540638a..c07e7af 100644 --- a/src/main/java/com/yaohun/consumereward/gui/RewardGui.java +++ b/src/main/java/com/yaohun/consumereward/gui/RewardGui.java @@ -10,6 +10,7 @@ import com.yaohun.consumereward.manage.PlayerManager; import com.yaohun.consumereward.util.MessageUtil; import com.yaohun.consumereward.util.StackUtil; import me.Demon.DemonPlugin.DemonAPI; +import me.Demon.DemonPlugin.Util.CDTimeAPI; import me.Demon.DemonPlugin.data.NbtItem; import org.bukkit.Bukkit; import org.bukkit.Sound; @@ -20,6 +21,8 @@ import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import java.util.UUID; + /** * 奖励界面类,负责处理奖励界面的展示和点击事件 */ @@ -49,6 +52,7 @@ public class RewardGui implements Listener { for (RewardData rewardData : Config.getRewardDataList()) { inv.setItem(rewardData.getSlot(), StackUtil.getRewardGiftBox(playerData, rewardData)); } + inv.setItem(40, Config.getItemStack("resetStackinAdvance")); } // 打开界面 player.openInventory(inv); @@ -64,6 +68,7 @@ public class RewardGui implements Listener { // 获取点击的原始槽位和玩家信息 int rawSlot = e.getRawSlot(); Player player = (Player) e.getWhoClicked(); + UUID uuid = player.getUniqueId(); String playerName = player.getName(); // 检查界面标题是否匹配 if(e.getView().getTitle().equalsIgnoreCase(Config.langData.getMessage("invTitle"))) { @@ -77,6 +82,22 @@ public class RewardGui implements Listener { if (DemonAPI.itemIsNull(stack) || DemonAPI.itemIsLore(stack)) { return; } + if(rawSlot == 40){ + player.closeInventory(); + if(!CDTimeAPI.isCD(uuid,"reset_confirm")){ + CDTimeAPI.setPlayerCD(uuid,"reset_confirm", 1000 * 5); + MessageUtil.sendMessageKey(player,"resetConfirm", Sound.ENTITY_BLAZE_DEATH); + return; + } + PlayerManager playerManager = ConsumeReward.getPlayerManager(); + PlayerData playerData = playerManager.getPlayerData(playerName); + if(playerData.getRewardList().size() < 8){ + MessageUtil.sendMessageKey(player,"minimumRequirements", Sound.ENTITY_VILLAGER_NO); + return; + } + playerData.carryOutRound(); + return; + } // 读取物品的NBT数据 NbtItem nbtItem = new NbtItem(stack); // 检查物品是否包含奖励键 @@ -95,9 +116,12 @@ public class RewardGui implements Listener { MessageUtil.sendMessageKey(player, "notEnoughInventorySlots", Sound.ENTITY_VILLAGER_NO); return; } + PlayerManager playerManager = ConsumeReward.getPlayerManager(); + PlayerData playerData = playerManager.getPlayerData(playerName); // 检查玩家是否有足够的消费值 int needConsume = rewardData.getNeedConsume(); - int consumeValue = ConsumeAPI.getConsumeData(playerName, TimeType.ANNUAL); + int recordingConsume = playerData.getRecordConsume(); + int consumeValue = ConsumeAPI.getConsumeData(playerName, TimeType.ANNUAL) - recordingConsume; if (needConsume > consumeValue) { String message = Config.langData.getMessage("notEnoughConsume"); int newConsume = needConsume - consumeValue; @@ -106,8 +130,6 @@ public class RewardGui implements Listener { return; } // 检查玩家是否已经领取过奖励 - PlayerManager playerManager = ConsumeReward.getPlayerManager(); - PlayerData playerData = playerManager.getPlayerData(playerName); if (playerData.isReceive(value)) { MessageUtil.sendMessageKey(player, "alreadyReceived", Sound.ENTITY_VILLAGER_NO); return; diff --git a/src/main/java/com/yaohun/consumereward/manage/PlayerManager.java b/src/main/java/com/yaohun/consumereward/manage/PlayerManager.java index 3b47da1..d701e31 100644 --- a/src/main/java/com/yaohun/consumereward/manage/PlayerManager.java +++ b/src/main/java/com/yaohun/consumereward/manage/PlayerManager.java @@ -33,5 +33,13 @@ public class PlayerManager { // 如果存在,直接返回该玩家的玩家数据对象 return playerDataMap.get(playerName); } + + public void saveAllPlayerData() { + // 遍历映射表中的玩家数据对象 + for (PlayerData playerData : playerDataMap.values()) { + // 调用玩家数据对象的保存方法 + playerData.savePlayerData(); + } + } } diff --git a/src/main/java/com/yaohun/consumereward/util/StackUtil.java b/src/main/java/com/yaohun/consumereward/util/StackUtil.java index 69ca783..c73472e 100644 --- a/src/main/java/com/yaohun/consumereward/util/StackUtil.java +++ b/src/main/java/com/yaohun/consumereward/util/StackUtil.java @@ -70,6 +70,8 @@ public class StackUtil { String rewardKey = rewardData.getRewardKey(); ItemStack stack = Config.getItemStack("rewardGiftBox"); ItemMeta meta = stack.getItemMeta(); + String itemName = meta.getDisplayName(); + meta.setDisplayName(itemName.replace("{coins}",String.valueOf(rewardData.getNeedConsume()))); List newLore = new ArrayList<>(); // 根据玩家是否已领取奖励和奖励的附带信息更新物品堆的附带信息 @@ -93,6 +95,7 @@ public class StackUtil { // 使用NbtItem来设置物品堆的特殊数据 NbtItem nbtItem = new NbtItem(stack); nbtItem.setString("rewardKey", rewardKey); + nbtItem.setString("stex", rewardData.getItemNbt()); return nbtItem.getItem(); } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index afd1c5b..fac5619 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: AuConsumeReward main: com.yaohun.consumereward.ConsumeReward -version: 1.2.1 +version: 1.2.5 depend: - DemonAPI commands: