Virtual Spawner插件开发:如何实现玩家输入关键词的事件确认?
解决Virtual Spawner插件的Y/N确认升级问题
问题说明
我在开发Virtual Spawner插件时遇到输入确认的问题:当玩家拥有足够资金并输入Y时,其刷怪笼应升级至2级。原本想通过AsyncPlayerChatEvent实现Y/N确认功能,但这样会导致玩家所有输入的Y/N都触发升级操作,无法区分是针对升级的确认还是普通聊天。现有触发确认提示的代码如下:
public static void jlvlup(Player player,int currentLevel) { String lvlup2= ChatColor.DARK_RED+"Do you confirm upgrade spawner to Level 2 for 5000000$ ?(Y/N) Write to chat."; if(currentLevel==1) { player.sendMessage(lvlup2); player.closeInventory(); } }
解决方案
核心思路是给需要确认升级的玩家做状态标记,只有处于确认状态的玩家输入Y/N时才触发升级逻辑,避免干扰普通聊天。具体实现步骤如下:
1. 定义全局状态存储
创建一个HashMap来记录当前处于升级确认状态的玩家,存储玩家对象和对应的升级关键信息(比如所需金额):
// 全局静态HashMap,键为玩家,值为升级所需费用 private static final HashMap<Player, Integer> pendingUpgrade = new HashMap<>();
2. 修改确认提示方法
在触发升级提示时,将玩家加入状态Map,同时记录升级需要的金额,方便后续校验:
public static void jlvlup(Player player, int currentLevel) { int upgradeCost = 5000000; // 升级到2级的固定费用 String confirmMsg = ChatColor.DARK_RED + "Do you confirm upgrade spawner to Level 2 for " + upgradeCost + "$ ?(Y/N) Write to chat."; if (currentLevel == 1) { // 将玩家加入待确认队列,绑定升级费用 pendingUpgrade.put(player, upgradeCost); player.sendMessage(confirmMsg); player.closeInventory(); } }
3. 监听聊天事件并处理确认逻辑
在AsyncPlayerChatEvent监听器中,先判断玩家是否处于待确认状态,再根据输入执行对应操作:
@EventHandler public void onPlayerChat(AsyncPlayerChatEvent event) { Player player = event.getPlayer(); String inputMsg = event.getMessage().trim().toLowerCase(); // 检查玩家是否处于升级确认状态 if (pendingUpgrade.containsKey(player)) { int requiredCost = pendingUpgrade.get(player); // 取消聊天事件,避免确认消息被发送到公共频道 event.setCancelled(true); if (inputMsg.equals("y")) { // 替换为你实际使用的经济插件余额校验逻辑 if (getPlayerBalance(player) >= requiredCost) { // 执行扣钱操作 deductPlayerMoney(player, requiredCost); // 执行刷怪笼升级到2级的核心逻辑 upgradeSpawnerToLevel2(player); player.sendMessage(ChatColor.GREEN + "Spawner upgraded to Level 2 successfully!"); } else { player.sendMessage(ChatColor.RED + "You don't have enough money to upgrade!"); } } else if (inputMsg.equals("n")) { player.sendMessage(ChatColor.YELLOW + "Upgrade cancelled."); } else { player.sendMessage(ChatColor.RED + "Invalid input! Please enter Y/N to confirm or cancel."); // 输入无效时不清除状态,让玩家重新输入 return; } // 处理完成后清除玩家的确认状态 pendingUpgrade.remove(player); } } // 示例:获取玩家余额的方法(替换为你插件的实际逻辑) private double getPlayerBalance(Player player) { // 比如使用Vault的Economy API:return economy.getBalance(player); return 0; } // 示例:扣除玩家资金的方法 private void deductPlayerMoney(Player player, double amount) { // 比如使用Vault:economy.withdrawPlayer(player, amount); } // 示例:刷怪笼升级到2级的核心逻辑 private void upgradeSpawnerToLevel2(Player player) { // 这里编写修改玩家刷怪笼等级的具体代码 }
额外优化点
- 监听
PlayerQuitEvent,当玩家退出服务器时从pendingUpgrade中移除其记录,避免内存泄漏 - 可以给确认状态设置超时时间,比如5分钟后自动取消待确认状态,提升用户体验
内容的提问来源于stack exchange,提问作者Archuleus
相关产品推荐
相关产品推荐

