AuConsumeReward/src/main/java/com/yaohun/consumereward/gui/RewardGui.java
2025-07-13 05:48:35 +08:00

155 lines
7.2 KiB
Java

package com.yaohun.consumereward.gui;
import com.yaohun.aurechargedata.api.ConsumeAPI;
import com.yaohun.aurechargedata.util.TimeType;
import com.yaohun.consumereward.ConsumeReward;
import com.yaohun.consumereward.config.Config;
import com.yaohun.consumereward.data.PlayerData;
import com.yaohun.consumereward.data.RewardData;
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;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import java.util.UUID;
/**
* 奖励界面类,负责处理奖励界面的展示和点击事件
*/
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")); }
// 获取玩家管理器和玩家数据
PlayerManager playerManager = ConsumeReward.getPlayerManager();
PlayerData playerData = playerManager.getPlayerData(playerName);
// 设置玩家数据展示位置
inv.setItem(4, StackUtil.getDataInfo(playerData));
if(playerData.getRewardList().size() >= 16){
inv.setItem(22, Config.getItemStack("resetStack"));
} else {
// 根据配置文件设置奖励展示位置
for (RewardData rewardData : Config.getRewardDataList()) {
inv.setItem(rewardData.getSlot(), StackUtil.getRewardGiftBox(playerData, rewardData));
}
inv.setItem(40, Config.getItemStack("resetStackinAdvance"));
}
// 打开界面
player.openInventory(inv);
}
/**
* 处理界面点击事件的方法
*
* @param e 界面点击事件
*/
@EventHandler
public void onClick(InventoryClickEvent e){
// 获取点击的原始槽位和玩家信息
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"))) {
// 取消默认事件
e.setCancelled(true);
// 检查点击的槽位是否有效
if (rawSlot >= 0 && rawSlot < e.getInventory().getSize()) {
// 获取点击的物品
ItemStack stack = e.getCurrentItem();
// 检查物品是否为空或无效
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);
// 检查物品是否包含奖励键
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;
}
PlayerManager playerManager = ConsumeReward.getPlayerManager();
PlayerData playerData = playerManager.getPlayerData(playerName);
// 检查玩家是否有足够的消费值
int needConsume = rewardData.getNeedConsume();
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;
message = message.replace("{needConsume}", String.valueOf(newConsume));
MessageUtil.sendMessage(player, message, Sound.ENTITY_VILLAGER_NO);
return;
}
// 检查玩家是否已经领取过奖励
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);
// 发送奖励成功领取信息
String msg = Config.langData.getMessage("receivedSuccessfully");
MessageUtil.sendMessage(player, msg.replace("{itemName}", DemonAPI.getItemName(stack)), Sound.ENTITY_PLAYER_LEVELUP);
}
}
}
}
}