初めに
今回はチェストを使ったGUIを作成していきます。
チェストGUIはバニラのコマンドだけだと作るのが難しく、プラグインの利点なので
沢山活用していきましょう!
前 → 中級編 Part.1 コマンドの引数の設定
次 → 中級編 Part.3 GUIのクリック検知
目次 → 目次と今後の展望
/guiコマンドをplugin.ymlに登録
/gui
というコマンドで新しくplugin.yml
に登録します。
また新しく今までのコマンドの下に登録していきます。
name: TutorialPlugin
version: '${version}'
main: com.github.tooooowa.tutorialplugin.TutorialPlugin # ここは環境によって異なります
api-version: '1.20'
commands:
debug:
usage: "/debug"
description: "デバッグ用のコマンドです"
permission: tutorialplugin.commands.debug
sum:
usage: "/<command> <number> <number>"
description: "足し算用のコマンドです"
gui: # ここから下に新規追加
usage: "/<command>"
description: "チェストGUIを開きます"
今回は特に引数を持たせないためusageは /<command>
だけで十分です。
オブジェクトを作成
コマンドが実行された時に呼び出される関数を用意します。
メインクラスと同じ階層に前回と同じようにオブジェクトを作成します。
ファイルの名前はGuiCommand.kt
で作成しました。
ファイルが今回は大きくなるので全て合わせたコードは最後に表示します。
それまでは所々コードを解説していきます!
// この上にimportやobjectの文があります
override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array<out String>): Boolean {
if (sender !is Player) {
return false
}
val inventory = Bukkit.createInventory(sender, 9*3, "§bメニュー")
// 木の下にインベントリのアイテムの処理の追加
sender.openInventory(inventory)
return true
}
// この下に}あり
まずは上のように新規オブジェクトに書きました。
一つずつ解説していきます。
if (sender !is Player) {
return false
}
これはsender
(実行者)がPlayer
(プレイヤー)じゃない時に
return false
(処理終了)するという処理です。
このreturn
はfalse
の時にコマンド実行失敗、true
の時に実行成功として返します。
val inventory = Bukkit.createInventory(sender, 9*3, "§bメニュー")
この行ではinventory
という変数に3行のインベントリを入れています。
Bukkit.createInventory()
関数では引数1に相手、
引数2にスロット数(9の倍数)、引数3にはインベントリの名前を入れます。
エラーを防ぐために引数2は 9*[行数]
で書くのがおすすめです
sender.openInventory(inventory)
これはsender
が変数(inventory
)に保存されてるインベントリを開くという関数です。
plugin.ymlにてコマンドの登録
この状態で動作確認のために一度実行してみます。
そのためにメインクラスのonEnableでコマンドの登録を行います。
前回のからコピペで少しだけ変更を加えました。
// この上にimportやobjectの文があります
package com.github.tooooowa.tutorialplugin
import org.bukkit.plugin.java.JavaPlugin
class TutorialPlugin : JavaPlugin() {
override fun onEnable() {
// Plugin startup logic
server.pluginManager.registerEvents(EventListener, this)
getCommand("debug")?.setExecutor(DebugCommand)
getCommand("sum")?.setExecutor(SumCommand)
getCommand("gui")?.setExecutor(GuiCommand) // この行を新たに追加
}
override fun onDisable() {
// Plugin shutdown logic
}
}
// この下に}あり
試しに実行
試しにビルドしてサーバーに実装し、/gui
を実行してみます。
すると画像のようなGUIが出てきます。
今回はこれにアイテムを入れていきます。
インベントリにアイテムを設置
さっきのGuiCommand.kt
を開きGUIの中に入れるアイテムを追加していきます。
override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array<out String>): Boolean {
if (sender !is Player){
return false
}
val inventory = Bukkit.createInventory(sender, 9 * 3, "§bメニュー")
// スロット12番 ダイヤモンド
val diamond = ItemStack(Material.DIAMOND, 1)
val diamondMeta = diamond.itemMeta
diamondMeta?.setDisplayName("§b青い宝石")
diamond.itemMeta = diamondMeta
inventory.setItem(12, diamond)
sender.openInventory(inventory)
return true
}
ダイヤモンドをスロット番号12番に入れます。
プラグインでのスロット番号は左上を0として数えだします。
val diamond = ItemStack(Material.DIAMOND, 1)
この行でdiamond
という変数に1つのdiamond
を保存しています。
ここのItemStack
の引数1のMaterial.DIAMOND
の
DIAMOND
はマイクラのアイテムIDを指しています。
アイテムIDが分からない場合はコチラのサイトを確認しましょう。
引数2はアイテムの数を指定します。
val diamondMeta = diamond.itemMeta
diamondMeta?.setDisplayName("§b青い宝石")
diamond.itemMeta = diamondMeta
この3行ではdiamond
のアイテムのメタデータをdiamondMeta
に保存し、
その後そのメタデータのアイテム名を編集して、
それをまたdiamond
のメタデータに更新しています。
このアイテムのメタデータを変数へ移した後に、
データを変更し、またアイテムに戻す作業はよく行うので覚えておきましょう。
エメラルドも追加
同じことをもう一度繰り返し、エメラルドも追加します。
最終的に以下のコードになりました。
package com.github.tooooowa.tutorialplugin // この行は環境によって異なります
import org.bukkit.Bukkit
import org.bukkit.Material
import org.bukkit.command.Command
import org.bukkit.command.CommandExecutor
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
object GuiCommand: CommandExecutor {
override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array<out String>): Boolean {
if (sender !is Player){
return false
}
val inventory = Bukkit.createInventory(sender, 9 * 3, "§bメニュー")
// スロット12番 ダイヤモンド
val diamond = ItemStack(Material.DIAMOND, 1)
val diamondMeta = diamond.itemMeta
diamondMeta?.setDisplayName("§b青い宝石")
diamond.itemMeta = diamondMeta
inventory.setItem(12, diamond)
// スロット14番 エメラルド
val emerald = ItemStack(Material.EMERALD, 1)
val emeraldMeta = emerald.itemMeta
emeraldMeta?.setDisplayName("§a緑色の宝石")
emerald.itemMeta = emeraldMeta
inventory.setItem(14, emerald)
sender.openInventory(inventory)
return true
}
}
デバッグ
これをサーバーに入れて、コマンドを実行してみます。
以下のように表示されれば成功です。
終わりに
今回はチェストを使用したGUIの作り方を勉強しました。
次回はこれを使用して、GUIのアイテムをクリックしても取れなくしたり、
クリックしたら何らかのコマンドが実行されるようにしてみます。
前 → 中級編 Part.1 コマンドの引数の設定
次 → 中級編 Part.3 GUIのクリック検知
目次 → 目次と今後の展望
参考
https://www.youtube.com/watch?v=hPzg4tXcu5I
https://www.youtube.com/watch?v=MenxQ76Weho