2016-07-31 86 views
1

我正在開發的項目是Minecraft的可互動的庫存菜單Bukkit插件。Bukkit交互式菜單 - 頁面滾動

我打算在這個功能包括: - 能產卵從庫存中包含的項目的目錄項(此操作,並且作品) - 與菜單交互(這是我的工作)

具體而言,我試圖讓兩個按鈕(項目)在不同頁面(上一頁和下一頁)之間的庫存滾動中。我需要這樣做,因爲此庫存中的最大物品數量只能達到45,並且生成能力的物品包含40個插槽中的40個。其他5個用完了退出按鈕(工作),後退按鈕(工作/導航到前一個菜單),兩個頁面切換按鈕(不起作用)和一個空白區域。

我的問題是,我無法獲得切換按鈕以正確返回到上一頁的項目和或下一頁的項目。

該目錄旨在成爲一個可以增長的目錄中的項目數量不是一個常數值。

我確認下面的代碼確實做了3個不同的庫存(86個項目的測試目錄),但我無法設法讓每個庫存都轉到上一個或下一個庫存。我已經得到它在不同庫存之間滾動,但只在(0)和(2)或(1)和(2)的庫存之間滾動。

以下代碼片段的一些特定行爲是,由於某種原因,當調用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(); 
    }  
} 
+0

我相信你將不得不爲每個頁面創建庫存的其他實例,並相應地打開它們。類似於你正在做的背景 – Kerooker

+0

@Kerooker我需要使用分頁,但我不知道如何在這種情況下正確實施。 – zedlander1000

+0

您可以爲每個頁面創建一個清單,並在需要時打開該清單 – Kerooker

回答

0

爲「菜單」和「頁面」創建類。 「Page」類包含一個自己的庫存和(可能繼承)兩個上下按鈕。在菜單中你有一個帶有「頁面」的列表和當前的索引。然後爲InventoryInteract實現一個Listener,在其中檢查要點擊的兩個按鈕(項目)。在您的菜單類中調用一個函數,您可以根據點擊按鈕打開「頁面」庫存。例如:scrollDown()會減少索引變量,然後打開列表中的頁面清單(使用遞減的索引)。 它更加面向對象。要填充頁面,您可以遍歷項目並將其添加到頁面。因此頁面類應該有一個IsFull()和一個AddItem()函數。我認爲你現在的方法是正確的。