0
1

More than 3 years have passed since last update.

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

Posted at

image.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のコード

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

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の基本的な作り方は過去記事を参照してください。ここでイベントハンドラとして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に指定されているものは、この後解説するファイルでも参照されるものなので覚えておいてください。今回のサンプルでいうとsunglassesidになります。
なお、この時点ではまだ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

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

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

en_us.json

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

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

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

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

image.png

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

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

動かす!

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

image.png

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

image.png

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

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

編集後記

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

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

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

リンク集

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

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

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

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

リソース

  • sunglasses.png
    sunglasses.png
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1