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

# はじめに

ここでご紹介させて頂く投擲アイテムというのは、トライデントやウインドチャージなどのように手に持って投げるアイテムの事を指しています。

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

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

以降では`components`ブロックのJSONデータの内容を「汎用ブロック」「アニメーション設定」「投擲設定」の３つのパートに分けて投擲（とうてき）アイテムの作り方をご紹介します。

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


# 定義ファイルの内容

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

```json:<ビヘイビアパック>/items/dummy_item.json
{
    "format_version": "1.20.50",
    "minecraft:item": {
        "description": {
            "identifier": "customize:dummy_item",
            "menu_category": {
                "category": "items"
            }
        },
        "components": {

            // 汎用ブロック -----START
            "minecraft:icon": {
                "texture": "dummy_item"
            },
            "minecraft:display_name": {
                "value": "item.customize:dummy_item.name"
            },
            "minecraft:can_destroy_in_creative": false,
            "minecraft:hand_equipped": false,
            "minecraft:glint": true,
            // 汎用ブロック -----END

            // アニメーション設定 -----START
            "minecraft:use_animation": "spear",
            "minecraft:use_modifiers": {
                "use_duration": 1.6,
                "movement_modifier": 0.35
            },
            // アニメーション設定 -----END

            // 投擲設定 -----START
            "minecraft:projectile": {
                "projectile_entity": "minecraft:ender_pearl"
            },
            "minecraft:throwable": {
                "do_swing_animation": false,
                "launch_power_scale": 1.6,
                "max_launch_power": 1.6,
                "scale_power_by_draw_duration": true,
                "max_draw_duration": 1.6,
                "min_draw_duration": 0.5
            },
            "minecraft:cooldown": {
                "category": "dummy_item",
                "duration": 0.1
            }
            // 投擲設定 -----END

        }
    }
}
```

上記のコメントのように、大きく分けて「汎用ブロック」「アニメーション設定」「投擲設定」の３つのパートに分けています。

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


# 汎用ブロック

## ・minecraft:icon

<dl>
    <dt>texture（="dummy_item"）</dt>
    <dd>
        テクスチャファイルの所在を表すキーを設定しています。
    </dd>
</dl>

## ・minecraft:display_name

<dl>
    <dt>value（="item.customize:dummy_item.name"）</dt>
    <dd>
        以下の<a href="#多言語設定">&gt;&gt; 多言語設定</a>の項目で設定しているキーの名前を設定しています。<br />
        この多言語設定で登録されているキーの値がアイテム名として表示されます。
    </dd>
</dl>

## ・minecraft:can_destroy_in_creative（=false）

クリエイティブモード時にブロックを壊さないようにfalseを設定しています。

## ・minecraft:hand_equipped（=false）

装備品ではないのでfalseを設定しています。

## ・minecraft:glint（=true）

カスタムアイテムである事を表現するため、レンダリングがかかるようにtrueを設定しています。


# アニメーション設定

## ・minecraft:use_animation（="spear"）

アニメーションの種類を指定します。
今回はトライデントと同じように投げるアイテムなのでspearを指定しています。

## ・minecraft:use_modifiers

アイテムを使用するまでにかかる時間を指定します。
ここでは[&gt;&gt; 食料アイテム](https://qiita.com/glasses_seven/items/633a9c4a3ad9c4b13d21/ "食料アイテムの作り方")の設定を流用しています。

アニメーションの種類と定義の詳細は以下のページをご覧ください。

https://qiita.com/glasses_seven/items/93ffdf68edb5e1f806bc/

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


# 投擲設定

## ・minecraft:projectile

発射体のエンティティを指定します。
<dl>
    <dt>projectile_entity（="minecraft:ender_pearl"）</dt>
    <dd>
        今回はネイティブアイテムのエンダーパールを指定しています。
    </dd>
</dl>

:::note info
発射体としてカスタムエンティティを指定する方法もあります。詳しい作り方については以下のページをご覧ください。
:::

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

## ・minecraft:throwable

各種投擲用の設定項目を指定します。
<dl>
    <dt>do_swing_animation（=false）</dt>
    <dd>
        アイテム投擲時のネイティブアニメーション再生有無を設定します。<br />
        今回はfalseを設定していますが、trueにすると<code>use_animation</code>とは異なるアニメーションが以下のように再生されます。<br /><br />
        ▼一人称<br />
        <img src="https://socket-manager.github.io/document/minecraft-contents/img/custom-item-throw/swing-animation1.gif" height="354px" width="500px" /><br /><br />
        ▼三人称<br />
        <img src="https://socket-manager.github.io/document/minecraft-contents/img/custom-item-throw/swing-animation3.gif" height="354px" width="500px" /><br /><br />
        <code>use_animation</code>と同時に指定してしまうと動作が混同しておかしな動きになるので、この設定項目を使う場合ははずしておきましょう。<br /><br />
    </dd>
    <dt>launch_power_scale（=1.6）</dt>
    <dd>
        投擲の威力を数値で設定します。<br /><br />
    </dd>
    <dt>max_launch_power（=1.6）</dt>
    <dd>
        投擲アイテムを発射するための最大威力を設定します。<br />
        <code>launch_power_scale</code>の数値を大きくしても、ここで設定した最大値は超えないように丸められるようです。<br /><br />
    </dd>
    <dt>scale_power_by_draw_duration（=true）</dt>
    <dd>
        チャージ時間に応じて投げの威力が増加するかどうかを設定します。<br />
        trueの場合、長く押し続けるほど放した時のパワーが大きくなり、アニメーションの<code>use_modifiers</code>設定に関わらず右クリック状態を解除した時点で発射されます。<br /><br />
    </dd>
    <dt>max_draw_duration（=1.6）</dt>
    <dd>
        投擲可能なアイテムを描画するための最大期間（恐らく秒数）を設定します。<br />
        <code>min_draw_duration</code>とのセットで最小期間～最大期間を設定すると、この期間に右クリック状態を解除した時点で投擲されるようです。<br /><br />
    </dd>
    <dt>min_draw_duration（=0.5）</dt>
    <dd>
        投擲可能なアイテムを描画するための最小期間（恐らく秒数）を設定します。<br />
        <code>max_draw_duration</code>とのセットで最小期間～最大期間を設定すると、この期間に右クリック状態を解除した時点で投擲されるようです。<br />
        この値が低すぎるとあまり勢いをつけずに投げる事になるので、自分に当たってダメージを受ける事があります。
    </dd>
</dl>

## ・minecraft:cooldown

アイテムのクールダウン時間を指定します。
このブロックを設定していると、投擲物発射後のクールダウン時間内では再投擲できなくなります。
また、右クリック状態を長押ししている間も投擲物が発射されません。
<dl>
    <dt>category（="dummy_item"）</dt>
    <dd>
        このアイテムのクールダウンの種類を文字列で設定します。<br /><br />
    </dd>
    <dt>duration（=0.1）</dt>
    <dd>
        一致するカテゴリを持つアイテムが再び使用可能になるまでのクールダウン時間（秒単位）を設定します。
    </dd>
</dl>


# 多言語設定

カスタムエンティティの場合と同様に以下のファイルでアイテム名を定義しています。

```text:<リソースパック>/texts/en_US.lang
item.customize:dummy_item.name=ダミーアイテム
```


# おわりに

完成イメージは次の通り。
![完成イメージ](https://socket-manager.github.io/document/minecraft-contents/img/custom-item-throw/swing-animation.gif "完成イメージ")

ここでご紹介させて頂いた作り方は以下のアイテム実装時に応用しています。

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

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