2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Minecraft Kotlinプラグイン開発 中級編 Part.2 チェストGUIの作成

Last updated at Posted at 2024-03-16

初めに

今回はチェストを使ったGUIを作成していきます。
チェストGUIはバニラのコマンドだけだと作るのが難しく、プラグインの利点なので
沢山活用していきましょう!

中級編 Part.1 コマンドの引数の設定
中級編 Part.3 GUIのクリック検知

目次目次と今後の展望

/guiコマンドをplugin.ymlに登録

/guiというコマンドで新しくplugin.ymlに登録します。
また新しく今までのコマンドの下に登録していきます。

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で作成しました。

ファイルが今回は大きくなるので全て合わせたコードは最後に表示します。
それまでは所々コードを解説していきます!

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(処理終了)するという処理です。
このreturnfalseの時にコマンド実行失敗、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でコマンドの登録を行います。

前回のからコピペで少しだけ変更を加えました。

TutorialPlugin.kt
// この上に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が出てきます。
今回はこれにアイテムを入れていきます。

image.png

インベントリにアイテムを設置

さっきのGuiCommand.ktを開きGUIの中に入れるアイテムを追加していきます。

GuiCommand.kt
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のメタデータに更新しています。

このアイテムのメタデータを変数へ移した後に、
データを変更し、またアイテムに戻す作業はよく行うので覚えておきましょう。

エメラルドも追加

同じことをもう一度繰り返し、エメラルドも追加します。
最終的に以下のコードになりました。

GuiCommand.kt
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
    }
}

デバッグ

これをサーバーに入れて、コマンドを実行してみます。
以下のように表示されれば成功です。

image.png

終わりに

今回はチェストを使用したGUIの作り方を勉強しました。

次回はこれを使用して、GUIのアイテムをクリックしても取れなくしたり、
クリックしたら何らかのコマンドが実行されるようにしてみます。

中級編 Part.1 コマンドの引数の設定
中級編 Part.3 GUIのクリック検知

目次目次と今後の展望

参考

https://www.youtube.com/watch?v=hPzg4tXcu5I
https://www.youtube.com/watch?v=MenxQ76Weho

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?