【マインクラフト（統合版）】カスタムアドオンパックことはじめ

[UUID Generator]: https://www.uuidgenerator.net/

# はじめに

ここで言うアドオンパックというのはビヘイビアパックやリソースパックの事を指しています。
以降では自分の環境で使っているアドオンパックをベースに話を進めます。

ビヘイビアパックやリソースパックと一言でいっても内容の規模が大きすぎて全容を理解するのは容易い事ではありません。

それを踏まえて、ここでは各パックを作成する前の基盤作りに主眼を置き、必要に応じて内容を付け足していく手法をとっていきます。


# 動作環境

<dl>
    <dt>プラットフォーム</dt>
    <dd>Windows10</dd>
    <dt>マインクラフト（統合版）</dt>
    <dd>Windows Edition v1.21.21</dd>
</dl>


# 最小限のフォルダ構成

最小限の構成は以下の通りでビヘイビアパックもリソースパックも同じです。

```text:最小限のフォルダ構成
/<アドオンパックのルート>
    manifest.json   マインクラフトがアドオンパックを認識するための情報
    pack_icon.png   アドオンパックのアイコン
```

バニラでのアイコンサイズは64×64pxですが異なるサイズであっても自動で拡縮してくれるようです。ちなみにpack_icon.pngはなくても動作します。

ここで重要なのは`manifest.json`の方ですがビヘイビアパックとリソースパックそれぞれのファイル内容を以下でみていきます。

ちなみに`manifest.json`内ではユニークなIDとしてUUIDが使われていますが、本家のサイトでは以下のリンク先で取得する事を推奨しているようです。

https://www.uuidgenerator.net/


# ビヘイビアパックのファイル

ファイルの内容は以下の通りです。
UUIDには仮のアルファベットを記入していますが、それぞれ異なるIDである事を表しています。

```json:ビヘイビアパックのmanifest.jsonの内容
{
    "format_version": 2,
    "header": {
        "description": <ビヘイビアパックの説明>,
        "name": <ビヘイビアパックの名前>,
        "uuid":"AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA",
        "version": [1, 0, 0],
        "min_engine_version": [1, 21, 0]
    },
    "modules":
        [
            {
                "description": <モジュールの説明>,
                "type": "data",
                "uuid": "BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB",
                "version": [1, 0, 0]
            }
        ],
    "dependencies": [
        {
            "uuid":"CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC",
            "version":[1,0,0]
        }
    ]
}
```

## 【format_version】

今は"2"固定で問題ないようです。

## 【header】

<dl>
    <dt>・description</dt>
    <dd>ビヘイビアパックの説明を記入します。ワールドの設定画面で表示されます（下図参照）</dd>
    <dt>・name</dt>
    <dd>ビヘイビアパックの名前を記入します。ワールドの設定画面で表示されます（下図参照）</dd>
    <dt>・uuid</dt>
    <dd>UUIDを記入します。上記"UUID Generator"のサイト等で取得</dd>
    <dt>・version</dt>
    <dd>ビヘイビアパックのバージョンをメジャーバージョン、マイナーバージョン、リビジョンの順で記入します。最初は"1,0,0"か"0,0,1"で問題ないでしょう</dd>
    <dt>・min_engine_version</dt>
    <dd>マインクラフトの対応基準にするバージョンをメジャーバージョン、マイナーバージョン、リビジョンの順で記入します。ビヘイビアパック作成時のバージョンを記入しておけば問題ないでしょう</dd>
</dl>

<img src="https://socket-manager.github.io/document/minecraft-contents/img/addon-begin/behavior.png" height="600px" width="728px" />

## 【modules】

モジュールは複数指定できるようですが自分の環境では"data"タイプしか使用していませんので以下の１モジュール分のみ定義しています。

<dl>
    <dt>・description</dt>
    <dd>モジュールの説明を記入します。使われる事はないので開発者側のメモとして残しておくといいでしょう</dd>
    <dt>・type</dt>
    <dd>"resources", "data", "world_template", "script"の指定ができますが自分の環境では"data"のみ使用しています</dd>
    <dt>・uuid</dt>
    <dd>UUIDを記入します。上記"UUID Generator"のサイト等で取得</dd>
    <dt>・version</dt>
    <dd>モジュールのバージョンをメジャーバージョン、マイナーバージョン、リビジョンの順で記入します。最初は"1,0,0"か"0,0,1"で問題ないでしょう</dd>
</dl>

## 【dependencies】

ここはリソースパックと依存関係がある場合に参照される場所です。

