マイクラMOD制作学習#2 アイテム追加【ver1.21、1.21.1】【NeoForge】

はじめに

アイテムの追加です。JSONファイルの自動生成も併せて対応していきます。
前回の記事の続きとなります。以下のリンクから是非ご覧ください!

参考

言語ファイルの自動生成について動画内では紹介されていませんが、日本語と英語に対応することを想定して以下の公式ドキュメントも見ながら進めていきます。
https://docs.neoforged.net/docs/1.21.1/resources/client/i18n

アイテム・クリエイティブタブクラスの追加

tutorialmodフォルダーの下に以下のファイル構成を追加する。

tutorialmod/
 └ item/
   ├ ModItems.java
   └ ModCreativeModeTabs.java
package com.chimugame.tutorialmod.item;

import com.chimugame.tutorialmod.TutorialMod;
import net.minecraft.world.item.Item;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.registries.DeferredItem;
import net.neoforged.neoforge.registries.DeferredRegister;

public class ModItems
{
    // 追加するアイテムを登録するリストのようなもの
    public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(TutorialMod.MOD_ID);

    // -----追加するアイテム群-----
    public static final DeferredItem<Item> RAINBOW_DIAMOND = ITEMS.register("rainbow_diamond",
            () -> new Item(new Item.Properties()));
    // -------------------------

    /// アイテムの登録
    /// @param eventBus イベントバス
    public static void register(IEventBus eventBus)
    {
        ITEMS.register(eventBus);
    }
}
package com.chimugame.tutorialmod.item;

import com.chimugame.tutorialmod.TutorialMod;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.ItemStack;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.registries.DeferredRegister;

import java.util.function.Supplier;

public class ModCreativeModeTabs
{
    public static final DeferredRegister<CreativeModeTab> CREATIVE_MODE_TAB =
            DeferredRegister.create(Registries.CREATIVE_MODE_TAB, TutorialMod.MOD_ID);

    public static final Supplier<CreativeModeTab> TUTORIAL_ITEM_TAB = CREATIVE_MODE_TAB.register("tutorial_tab",
            () -> CreativeModeTab.builder()
                    .icon(() -> new ItemStack(ModItems.RAINBOW_DIAMOND.get()))
                    .title(Component.translatable("creativetabs.tutorial_tab"))
                    .displayItems((itemdisplayParameters, output) -> {
                        output.accept(ModItems.RAINBOW_DIAMOND);
                    })
                    .build());

    public static void register(IEventBus eventBus)
    {
        CREATIVE_MODE_TAB.register(eventBus);
    }
}

TutorialMod.Javaクラスのコンストラクタでアイテムの登録メソッドを呼び出す。

    public TutorialMod(IEventBus modEventBus, ModContainer modContainer)
    {
        // Register the commonSetup method for modloading
        modEventBus.addListener(this::commonSetup);

        // Register ourselves for server and other game events we are interested in.
        // Note that this is necessary if and only if we want *this* class (ExampleMod) to respond directly to events.
        // Do not add this line if there are no @SubscribeEvent-annotated functions in this class, like onServerStarting() below.
        NeoForge.EVENT_BUS.register(this);

        // クリエイティブモードタブの登録
        ModCreativeModeTabs.register(modEventBus);

        // アイテムの登録
        ModItems.register(modEventBus);

        // Register the item to a creative tab
        modEventBus.addListener(this::addCreative);

        // Register our mod's ModConfigSpec so that FML can create and load the config file for us
        modContainer.registerConfig(ModConfig.Type.COMMON, Config.SPEC);
    }

JSONファイルの自動生成

tutorialmodフォルダーの下に以下のファイル構成を追加する。

tutorialmod/
 ├ DataGenerators.java
 └ client/
   ├ ModItemModelProvider.java
   ├ ModJAJPLanguageProvider.java
   └ ModENUSLanguageProvider.java
package com.chimugame.tutorialmod.datagen.client;

import com.chimugame.tutorialmod.TutorialMod;
import com.chimugame.tutorialmod.item.ModItems;
import net.minecraft.data.PackOutput;
import net.neoforged.neoforge.client.model.generators.ItemModelProvider;
import net.neoforged.neoforge.common.data.ExistingFileHelper;

