1.2.5
This commit is contained in:
parent
cf6c7c2a41
commit
ca3cc334ff
|
@ -52,6 +52,8 @@ public class ConsumeReward extends JavaPlugin {
|
||||||
sender.sendMessage("");
|
sender.sendMessage("");
|
||||||
sender.sendMessage("§e------- ======= §6累积消费礼包 §e======= -------");
|
sender.sendMessage("§e------- ======= §6累积消费礼包 §e======= -------");
|
||||||
sender.sendMessage("§2/"+label+" open §f- §2打开界面");
|
sender.sendMessage("§2/"+label+" open §f- §2打开界面");
|
||||||
|
sender.sendMessage("§2/"+label+" reset §e[玩家名] §f- §2重置玩家数据");
|
||||||
|
sender.sendMessage("§2/"+label+" §e[奖励Key] §2<玩家名> §f- §2设置玩家领取状态");
|
||||||
sender.sendMessage("§2/"+label+" reload §f- §2重载配置文件");
|
sender.sendMessage("§2/"+label+" reload §f- §2重载配置文件");
|
||||||
sender.sendMessage("§2/"+label+" convert §f- §c导入旧版奖励领取数据");
|
sender.sendMessage("§2/"+label+" convert §f- §c导入旧版奖励领取数据");
|
||||||
sender.sendMessage("§e------- ======= §6累积消费礼包 §e======= -------");
|
sender.sendMessage("§e------- ======= §6累积消费礼包 §e======= -------");
|
||||||
|
@ -60,9 +62,38 @@ public class ConsumeReward extends JavaPlugin {
|
||||||
}
|
}
|
||||||
if("reload".equalsIgnoreCase(args[0])){
|
if("reload".equalsIgnoreCase(args[0])){
|
||||||
Config.reloadConfig(this);
|
Config.reloadConfig(this);
|
||||||
|
playerManager.saveAllPlayerData();
|
||||||
sender.sendMessage("[消费奖励] 配置文件已重载.");
|
sender.sendMessage("[消费奖励] 配置文件已重载.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if("reset".equalsIgnoreCase(args[0])){
|
||||||
|
if(args.length == 1){
|
||||||
|
sender.sendMessage("[消费奖励] 缺少玩家名参数.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String playerName = args[1];
|
||||||
|
PlayerData playerData = playerManager.getPlayerData(playerName);
|
||||||
|
playerData.carryOutRound();
|
||||||
|
sender.sendMessage("[消费奖励] 玩家 "+playerName+" 已完成重置.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if(args.length == 2) {
|
||||||
|
String rewardKey = args[0];
|
||||||
|
if(Config.getRewardData(rewardKey) == null){
|
||||||
|
sender.sendMessage("[消费奖励] 奖励代号 "+rewardKey+" 不存在.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String playerName = args[1];
|
||||||
|
PlayerData playerData = playerManager.getPlayerData(playerName);
|
||||||
|
if(playerData.isReceive(rewardKey)){
|
||||||
|
playerData.removeRewardReceive(rewardKey);
|
||||||
|
sender.sendMessage("[消费奖励] 玩家: "+playerName+" 奖励: "+rewardKey+" [SET] NO");
|
||||||
|
} else {
|
||||||
|
playerData.addRewardReceive(rewardKey);
|
||||||
|
sender.sendMessage("[消费奖励] 玩家: "+playerName+" 奖励: "+rewardKey+" [SET] YES");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if("convert".equalsIgnoreCase(args[0])){
|
if("convert".equalsIgnoreCase(args[0])){
|
||||||
// 转换后的 map: 玩家名 -> 参与的 key 列表
|
// 转换后的 map: 玩家名 -> 参与的 key 列表
|
||||||
Map<String, List<String>> playerToKeys = new TreeMap<>();
|
Map<String, List<String>> playerToKeys = new TreeMap<>();
|
||||||
|
|
|
@ -1,50 +1,65 @@
|
||||||
package com.yaohun.consumereward.data;
|
package com.yaohun.consumereward.data;
|
||||||
|
|
||||||
|
import com.yaohun.aurechargedata.api.ConsumeAPI;
|
||||||
|
import com.yaohun.aurechargedata.util.TimeType;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.configuration.file.FileConfiguration;
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 玩家数据类:用于管理每个玩家在消费奖励系统中的轮次、记录消费值以及已领取的奖励
|
||||||
|
*/
|
||||||
public class PlayerData {
|
public class PlayerData {
|
||||||
|
|
||||||
/**
|
// 玩家名称
|
||||||
* 玩家数据类,用于管理玩家的奖励接收情况
|
|
||||||
*/
|
|
||||||
private final String playerName;
|
private final String playerName;
|
||||||
|
// 玩家当前所在的消费轮次
|
||||||
private int roundAmount;
|
private int roundAmount;
|
||||||
|
// 玩家该轮次记录下来的消费总额
|
||||||
private int recordConsume;
|
private int recordConsume;
|
||||||
|
// 玩家已领取的奖励Key集合(使用LinkedHashSet确保顺序 + 去重)
|
||||||
/**
|
|
||||||
* 存储玩家已接收的奖励列表
|
|
||||||
* 使用 Set 而不是 List 来提升 contains 方法的性能,因为 Set 的查找效率更高
|
|
||||||
*/
|
|
||||||
private final Set<String> rewardList;
|
private final Set<String> rewardList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构造玩家数据对象,根据玩家名称加载其奖励接收数据
|
* 构造方法:从本地配置文件加载指定玩家的数据
|
||||||
*
|
*
|
||||||
* @param playerName 玩家名称,用于标识和加载玩家数据
|
* @param playerName 玩家名称
|
||||||
*/
|
*/
|
||||||
public PlayerData(String playerName) {
|
public PlayerData(String playerName) {
|
||||||
this.playerName = playerName;
|
this.playerName = playerName;
|
||||||
// 加载玩家的奖励数据文件
|
|
||||||
File file = new File("plugins/AuData/ConsumeReward", playerName + ".yml");
|
File file = new File("plugins/AuData/ConsumeReward", playerName + ".yml");
|
||||||
YamlConfiguration config = YamlConfiguration.loadConfiguration(file);
|
YamlConfiguration config = YamlConfiguration.loadConfiguration(file);
|
||||||
|
|
||||||
this.roundAmount = config.getInt("RoundAmount");
|
this.roundAmount = config.getInt("RoundAmount");
|
||||||
this.recordConsume = config.getInt("RecordConsume");
|
this.recordConsume = config.getInt("RecordConsume");
|
||||||
|
// 保持插入顺序、防止重复
|
||||||
List<String> rewards = config.getStringList("RewardsReceive");
|
List<String> rewards = config.getStringList("RewardsReceive");
|
||||||
// 使用 LinkedHashSet 保持插入顺序,避免重复
|
|
||||||
this.rewardList = new LinkedHashSet<>(rewards);
|
this.rewardList = new LinkedHashSet<>(rewards);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行“新一轮”操作:
|
||||||
|
* - 轮次数+1
|
||||||
|
* - 记录新的年度消费值
|
||||||
|
* - 清空已领取奖励记录
|
||||||
|
* - 保存数据到文件
|
||||||
|
*/
|
||||||
|
public void carryOutRound() {
|
||||||
|
setRoundAmount(getRoundAmount() + 1);
|
||||||
|
int consumeValue = ConsumeAPI.getConsumeData(playerName, TimeType.ANNUAL);
|
||||||
|
setRecordConsume(consumeValue);
|
||||||
|
// 清空奖励记录
|
||||||
|
setRewardList(new ArrayList<>());
|
||||||
|
|
||||||
|
savePlayerData();
|
||||||
|
Bukkit.getLogger().info("[消费奖励 - 重置] " + playerName + " 已执行累积消费重置.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getter 方法
|
||||||
|
|
||||||
public String getPlayerName() {
|
public String getPlayerName() {
|
||||||
return playerName;
|
return playerName;
|
||||||
|
@ -54,60 +69,72 @@ public class PlayerData {
|
||||||
return roundAmount;
|
return roundAmount;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRoundAmount(int roundAmount) {
|
|
||||||
this.roundAmount = roundAmount;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getRecordConsume() {
|
public int getRecordConsume() {
|
||||||
return recordConsume;
|
return recordConsume;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Set<String> getRewardList() {
|
||||||
|
return rewardList;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setter 方法
|
||||||
|
|
||||||
|
public void setRoundAmount(int roundAmount) {
|
||||||
|
this.roundAmount = roundAmount;
|
||||||
|
}
|
||||||
|
|
||||||
public void setRecordConsume(int recordConsume) {
|
public void setRecordConsume(int recordConsume) {
|
||||||
this.recordConsume = recordConsume;
|
this.recordConsume = recordConsume;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查玩家是否已经接收了指定的奖励
|
* 替换奖励领取列表(避免重复)
|
||||||
*
|
*
|
||||||
* @param rewardKey 奖励的唯一键,用于标识特定的奖励
|
* @param rewardList 新的奖励列表
|
||||||
* @return 如果玩家已经接收了指定的奖励,则返回 true;否则返回 false
|
*/
|
||||||
|
public void setRewardList(List<String> rewardList) {
|
||||||
|
this.rewardList.clear();
|
||||||
|
this.rewardList.addAll(new LinkedHashSet<>(rewardList));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 奖励记录操作
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查玩家是否已经领取了某个奖励
|
||||||
|
*
|
||||||
|
* @param rewardKey 奖励唯一标识
|
||||||
|
* @return 是否已领取
|
||||||
*/
|
*/
|
||||||
public boolean isReceive(String rewardKey) {
|
public boolean isReceive(String rewardKey) {
|
||||||
return rewardList.contains(rewardKey);
|
return rewardList.contains(rewardKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 向玩家的奖励列表中添加一个新的奖励
|
* 添加一项已领取的奖励
|
||||||
*
|
*
|
||||||
* @param rewardKey 新增奖励的唯一键,用于标识特定的奖励
|
* @param rewardKey 奖励唯一标识
|
||||||
*/
|
*/
|
||||||
public void addRewardReceive(String rewardKey) {
|
public void addRewardReceive(String rewardKey) {
|
||||||
rewardList.add(rewardKey);
|
rewardList.add(rewardKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置玩家的奖励列表,替换现有的奖励列表
|
* 移除一项已领取的奖励(如回滚操作)
|
||||||
*
|
*
|
||||||
* @param rewardList 新的奖励列表,不含重复项
|
* @param rewardKey 奖励唯一标识
|
||||||
*/
|
*/
|
||||||
public void setRewardList(List<String> rewardList) {
|
public void removeRewardReceive(String rewardKey) {
|
||||||
this.rewardList.clear();
|
rewardList.remove(rewardKey);
|
||||||
// 使用 LinkedHashSet 包装列表以避免重复项,并保持插入顺序
|
|
||||||
this.rewardList.addAll(new LinkedHashSet<>(rewardList));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<String> getRewardList() {
|
|
||||||
return rewardList;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 保存玩家的奖励接收数据到文件
|
* 保存当前玩家数据到本地配置文件(YAML)
|
||||||
* 将 Set 类型的 rewardList 转换回 List 类型以保存到 YAML 文件中
|
|
||||||
*/
|
*/
|
||||||
public void savePlayerData() {
|
public void savePlayerData() {
|
||||||
File file = new File("plugins/AuData/ConsumeReward", playerName + ".yml");
|
File file = new File("plugins/AuData/ConsumeReward", playerName + ".yml");
|
||||||
YamlConfiguration config = YamlConfiguration.loadConfiguration(file);
|
YamlConfiguration config = YamlConfiguration.loadConfiguration(file);
|
||||||
// 将 Set 转换回 List 以保存
|
config.set("RoundAmount", roundAmount);
|
||||||
|
config.set("RecordConsume", recordConsume);
|
||||||
config.set("RewardsReceive", new ArrayList<>(rewardList));
|
config.set("RewardsReceive", new ArrayList<>(rewardList));
|
||||||
try {
|
try {
|
||||||
config.save(file);
|
config.save(file);
|
||||||
|
|
|
@ -10,6 +10,7 @@ import com.yaohun.consumereward.manage.PlayerManager;
|
||||||
import com.yaohun.consumereward.util.MessageUtil;
|
import com.yaohun.consumereward.util.MessageUtil;
|
||||||
import com.yaohun.consumereward.util.StackUtil;
|
import com.yaohun.consumereward.util.StackUtil;
|
||||||
import me.Demon.DemonPlugin.DemonAPI;
|
import me.Demon.DemonPlugin.DemonAPI;
|
||||||
|
import me.Demon.DemonPlugin.Util.CDTimeAPI;
|
||||||
import me.Demon.DemonPlugin.data.NbtItem;
|
import me.Demon.DemonPlugin.data.NbtItem;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Sound;
|
import org.bukkit.Sound;
|
||||||
|
@ -20,6 +21,8 @@ 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;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 奖励界面类,负责处理奖励界面的展示和点击事件
|
* 奖励界面类,负责处理奖励界面的展示和点击事件
|
||||||
*/
|
*/
|
||||||
|
@ -49,6 +52,7 @@ public class RewardGui implements Listener {
|
||||||
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));
|
||||||
}
|
}
|
||||||
|
inv.setItem(40, Config.getItemStack("resetStackinAdvance"));
|
||||||
}
|
}
|
||||||
// 打开界面
|
// 打开界面
|
||||||
player.openInventory(inv);
|
player.openInventory(inv);
|
||||||
|
@ -64,6 +68,7 @@ public class RewardGui implements Listener {
|
||||||
// 获取点击的原始槽位和玩家信息
|
// 获取点击的原始槽位和玩家信息
|
||||||
int rawSlot = e.getRawSlot();
|
int rawSlot = e.getRawSlot();
|
||||||
Player player = (Player) e.getWhoClicked();
|
Player player = (Player) e.getWhoClicked();
|
||||||
|
UUID uuid = player.getUniqueId();
|
||||||
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"))) {
|
||||||
|
@ -77,6 +82,22 @@ public class RewardGui implements Listener {
|
||||||
if (DemonAPI.itemIsNull(stack) || DemonAPI.itemIsLore(stack)) {
|
if (DemonAPI.itemIsNull(stack) || DemonAPI.itemIsLore(stack)) {
|
||||||
return;
|
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数据
|
// 读取物品的NBT数据
|
||||||
NbtItem nbtItem = new NbtItem(stack);
|
NbtItem nbtItem = new NbtItem(stack);
|
||||||
// 检查物品是否包含奖励键
|
// 检查物品是否包含奖励键
|
||||||
|
@ -95,9 +116,12 @@ public class RewardGui implements Listener {
|
||||||
MessageUtil.sendMessageKey(player, "notEnoughInventorySlots", Sound.ENTITY_VILLAGER_NO);
|
MessageUtil.sendMessageKey(player, "notEnoughInventorySlots", Sound.ENTITY_VILLAGER_NO);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
PlayerManager playerManager = ConsumeReward.getPlayerManager();
|
||||||
|
PlayerData playerData = playerManager.getPlayerData(playerName);
|
||||||
// 检查玩家是否有足够的消费值
|
// 检查玩家是否有足够的消费值
|
||||||
int needConsume = rewardData.getNeedConsume();
|
int needConsume = rewardData.getNeedConsume();
|
||||||
int consumeValue = ConsumeAPI.getConsumeData(playerName, TimeType.ANNUAL);
|
int recordingConsume = playerData.getRecordConsume();
|
||||||
|
int consumeValue = ConsumeAPI.getConsumeData(playerName, TimeType.ANNUAL) - recordingConsume;
|
||||||
if (needConsume > consumeValue) {
|
if (needConsume > consumeValue) {
|
||||||
String message = Config.langData.getMessage("notEnoughConsume");
|
String message = Config.langData.getMessage("notEnoughConsume");
|
||||||
int newConsume = needConsume - consumeValue;
|
int newConsume = needConsume - consumeValue;
|
||||||
|
@ -106,8 +130,6 @@ public class RewardGui implements Listener {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 检查玩家是否已经领取过奖励
|
// 检查玩家是否已经领取过奖励
|
||||||
PlayerManager playerManager = ConsumeReward.getPlayerManager();
|
|
||||||
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;
|
||||||
|
|
|
@ -33,5 +33,13 @@ public class PlayerManager {
|
||||||
// 如果存在,直接返回该玩家的玩家数据对象
|
// 如果存在,直接返回该玩家的玩家数据对象
|
||||||
return playerDataMap.get(playerName);
|
return playerDataMap.get(playerName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void saveAllPlayerData() {
|
||||||
|
// 遍历映射表中的玩家数据对象
|
||||||
|
for (PlayerData playerData : playerDataMap.values()) {
|
||||||
|
// 调用玩家数据对象的保存方法
|
||||||
|
playerData.savePlayerData();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,8 @@ public class StackUtil {
|
||||||
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();
|
||||||
|
String itemName = meta.getDisplayName();
|
||||||
|
meta.setDisplayName(itemName.replace("{coins}",String.valueOf(rewardData.getNeedConsume())));
|
||||||
List<String> newLore = new ArrayList<>();
|
List<String> newLore = new ArrayList<>();
|
||||||
|
|
||||||
// 根据玩家是否已领取奖励和奖励的附带信息更新物品堆的附带信息
|
// 根据玩家是否已领取奖励和奖励的附带信息更新物品堆的附带信息
|
||||||
|
@ -93,6 +95,7 @@ public class StackUtil {
|
||||||
// 使用NbtItem来设置物品堆的特殊数据
|
// 使用NbtItem来设置物品堆的特殊数据
|
||||||
NbtItem nbtItem = new NbtItem(stack);
|
NbtItem nbtItem = new NbtItem(stack);
|
||||||
nbtItem.setString("rewardKey", rewardKey);
|
nbtItem.setString("rewardKey", rewardKey);
|
||||||
|
nbtItem.setString("stex", rewardData.getItemNbt());
|
||||||
return nbtItem.getItem();
|
return nbtItem.getItem();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
name: AuConsumeReward
|
name: AuConsumeReward
|
||||||
main: com.yaohun.consumereward.ConsumeReward
|
main: com.yaohun.consumereward.ConsumeReward
|
||||||
version: 1.2.1
|
version: 1.2.5
|
||||||
depend:
|
depend:
|
||||||
- DemonAPI
|
- DemonAPI
|
||||||
commands:
|
commands:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user