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); } })
额外优化建议
- 补充
Delete shop和Add item to your shop按钮的处理逻辑,避免这些按钮点击后无响应 - 对
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
相关产品推荐
相关产品推荐