public class ModItemModelProvider extends ItemModelProvider
{
    public ModItemModelProvider(PackOutput output, ExistingFileHelper existingFileHelper)
    {
        super(output, TutorialMod.MOD_ID, existingFileHelper);
    }

    @Override
    protected void registerModels()
    {
        basicItem(ModItems.RAINBOW_DIAMOND.get());
    }
}
package com.chimugame.tutorialmod.datagen.client;

import com.chimugame.tutorialmod.TutorialMod;
import com.chimugame.tutorialmod.item.ModItems;
import net.minecraft.data.PackOutput;
import net.neoforged.neoforge.common.data.LanguageProvider;

import java.util.Locale;

public class ModJAJPLanguageProvider extends LanguageProvider
{
    public ModJAJPLanguageProvider(PackOutput output)
    {
        super(output, TutorialMod.MOD_ID, Locale.JAPAN.toString().toLowerCase());
    }

    @Override
    protected void addTranslations()
    {
        addItem(ModItems.RAINBOW_DIAMOND, "レインボーダイヤ");

        add("creativetabs.tutorial_tab", "練習");
    }
}
package com.chimugame.tutorialmod.datagen.client;

import com.chimugame.tutorialmod.TutorialMod;
import com.chimugame.tutorialmod.item.ModItems;
import net.minecraft.data.PackOutput;
import net.neoforged.neoforge.common.data.LanguageProvider;

import java.util.Locale;

public class ModENUSLanguageProvider extends LanguageProvider
{
    public ModENUSLanguageProvider(PackOutput output)
    {
        super(output, TutorialMod.MOD_ID, Locale.US.toString().toLowerCase());
    }

    @Override
    protected void addTranslations()
    {
        addItem(ModItems.RAINBOW_DIAMOND, "Rainbow Diamond");

        add("creativetabs.tutorial_tab", "Practice");
    }
}
package com.chimugame.tutorialmod.datagen;

import com.chimugame.tutorialmod.TutorialMod;
import com.chimugame.tutorialmod.datagen.client.ModENUSLanguageProvider;
import com.chimugame.tutorialmod.datagen.client.ModItemModelProvider;
import com.chimugame.tutorialmod.datagen.client.ModJAJPLanguageProvider;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.PackOutput;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.common.data.ExistingFileHelper;
import net.neoforged.neoforge.data.event.GatherDataEvent;

import java.util.concurrent.CompletableFuture;

@EventBusSubscriber(modid = TutorialMod.MOD_ID, bus = EventBusSubscriber.Bus.MOD)
public class DataGenerators
{
    @SubscribeEvent
    public static void gatherData(GatherDataEvent event)
    {
        DataGenerator generator = event.getGenerator();
        PackOutput packOutput = generator.getPackOutput();
        ExistingFileHelper existingFileHelper = event.getExistingFileHelper();
        CompletableFuture<HolderLookup.Provider> lookupProvider = event.getLookupProvider();

        // アイテムモデル
        generator.addProvider(event.includeClient(), new ModItemModelProvider(packOutput, existingFileHelper));

        // 言語ファイル
        generator.addProvider(event.includeClient(), new ModJAJPLanguageProvider(packOutput));
        generator.addProvider(event.includeClient(), new ModENUSLanguageProvider(packOutput));
    }
}

テクスチャの追加

resources/assetsフォルダーの下に以下のファイル構成を追加する。

resources/assets/
 └ tutorialmod/
   └ textures/
     └ item/
       └ rainbow_diamond.png

テキトーに作ったものですが、よければ利用してください。(配布などはご遠慮を…)

または、以下のフォルダからバニラのテクスチャが参照できるので、一旦これをコピペして動作確認してもよいかもです。

動作確認

JSONデータの生成

上部のメニューから「Dataの実行」

成功すれば以下の通りgenetatedフォルダーが生成され、アイテムモデルと言語のJSONファイルが追加されているはずです。

移行の開発では、アイテムやブロックの追加などを行った場合にはこの手順が必要になります。

ゲーム実行

では、前回と同様にClientを実行して動作確認します。

クリエイティブタブが追加され、アイコンやタブ名が正しく設定され、追加したレインボーダイヤがあることが確認できます。

これをアイテムとして取り出せることも確認します。ブロックではないので、右クリックで置いたりはできません。

タイトルとURLをコピーしました