今回は簡単なアイテムを追加してみます。アイテムを追加するだけ。ブロックのように置いたり防具のように身に着けたりはできません。。。今後、別記事でブロックアイテムや防具などに発展させていきますね!
環境
- 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のコード
いつもならまずサクッと動くコードを出して順に解説していくのですが、今回は準備物が多いので順を追って説明するスタイルで。。
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の基本的な作り方は過去記事を参照してください。ここでイベントハンドラとしてthis
を登録しています。今回初めてFMLのイベントバスを使います。イベントバスについてはこちらの過去記事。
次に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
しているだけなのですぐわかると思います。
リソースファイル
今回のサンプルに関連しそうなディレクトリとファイルの配置は下のようになっています。
├─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
追加するアイテムの表示名を定義するファイル。めんどくさいので今回は英語のみ。 - sunglasses.json
追加するアイテムのモデル。 - sunglasses.png
冒頭でお絵描きしたpngイメージ。
では、
sunglasses.json
{
"parent": "item/generated",
"textures": {
"layer0": "itemtestmod:item/sunglasses"
}
}
ポイントは"layer0": "itemtestmod:item/sunglasses"
ですね。みりゃわかると思いますが
itemtestmod
がJavaのコードのMOD_ID
、sunglasses
がid
に対応しています。
モデルファイルは結構奥が深そうですが、この記事ではとりあえずシンプルに。。(まだmunecraft自身もいろいろ勉強中なので^^;)
en_us.json
{
"item.itemtestmod.sunglasses": "Sunglasses",
}
ほぼ解説不要でしょう。先ほど同様MOD_ID
、id
を指定しつつ英語の表示名を指定しています。
sunglasses.png:ドット絵を描いてみる
ドット絵を描くとか懐かしい。。とか思いながらこんな絵を。今後防具化することも見据えて身に着けられるこんなものを描いてみました。
え?これ何って?サングラスですがな。まぁ、拡大しすぎでわかりにくいかもですが。。(下手なのも否定しないっすけど。。)
元ファイルは末尾に載せておくのでご活用ください。描画にはpaint.netというものを使いました。透過pngが編集できればおそらく何でも大丈夫です。ゆくゆくはテクスチャの描画もすべてBlockbenchに寄せちゃってもよいような気もしていますがひとまず。。
動かす!
ではようやく起動してみませう。ポチっとな
おーー。Sunglassesが「その他」に追加されてる!
持ってる姿。なんかかわゆい( *´ω`*)
てなわけで無事にアイテムの追加ができました!
編集後記
今回も前回からちょっち期間が開いちゃいました。。内容は大したことないんだけど、アイテムの追加、ブロックの追加について調べているとBlockbenchを見つけて遊んでしまったり、ブロック追加にもちょっと手を出してモデルについてあれやこれや調べているうちに結構日にちが経ってしまいました。。
ブロック追加もいろいろ奥が深そうで、いったん今回作ったサングラスを身に着けられるようにするか、ブロックについてもうちょっと勉強してから記事を書くか悩んでいるところです。
では、最後まで読んでいただいてありがとうございました~。また次回お会いしましょう。
リンク集
Minecraft Wikiのモデルについての解説ページ
よく参考にさせていただいているTNT Modderさんのアイテム追加チュートリアル
今回は使ってないけどちょっとだけ触れたBlockbench
今回使用したpaint.netのダウンロード先