Eclipse+Forgeでマイクラのmod開発～単純なアイテムの追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191672/b9d26648-cf3b-9e5f-300d-c4031475fd3c.png)

今回は簡単なアイテムを追加してみます。アイテムを追加するだけ。ブロックのように置いたり防具のように身に着けたりはできません。。。今後、別記事でブロックアイテムや防具などに発展させていきますね！

## 環境

* OS: Windows10
* Jdk: openjdk version "15.0.2" 2021-01-19 ※16.xでもいいかもだけどgradleやらなにやら色々変わってしまって心配だったので今回は15で。
* IDE: Eclipse IDE for Java Developers (Version 4.19.0)
* Buildship(Eclipseのgradleプラグイン)
: 3.0
* Minecraft: Java版 1.16.5
* Forge: 1.16.5
* paint.net V4.2.16

## Javaのコード

いつもならまずサクッと動くコードを出して順に解説していくのですが、今回は準備物が多いので順を追って説明するスタイルで。。

```java:ItemTest.java
package jp.munecraft.mod.itemtestmod;

// importは省略

@Mod(ItemTest.MOD_ID)
public class ItemTest {

	public static final String MOD_ID = "itemtestmod"; 
	private static final Logger LOGGER = LogManager.getLogger();

	private List<Item> items = new LinkedList<Item>();
	private String[] itemIDs = {
		"sunglasses",
	};

	public ItemTest() {
		LOGGER.info("Hello item test mod");
		FMLJavaModLoadingContext.get().getModEventBus().register(this);
		createItems();
	}

	protected void createItems() {
		for (String itemID : itemIDs) {
			Item item = createItem(itemID);
			items.add(item);
		}
	}

	protected Item createItem(String id) {
		return createBlockItem(id, null);
	}

	protected Item createBlockItem(String id, Block block) {
		Item item = null;
		Item.Properties itemProperties = new Item.Properties();
		itemProperties.tab(ItemGroup.TAB_MATERIALS);
		if (block == null) {
			// 今回はこっちにしか来ない。
			item = new Item(itemProperties);
		}
		else {
			// こちらは今後Blockの追加をした時に解説。
			item = new BlockItem(block, itemProperties);
		}
		item.setRegistryName(MOD_ID, id);
		return item;
	}

	@SubscribeEvent
	public void onRegisterItem(RegistryEvent.Register<Item> event) {
		LOGGER.info("onRegisterItem");
		IForgeRegistry<Item> registry = event.getRegistry();
		for (Item item : items) {
			registry.register(item);
		}
	}
}

```

このコードの解説から。いつもはやりたいことをやるだけのためのできるだけシンプルなコード例を載せていますが今回は今後のことも考えてあえて少しだけ構造化しています。

### `ItemTest()`

