リソースの自動生成 (1.19.4)

概要

アイテムの追加 (1.19.4) で追加したアイテムにテクスチャ・翻訳のリソースを追加します。リソースの内容はjavaコードで生成し、Forgeの自動生成システムを利用して出力します。

 

動作確認

2023年12月13日

  • Minecraft 1.19.4
  • Forge 45.2.0

解説

GitHub

ExampleTNT.java

ExampleTNT/src/main/java/com/tntmodders/exampletnt/ExampleTNT.java


package com.tntmodders.exampletnt;

import com.tntmodders.exampletnt.provider.ExampleTNTItemModelProvider;
import com.tntmodders.exampletnt.provider.ExampleTNTLangProvider;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.PackOutput;
import net.minecraftforge.common.data.ExistingFileHelper;
import net.minecraftforge.data.event.GatherDataEvent;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;

@Mod(ExampleTNT.MOD_ID)
public class ExampleTNT {

    public static final String MOD_ID = "exampletnt";

    public ExampleTNT() {
        IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
        modEventBus.addListener(this::registerProviders);
        ExampleTNTItems.register(modEventBus);
    }

    private void registerProviders(GatherDataEvent event) {
        DataGenerator gen = event.getGenerator();
        PackOutput packOutput = gen.getPackOutput();
        ExistingFileHelper fileHelper = event.getExistingFileHelper();
        gen.addProvider(event.includeClient(), new ExampleTNTItemModelProvider(packOutput, fileHelper));
        gen.addProvider(event.includeClient(), new ExampleTNTLangProvider.ExampleTNTLangUS(gen.getPackOutput()));
        gen.addProvider(event.includeClient(), new ExampleTNTLangProvider.ExampleTNTLangJP(gen.getPackOutput()));
    }
}

modEventとして、GatherDataEventを引数として呼ぶメソッドを登録しています。このイベントはデータ生成の際のみ呼ばれ、jsonファイル生成を行います。
今回は、ItemModel及びLanguageを生成するため、ExampleTNTItemModelProviderExampleTNTLangProviderを作成しました。

small_tnt.png

ExampleTNT/src/main/resources/assets/exampletnt/textures/item/small_tnt.png

テクスチャファイル
テクスチャファイルを上記ディレクトリに設置して下さい。16x16のpngファイルで作成して下さい。ファイル名はアイテムの登録名と同じ名称にすることをおすすめします。

ExampleTNTItemModelProvider.java

ExampleTNT/src/main/java/com/tntmodders/exampletnt/provider/ExampleTNTItemModelProvider.java


package com.tntmodders.exampletnt.provider;

import com.tntmodders.exampletnt.ExampleTNT;
import net.minecraft.data.PackOutput;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.client.model.generators.ItemModelProvider;
import net.minecraftforge.common.data.ExistingFileHelper;

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

    @Override
    protected void registerModels() {
        this.singleTexture("small_tnt", mcLoc(folder + "/generated"), "layer0",
                new ResourceLocation("exampletnt", folder + "/" + "small_tnt"));
    }
}

このクラスでは、アイテムのモデルファイルを生成しています。一枚絵のモデルファイルはsingleTexture(String name, ResourceLocation parent, String textureKey, ResourceLocation texture)で生成することができます。
第一引数はファイル名になります。アイテムの登録名と同じ名称にすることをおすすめします。第二、第三引数はそれぞれjsonファイル内の"parent":"textures": {}に対応しています。第四引数はjsonファイル内に記述されるテクスチャのロケーションに対応しています。先に作成したテクスチャに対応させて下さい。

ExampleTNTLangProvider.java

ExampleTNT/src/main/java/com/tntmodders/exampletnt/provider/ExampleTNTLangProvider.java


package com.tntmodders.exampletnt.provider;

import com.tntmodders.exampletnt.ExampleTNT;
import com.tntmodders.exampletnt.ExampleTNTItems;
import net.minecraft.data.PackOutput;
import net.minecraftforge.common.data.LanguageProvider;

public abstract class ExampleTNTLangProvider extends LanguageProvider {
    public ExampleTNTLangProvider(PackOutput output, String locale) {
        super(output, ExampleTNT.MOD_ID, locale);
    }

    public static class ExampleTNTLangJP extends ExampleTNTLangProvider {

        public ExampleTNTLangJP(PackOutput output) {
            super(output, "ja_jp");
        }

        @Override
        protected void addTranslations() {
            this.add(ExampleTNTItems.SMALL_TNT.get(), "小型TNT");
        }
    }

    public static class ExampleTNTLangUS extends ExampleTNTLangProvider {

        public ExampleTNTLangUS(PackOutput output) {
            super(output, "en_us");
        }

        @Override
        protected void addTranslations() {
            this.add(ExampleTNTItems.SMALL_TNT.get(), "Small TNT");
        }
    }
}

