You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 13:17:44