1.2.0
This commit is contained in:
parent
d0d574eedf
commit
183135cc58
|
@ -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();
|
||||||
// 遍历所有命令并执行
|
// 遍历所有命令并执行
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user