このクラスでは翻訳ファイルを生成しています。コンストラクタの第三引数がロケールに対応しているため、日本語( "ja_jp" )と英語( "en_us" )でそれぞれサブクラスを作成しています。
翻訳の対応はaddTranslations()で作成します。

リソース生成方法

リソースの生成は実行構成 runData より行います。runDataが完了した後、以下の画面のようにProcess finished with exit code 0とコンソール最終行に表示されており、かつディレクトリsrc/generated/resources/assets/exampletntにファイルが3つ生成されていれば成功です。

generatedディレクトリの中身は開発環境ではsrc/main/直下にあるように振る舞い、またMODのビルド時にともに格納されるファイル群です。providerを介したリソースの自動生成は全てrunDataを実行することで行われるため、jsonファイルなどを手書きする必要は一切ありません。jsonリソースを伴う追加を行った際は、runClientを行う前に必ずrunDataを行うようにして下さい。

関連クラス

  • net.minecraftforge.client.model.generators.ItemModelProvider:アイテムのjsonモデルを追加しています。複雑なモデル追加の処理はこのクラスを参考にして下さい。
  • net.minecraftforge.common.data.LanguageProvider:翻訳の追加を行うクラスです。

リンク


前:アイテムの追加

次:ブロックの追加

3件のコメント

  1. runDataの過程で躓いてしまったのでご質問させてください。リソースの生成において、

    [1][main/INFO] [ne.mi.da.lo.DatagenModLoader/]: Initializing Data Gatherer for mods [(MODのID)]

    からリソースが(今回の場合はモデルと言語ファイルのjson)生成された後、All providers took:~と続くと思うのですが、リソースが生成されず、代わりに警告文が出てきました。

    [2][main/WARN] [minecraft/VanillaPackResourcesBuilder]: Assets URL 'union:/C:/Users/(ユーザー)/.gradle/caches/forge_gradle/minecraft_user_repo/net/minecraftforge/forge/1.20.4-49.0.28_mapped_official_1.20.4/forge-1.20.4-49.0.28_mapped_official_1.20.4-recomp.jar%2316!/assets/.mcassetsroot' uses unexpected schema
    [3][02:07:53] [main/WARN] [minecraft/VanillaPackResourcesBuilder]: Assets URL 'union:/C:/Users/(ユーザー)/.gradle/caches/forge_gradle/minecraft_user_repo/net/minecraftforge/forge/1.20.4-49.0.28_mapped_official_1.20.4/forge-1.20.4-49.0.28_mapped_official_1.20.4-recomp.jar%2316!/data/.mcassetsroot' uses unexpected schema

    forgeのフォーラムに同様の質問があり(https://forums.minecraftforge.net/topic/105216-forge-data-generators-not-generating-any-data/)、最下部の回答にbuild.gradleにおけるrun-dataの引数としてrunDataのid指定をするとの記載がありましたが、上記[1]のMODIDは正しく反映されていた上、runData.xmlにも正しいパスを指定しているため別の場所にファイルが生成されたわけでもなさそうです。
    おそらく[2][3]の ~ uses unexpected schemaが何かしらの例外を引き起こしているのでしょうが自分には見当が付きませんでした。もし何かご存じでしたらご教授いただければ幸いです。

    • 赤砂蛇 凪浜

      1.20.4で開発したことがないので確かなことはわかりませんが、エラー文にはForgeのjarファイルに含まれる/data/.mcassetsrootというファイルの形式が正しくないと書かれています。
      また、build.gradleのMODIDは「Reload All Gradle Projects」と「genIntellijRuns」で反映されるので、環境構築の記事を参考に該当手順だけ再度やり直してみてください。

      • 連投失礼します。結果としては解決致しましたが、stackoverflowなどに同様の質問が多数あったため共有させてください。

        記載のとおり1.19.4で環境構築をやり直し、runDataを行ったのですが同じく~.mcassetsroot' uses unexpected schemaと出てリソースが生成されませんでした。Forgeのjarファイルは公式のmdkから落として以来触ってなかったのですが結果が変わりませんでした。
        作業環境内で「examplemod」を検索し、C:\(作業環境).idea\runConfigurationsにあるrunData.xmlの「examplemod」をすべてMODのIDに変更し、C:\Users\(ユーザー名).gradle\caches\forge_gradle\minecraft_user_repo\net\minecraftforge\forge内のディレクトリを中身ごとすべて削除した後もう一度「Reload All Gradle Projects」と「genIntellijRuns」を行った結果解決しました。私の環境では記事の環境構築通りに行ってもここが変更されなかったため、もしかしたら同様の現象が起こる人がいらっしゃるかもしれません。
        ご返信ありがとうございました。いつも大変参考になる記事をご提供いただきありがとうございます。

コメントはこちらです。(スパム対策の為コメントは手動承認になっています。未承認のコメントは表示されないので連投はお控え下さい。)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください