【マインクラフト（統合版）】ダミーアイテムの作り方まとめ

# はじめに

ここではダミーアイテムの作り方を通して、カスタムアイテムを作る上で最低限必要な基本部分の実装をまとめています。

以下の環境ではこの作り方を基本としていますので、この環境に倣ってご紹介します。

https://qiita.com/glasses_seven/items/433ac9d9fcbdb72c6d18/

カスタムアイテムの作り方には大きく分けて以下の２種類があります。

<dl>
    <dt>①既存のアイテムにデータ値を付与</dt>
    <dd>
        弓や矢などの装備アイテムにユニークなデータ値を付与する事により、ターゲットセレクタ等で一意の判定を行います。<br />
        データ値の付与の方法は<a href="https://qiita.com/glasses_seven/items/f0e745f9715e6ac34560/">&gt;&gt; ルートテーブルの書き方</a>のページでご紹介していますのでそちらをご覧ください。
    </dd>
    <dt>②アイテムを新規で作成</dt>
    <dd>今回ご紹介する方法です。アイテムIDを新規で割り当てて実装します。</dd>
</dl>


# 定義ファイルの内訳

カスタムアイテムを作るためにはビヘイビアパックとリソースパックの両方が必要になりますが、最低限以下の３ファイルを実装すれば完了します。

:::note info
ここでは`customize:dummy_item`というアイテムIDを使う想定でファイル名を記載しています。
:::

```text:ビヘイビアパック内で必要になるファイル
/<ビヘイビアパックのルート>
    /items
        dummy_item.json
```

```text:リソースパック内で必要になるファイル
/<リソースパックのルート>
    /texts
        en_US.lang
    /textures
        item_texture.json
```


# 定義ファイルの内容

### ビヘイビアパック

```json:items/dummy_item.json
{
    "format_version": "1.20.50",
    "minecraft:item": {
        "description": {
            "identifier": "customize:dummy_item",
            "menu_category": {
                "category": "equipment",
                "group": "itemGroup.name.sword",
                "is_hidden_in_commands": false
            }
        },
        "components": {
            "minecraft:icon": {
                "texture": "dummy_item"
            },
            "minecraft:display_name": {
                "value": "item.customize:dummy_item.name"
            }
        }
    }
}
```

上記の`format_version`と`minecraft:item`の項目は固定だとお考えください。

<dl>
    <dt>・description</dt>
    <dd>
        <dl>
            <dt>identifier</dt>
            <dd>アイテムIDを設定します。</dd>
            <dt>menu_category</dt>
            <dd>
                <code>menu_category</code>ブロック自体が未定義の場合はデフォルトで<code>items</code>（アイテム）カテゴリに表示されます。
                <dl>
                    <dt>category</dt>
                    <dd>
                        クリエイティブモード時にアイテムを表示するメニューカテゴリを文字列で設定します。<br />
                        設定できる値は以下の通り。
                        <ul>
                            <li>construction（構築）</li>
                            <li>equipment（所持品）</li>
                            <li>items（アイテム）</li>
                            <li>nature（性質）</li>
                            <li>none（指定なし）</li>
                        </ul>
                        <code>none</code>の場合は特別で、<code>group</code>や<code>is_hidden_in_commands</code>の設定に係わらずメニュー上には表示されなくなり<code>give</code>コマンドも使えませんが、<code>loot</code>コマンドによる取得は可能です。<br />
                        <code>loot</code>コマンドで利用できるようにするには<a href="https://qiita.com/glasses_seven/items/f0e745f9715e6ac34560/">&gt;&gt; ルートテーブルの書き方</a>のページでご紹介したJSONデータを作成しておく必要があります。
                    </dd>
                    <dt>group</dt>
                    <dd>
                        アイテムグループを文字列で設定します。<br />
                        <code>category</code>の内容と一致していないと認識されないので注意が必要です。<br />
                        例えば<code>"category": "equipment"</code>の時、<code>"group": "itemGroup.name.sword"</code>は認識されますが、<code>"group": "itemGroup.name.boat"</code>は認識されません。<br />
                        ちなみに、元々プラスマークが付いているグループを指定しないと意味はないようです。
                    </dd>
                    <dt>is_hidden_in_commands</dt>
                    <dd>
                        アイテムをコマンドで利用できるかどうかを設定します（true:利用不可、false:利用可能）。<br />
                        設定がtrueであっても<code>loot</code>コマンドは利用できます。
                    </dd>
                </dl>
            </dd>
        </dl>
    </dd>
    <dt>・components</dt>
    <dd>
        このブロックでアイテムが持つさまざまな性質や機能を定義する事ができるので、見た目以外の部分でオリジナルコンテンツを作る時はこの部分の定義がメインになるでしょう。<br />
        定義内容についての詳細は以下の<a href="#コンポーネント定義">&gt;&gt; コンポーネント定義</a>の項目をご覧ください。
    </dd>
</dl>

### リソースパック

```text:texts/en_US.lang
item.customize:dummy_item.name=ダミーアイテム
```

ここではアイテム名を定義します。
カスタムエンティティを作成する場合と同様に`en_US.lang`ファイルが規定の言語ファイルになります。

```json:textures/item_texture.json
{
    "resource_pack_name": "family-customize",
    "texture_name": "atlas.items",
    "texture_data": {
        "dummy_item": {
            "textures": "textures/items/dummy_item"
        }
    }
}
```

上記の`resource_pack_name`、`texture_name`、`texture_data`の項目は基本的に固定です。

:::note info
`resource_pack_name`の値にはあらかじめ`manifest.json`内のリソースパック名である`header.name`の値を入れておく必要があります。
:::

