Skip to content

Latest commit

 

History

History
51 lines (39 loc) · 1.94 KB

File metadata and controls

51 lines (39 loc) · 1.94 KB

@FromPattern 詳解

要獲取指定 pattern 内的所有物品,只需要填入方法參數 @FromPattern List<ItemStack> 並輸入指定 pattern:

@UIController("main")
public class MainController {

    public BukkitView<?, ?> index(Player player) {
        String greeting = "hello, " + player.getName() + "!"; // 將顯示玩家的名稱
        return new BukkitView<>(MainView.class, greeting);
    }
    
    @ClickMapping(view = MainView.class, pattern = 'A')
    public void clicked(Player player, @FromPattern('Z') List<ItemStack> items, ItemStack clicked){
        player.sendMessage("you clicked "+clicked.getType());
        assert items.stream().allMatch(item -> item.getType() == Material.BLACK_STAINED_GLASS_PANE);
        assert clicked.getType() == Material.DIAMOND_BLOCK;
    }
}

從上述可以看見,填入參數中,ItemStack 只代表了被點擊的物品,而 @FromPattern 則代表了該 pattern 内的所有物品,因此必須使用 List<ItemStack> 作爲其類型。

{% hint style="info" %} 根據之前範例的物品,以上兩個 assert 理應為 true。 {% endhint %}

連帶 Slot 的 FromPattern

有時候你需要連帶該 pattern 的 slot 來傳回物品以用於檢查該物品的slot分佈(例如合成臺)。

@UIController("main")
public class MainController {

    public BukkitView<?, ?> index(Player player) {
        String greeting = "hello, " + player.getName() + "!"; // 將顯示玩家的名稱
        return new BukkitView<>(MainView.class, greeting);
    }
    
    @ClickMapping(view = MainView.class, pattern = 'A')
    public void clicked(Player player, @FromPattern('Z') Map<Integer, ItemStack> items, ItemStack clicked){
        player.sendMessage("you clicked "+clicked.getType());
        assert items.keySet().containsAll(List.of(1, 2, 3, 4, 5, 6, 7, 8));
    }

{% hint style="info" %} 該 slot 為 pattern 內的 slot, 而不是整個 inventory 的 slot。 {% endhint %}