<dl>
    <dt>・uuid</dt>
    <dd>依存関係にあるリソースパックのheader部のUUIDを記入します。依存するリソースパックがない場合は先にUUIDを取得して記入しておけば、後からリソースパックを追加した時にそのまま使えます</dd>
    <dt>・version</dt>
    <dd>依存関係にあるリソースパックのheader部のバージョンを記入します。依存するリソースパックがない場合は"1,0,0"か"0,0,1"を設定しておけば問題ないでしょう</dd>
</dl>


# リソースパックのファイル

ファイルの内容は以下の通りです。
UUIDには仮のアルファベットを記入していますが、それぞれ異なるIDである事を表しています。
連携しているビヘイビアパックがある場合、header内の`uuid`と`version`はビヘイビアパック用`manifest.json`内の`dependencies`の内容と合わせておく必要があります。

```json:リソースパックのmanifest.jsonの内容
{
    "format_version": 2,
    "header": {
        "description": <リソースパックの説明>,
        "name": <リソースパックの名前>,
        "uuid":"CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC",
        "version": [1, 0, 0],
        "min_engine_version": [1, 16, 0]
    },
    "modules": [
        {
            "description": <モジュールの説明>,
            "type": "resources",
            "uuid": "DDDDDDDD-DDDD-DDDD-DDDD-DDDDDDDDDDDD",
            "version": [1, 0, 0]
        }
    ]
}
```

## 【format_version】

今は"2"固定で問題ないようです。

## 【header】

<dl>
    <dt>・description</dt>
    <dd>リソースパックの説明を記入します。ワールドの設定画面で表示されます（下図参照）</dd>
    <dt>・name</dt>
    <dd>リソースパックの名前を記入します。ワールドの設定画面で表示されます（下図参照）</dd>
    <dt>・uuid</dt>
    <dd>UUIDを記入します。上記"UUID Generator"のサイト等で取得</dd>
    <dt>・version</dt>
    <dd>リソースパックのバージョンをメジャーバージョン、マイナーバージョン、リビジョンの順で記入します。最初は"1,0,0"か"0,0,1"で問題ないでしょう</dd>
    <dt>・min_engine_version</dt>
    <dd>マインクラフトの対応基準にするバージョンをメジャーバージョン、マイナーバージョン、リビジョンの順で記入します。リソースパック作成時のバージョンを記入しておけば問題ないでしょう</dd>
</dl>

<img src="https://socket-manager.github.io/document/minecraft-contents/img/addon-begin/resource.png" height="600px" width="728px" />

## 【modules】

モジュールは複数指定できるようですが自分の環境では"resource"タイプしか使用していませんので以下の１モジュール分のみ定義しています。

<dl>
    <dt>・description</dt>
    <dd>モジュールの説明を記入します。使われる事はないので開発者側のメモとして残しておくといいでしょう</dd>
    <dt>・type</dt>
    <dd>"resources", "data", "world_template", "script"の指定ができますが自分の環境では"resources"のみ使用しています</dd>
    <dt>・uuid</dt>
    <dd>UUIDを記入します。上記"UUID Generator"のサイト等で取得</dd>
    <dt>・version</dt>
    <dd>モジュールのバージョンをメジャーバージョン、マイナーバージョン、リビジョンの順で記入します。最初は"1,0,0"か"0,0,1"で問題ないでしょう</dd>
</dl>


# コメント記法

アドオンパック内のJSONファイルでは、以下のようにスラッシュ２つ（"//"）を付けてコメント表記が使えます。

```json:JSONファイル内でのコメント表記
// 【付与されるエンチャント】
// 
// knockback    ノックバック    レベル１
// sharpness    ダメージ増加    レベル２
// looting      ドロップ増加    レベル３
{
    "function": "specific_enchants",
    "enchants": [
        {"id": "knockback", "level": 1},
        {"id": "sharpness", "level": 2},
        {"id": "looting"  , "level": 3}
    ]
}
```


# おわりに

`manifest.json`さえ出来てしまえば、あとは必要に応じて内容を付け足していけばいいだけなので、先に空のアドオンパックを追加しておくのもいいでしょう。

アドオンパックの適用方法については以下のページをご覧ください。

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

https://qiita.com/glasses_seven/items/7a174722c9030e669eac

:::note info
ルートテーブルの書き方は以下のページでご紹介しています。
:::

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

:::note info
今回ご紹介したファイルの内容は以下の環境で使用しているものです。
:::

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

この環境ではまだ使っていない項目や、ここに記載していない項目もありますので、今後も必要に応じて内容を追加／修正していきます。