【マインクラフト（統合版）】座れるエンティティの作り方まとめ

# はじめに

ここでは以下のページでご紹介させて頂いたコンテンツを例に取り上げて進めていきます。

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

基本的な部分は以下のページでダミーエンティティが実装済みである事を前提にしています。

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

`components`ブロックのJSONデータの内容を、「汎用ブロック」と「座れる設定」の２つのパートに分け、座れるエンティティの作り方を以降でご紹介します。

:::note info
「汎用ブロック」とは[&gt;&gt; コンポーネント定義](https://qiita.com/glasses_seven/items/abf1aecba67284e88e27/#コンポーネント定義 "ダミーエンティティの作り方（コンポーネント定義）")の項目でご紹介させて頂いた`components`ブロックの便宜上の呼称です。
:::


# 定義ファイルの内容

ここでは「不動の杖」で使っている以下のダミーエンティティのファイルを例に取り上げます。

```json:<ビヘイビアパック>/entities/immovable.json
{
    "format_version": "1.17.10",
    "minecraft:entity": {
        "description": {
            "identifier": "customize:immovable",
            "is_spawnable": false,
            "is_summonable": true
        },
        "components": {

            // 汎用ブロック -----START
            "minecraft:breathable": {
                "breathes_solids": true,
                "breathes_water": true
            },
            "minecraft:collision_box": {
                "height": 0.0,
                "width": 0.0
            },
            "minecraft:pushable": {
                "is_pushable": false,
                "is_pushable_by_piston": false
            },
            // 汎用ブロック -----END

            // 座れる設定 -----START
            "minecraft:rideable": {
                "seat_count": 1,
                "crouching_skip_interact": true,
                "family_types": [],
                "seats": [
                    {
                        "position": [ 0.0, 0.0, 0.0 ]
                    }
                ],
                "pull_in_entities": true
            }
            // 座れる設定 -----END

        }
    }
}
```

上記のコメントのように、大きく分けて「汎用ブロック」と「座れる設定」の２つのパートに分けています。

以下ではパート分けしたそれぞれの内容をみていきます。


# 汎用ブロック

ここでは座れるエンティティを作成するために必要な汎用ブロックの設定内容を記載しています。

## ・minecraft:breathable

座らせる相手によっては色んな場所でスポーンさせる事があり得るので、エンティティが呼吸できるブロック、あるいは場所を設定しています。

<dl>
    <dt>breathes_solids（=true）</dt>
    <dd>固形ブロック内で呼吸できます。</dd>
    <dt>breathes_water（=true）</dt>
    <dd>水の中で呼吸できます。</dd>
</dl>

上記以外の項目はデフォルト値が適用されます。
これを設定しておかないと召喚してもすぐにデスポーンしてしまう事があります。

## ・minecraft:collision_box

ここでは衝突判定が作動しないように高さ・幅共にゼロで設定しています。

<dl>
    <dt>height（=0.0）</dt>
    <dd>高さなし。</dd>
    <dt>width（=0.0）</dt>
    <dd>幅なし。</dd>
</dl>

衝突判定があると、モブ等による押し出しによって座っている位置をずらされたり、攻撃の影響を受けてデスポーンする事があるので注意が必要です。

## ・minecraft:pushable

上記の`collision_box`が設定されている場合に限りますが、モブ等によって押し出される事があるので無効になるように設定しています。

<dl>
    <dt>is_pushable（=false）</dt>
    <dd>モブ等からの押し出しは無効。</dd>
    <dt>is_pushable_by_piston（=false）</dt>
    <dd>ピストンによる押し出しは無効。</dd>
</dl>

## ・minecraft:physics

上記のJSONファイルでは定義されていませんが、これを定義しない事で物理法則が適用されないようにしていますので敢えて書かせて頂きました。
エンティティを召喚した場所が空洞になっていた場合、物理法則があると下に抜け落ちてしまうので未定義としています。


# 座れる設定

ここでは座れるようにするために必要な設定内容を記載しています。

## ・minecraft:rideable

<dl>
    <dt>seat_count（=1）</dt>
    <dd>座れる人数を指定します。</dd>
    <dt>family_types（=[]）</dt>
    <dd>
        座れるファミリータイプをリスト形式で指定します。<br />
        現在は空配列を指定する事で全ファミリーを指定していますが<code>family_types</code>の定義自体をしなくても同じ動作になります。
    </dd>
    <dt>seats（=[{"position": [ 0.0, 0.0, 0.0 ]}]）</dt>
    <dd>
        座るポジションを相対座標（[X, Y, Z]）で指定します。
        例えば<code>[ 0.0, 2.0, 0.0 ]</code>とした場合、以下みたく浮いたように見えます。<br />
        <img src="https://socket-manager.github.io/document/minecraft-contents/img/custom-entity-sit/position.png" /><br />
        ※ダミーエンティティはテスト用のスプライト表示にしています。
    </dd>
    <dt>pull_in_entities（=true）</dt>
    <dd>
        <code>family_types</code>で許可されている近くのモブを座席へ引き込みます。
        より確実に座らせるために今回は定義を入れています。
    </dd>
</dl>


# 多言語設定

あと忘れてはいけないのが多言語設定です。
カスタムエンティティの場合は`en_US.lang`ファイルが規定の言語ファイルになるので以下のファイルに記載する必要があります。

```text:<リソースパック>/texts/en_US.lang
entity.customize:immovable.name=<カスタムエンティティの名前>
item.spawn_egg.entity.customize:immovable.name=<カスタムエンティティのスポーンエッグの名前>
action.hint.exit.customize:immovable=:_input_key.sneak: を押して降りる
```

プレイヤーが座った時に「Shiftを押して降りる」という表示を目にされた事があると思いますが、この部分は上記の`action.hint.exit.<エンティティID>`で設定されている文章です。

`:_input_key.sneak:`というプレースホルダの部分はスニーク時のキーの名前で置換されます。

今回はダミー用途なのでエンティティの名前やスポーンエッグの名前はなくても問題ありませんが、この設定がないと以下のようにキーそのものが画面に表示されてしまうので注意が必要です。

▼設定がない場合
![設定がない場合の表示](https://socket-manager.github.io/document/minecraft-contents/img/custom-entity-sit/shift-key.png "設定がない場合の表示")

▼設定がある場合
![設定がある場合の表示](https://socket-manager.github.io/document/minecraft-contents/img/custom-entity-sit/shift-ja.png "設定がある場合の表示")


# おわりに

ここでご紹介させて頂いた座れるダミーエンティティは、以下のコンテンツでも利用しています。

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

https://qiita.com/glasses_seven/items/876eb47c3e38828428e4/

https://qiita.com/glasses_seven/items/690f46f3ac6181d91ebc/