This commit is contained in:
yaohunya 2025-07-12 07:54:30 +08:00
parent d0d574eedf
commit 183135cc58
4 changed files with 104 additions and 0 deletions

View File

@ -6,18 +6,35 @@ import org.bukkit.entity.Player;
import java.util.List; import java.util.List;
/**
* RewardData 类用于存储和管理消费奖励的相关数据
*/
public class RewardData { public class RewardData {
// 奖励的唯一键值
private String rewardKey; private String rewardKey;
// 奖励在界面中的槽位
private int slot; private int slot;
// 需要消耗的金额
private int needConsume; private int needConsume;
// 额外背包槽位奖励数量
private int backpackSlot; private int backpackSlot;
// 物品的NBT数据
private String itemNbt; private String itemNbt;
// 奖励的描述信息
private List<String> rewardLore; private List<String> rewardLore;
// 执行的命令列表
private List<String> commandList; private List<String> commandList;
/**
* 构造一个新的 RewardData 对象
*
* @param rewardKey 奖励的唯一键值
* @param section 配置文件的 ConfigurationSection 对象用于读取奖励数据
*/
public RewardData(String rewardKey, ConfigurationSection section){ public RewardData(String rewardKey, ConfigurationSection section){
this.rewardKey = rewardKey; this.rewardKey = rewardKey;
// 从配置中读取奖励数据
this.slot = section.getInt(rewardKey+".slot"); this.slot = section.getInt(rewardKey+".slot");
this.needConsume = section.getInt(rewardKey+".needConsume"); this.needConsume = section.getInt(rewardKey+".needConsume");
this.backpackSlot = section.getInt(rewardKey+".backpackSlot"); this.backpackSlot = section.getInt(rewardKey+".backpackSlot");
@ -26,6 +43,7 @@ public class RewardData {
this.commandList = section.getStringList(rewardKey+".commandList"); this.commandList = section.getStringList(rewardKey+".commandList");
} }
// 以下为获取奖励数据的getter方法
public String getRewardKey() { public String getRewardKey() {
return rewardKey; return rewardKey;
} }
@ -44,6 +62,12 @@ public class RewardData {
public List<String> getRewardLore() { public List<String> getRewardLore() {
return rewardLore; return rewardLore;
} }
/**
* 发放奖励给指定玩家
*
* @param player 接收奖励的玩家对象
*/
public void carryOutReward(Player player){ public void carryOutReward(Player player){
String playerName = player.getName(); String playerName = player.getName();
// 遍历所有命令并执行 // 遍历所有命令并执行

View File

@ -20,45 +20,78 @@ import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
/**
* 奖励界面类负责处理奖励界面的展示和点击事件
*/
public class RewardGui implements Listener { public class RewardGui implements Listener {
/**
* 打开奖励界面的方法
*
* @param player 打开界面的玩家
*/
public static void OpenGui(Player player){ public static void OpenGui(Player player){
// 获取玩家名称
String playerName = player.getName(); String playerName = player.getName();
// 创建奖励界面
Inventory inv = Bukkit.createInventory(null,54, Config.langData.getMessage("invTitle")); 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")); } for (int i = 0;i<9;i++){ inv.setItem(i, DemonAPI.glass(DemonAPI.getRandomInt(7,1),"§r")); }
// 设置玩家数据展示位置
inv.setItem(4, StackUtil.getDataInfo(playerName)); inv.setItem(4, StackUtil.getDataInfo(playerName));
// 获取玩家管理器和玩家数据
PlayerManager playerManager = ConsumeReward.getPlayerManager(); PlayerManager playerManager = ConsumeReward.getPlayerManager();
PlayerData playerData = playerManager.getPlayerData(playerName); PlayerData playerData = playerManager.getPlayerData(playerName);
// 根据配置文件设置奖励展示位置
for (RewardData rewardData : Config.getRewardDataList()){ for (RewardData rewardData : Config.getRewardDataList()){
inv.setItem(rewardData.getSlot(), StackUtil.getRewardGiftBox(playerData, rewardData)); inv.setItem(rewardData.getSlot(), StackUtil.getRewardGiftBox(playerData, rewardData));
} }
// 打开界面
player.openInventory(inv); player.openInventory(inv);
} }
/**
* 处理界面点击事件的方法
*
* @param e 界面点击事件
*/
@EventHandler @EventHandler
public void onClick(InventoryClickEvent e){ public void onClick(InventoryClickEvent e){
// 获取点击的原始槽位和玩家信息
int rawSlot = e.getRawSlot(); int rawSlot = e.getRawSlot();
Player player = (Player) e.getWhoClicked(); Player player = (Player) e.getWhoClicked();
String playerName = player.getName(); String playerName = player.getName();
// 检查界面标题是否匹配
if(e.getView().getTitle().equalsIgnoreCase(Config.langData.getMessage("invTitle"))) { if(e.getView().getTitle().equalsIgnoreCase(Config.langData.getMessage("invTitle"))) {
// 取消默认事件
e.setCancelled(true); e.setCancelled(true);
// 检查点击的槽位是否有效
if (rawSlot >= 0 && rawSlot < e.getInventory().getSize()) { if (rawSlot >= 0 && rawSlot < e.getInventory().getSize()) {
// 获取点击的物品
ItemStack stack = e.getCurrentItem(); ItemStack stack = e.getCurrentItem();
// 检查物品是否为空或无效
if (DemonAPI.itemIsNull(stack) || DemonAPI.itemIsLore(stack)) { if (DemonAPI.itemIsNull(stack) || DemonAPI.itemIsLore(stack)) {
return; return;
} }
// 读取物品的NBT数据
NbtItem nbtItem = new NbtItem(stack); NbtItem nbtItem = new NbtItem(stack);
// 检查物品是否包含奖励键
if (nbtItem.hasKey("rewardKey")) { if (nbtItem.hasKey("rewardKey")) {
// 获取奖励键值
String value = nbtItem.getString("rewardKey"); String value = nbtItem.getString("rewardKey");
// 根据奖励键获取奖励数据
RewardData rewardData = Config.getRewardData(value); RewardData rewardData = Config.getRewardData(value);
// 检查奖励数据是否存在
if (rewardData == null) { if (rewardData == null) {
return; return;
} }
// 检查玩家背包是否有足够的空位
int backpackSlot = rewardData.getBackpackSlot(); int backpackSlot = rewardData.getBackpackSlot();
if (!DemonAPI.hasEmptyInventorySlots(player, backpackSlot)) { if (!DemonAPI.hasEmptyInventorySlots(player, backpackSlot)) {
MessageUtil.sendMessageKey(player, "notEnoughInventorySlots", Sound.ENTITY_VILLAGER_NO); MessageUtil.sendMessageKey(player, "notEnoughInventorySlots", Sound.ENTITY_VILLAGER_NO);
return; return;
} }
// 检查玩家是否有足够的消费值
int needConsume = rewardData.getNeedConsume(); int needConsume = rewardData.getNeedConsume();
int consumeValue = ConsumeAPI.getConsumeData(playerName, TimeType.ANNUAL); int consumeValue = ConsumeAPI.getConsumeData(playerName, TimeType.ANNUAL);
if (needConsume > consumeValue) { if (needConsume > consumeValue) {
@ -68,20 +101,24 @@ public class RewardGui implements Listener {
MessageUtil.sendMessage(player, message, Sound.ENTITY_VILLAGER_NO); MessageUtil.sendMessage(player, message, Sound.ENTITY_VILLAGER_NO);
return; return;
} }
// 检查玩家是否已经领取过奖励
PlayerManager playerManager = ConsumeReward.getPlayerManager(); PlayerManager playerManager = ConsumeReward.getPlayerManager();
PlayerData playerData = playerManager.getPlayerData(playerName); PlayerData playerData = playerManager.getPlayerData(playerName);
if (playerData.isReceive(value)) { if (playerData.isReceive(value)) {
MessageUtil.sendMessageKey(player, "alreadyReceived", Sound.ENTITY_VILLAGER_NO); MessageUtil.sendMessageKey(player, "alreadyReceived", Sound.ENTITY_VILLAGER_NO);
return; return;
} }
// 关闭界面更新玩家数据发放奖励
player.closeInventory(); player.closeInventory();
playerData.addRewardReceive(value); playerData.addRewardReceive(value);
playerData.savePlayerData(); playerData.savePlayerData();
rewardData.carryOutReward(player); rewardData.carryOutReward(player);
// 广播奖励信息
String message = Config.langData.getMessage("announcement"); String message = Config.langData.getMessage("announcement");
message = message.replace("{name}", playerName); message = message.replace("{name}", playerName);
message = message.replace("{itemName}", DemonAPI.getItemName(stack)); message = message.replace("{itemName}", DemonAPI.getItemName(stack));
Bukkit.broadcastMessage(message); Bukkit.broadcastMessage(message);
// 发送奖励成功领取信息
MessageUtil.sendMessageKey(player, "receivedSuccessfully", Sound.ENTITY_PLAYER_LEVELUP); MessageUtil.sendMessageKey(player, "receivedSuccessfully", Sound.ENTITY_PLAYER_LEVELUP);
} }
} }

View File

@ -4,16 +4,34 @@ import com.yaohun.consumereward.data.PlayerData;
import java.util.HashMap; import java.util.HashMap;
/**
* 玩家管理器类用于管理游戏中的玩家数据
*/
public class PlayerManager { public class PlayerManager {
/**
* 存储玩家数据的映射表键为玩家名称值为玩家数据对象
*/
private HashMap<String, PlayerData> playerDataMap = new HashMap<>(); private HashMap<String, PlayerData> playerDataMap = new HashMap<>();
/**
* 获取玩家数据如果玩家数据不存在则创建新的玩家数据对象
*
* @param playerName 玩家名称用于标识玩家数据
* @return 玩家数据对象如果之前不存在则返回新创建的玩家数据对象
*/
public PlayerData getPlayerData(String playerName) { public PlayerData getPlayerData(String playerName) {
// 检查映射表中是否已存在该玩家的玩家数据
if(!playerDataMap.containsKey(playerName)){ if(!playerDataMap.containsKey(playerName)){
// 如果不存在创建新的玩家数据对象
PlayerData playerData = new PlayerData(playerName); PlayerData playerData = new PlayerData(playerName);
// 将新的玩家数据对象添加到映射表中
playerDataMap.put(playerName, playerData); playerDataMap.put(playerName, playerData);
// 返回新的玩家数据对象
return playerData; return playerData;
} }
// 如果存在直接返回该玩家的玩家数据对象
return playerDataMap.get(playerName); return playerDataMap.get(playerName);
} }
} }

View File

@ -13,12 +13,24 @@ import org.bukkit.inventory.meta.ItemMeta;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/**
* StackUtil类用于处理物品堆的工具方法
*/
public class StackUtil { public class StackUtil {
/**
* 获取玩家的消费数据信息物品堆
*
* @param playerName 玩家名
* @return 包含玩家消费数据的物品堆
*/
public static ItemStack getDataInfo(String playerName){ public static ItemStack getDataInfo(String playerName){
// 获取配置中的数据信息物品堆模板
ItemStack stack = Config.getItemStack("dataInfo"); ItemStack stack = Config.getItemStack("dataInfo");
ItemMeta meta = stack.getItemMeta(); ItemMeta meta = stack.getItemMeta();
List<String> lore = meta.getLore(); List<String> lore = meta.getLore();
// 遍历物品堆的附带信息替换{name}{consume}占位符
for (int i = 0; i < lore.size(); i++){ for (int i = 0; i < lore.size(); i++){
String line = lore.get(i); String line = lore.get(i);
if(line.contains("{name}")){ if(line.contains("{name}")){
@ -30,16 +42,26 @@ public class StackUtil {
lore.set(i, line.replace("{consume}", String.valueOf(consumeValue))); lore.set(i, line.replace("{consume}", String.valueOf(consumeValue)));
} }
} }
meta.setLore(lore); meta.setLore(lore);
stack.setItemMeta(meta); stack.setItemMeta(meta);
return stack; return stack;
} }
/**
* 获取玩家的奖励礼品盒物品堆
*
* @param playerData 玩家数据对象
* @param rewardData 奖励数据对象
* @return 包含奖励信息的物品堆
*/
public static ItemStack getRewardGiftBox(PlayerData playerData, RewardData rewardData){ public static ItemStack getRewardGiftBox(PlayerData playerData, RewardData rewardData){
String rewardKey = rewardData.getRewardKey(); String rewardKey = rewardData.getRewardKey();
ItemStack stack = Config.getItemStack("rewardGiftBox"); ItemStack stack = Config.getItemStack("rewardGiftBox");
ItemMeta meta = stack.getItemMeta(); ItemMeta meta = stack.getItemMeta();
List<String> newLore = new ArrayList<>(); List<String> newLore = new ArrayList<>();
// 根据玩家是否已领取奖励和奖励的附带信息更新物品堆的附带信息
for (String line : meta.getLore()){ for (String line : meta.getLore()){
if(line.contains("{stats}")){ if(line.contains("{stats}")){
if(playerData.isReceive(rewardKey)){ if(playerData.isReceive(rewardKey)){
@ -53,8 +75,11 @@ public class StackUtil {
newLore.add(line); newLore.add(line);
} }
} }
meta.setLore(newLore); meta.setLore(newLore);
stack.setItemMeta(meta); stack.setItemMeta(meta);
// 使用NbtItem来设置物品堆的特殊数据
NbtItem nbtItem = new NbtItem(stack); NbtItem nbtItem = new NbtItem(stack);
nbtItem.setString("rewardKey", rewardKey); nbtItem.setString("rewardKey", rewardKey);
return nbtItem.getItem(); return nbtItem.getItem();