<dl>
    <dt>・texture_data</dt>
    <dd>
        このデータブロックに各アイテムのテクスチャファイルへのパスを列記します。<br />
        アイテムIDをキーとしたデータブロック内で<code>textures</code>キーの値としてパス（<code>.png</code>の拡張子は省く）を設定します。<br />
        テクスチャファイルは、ここで指定したパスへ格納する必要があります。
    </dd>
</dl>

:::note info
アイテムIDのキーにはネームスペースを含めずに指定するので、他と被らないアイテムの命名をお勧めします。<br />
:::


# テストしてみる

ここまで定義できればダミーアイテムとしての最低限の実装は完了です。
この時点で正しくアイテムを取得できるのかテストしておいた方がいいでしょう。

但し今のままでは取得できたとしても透明のままなので目視で確認する事ができません。
そこで以下の手順に従ってテストを進めてください。

### ①ダミー画像を設置

リソースパック内の`textures/items`の場所にダミー画像を格納してください。

動作を確認するだけであればバニラのリソースパック内にある`textures/items/ender_pearl.png`（エンダーパール）あたりを使っておけば、わざわざ作る必要がないので手間が省けるでしょう。

`textures/item_texture.json`内の`textures`の項目で設定した`dummy_item`という名前がファイル名になるので`dummy_item.png`という名前にしておきます。

### ②コマンドで召喚する

コマンド行で`give @s customize`というところまで入力すると、入力補助の機能が働いて以下の赤枠部分のように選択できるアイテムIDが表示されるはずです。

![giveコマンド入力](https://socket-manager.github.io/document/minecraft-contents/img/custom-item-dummy/give-input.png?reload "giveコマンド入力")

これが表示されればJSONファイルが正しく認識されています。
後は実際に`give`コマンドを使って取得すると以下のように表示されます。

![アイテムの取得](https://socket-manager.github.io/document/minecraft-contents/img/custom-item-dummy/give.png "アイテムの取得")

アイテムにカーソルを合わせた時に`texts/en_US.lang`のファイルで定義しておいたアイテム名が表示されるかどうかも確認しておきましょう。

あとは適当なタイミングでテクスチャファイル（今回の場合はリソースパック内の`textures/items/dummy_item.png`）を正式なテクスチャファイルで入れ替えておいてください。


# コンポーネント定義

これまでの設定でベースの部分は出来上がりました。
あとは用途に応じてビヘイビアパック内にある`items/dummy_item.json`ファイルの`components`ブロックに都度必要な定義を追加していく事になります。

ここでは`components`ブロックのうち本環境で汎用的に使っている部分だけをピックアップしておきます。<br /><br />

<dl>
    <dt>・minecraft:icon</dt>
    <dd>
        <dl>
            <dt>texture（デフォルト:なし）</dt>
            <dd>
                リソースパック内の<code>textures/item_texture.json</code>ファイルに定義済のキーを設定してテクスチャファイルの場所を指示します。
            </dd>
        </dl>
    </dd>
    <dt>・minecraft:display_name</dt>
    <dd>
        <dl>
            <dt>value（デフォルト:なし）</dt>
            <dd>
                リソースパック内の<code>texts/en_US.lang</code>ファイルに定義済のキーを設定する事で、そのキーに設定されているアイテム名が表示されます。
            </dd>
        </dl>
    </dd>
    <dt>・minecraft:can_destroy_in_creative（デフォルト:true）</dt>
    <dd>
        クリエイティブモード時にアイテムがブロックを破壊できるかどうかを設定します（true:破壊可能、false:破壊不可能）。
    </dd>
    <dt>・minecraft:damage（デフォルト:0）</dt>
    <dd>
        アイテムによる攻撃時のダメージ量を設定します。
    </dd>
    <dt>・minecraft:hand_equipped（デフォルト:false）</dt>
    <dd>
        アイテム装備時の持ち方にするかどうかを設定します（true:装備アイテム、false:装備品以外）。<br /><br />
        ▼trueの時<br />
        <img src="https://socket-manager.github.io/document/minecraft-contents/img/custom-item-dummy/hand-equipped-true.png" /><br />
        プレイヤーが向いている方向に対して直線的な向きになり、少しサイズが大きく見えます。<br /><br />
        ▼falseの時<br />
        <img src="https://socket-manager.github.io/document/minecraft-contents/img/custom-item-dummy/hand-equipped-false.png" /><br />
        プレイヤーが向いている方向に対して９０度回転した向きになり、少しサイズが小さく見えます。<br /><br />
    </dd>
    <dt>・minecraft:glint（デフォルト:false）</dt>
    <dd>
        エンチャント付与状態の輝きのレンダリングの有無を設定します（true:レンダリング有り、false:レンダリング無し）。<br />
        エンチャントを付与していなくても適用されます。
    </dd>
    <dt>・minecraft:enchantable</dt>
    <dd>
        アイテムに適用できるエンチャントの種類を設定します。
        <dl>
            <dt>slot（デフォルト:なし）</dt>
            <dd>
                エンチャントの種類を文字列で設定します。<br />
                例：sword、bowなど
            </dd>
            <dt>value（デフォルト:なし）</dt>
            <dd>
                エンチャントの値を設定します。とりあえずゼロで問題ないようです。
            </dd>
        </dl>
    </dd>
</dl>

:::note info
基本的に定義されていないデータブロック、および値は暗黙的にデフォルト値が適用されます。
:::


# おわりに

本環境では以下のページでご紹介させて頂いたコンテンツ内で、今回ご紹介した方法を使ってアイテムを実装しています。

https://qiita.com/glasses_seven/items/b45a80c91243177ff37f/

https://qiita.com/glasses_seven/items/d48d8716eb80daa2a518/

https://qiita.com/glasses_seven/items/cd55c6bd721a9ced1f06/

https://qiita.com/glasses_seven/items/0529d05f2b833a9f9cae/