【MC1.12Modding】初心者研修編 - ItemとItemStackの違い


# 初心者研修編リンク
- [新規Modの作成からビルドまで](https://qiita.com/Katatsumuri_Pan/items/fec8344fa51b79261381)
- [早速プログラムを書いてみる](https://qiita.com/Katatsumuri_Pan/items/21f4b5f08aadec2eac17)
- ItemとItemStackの違い ← here
- BlockとIBlockStateとTileEntityは一緒です（大嘘）
- Modを国際化する
- デバッグを実践する
- イベント購読
- 音とか粒子とか
- ワールドとディメンションは何が違うんだ
- 「メタデータ」ってかっこいいな
- Entityを少しだけ操る
- 強敵NBT
- [メインページへ戻る](https://qiita.com/Katatsumuri_Pan/items/e3fd7fec471ee66fa17a)

# はじめに

前回の記事（[早速プログラムを書いてみる](https://qiita.com/Katatsumuri_Pan/items/21f4b5f08aadec2eac17)）では、レシピの登録を題材にプログラミングを実践しました。
意外と簡単だったと思います。（難しかったらゆっくりやればいいだけですので）

今回はマイクラのModdingに欠かせない`Item`と`ItemStack`の違いを理解するだけの記事です。
それじゃあつまらないだろうと思ったので、（不完全ではありますが）アイテムを登録するソースコードも一緒に付けました。ぜひ遊んでみてください。
（なんならレシピ登録のプログラミングより楽かもしれない）

# 目次

[1. とりあえずアイテムを追加してみる](#1-とりあえずアイテムを追加してみる)
[2. `Item`と`ItemStack`の違い](#2-itemとitemstackの違い)
[3. イメージ図](#3-イメージ図)
[4. `Item`と`ItemStack`の違いを踏まえてコードを読む](#4-itemとitemstackの違いを踏まえてコードを読む)
[5. 終わりに](#5-終わりに)

# 1. とりあえずアイテムを追加してみる

### 最短！アイテムの追加コード！（非推奨）

実は機能や見た目、利便性等々を一切考えなければ、アイテムの追加は短い1行で終了します。
```java
event.getRegistry().register(new Item().setRegistryName("my_item1"));
```
これを`public void registerItems(RegistryEvent.Register<Item> event) {`の直後にコピペするだけでアイテムを追加できます。
が、正直、このコードはあまり勉強向きでない例[^101]なのでわざわざやらなくて良いです。

[^101]: `setTranslationKey`を呼んでない、なんならそもそもItemを継承せずにそのままインスタンス化するような状況がほぼ無い
~~工業Mod依存者とか素材アイテム大好きマンなら別だが~~

<details><summary>わざわざやった例</summary>

まず、コードをコピペした時のスクショです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835470/44f776da-9058-252c-aca7-1b5a9afde5fc.png)
40行目にコピペしました。（前回のレシピ登録コードを追加している場合は行数がずれます。）

`/give @p my_first_mod:my_item1`でしか入手できない[^102]ので非常に不便です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835470/6de9ee72-ad5a-dd50-ea5c-484cac9f9fd2.png)

[^102]: JEI入ってるじゃんという屁理屈は不要

<font color="gray">└わざわざやった例終わり</font>
</details>

### アイテムを追加するコード

さて、もう多少は学びがいのある[^103]アイテム追加練習コードを用意しました。

[^103]: いきなり別ファイルに継承クラスを書き始められると学ぶ側は不安になってしまうので、ここではごくシンプルなものを使う

```java
// アイテムの見本を生成
Item myItem1 = new Item();

// 必須
// 内部名の設定（半角小文字とアンダーバーのみ使用可能）
// 好きな名前を付けられる（他との被り不可）
myItem1.setRegistryName("my_item1");

// 必須
// 翻訳基本名の設定（半角小文字やアンダーバー、ドット辺りを使うことが多い）
// setRegistryNameと同じものを使うのが自然
myItem1.setTranslationKey(new ResourceLocation(Tags.MODID, "my_item1").toString());

// アイテムを入手できるクリエイティブタブの設定
// CreativeTabs.****でエラーにならないものなら何でも可
myItem1.setCreativeTab(CreativeTabs.FOOD);

// アイテム（の見本）の登録（生成しただけじゃゲーム内では使用できない！）
event.getRegistry().register(myItem1);
```

<details><summary>さてコードの中身を軽めに解説しておこう！</summary>

少しづつJavaに慣れて行くためにも、まずは比較的シンプルなコードを上から順にみていきましょう。

```java
// アイテムの見本を生成
Item myItem1 = new Item();
```
まずはアイテムの**見本**を生成する行です。
`new`って書いてある通り、新しいアイテムの**見本**が作られます。

わざわざ**見本**と強調している通り、ここで作られるものはイメージするゲーム中のアイテムとは異なります。
~~（実は後述するItemStackこそがゲーム内のアイテムに対応するという早すぎるネタバレ）~~


以降のコードでは生成した見本を`myItem1`という名前で**一時的に**呼ぶことにします。
じゃあ永久的な名前は？というとその次のコードです。
```java
// 必須
// 内部名の設定（半角小文字とアンダーバーのみ使用可能）
// 好きな名前を付けられる（他との被り不可）
myItem1.setRegistryName("my_item1");
```
生成したいアイテム見本の内部名[^190]を設定します。
`"my_item1"`の部分を変更することで任意の名づけが可能ですが、ModIdと同様に半角アルファベットやアンダーバーしか使えない[^104]ことに注意しましょう。

[^190]: 他のアイテムと区別するために使用する名前、識別名
この名前を基準にアイテムを認識しているため、名前が変わると別アイテム扱い
昔は数値ID（のみ）で認識していたので、それよりは進歩した

[^104]: 厳密にはModId同様、使えなくはないがバグの元

:::note warn

空白や大文字さえも非推奨です。

:::

:::note info

レシピの内部名と同様に、被らない名前[^105]を付けましょう。

[^105]: 他Modやバニラとは被っても良い
内部名は`（ModId）:（設定した名前）`[^106]となるため、別Modの場合は別名扱い
なお、ブロックとアイテムで名前が被ってもよい（別管理のため）

[^106]: こういった`（ModId）:`の部分を名前空間と呼ぶ

:::

```java
// 必須
// 翻訳基本名の設定（半角小文字とアンダーバー、ドット辺りを使うことが多い）
// setRegistryNameと同じものを使うのが自然
myItem1.setTranslationKey(new ResourceLocation(Tags.MODID, "my_item1").toString());
```
ここはまあ、一つ前と同じもの[^107]を設定しておけば特に問題は無いです。わざわざ説明するほどの重要な話はありません。

[^107]: ModIdが付いてるじゃんという屁理屈は受け付けておりません

<details><summary>もうちょっと真面目な説明</summary>

翻訳関連については次の記事でより詳細に解説する予定のため、ここではこのコードの説明や特徴の解説に留めます。

アイテム名の翻訳キーを`item.（ModId）:（設定名）.name`に設定するコードです。
（今までのコードをアレンジせずに来た場合は`item.my_first_mod:my_item1.name`が翻訳キーです。）
`Tags.MODID`がModIdを表しています。
名前にModIdを組み合わせることで他Modと重複することを防いでいます。
~~`setRegistryName`は自動でModIdが付くのになぜ同じそういう仕様にしなかったのか~~

<font color="gray">└もうちょっと真面目な説明終わり</font>
</details>

続いてが一番カスタムしがいのある（？）部分です。
```java
// アイテムを入手できるクリエイティブタブの設定
// CreativeTabs.****でエラーにならないものなら何でも可
myItem1.setCreativeTab(CreativeTabs.FOOD);
```
コメントを読めば何をする部分かは割と分かります。
~~別に食料でも何でもないのに食料タブに設定してる~~
お好みで好きなクリエイティブタブを設定してください。

<details><summary>簡単な設定方法（復習）</summary>

[前記事](https://qiita.com/Katatsumuri_Pan/items/21f4b5f08aadec2eac17#3-%E5%B0%91%E3%81%97%E3%81%A0%E3%81%91%E6%94%B9%E9%80%A0%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B) の「2.成果品を別アイテムにする」でアイテムの選択肢表示を出す方法の説明を行いましたが、これも同様です。（全部一緒）

`FOOD`の部分を消し、`myItem1.setCreativeTab(CreativeTabs.！！ココ！！);`にキャレットがある状態（クリックした状態）でCtrl+スペースを押して予測表示を出しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835470/da406bc3-f7f0-9d3d-3efa-6588cc2bc1d4.png)

<font color="gray">└簡単な設定方法（復習）終わり</font>
</details>

ちなみに、クリエイティブタブで入手できないようにしたい（例：コマンドブロック）場合は、この行を丸ごと削除すればOKです。
裏を返せば、**このプログラムコードでちゃんと設定しないとクリエイティブタブに現れない**ということです。

:::note info

食料タブに設定したからといって、食べ物になるわけではありません。
食料アイテムの作成は初級編で解説予定です。

:::

最後にできあがったアイテム見本を登録するコードです。
```java
// アイテム（の見本）の登録（生成しただけじゃゲーム内では使用できない！）
event.getRegistry().register(myItem1);
```
いわゆる「武器や防具は持っているだけじゃ意味が無いぞ、ちゃんと装備しよう！」ってのと同じです。
ちゃんと登録しておかないと使えません。
~~これ以上説明することは無い~~

<font color="gray">└さてコードの中身を軽めに解説しておこう！終わり</font>
</details>

このアイテム登録コードを`registerItems`のメソッドの中にコピペしてください。
`public void registerItems(RegistryEvent.Register<Item> event) {`の次の行ですね。

:::note warn

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835470/797c012d-4a4d-cccf-e399-3e9ee77b9690.png)
画像のようにメソッドが折り畳まれている場合はちゃんと展開してからにしましょう[^108]。（行番号の右の`>`をクリック）

[^108]: あえて一度ミスってみるのも手
やらかした時にどうなるかを予め知っておけばいざという時に焦りづらい
~~マイクラ秋のエラー祭り~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835470/8be22a3b-dafc-03a5-e9d7-5aebd1e5324d.png)


これならOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835470/c0de833d-5a37-506f-2bea-7e36911587ac.png)

:::


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835470/1cc46023-881a-2ff9-99df-df8245055971.png)
（前回のレシピ登録コードを追加している場合は開始行番号がずれます。）
コピペがミスっていなければそのまま`2.Run Client`できるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835470/fa49338d-35c3-e602-67dc-ce09341dc52c.png)
バグった見た目と名前のアイテムが指定したクリエタブに追加されていますね。

本当に何の機能も見た目も持たない"スカ"なアイテムが追加されました。
手にもって右クリックしても何も起きません。

あっけなく終わったように感じますが、これでアイテム追加コードの基礎は完了です！
「見た目と名前バグってるんだけど終わり？」という声が聞こえてきそうですが、実はアイテムの見た目と名前はJavaのコードではなくリソースパック[^109]の領分のため、解説はリソパ編に回します。
（食料アイテムの追加方法を含め、アイテムの追加方法特化の解説は初級編で行う予定です。）

[^109]: 意外に思えるが、Modはリソースパックを内蔵している
そのため、リソースパックの知識が必要（「リソースパックを知っていれば簡単」とも言い換えられる）

:::note info

無機能アイテムの追加は非常に簡単ですが、Javaのコードとリソースパックの両方を組み合わせる必要があります

:::

<details><summary>ワールドに入る際になんか警告が出た時</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835470/6cf02a2e-d37e-84b6-afed-3a52f0ee63c4.png)

これは「前回プレイ時に登録されていたアイテムが今回は登録されていないため、既に存在していたワールド内の該当のアイテムのスロットは全て空になります[^180]」という警告です。
Modを抜いたり入れ替えたりして遊んだ場合にはよく見かけるメッセージですね。

[^180]: 一度空になってしまった場合、Modを入れ直してワールドに入っても復活しない
ただし、文字列で保存されている場合はModを入れ直せば大抵元通りになる
クエストModとかは割とそう

アイテムの内部名を変更した際にはその度に出るので慣れます。
~~逆に何も変更していないはずなのにこれが出たらヤバイ（大抵は入るワールド間違えたパターンだけど）~~

<font color="gray">└ワールドに入る際になんか警告が出た時終わり</font>
</details>




# 2. ItemとItemStackの違い

さて突然ですがクイズです。以下の二つのアイテムの違いは何でしょう。
ひっかけ問題ではありません。~~スロット位置が違う！[^200]~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835470/602c58df-ebbd-7167-6fe9-aa35770ec2a0.png)

