5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Java]MinecraftのModを作成しよう 1.16.1【アイテムの追加】

Last updated at Posted at 2020-08-13

(この記事は一連の解説記事の一つになります)

先頭記事:入門編
前の記事:基本ファイル
次の記事:ブロックの追加

アイテムの追加

まずは基本となるアイテムの追加を行っていきます。1.14.4のときと少し書き方を変えました(バージョンアップによって実装の方法が変わったという意味ではないです)。

アイテムの登録

\src\main\java\jp\koteko\liveinwater\
   ├ item
   │   └ Items.java
   └ LiveInWater.java
Items.java
package jp.koteko.liveinwater.item;

import jp.koteko.liveinwater.LiveInWater;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

import java.util.ArrayList;
import java.util.List;

@Mod.EventBusSubscriber(modid = LiveInWater.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class Items {
    public static List<Item> itemList = new ArrayList<Item>();
    public static final Item WATERTREE_ROOT = register("watertree_root", new Item((new Item.Properties()).group(ItemGroup.MATERIALS)));

    private static Item register(String key, Item itemIn) {
        itemList.add(itemIn);
        return itemIn.setRegistryName(LiveInWater.MOD_ID, key);
    }

    @SubscribeEvent
    public static void registerItems(RegistryEvent.Register<Item> event) {
        for (Item item : itemList) {
            event.getRegistry().register(item);
        }
    }
}

宣言・初期化と同時にListにアイテムを追加し、forループでリストのアイテムをすべてregister()します。

各アノテーション(注釈)はそれぞれ以下のはたらきです。

EventBusSubscriber

Annotate a class which will be subscribed to an Event Bus at mod construction time. Defaults to subscribing the current modid to the MinecraftForge.EVENT_BUS on both sides.

forgeのEventBusにこのクラスを登録しているようです。

SubscribeEvent

Annotation to subscribe a method to an Event This annotation can only be applied to single parameter methods, where the single parameter is a subclass of Event. Use IEventBus.register(Object) to submit either an Object instance or a Class to the event bus for scanning to generate callback IEventListener wrappers. The Event Bus system generates an ASM wrapper that dispatches to the marked method.

メソッドがハンドラであることを示すために必要らしいです。

これらをつけてやると、自動でアイテムの登録を行ってくれます。

単なる無機能アイテムの場合単にItemクラスのインスタンスとします。Item.Propertiesは名の通りアイテムのプロパティを管理するクラスで、クリエイティブタブを設定するgroup()以外にもいろいろとできるので該当クラスを適宜見に行きましょう。
またItemクラスのインスタンスに対してsetRegistryName()でforgeにアイテムを登録する際の内部名を決めます。名前空間にMOD_IDを使い、MOD_ID:ITEM_NAMEという形にします。

resourcesの設定

前項でアイテムの追加は完了ですが、このままだとゲーム内での表示が整っていませんので、これらを設定していきます。resources以下にファイルを配置していきます。

\src\main\resources
   └ assets
      └ liveinwater
         ├ lang
         │  └ en_us.json
         │  └ ja_jp.json
         ├ models
         │  └ item
         │     └ watertree_root.json
         └ textures
            └ item
               └ watertree_root.png

(1.14.4の記事と少し名前を変えています。)

lang\en_us.json
{
  "item.liveinwater.watertree_root": "WaterTree Root"
}
lang\ja_jp.json
{
  "item.liveinwater.watertree_root": "ウォーターツリーの根"
}

"item.[MOD_ID].[ITEM_NAME]": "表示名"

watertree_root.json
{
  "parent": "item/generated",
  "textures": {
    "layer0": "liveinwater:item/watertree_root"
  }
}

単純なアイテムならparentitem/generated
MOD_ID:[テクスチャファイルのパス]

textures\item\watertree_root.png
公式は16*16のpngなようなのでこれに合わせてテクスチャを作成し、配置します。(ちゃんと自分で手書きするとすごく難しいですね…。)

確認

ゲームを起動して確認します。
キャプチャ.PNG
ItemGroup.MATERIALSを指定してので、クリエイティブだとこのタブにアイテムが増えています。きちんとテクスチャが反映され、言語ファイルで設定した名前が表示されています。

参考

Minecraft Forge Eventシステム概要 - Minecraft Modding Wiki
[Java]MinecraftのModを作成しよう 1.14.4【1. アイテムの追加】
Minecraft 1.14.4 Forge Modの作成 その3 【無機能アイテムの追加】

次の記事

ブロックの追加

5
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
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?