マインクラフトでインベントリに触れる機会は以外にあります。
私はPluginを作る時にインベントリにアイテムを追加したり消す時に、アイテムが更新されなかったり、置きたい所に置けなかったりして仕様が分からず困りました。
なので、忘れないように記事に書いておきたいと思います。もし間違っていたら教えてください :P
インベントリのスロット番号について
インベントリにアイテムを追加する時には置きたい位置のインベントリのスロット番号を指定する必要があります。これはコマンドでもPlugin等でも同じです。
インベントリの一つのマスの事をスロットといい、プレイヤには大きく分けて3種類のスロットがあり以下のように分かれています。
- slot.inventory インベントリのメインのスロット
- slot.hotbar インベントリのホットバーのスロット
- slot.armor インベントリのアーマのスロット
装備はスロット番号ではなくslot.armor.headと装備したい場所を指定します。
Pluginの場合
Pluginではスロットの種類は指定する必要が無くインベントリ全体での番号を指定する事になります。次のコードはインベントリにアイテムを追加する処理の例です。
[java autolinks=”true”]
public void setInventory(Player player){
ItemStack sword = new ItemStack(Material.DIAMOND_SWORD);
ItemStack helmet = new ItemStack(Material.DIAMOND_HELMET);
player.getInventory.setItem(0,sword);
player.getInventory.setHelmet(helmet);
player.updateIntentory();
}
[/java]
ですがプレイヤに装備を追加する場合スロット番号ではなくPlayerInventory#setHelmet()等を使用するのが一般的です。
チェストのスロット番号について
チェストにアイテムを追加する場合にもチェストのスロット番号を指定する必要があります。チェストはインベントリと違い左上から増えていくだけなので簡単ですね。
1列は9スロットですが指定する数字的には8が列の最後になるように、0から始まるという事を忘れないようにしましょう。
Plugin 独自GUIを作成
[java autolinks=”true”]
public void displayGUI(Player player){
Inventory inv = Bukkit.createInventory(null, 18,"GUIName");
ItemStack food = new ItemStack(Material.APPLE);
inv.setItem(4, food);
player.openInventory(inv);
}
[/java]
Server#createInventoryを使用する事で独自のGUIを作成する事ができます。createInventoryの第二引数は表示するスロット数になっていて9の倍数を指定します。1列が9スロットなので20など中途半端な数字だとダメだというのがなんとなく分かるはずです。
インベントリの領域にアイテムを設置する時はsetItemを使用し第一引数に設置するスロット番号で指定します。スロット番号はチェストと同じです。
最後にopenInventoryで作成したインベントリを表示しましょう。
これでプレイヤがインベントリを開いている状態になるので、後はInventoryClickEventでEventをキャッチし、今回作成したインベントリにあるAppleをクリックしたら~等の処理をするなど好きにしてください。因みにラージチェストの容量54スロット以上指定する事もできます。
感想を書いてね