[^200]: 「スロット位置が違う」は「ItemStackのインスタンスが違う」という意味でクイズの適切な正解ではあるが…

.
.
.

どう見ても耐久値が違いますね。

では第2問、先ほどの二つのアイテムの**共通点**は何でしょう。~~同じ画面内！~~

.
.
.
.
.
.

これは正答が無数にあると思いますが、一番は **「どちらも同じ鉄の剣」** ということです。
両方とも両方とも鉄の剣という名前で、両方とも武器で、両方とも攻撃力が6で、両方とも焼くと鉄ナゲット（鉄塊）ができて…
両方とも同じ性質・属性のアイテムです。
今回は2個ですが、いくつ鉄の剣があっても全て同じ性質・属性を持ちます。

対して、耐久値はモノによって違います。
どんなエンチャントが付いているかもモノによって違います。
金床で付けた名前もモノによって違うでしょう[^201]。

[^201]: 全てに同じ名前を付ける~~狂じ…狂ったひ…変じ~~…ちょっと変わった人は別

つまり、二つは同じ鉄の剣でも、**常に共通する要素**と**モノによって異なりうる要素**の2つの要素が混ざっているということです。

この**共通要素**が`Item`、ひな形、テンプレート、設計図、見本であり[^202]、
**個別要素**が`ItemStack`、個体、インスタンス[^203]です。

