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

ui_screen_market方法打开对应玩家商店GUI异常求助

Bukkit插件市场GUI按钮点击匹配错误问题

问题概述

开发一款带市场功能的Bukkit插件,玩家可通过GUI浏览并购买其他玩家的物品。其中ui_screen_market方法会将玩家名称作为按钮显示,点击按钮本应打开对应玩家的商品售卖GUI,但实际打开的是其他玩家的商店GUI。已调试参数未发现明显错误,问题出在按钮点击处理的索引匹配逻辑上。

预期行为

点击ui_screen_market GUI中的玩家名称按钮,打开对应玩家的商品售卖GUI。

实际行为

点击后打开的是其他玩家的商店GUI。

问题代码分析

在ui_screen_market方法中,按钮添加顺序与点击事件的索引计算不匹配:

  • 先添加了4个固定按钮(ID依次为0:Go Back、1:Create shop、2:Delete shop、3:Add item to your shop)
  • 之后才循环添加玩家商店按钮,这些按钮的ID从4开始
  • 但点击事件中用clickedButtonId >=3判断,并通过clickedButtonId -3获取shopNames中的元素,导致索引错位,取到错误的商店名称

错误代码片段:

.validResultHandler(response -> {
    int clickedButtonId = response.getClickedButtonId();
    if (clickedButtonId == 0) {
        ui_screen_join_main(player);
    } else if (clickedButtonId == 1) {
        ui_screen_market_create(player);
    } else if (clickedButtonId >= 3) {
        String clickedShopName = shopNames.get(clickedButtonId - 3);
        openPlayerItemsGUI(player, clickedShopName); // 索引计算错误
    }
})

解决方案

修正点击事件中的索引计算逻辑,确保按钮ID与shopNames列表的索引对应:

.validResultHandler(response -> {
    int clickedButtonId = response.getClickedButtonId();
    if (clickedButtonId == 0) {
        ui_screen_join_main(player);
    } else if (clickedButtonId == 1) {
        ui_screen_market_create(player);
    } else if (clickedButtonId == 2) {
        // 补充Delete shop的处理逻辑(原代码遗漏)
        player.sendMessage("Delete shop functionality to be implemented");
    } else if (clickedButtonId == 3) {
        ui_screen_market_add(player); // 补充Add item的处理逻辑(原代码遗漏)
    } else if (clickedButtonId >= 4) {
        String clickedShopName = shopNames.get(clickedButtonId - 4);
        openPlayerItemsGUI(player, clickedShopName);
    }
})

额外优化建议

  1. 补充Delete shop和Add item to your shop按钮的处理逻辑,避免这些按钮点击后无响应
  2. 对shopNames列表进行排序,让GUI中的商店按钮显示更有序:
Collections.sort(shopNames);

添加在for (String shopName : shopNames) { formBuilder.button(shopName); }之前即可。

修正后的完整方法代码

public void ui_screen_market(Player player) {
    FloodgatePlayer floodgatePlayer = floodgateApi.getPlayer(player.getUniqueId());
    if (floodgatePlayer != null) {
        List<String> shopNames = new ArrayList<>();

        Plugin plugin = Bukkit.getPluginManager().getPlugin("CentoriUI23");
        assert plugin != null;
        File bdataFolder = new File(plugin.getDataFolder(), "bdata");
        File[] shopDirectories = bdataFolder.listFiles();

        if (shopDirectories != null) {
            for (File directory : shopDirectories) {
                if (directory.isDirectory()) {
                    shopNames.add(directory.getName());
                }
            }
        }

        if (!shopNames.isEmpty()) {
            // 优化:对商店名称排序
            Collections.sort(shopNames);
            
            SimpleForm.Builder formBuilder = SimpleForm.builder()
                    .title("Centori UI / MARKET TEST")
                    .button("Go Back")
                    .button("Create shop")
                    .button("Delete shop")
                    .button("Add item to your shop")
                    .validResultHandler(response -> {
                        int clickedButtonId = response.getClickedButtonId();
                        if (clickedButtonId == 0) {
                            ui_screen_join_main(player);
                        } else if (clickedButtonId == 1) {
                            ui_screen_market_create(player);
                        } else if (clickedButtonId == 2) {
                            player.sendMessage("Delete shop functionality to be implemented");
                        } else if (clickedButtonId == 3) {
                            ui_screen_market_add(player);
                        } else if (clickedButtonId >= 4) {
                            String clickedShopName = shopNames.get(clickedButtonId - 4);
                            openPlayerItemsGUI(player, clickedShopName);
                        }
                    })
                    .closedOrInvalidResultHandler(response -> {
                        player.sendMessage("Form closed or invalid");
                    });

            for (String shopName : shopNames) {
                formBuilder.button(shopName);
            }

            floodgatePlayer.sendForm(formBuilder.build());
        } else {
            player.sendMessage("No shops found.");
        }
    }
}

内容的提问来源于stack exchange,提问作者Nopfp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:10:03