From 183135cc58879a967d12ca5270e4ab78f62ae96f Mon Sep 17 00:00:00 2001 From: yaohunya <1763917516@qq.com> Date: Sat, 12 Jul 2025 07:54:30 +0800 Subject: [PATCH] 1.2.0 --- .../yaohun/consumereward/data/RewardData.java | 24 ++++++++++++ .../yaohun/consumereward/gui/RewardGui.java | 37 +++++++++++++++++++ .../consumereward/manage/PlayerManager.java | 18 +++++++++ .../yaohun/consumereward/util/StackUtil.java | 25 +++++++++++++ 4 files changed, 104 insertions(+) diff --git a/src/main/java/com/yaohun/consumereward/data/RewardData.java b/src/main/java/com/yaohun/consumereward/data/RewardData.java index d8d5a8e..b0d1dfb 100644 --- a/src/main/java/com/yaohun/consumereward/data/RewardData.java +++ b/src/main/java/com/yaohun/consumereward/data/RewardData.java @@ -6,18 +6,35 @@ import org.bukkit.entity.Player; import java.util.List; +/** + * RewardData 类用于存储和管理消费奖励的相关数据 + */ public class RewardData { + // 奖励的唯一键值 private String rewardKey; + // 奖励在界面中的槽位 private int slot; + // 需要消耗的金额 private int needConsume; + // 额外背包槽位奖励数量 private int backpackSlot; + // 物品的NBT数据 private String itemNbt; + // 奖励的描述信息 private List rewardLore; + // 执行的命令列表 private List commandList; + /** + * 构造一个新的 RewardData 对象 + * + * @param rewardKey 奖励的唯一键值 + * @param section 配置文件的 ConfigurationSection 对象,用于读取奖励数据 + */ public RewardData(String rewardKey, ConfigurationSection section){ this.rewardKey = rewardKey; + // 从配置中读取奖励数据 this.slot = section.getInt(rewardKey+".slot"); this.needConsume = section.getInt(rewardKey+".needConsume"); this.backpackSlot = section.getInt(rewardKey+".backpackSlot"); @@ -26,6 +43,7 @@ public class RewardData { this.commandList = section.getStringList(rewardKey+".commandList"); } + // 以下为获取奖励数据的getter方法 public String getRewardKey() { return rewardKey; } @@ -44,6 +62,12 @@ public class RewardData { public List getRewardLore() { return rewardLore; } + + /** + * 发放奖励给指定玩家 + * + * @param player 接收奖励的玩家对象 + */ public void carryOutReward(Player player){ String playerName = player.getName(); // 遍历所有命令并执行 diff --git a/src/main/java/com/yaohun/consumereward/gui/RewardGui.java b/src/main/java/com/yaohun/consumereward/gui/RewardGui.java index 5d3d6a4..6bcfead 100644 --- a/src/main/java/com/yaohun/consumereward/gui/RewardGui.java +++ b/src/main/java/com/yaohun/consumereward/gui/RewardGui.java @@ -20,45 +20,78 @@ import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +/** + * 奖励界面类,负责处理奖励界面的展示和点击事件 + */ public class RewardGui implements Listener { + /** + * 打开奖励界面的方法 + * + * @param player 打开界面的玩家 + */ public static void OpenGui(Player player){ + // 获取玩家名称 String playerName = player.getName(); + // 创建奖励界面 Inventory inv = Bukkit.createInventory(null,54, Config.langData.getMessage("invTitle")); + // 填充界面底部的玻璃物品 for (int i = 0;i<9;i++){ inv.setItem(i, DemonAPI.glass(DemonAPI.getRandomInt(7,1),"§r")); } + // 设置玩家数据展示位置 inv.setItem(4, StackUtil.getDataInfo(playerName)); + // 获取玩家管理器和玩家数据 PlayerManager playerManager = ConsumeReward.getPlayerManager(); PlayerData playerData = playerManager.getPlayerData(playerName); + // 根据配置文件设置奖励展示位置 for (RewardData rewardData : Config.getRewardDataList()){ inv.setItem(rewardData.getSlot(), StackUtil.getRewardGiftBox(playerData, rewardData)); } + // 打开界面 player.openInventory(inv); } + /** + * 处理界面点击事件的方法 + * + * @param e 界面点击事件 + */ @EventHandler public void onClick(InventoryClickEvent e){ + // 获取点击的原始槽位和玩家信息 int rawSlot = e.getRawSlot(); Player player = (Player) e.getWhoClicked(); String playerName = player.getName(); + // 检查界面标题是否匹配 if(e.getView().getTitle().equalsIgnoreCase(Config.langData.getMessage("invTitle"))) { + // 取消默认事件 e.setCancelled(true); + // 检查点击的槽位是否有效 if (rawSlot >= 0 && rawSlot < e.getInventory().getSize()) { + // 获取点击的物品 ItemStack stack = e.getCurrentItem(); + // 检查物品是否为空或无效 if (DemonAPI.itemIsNull(stack) || DemonAPI.itemIsLore(stack)) { return; } + // 读取物品的NBT数据 NbtItem nbtItem = new NbtItem(stack); + // 检查物品是否包含奖励键 if (nbtItem.hasKey("rewardKey")) { + // 获取奖励键值 String value = nbtItem.getString("rewardKey"); + // 根据奖励键获取奖励数据 RewardData rewardData = Config.getRewardData(value); + // 检查奖励数据是否存在 if (rewardData == null) { return; } + // 检查玩家背包是否有足够的空位 int backpackSlot = rewardData.getBackpackSlot(); if (!DemonAPI.hasEmptyInventorySlots(player, backpackSlot)) { MessageUtil.sendMessageKey(player, "notEnoughInventorySlots", Sound.ENTITY_VILLAGER_NO); return; } + // 检查玩家是否有足够的消费值 int needConsume = rewardData.getNeedConsume(); int consumeValue = ConsumeAPI.getConsumeData(playerName, TimeType.ANNUAL); if (needConsume > consumeValue) { @@ -68,20 +101,24 @@ public class RewardGui implements Listener { MessageUtil.sendMessage(player, message, Sound.ENTITY_VILLAGER_NO); return; } + // 检查玩家是否已经领取过奖励 PlayerManager playerManager = ConsumeReward.getPlayerManager(); PlayerData playerData = playerManager.getPlayerData(playerName); if (playerData.isReceive(value)) { MessageUtil.sendMessageKey(player, "alreadyReceived", Sound.ENTITY_VILLAGER_NO); return; } + // 关闭界面,更新玩家数据,发放奖励 player.closeInventory(); playerData.addRewardReceive(value); playerData.savePlayerData(); rewardData.carryOutReward(player); + // 广播奖励信息 String message = Config.langData.getMessage("announcement"); message = message.replace("{name}", playerName); message = message.replace("{itemName}", DemonAPI.getItemName(stack)); Bukkit.broadcastMessage(message); + // 发送奖励成功领取信息 MessageUtil.sendMessageKey(player, "receivedSuccessfully", Sound.ENTITY_PLAYER_LEVELUP); } } diff --git a/src/main/java/com/yaohun/consumereward/manage/PlayerManager.java b/src/main/java/com/yaohun/consumereward/manage/PlayerManager.java index 6b0972e..3b47da1 100644 --- a/src/main/java/com/yaohun/consumereward/manage/PlayerManager.java +++ b/src/main/java/com/yaohun/consumereward/manage/PlayerManager.java @@ -4,16 +4,34 @@ import com.yaohun.consumereward.data.PlayerData; import java.util.HashMap; +/** + * 玩家管理器类,用于管理游戏中的玩家数据 + */ public class PlayerManager { + /** + * 存储玩家数据的映射表,键为玩家名称,值为玩家数据对象 + */ private HashMap playerDataMap = new HashMap<>(); + /** + * 获取玩家数据如果玩家数据不存在,则创建新的玩家数据对象 + * + * @param playerName 玩家名称,用于标识玩家数据 + * @return 玩家数据对象,如果之前不存在则返回新创建的玩家数据对象 + */ public PlayerData getPlayerData(String playerName) { + // 检查映射表中是否已存在该玩家的玩家数据 if(!playerDataMap.containsKey(playerName)){ + // 如果不存在,创建新的玩家数据对象 PlayerData playerData = new PlayerData(playerName); + // 将新的玩家数据对象添加到映射表中 playerDataMap.put(playerName, playerData); + // 返回新的玩家数据对象 return playerData; } + // 如果存在,直接返回该玩家的玩家数据对象 return playerDataMap.get(playerName); } } + diff --git a/src/main/java/com/yaohun/consumereward/util/StackUtil.java b/src/main/java/com/yaohun/consumereward/util/StackUtil.java index 9ef94c9..eb16427 100644 --- a/src/main/java/com/yaohun/consumereward/util/StackUtil.java +++ b/src/main/java/com/yaohun/consumereward/util/StackUtil.java @@ -13,12 +13,24 @@ import org.bukkit.inventory.meta.ItemMeta; import java.util.ArrayList; import java.util.List; +/** + * StackUtil类用于处理物品堆的工具方法 + */ public class StackUtil { + /** + * 获取玩家的消费数据信息物品堆 + * + * @param playerName 玩家名 + * @return 包含玩家消费数据的物品堆 + */ public static ItemStack getDataInfo(String playerName){ + // 获取配置中的数据信息物品堆模板 ItemStack stack = Config.getItemStack("dataInfo"); ItemMeta meta = stack.getItemMeta(); List lore = meta.getLore(); + + // 遍历物品堆的附带信息,替换{name}和{consume}占位符 for (int i = 0; i < lore.size(); i++){ String line = lore.get(i); if(line.contains("{name}")){ @@ -30,16 +42,26 @@ public class StackUtil { lore.set(i, line.replace("{consume}", String.valueOf(consumeValue))); } } + meta.setLore(lore); stack.setItemMeta(meta); return stack; } + /** + * 获取玩家的奖励礼品盒物品堆 + * + * @param playerData 玩家数据对象 + * @param rewardData 奖励数据对象 + * @return 包含奖励信息的物品堆 + */ public static ItemStack getRewardGiftBox(PlayerData playerData, RewardData rewardData){ String rewardKey = rewardData.getRewardKey(); ItemStack stack = Config.getItemStack("rewardGiftBox"); ItemMeta meta = stack.getItemMeta(); List newLore = new ArrayList<>(); + + // 根据玩家是否已领取奖励和奖励的附带信息更新物品堆的附带信息 for (String line : meta.getLore()){ if(line.contains("{stats}")){ if(playerData.isReceive(rewardKey)){ @@ -53,8 +75,11 @@ public class StackUtil { newLore.add(line); } } + meta.setLore(newLore); stack.setItemMeta(meta); + + // 使用NbtItem来设置物品堆的特殊数据 NbtItem nbtItem = new NbtItem(stack); nbtItem.setString("rewardKey", rewardKey); return nbtItem.getItem();