[^202]: `Item`は「アイテムの種類」で`ItemStack`は「実際のアイテム」と呼ぶこともできそうだが、「アイテムの種類」だと「ツールor食べ物or素材」という上位の種類ばかりイメージしてしまうのが難点か
~~「ひな形」という言い回しがそれより優れているかどうかはまた悩ましい問題である~~

[^203]: `Item`も（プログラミングの文脈では）インスタンスだという指摘は話を面倒にするのでナシで
あくまでゲームMinecraftとしての考え方

当然ながら**個別要素**`ItemStack`は**共通要素**`Item`を土台にしています。
（例えばアイテム名は個別に設定できる**個別要素**であるが、特段変更しない限りは**共通要素**として決まっている名前がデフォルトとして使われるようなイメージ）

:::note info

つまり、二つの鉄の剣は同じ`Item`だが、異なる`ItemStack`ということです。

:::


以下の場合はどうでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835470/f4b23925-dd03-f8d7-a369-32aaa4042df2.png)

鉄インゴットに耐久値やエンチャントのような概念はありませんが、「個数」[^204]の概念はあります。
そしてそれは**モノによって違う**=**個別要素**（`ItemStack`）ということです。

[^204]: `ItemStack`のStackは英語で「積み重なった（ひとまとまりの）もの」という意味
カタカナ読みは「スタック」

