2016-07-31 8 views
1

私が取り組んでいるプロジェクトは、インタラクティブなインベントリメニューのMinkraftのBukkitプラグインです。私はこれを持っているつもりBukkitインタラクティブメニュー - ページスクロール

機能が含まれます: - (これが行われると作品)在庫に含まれる品目のカタログからアイテム を起動することができること - これは私が働いているものです(メニューとの対話on))

具体的には、別のページ(前と次のページ)間の在庫スクロールで2つのボタン(アイテム)を作ろうとしています。私はこれを行う必要があります。これは、このインベントリ内のアイテムの最大量が45に過ぎず、スポーン可能なアイテムに45のうち40スロットが含まれているためです。他の5つは終了ボタン(作業)、戻るボタン/前のメニューにナビゲートする)、2つのページ切り替えボタン(機能しない)、および空白のスペースが含まれます。

私の問題は、スイッチャーのボタンがアイテムの前のページやアイテムの次のページに正しく戻ることができないということです。

カタログは、カタログ内のアイテムの量が一定値でないように拡張できるものを意味します。

以下のコードは3種類のインベントリ(86項目のテストカタログ)を作成していますが、各インベントリを前後に移動することはできません。私は別の在庫間をスクロールすることができましたが、(0)と(2)、(1)と(2)の在庫の間だけです。

以下のコードスニペットの特定の動作は、何らかの理由でclickイベントが呼び出されたときに、すべてがx回実行されることです。私はwhiteCatalogの値を設定する目的でこれが一度だけ実行されたときに、なぜクリック時にループするのか理解できません。

EDIT:whiteCatalog [0〜2] .open(。。)を実行することで手動で個々の在庫を開くことができますが、インデックスで数式を試してみると、メニューの奇妙な結果がインデックス1または2。

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"クラスには、独自のインベントリと(継承された)上下の2つのボタンが含まれています。メニューには、 "ページ"と現在のインデックスのリストがあります。次に、クリックされる両方のボタン(項目)をチェックするInventoryInteractのリスナーを実装します。ボタンクリックに応じて "ページ"インベントリを開くメニュークラスの関数を呼び出します。たとえば、scrollDown()はインデックス変数をデクリメントして、リストからページインベントリを(デクリメントされたインデックスを使用して)開きます。 これはオブジェクト指向のオブジェクトです。ページを埋めるには、アイテムを繰り返してページに追加することができます。したがって、ページクラスには、IsFull()およびAddItem()関数が必要です。私は、あなたが正しい方法で現在のアプローチをしていると思います。