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

# はじめに

発射体エンティティが作れるようになると、投擲アイテムや発射アイテムからの発射物としてカスタムエンティティが使えるようになります。

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

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

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

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


# 定義ファイルの内容

以下のファイルはダミーエンティティの実装を元に必要な定義を追加したものです。

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

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

            // 発射体設定 -----START
            "minecraft:projectile": {
                "on_hit": {
                    "impact_damage": {
                        "damage": [ 1, 4 ],
                        "knockback": true,
                        "semi_random_diff_damage": false,
                        "destroy_on_hit": false
                    },
                    "stick_in_ground": {
                        "shake_time" : 0.35
                    }
                },
                "hit_sound": "bow.hit",
                "power": 1.6,
                "gravity": 0.05
            }
            // 発射体設定 -----END

        }
    }
}
```

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

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


# 汎用ブロック

## ・minecraft:breathable

射出場所によっては色んなところで着弾する事があり得るので、エンティティが呼吸できるブロック、あるいは場所を設定しています。
<dl>
    <dt>breathes_solids（=true）</dt>
    <dd>固形ブロック内で呼吸できます。<br /><br /></dd>
    <dt>breathes_water（=true）</dt>
    <dd>水の中で呼吸できます。</dd>
</dl>

上記以外の項目はデフォルト値が適用されます。
これを設定しておかないと射出場所によってはすぐにデスポーンしてしまう事があるので注意が必要です。

## ・minecraft:collision_box

ここでは衝突判定が作動しないように高さ・幅共にゼロで設定しています。
<dl>
    <dt>height（=0.0）</dt>
    <dd>高さなし。<br /><br /></dd>
    <dt>width（=0.0）</dt>
    <dd>幅なし。</dd>
</dl>

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

## ・minecraft:pushable

上記の`collision_box`が設定されている場合に限りますが、モブ等によって押し出される事があるので無効になるように設定しています。
<dl>
    <dt>is_pushable（=false）</dt>
    <dd>モブ等からの押し出しは無効。<br /><br /></dd>
    <dt>is_pushable_by_piston（=false）</dt>
    <dd>ピストンによる押し出しは無効。</dd>
</dl>

## ・minecraft:physics

物理法則を設定しています。
<dl>
    <dt>has_collision（デフォルト:true）</dt>
    <dd>
        trueの場合、オブジェクトと衝突します。<br /><br />
    </dd>
    <dt>has_gravity（デフォルト:true）</dt>
    <dd>
        trueの場合、重力の影響を受けます。<br /><br />
    </dd>
    <dt>push_towards_closest_space（デフォルト:false）</dt>
    <dd>
        trueの場合、ブロックに埋まった時に最も近い空き領域に押し出されます。
    </dd>
</dl>


# 発射体設定

## ・minecraft:projectile

<dl>
    <dt>on_hit</dt>
    <dd>
        発射物の着弾時の動作を指定します。<br /><br />
        <dl>
            <dt>impact_damage</dt>
            <dd>
                発射物のヒット時のダメージに関する設定を行います。
                <dl>
                    <dt>damage（=[1, 4]）</dt>
                    <dd>
                        ダメージの量を数値、あるいは配列（最小値、最大値）で指定します。<br /><br />
                    </dd>
                    <dt>knockback（=true）</dt>
                    <dd>
                        trueの場合、ノックバックが発生します。<br /><br />
                    </dd>
                    <dt>semi_random_diff_damage（=false）</dt>
                    <dd>
                        trueの場合、<code>damage</code>と速度に基づいてダメージがランダム化されます。<br /><br />
                    </dd>
                    <dt>destroy_on_hit（=false）</dt>
                    <dd>
                        trueの場合、発射物がヒット時に削除されます。
                    </dd>
                </dl>
            </dd>
        </dl>
        <dl>
            <dt>stick_in_ground</dt>
            <dd>
                発射物が地面に突き刺さるようにする場合、指定します。
                <dl>
                    <dt>shake_time（=0.35）</dt>
                    <dd>
                        着弾時に揺れる時間（恐らく秒数）を指定します。
                    </dd>
                </dl>
            </dd>
        </dl>
    </dd>
    <dt>hit_sound（="bow.hit"）</dt>
    <dd>
        発射物の着弾時のサウンドを指定します。<br />
        <code>&lt;リソースパック&gt;/sounds.json</code>内の<code>individual_event_sounds</code>ブロックの項目から選択します。<br /><br />
    </dd>
    <dt>power（=1.6）</dt>
    <dd>
        発射物の速度を指定します。<br /><br />
    </dd>
    <dt>gravity（=0.05）</dt>
    <dd>
        発射物に適用される重力を指定します。<br />
        値が大きいほど落下速度が速くなります。<br /><br />
    </dd>
</dl>

:::note info
設定できる項目は他にもたくさんあるようですが、ここでは極力必要最小限の構成で作成しています。
:::


# 発射体としてアイテムに登録

このままでは発射体として機能しないので、以下それぞれのアイテムに定義を追加する必要があります。

## ・投擲アイテムで使う場合

[>> 投擲アイテム](https://qiita.com/glasses_seven/items/1c2dddcea47e8fd531a0/ "投擲アイテムの作り方")のページでご紹介させて頂いた`projectile`ブロックを以下の内容に置き換える事で、今回ご紹介した発射体エンティティを投擲できるようになります。
<dl>
    <dt>minecraft:projectile</dt>
    <dd>
        <dl>
            <dt>projectile_entity</dt>
            <dd>
                今回の場合は<code>customize:dummy_entity</code>を指定します。
            </dd>
        </dl>
    </dd>
</dl>

## ・発射アイテムで使う場合

投擲アイテムの場合と比べると少し複雑になりますが、補充アイテム（発射時にアイテムスロット上で消費するアイテム）と[&gt;&gt; 発射アイテム](https://qiita.com/glasses_seven/items/ed7e18730c9c5de3295c/ "発射アイテムの作り方")のページでご紹介させて頂いた発射アイテムにそれぞれ定義を追加する必要があります。

そして今回作成した発射体エンティティは補充アイテムに登録する必要があります。

仮に[>> ダミーアイテム](https://qiita.com/glasses_seven/items/b41797e3df3325c3fab5/ "ダミーアイテムの作り方")のページでご紹介させて頂いたダミーアイテムを補充アイテムとして使う場合、`customize:dummy_item`の`components`ブロックに以下の`projectile`ブロックを追加する必要があります（内容は投擲アイテムで設定したものと全く同じです）。
<dl>
    <dt>minecraft:projectile</dt>
    <dd>
        <dl>
            <dt>projectile_entity</dt>
            <dd>
                今回の場合は<code>customize:dummy_entity</code>を指定します。
            </dd>
        </dl>
    </dd>
</dl><br />

上記で定義した補充アイテムが準備できれば、今度は発射アイテムの以下の部分に補充アイテムを登録する事で発射できるようになります。
<dl>
    <dt>minecraft:shooter</dt>
    <dd>
        <dl>
            <dt>ammunition</dt>
            <dd>
                <dl>
                    <dt>item</dt>
                    <dd>
                        今回の場合は<code>customize:dummy_item</code>を指定します。
                    </dd>
                </dl>
            </dd>
        </dl>
    </dd>
</dl>


# 多言語設定

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

```text:<リソースパック>/texts/en_US.lang
entity.customize:dummy_entity.name=<カスタムエンティティの名前>
item.spawn_egg.entity.customize:dummy_entity.name=<カスタムエンティティのスポーンエッグの名前>
```

:::note info
今回の場合は発射体のエンティティなので必要なければ書かなくてもいいでしょう。
:::


# おわりに

ここでご紹介した発射体エンティティの`minecraft:projectile`ブロックの項目は、既存のエンティティにも適用する事ができます。

例えばエンダーマイトに適用する場合、JSONファイルには以下のように追加します。

```json:<ビヘイビアパック>/entities/endermite.json
{
    "format_version": "1.17.10",
    "minecraft:entity": {
        "description": {
            "identifier": "minecraft:endermite",
            "spawn_category": "monster",
            "is_spawnable": true,
            "is_summonable": true,
            "is_experimental": false
        },
        "components": {
            ・
            ・
            ・
            "minecraft:projectile": {
                "on_hit": {
                    "impact_damage": {
                        "damage": [ 1, 4 ],
                        "knockback": true,
                        "semi_random_diff_damage": false,
                        "destroy_on_hit": false
                    },
                    "stick_in_ground": {
                        "shake_time" : 0.35
                    }
                },
                "hit_sound": "bow.hit",
                "power": 1.6,
                "gravity": 0.05
            }
            ・
            ・
            ・
        }
    }
}
```

これを投擲アイテムの`projectile`ブロックに登録すると以下のように発射できるようになります。
![エンダーマイトの投擲](https://socket-manager.github.io/document/minecraft-contents/img/custom-entity-projectile/endermite.gif "エンダーマイトの投擲")

ここでご紹介させて頂いた発射体エンティティは、以下のコンテンツでも利用しています。

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

https://qiita.com/glasses_seven/items/3135aab823428dcc708e/

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

https://qiita.com/glasses_seven/items/556927227356043752a2/

https://qiita.com/glasses_seven/items/6f125a1d45f5d9cef538/

https://qiita.com/glasses_seven/items/88f9e2fea056172d41b7/

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

https://qiita.com/glasses_seven/items/129d40545884750e4e78/

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

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

https://qiita.com/glasses_seven/items/8fb6f96a829a449d4ad3/