:::note info

ここで少し`Item`と`ItemStack`という言葉の使い方を修正しておきます。（ふーん。程度でOK）
- `Item`はそのアイテムの共通要素（共通設定）を全てまとめたモノ（クラス[^205]）
- `ItemStack`は`Item`をベースに追加で個別要素を持っているモノ（クラス）

[^205]: 「クラス」はプログラミング用語
おおざっぱには「モノ」だが、「インスタンス（個体・個別具体物）」に対して「それらの元となる設計図・ひな形・概念」というニュアンスの言葉
教義的にはオブジェクトの属性と操作を定義したもの

:::

# 3. イメージ図

人間言葉で説明されるより図見たほうがずっと理解しやすい！
ということで`Item`と`ItemStack`の違いを図にしてみました。~~はいここテスト出るぞーちゃんと板書しとけ～~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835470/100cddf1-e975-452c-e170-0ce99dbea920.png)

`Item`は共有しており、`ItemStack`は個別に存在しています。


例えば左上の鉄の剣①の耐久値（`ItemStack`の要素）が1減ったとしても、下の鉄の剣②には一切影響がありませんが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835470/52336e2f-1f1e-5cb7-f01a-3fc7d6475891.png)
鉄の剣の元の攻撃力（`Item`の要素）自体を変えてしまうと、ゲーム内全ての鉄の剣に影響が出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835470/77757d5e-bd5b-a57e-3950-a6bf7f4941f1.png)

