【发布时间】:2016-07-31 15:59:27
【问题描述】:
我正在进行的项目是一个可交互的 Inventory 菜单 Bukkit 插件,用于 Minecraft。
我打算在其中拥有的功能包括: - 能够从库存中包含的项目目录中生成项目(这已经完成并且有效) - 与菜单互动(这是我正在做的)
具体来说,我正在尝试使库存中的两个按钮(项目)在不同页面(上一页和下一页)之间滚动。我需要这样做,因为此库存中的最大物品数量只能是 45 个,并且可生成的物品包含 45 个插槽中的 40 个。另外 5 个被退出按钮(有效)、后退按钮(有效)用完/导航到上一个菜单),两个页面切换按钮(不起作用)和一个空白区域。
我的问题是我无法让切换器按钮正确返回上一页项目和/或下一页项目。
目录是一种可以增长的目录,因此目录中的项目数量不是一个恒定值。
我已经确认我下面的代码确实创建了 3 个不同的库存(86 个项目的测试目录),但我无法使每个库存转到上一个或下一个。我已经让它在不同的库存之间滚动,但只能在 (0) 和 (2) 或 (1) 和 (2) 的库存之间滚动。
下面代码的 sn-p 的一些特定行为是,由于某种原因,当调用 click 事件时,整个事情会运行 x 次。我只是不明白为什么为了设置 whiteCatalog 的值而只运行一次时它会在点击时循环。
编辑:我可以通过执行 whiteCatalog[0 到 2].open(. . . ) 手动打开每个单独的库存,但是当我在索引中尝试数学时,我会得到奇怪的菜单结果,只是跳到索引一两个。
YamlConfiguration test = YamlConfiguration.loadConfiguration(Main.bannerCatalogs[0]);
int x = (int) Math.ceil((double)test.getConfigurationSection("Banners").getKeys(false).size()/40);
whiteCatalog = new InventoryMenu[x];
for(int i = 0; i < x; i++)
{
int offset = 0;
final int k = i;
offset = (40 * i);
whiteCatalog[i] = new InventoryMenu("Banner Catalog: white", 45, Main.plug, i, new IMenuItemClicked()
{
@Override
public void onMenuItemClicked(MenuItemClicked clickEvent)
{
clickEvent.setCanClose(false);
ItemStack clicked = clickEvent.getItemClicked();
BTBUtil.log(Prefix.TEST + "Inventory ID: " + clickEvent.getMenu().id);
if(clickEvent.getMenu().id == 0)
{
if(clicked.getType() == Material.BANNER)
clickEvent.getPlayer().getInventory().addItem(clicked);
else if(clicked.getType() == Material.BARRIER)
clickEvent.getPlayer().closeInventory();
else if(clicked.getType() == Material.SPRUCE_DOOR_ITEM)
catalogSelect.open(clickEvent.getPlayer());
}
BTBUtil.log(Prefix.TEST + whiteCatalog.length);
if(clicked.getType() == Material.STAINED_GLASS_PANE && clicked.getItemMeta().getDisplayName().equalsIgnoreCase("Previous Page"))
{
whiteCatalog[clickEvent.getMenu().id-1].open(clickEvent.getPlayer());
}
else if(clicked.getType() == Material.STAINED_GLASS_PANE && clicked.getItemMeta().getDisplayName().equalsIgnoreCase("Next Page"))
{
whiteCatalog[clickEvent.getMenu().id+1].open(clickEvent.getPlayer());
}
}
}).loadItemsFromConfig(0, offset)
.loadMenu();
}
}
【问题讨论】:
-
我相信您必须为每个页面创建其他库存实例,并相应地打开它们。类似于您对后页所做的操作
-
@Kerooker 我需要使用分页,但我不确定在这种情况下如何正确实现它。
-
您可以为每个页面创建一个库存,并在需要时打开该库存
标签: java plugins bukkit inventory