155 lines
7.2 KiB
Java
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|