今回作るmodのエントリーポイント。modの基本的な作り方は[過去記事](https://qiita.com/kawamune/items/cc31848c070bcbb3e8f4)を参照してください。ここでイベントハンドラとして`this`を登録しています。今回初めてFMLのイベントバスを使います。イベントバスについては[こちらの過去記事](https://qiita.com/kawamune/items/b6aac165885f3ee70291)。

次に`createItems()`を呼んで`Item`を作っていきます。これを、口述する`onRegisterItem()`のようなイベントハンドラの処理で行うのではなく、エントリーポイントで行っているのにはちゃんと意味があるので、ここであらかじめ`Item`を作っておきましょう。

### `createItems()` `createItem()` `createBlockItem()`

これらは単に`itemIDs`にある文字列配列に対する`Item`を作っているだけで、処理の本体は`createBlockItem()`にあります。


まず`Item.Properties`をインスタンス化し、今回は`itemProperties.tab(ItemGroup.TAB_MATERIALS)`属性だけ設定しています。`TAB_MATERIALS`はアイテムグループとして「その他」を指定していることを意味します。他にも`TAB_BUILDING_BLOCKS`を指定すると建築ブロックを指定することができ、この指定によってアイテムグループのどのタブに登場させるかを指定可能です。
続いて`itemProperties`を引数に渡して`Item`インスタンスを作り、最後に`item`インスタンスに`setRegistryName()`でレジストリに入れる際のキーを指定します。
`MOD_ID`はいいと思いますが、`id`に指定されているものは、この後解説するファイルでも参照されるものなので覚えておいてください。今回のサンプルでいうと`sunglasses`が`id`になります。
なお、この時点ではまだ`Item`のレジストリへの登録(register)は行っていません。登録する時のキーを設定しただけです。

### `onRegisterItem()`

見てわかるように`@SubscribeEvent`アノテーションがついているのでイベントハンドラです。このイベントハンドラでアイテム登録イベントをフックし、その中でアイテムを追加しています。やっていることは`event`からレジストリを取得して`register`しているだけなのですぐわかると思います。

## リソースファイル

今回のサンプルに関連しそうなディレクトリとファイルの配置は下のようになっています。

```shell
├─java
│  └─jp
│      └─munecraft
│          └─mod
│              └─itemtestmod
│                      ItemTest.java
│
└─resources
    │  pack.mcmeta
    │
    ├─assets
    │  └─itemtestmod
    │      ├─lang
    │      │      en_us.json
    │      │
    │      ├─models
    │      │  └─item
    │      │          sunglasses.json
    │      │
    │      └─textures
    │          └─item
    │                 sunglasses.png
    │
    └─META-INF
            mods.toml
```

今回、アイテムを追加するにあたり新たに登場しているファイルは次の3つだけです。

* en_us.json<br>追加するアイテムの表示名を定義するファイル。めんどくさいので今回は英語のみ。
* sunglasses.json<br>追加するアイテムのモデル。
* sunglasses.png<br>冒頭でお絵描きしたpngイメージ。

では、 

### sunglasses.json

```json:sunglasses.json
{
	"parent": "item/generated",
	"textures": {
		"layer0": "itemtestmod:item/sunglasses"
	}
}
```

ポイントは`"layer0": "itemtestmod:item/sunglasses"`ですね。みりゃわかると思いますが
`itemtestmod`がJavaのコードの`MOD_ID`、`sunglasses`が`id`に対応しています。
モデルファイルは結構奥が深そうですが、この記事ではとりあえずシンプルに。。（まだmunecraft自身もいろいろ勉強中なので＾＾；）

### en_us.json

```json:en_us.json
{
	"item.itemtestmod.sunglasses": "Sunglasses",
}
```

ほぼ解説不要でしょう。先ほど同様`MOD_ID`、`id`を指定しつつ英語の表示名を指定しています。

### sunglasses.png：ドット絵を描いてみる

ドット絵を描くとか懐かしい。。とか思いながらこんな絵を。今後防具化することも見据えて身に着けられるこんなものを描いてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191672/f0308ebc-4907-7b94-3880-f07a26e53b3a.png)

え？これ何って？サングラスですがな。まぁ、拡大しすぎでわかりにくいかもですが。。（下手なのも否定しないっすけど。。）

元ファイルは末尾に載せておくのでご活用ください。描画には[paint.net](https://www.getpaint.net/download.html)というものを使いました。透過pngが編集できればおそらく何でも大丈夫です。ゆくゆくはテクスチャの描画もすべて[Blockbench](https://www.blockbench.net/)に寄せちゃってもよいような気もしていますがひとまず。。

## 動かす！

ではようやく起動してみませう。ポチっとな

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191672/1becea0f-ec27-8f1a-1cec-8e79d0bf09d2.png)

おーー。Sunglassesが「その他」に追加されてる！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191672/7043ba57-3d1a-1337-c384-ec01ddfee53d.png)

持ってる姿。なんかかわゆい( \*´ω`\*)

てなわけで無事にアイテムの追加ができました！

## 編集後記

今回も前回からちょっち期間が開いちゃいました。。内容は大したことないんだけど、アイテムの追加、ブロックの追加について調べていると[Blockbench](https://www.blockbench.net/)を見つけて遊んでしまったり、ブロック追加にもちょっと手を出してモデルについてあれやこれや調べているうちに結構日にちが経ってしまいました。。

ブロック追加もいろいろ奥が深そうで、いったん今回作ったサングラスを身に着けられるようにするか、ブロックについてもうちょっと勉強してから記事を書くか悩んでいるところです。

では、最後まで読んでいただいてありがとうございました～。また次回お会いしましょう。


## リンク集

Minecraft Wikiのモデルについての解説ページ

https://minecraft.fandom.com/ja/wiki/%E3%83%A2%E3%83%87%E3%83%AB

よく参考にさせていただいているTNT Modderさんのアイテム追加チュートリアル

https://www.tntmodders.com/tutorial/item-1165/

今回は使ってないけどちょっとだけ触れたBlockbench

https://www.blockbench.net/

今回使用したpaint.netのダウンロード先

https://www.getpaint.net/download.html



## リソース

* sunglasses.png<br>
![sunglasses.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191672/62103d17-14d8-cd73-8b56-78afd99e36b9.png)