:::note info

つまり、
- `Item`は基本設定を持つ。
- `ItemStack`は`Item`を参照しつつ、個別状態を持つ[^301]。


[^301]: マイクラ全体で見れば、「ゲーム内要素であること」という基本から`Block`や`Item`という個別に分かれるという階層構造で考える方法もあるかもしれない

:::

特に、`Item`はゲームを通してずっと同じ設定値だけを持ち、`ItemStack`はプレイ中に変化しうる状態を保持するイメージです。
（例えばデフォルトのアイテム名がプレイ中に突然変化することは不自然、逆にどんなに使用しても個数が3個のままだったらそれも不自然）

# 4. `Item`と`ItemStack`の違いを踏まえてコードを読む

## `Item`

本記事最初[^401]のコードを再掲します。

[^401]: 最初じゃなくて2番目だという屁理屈は不要

```java
// アイテムの見本を生成
Item myItem1 = new Item();

// 必須
// 内部名の設定（半角小文字とアンダーバーのみ使用可能）
// 好きな名前を付けられる（他との被り不可）
myItem1.setRegistryName("my_item1");

// 必須
// 翻訳基本名の設定（半角小文字やアンダーバー、ドット辺りを使うことが多い）
// setRegistryNameと同じものを使うのが自然
myItem1.setTranslationKey(new ResourceLocation(Tags.MODID, "my_item1").toString());

// アイテムを入手できるクリエイティブタブの設定
// CreativeTabs.****でエラーにならないものなら何でも可
myItem1.setCreativeTab(CreativeTabs.FOOD);

// アイテム（の見本）の登録（生成しただけじゃゲーム内では使用できない！）
event.getRegistry().register(myItem1);
```

アイテムを登録するコードですが、`Item`を扱っています。
すなわち（ゲームを通して変わらない）基本設定値のみを設定しています。

- 「内部名」は固定値でないと正しく動作しない
- 「翻訳基本名」は翻訳版内部名なので「内部名」と同じと思って良い
- 「クリエイティブタブ」はプレイ中に変化することは相当考え難い

どれも`Item`として扱うべき基本設定であることが分かります。

イメージ図を踏まえると、「最大スタック数や最大耐久値はどうやって指定するの？」と疑問に思うでしょうが、単純に設定する方法を紹介していないだけです。
それらを踏まえたアイテム登録の基本解説は初級編で行います。

## `ItemStack`

