【问题标题】:Bukkit interactable menu - page scrollingBukkit 可交互菜单 - 页面滚动
【发布时间】: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


【解决方案1】:

为“菜单”和“页面”创建类。 “Page”类包含一个自己的清单和(可能继承的)两个向上和向下按钮。在菜单中,您有一个带有“页面”和当前索引的列表。然后为 InventoryInteract 实现一个侦听器,您可以在其中检查要单击的两个按钮(项目)。在您的菜单类中调用一个函数,您可以在其中根据按钮单击打开“页面”库存。例如:scrollDown() 将递减索引变量,然后从列表中打开页面清单(使用递减的索引)。 它有点面向对象。要填充页面,您可以遍历项目并将它们添加到页面。因此页面类应该有一个 IsFull() 和一个 AddItem() 函数。我认为你目前的方法是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    相关资源
    最近更新 更多