`ItemStack`は[前記事](https://qiita.com/Katatsumuri_Pan/items/21f4b5f08aadec2eac17)でレシピを登録する際に登場しました。
```java
{
    //--------------------不定形レシピの追加--------------------

    // クラフト材料の設定（アイテムの指定は順不同）
    NonNullList<Ingredient> ingredients = NonNullList.create();
    ingredients.add(Ingredient.fromItem(Items.APPLE));      // リンゴ
    ingredients.add(Ingredient.fromItem(Items.GOLD_INGOT)); // 金インゴット

    // クラフト成果品の設定
    ItemStack output = new ItemStack(Items.GOLDEN_APPLE, 2); // 金リンゴ×2

    // レシピの作成
    ShapelessRecipes recipe = new ShapelessRecipes("", output, ingredients); // groupと成果品と材料からレシピ作成

    // レシピの登録
    recipe.setRegistryName(new ResourceLocation(Tags.MODID, "apple_plus_gold_ingot")); // 登録時の内部レシピ名指定
    event.getRegistry().register(recipe); // 登録
}
```
これのクラフト成果品を作る部分です。
```java
// クラフト成果品の設定
ItemStack output = new ItemStack(Items.GOLDEN_APPLE, 2); // 金リンゴ×2
```
`Items.GOLDEN_APPLE`は金リンゴの`Item`です。
そしてコンマの後ろの`2`は個数です。
つまり、`Item`に個数という状態を組み合わせて`ItemStack`を生成（`new`）しています。

ということは、ここで鉄の剣を`Item`として指定し、ダメージ値という状態を与えることによって
消耗した鉄の剣をクラフトするレシピも作れそうですね。

<details><summary>消耗した鉄の剣レシピ</summary>

耐久値[^402]が200削れた鉄の剣をクラフトするレシピです。

[^402]: `ItemStack`の第3引数はメタデータ[^403]を設定するところである
耐久値は`最大値-ダメージ値（メタデータ）`で計算されるため、耐久値が250-200=50残った剣がクラフトされる

[^403]: メタデータ（マイクラ内部仕様用語）とは、アイテム[^404]の状態を数値で表現したもの
当然状態なので`Item`ではなく`ItemStack`が保持する
羊毛や木材の種類もこの値に依存する

[^404]: アイテムだけじゃなくてブロックにもあるが、その話はまた今度

```java
{
    //--------------------不定形レシピの追加--------------------

    // クラフト材料の設定（アイテムの指定は順不同）
    NonNullList<Ingredient> ingredients = NonNullList.create();
    ingredients.add(Ingredient.fromItem(Items.STICK));       // 棒
    ingredients.add(Ingredient.fromItem(Items.IRON_NUGGET)); // 鉄塊
    ingredients.add(Ingredient.fromItem(Items.IRON_NUGGET)); // 鉄塊

    // クラフト成果品の設定
    ItemStack output = new ItemStack(Items.IRON_SWORD, 1, 200); // 鉄の剣×1 (耐久値が200削れている)

    // レシピの作成
    ShapelessRecipes recipe = new ShapelessRecipes("", output, ingredients); // groupと成果品と材料からレシピ作成

    // レシピの登録
    recipe.setRegistryName(new ResourceLocation(Tags.MODID, "almost_broken_iron_sword")); // 登録時の内部レシピ名指定
    event.getRegistry().register(recipe); // 登録
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835470/f615f459-a89d-8ff4-bc57-75b23d6331a6.png)

<details><summary>さらにエンチャントまで付けちゃう</summary>

エンチャントについては~~研修でやるほどの面白い内容が無いので~~初級編で扱います。
また、NBTの説明は研修編の終わりの方で解説予定です。

```java
{
    //--------------------不定形レシピの追加--------------------

    // クラフト材料の設定（アイテムの指定は順不同）
    NonNullList<Ingredient> ingredients = NonNullList.create();
    ingredients.add(Ingredient.fromItem(Items.STICK));       // 棒
    ingredients.add(Ingredient.fromItem(Items.IRON_NUGGET)); // 鉄塊
    ingredients.add(Ingredient.fromItem(Items.IRON_NUGGET)); // 鉄塊

    // クラフト成果品の設定
    ItemStack output = new ItemStack(Items.IRON_SWORD, 1, 200); // 鉄の剣×1 (耐久値が200削れている)

    // エンチャントの設定
    output.addEnchantment(Enchantments.UNBREAKING, 2); // 耐久力(Lv2)
    output.addEnchantment(Enchantments.VANISHING_CURSE, 1); // 消滅の呪い

    // レシピの作成
    ShapelessRecipes recipe = new ShapelessRecipes("", output, ingredients); // groupと成果品と材料からレシピ作成

    // レシピの登録
    recipe.setRegistryName(new ResourceLocation(Tags.MODID, "almost_broken_enchanted_iron_sword")); // 登録時の内部レシピ名指定
    event.getRegistry().register(recipe); // 登録
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835470/4cf541db-49d3-39cf-448d-0effb98121c9.png)

<font color="gray">└さらにエンチャントまで付けちゃう終わり</font>
</details>

<font color="gray">└消耗した鉄の剣レシピ終わり</font>
</details>


# 5. 終わりに

とりあえず、`Item`は「アイテムの基本設定（基本情報）」、`ItemStack`は「`Item`＋状態」と思っておけば良いですね。

Modding初心者[^500]は大抵`Item`と`ItemStack`を混同しているため、区別できるようになればそれだけで初心者脱却への一歩です。

[^500]: ~~諸説あるが、勘でModdingしてきたせいで`Item`と`ItemStack`の違いが分からないとんでもない人間もいるかもしれないしいないかもしれない~~


---
初心者研修編 - BlockとIBlockStateとTileEntityは一緒です（大嘘）に続く

[メインページに戻る](https://qiita.com/Katatsumuri_Pan/items/e3fd7fec471ee66fa17a)