たくさんの自由帳

自作 MOD を NeoForge でも遊べるようにした

投稿日 : | 0 日前

文字数(だいたい) : 4455

どうもこんばんわ。
UMPC (排熱目当て)を持っておふとんに潜って暖を取る時期がもう終わりそう。へーくちゅん

本題

NeoForgeMODを遊びたいって、GitHubIssueに来たので対応してみる。
https://github.com/takusan23/ClickManaita2/issues/3

neoforge-1.21.4!!!!
Imgur

今日の Minecraft MOD プレイ

マイクラにMODを入れて遊ぶには前提 MOD(MOD ローダー)を入れる必要があるのですが、種類が3つくらいある。
遊ぶ側としては遊びたい MOD に合わせればいいと思う。どれも互換性はない。 どれも互換性がないので開発側としては厳しそう(こなみかん)。

  • Forge
    • ずっとずっと前からあるやつ
    • Fabricよりもやっぱりこっちなんですかね?
  • Fabric
    • バニラのバージョンアップにすぐ対応する
    • 開発者向けドキュメントがかなり充実している、Kotlinでも書ける!!
    • 個人的にはこれがすき、ドキュメントが優しい
  • NeoForge
    • Forgeのフォークだそう。互換性はない。
    • MOD開発者は1.21あたりでみんなForgeからこれに引っ越したらしい
    • 今のところForgeからの移植は多分難しくない、import直すだけとか(後述)

1.6.4とか1.7.10とか1.10.2とか1.12.2まで(同窓会かな)はForgeだけだったはず。

そのあとにFabricっていうバニラのアップデートに速攻対応するMOD ローダーが登場した。
Forgeが数週間待ちに対して、これは次の日くらいにはリリースノートが投稿され、その中でAPIや内部の仕様変更がまとめられているという開発者にめちゃ優しい。

ForgeMDK(SDK)だけ配ってじゃあ後やってね~だから何もわからないんだよな。
ドキュメントだってあってないようなものだし。

そのあと、NeoForgeていうのがForgeをフォークして登場したそうな。
名前が似ているけど互換性が無い。ただmodding書いて見た感じ限りなくForgeAPIに似ている。
1.21あたりでかなりの開発者がこっちに移住したそう。で、私のMODはこのMOD ローダーでは遊べないのでIssueが来た。

NeoForgeに移行しているあたり、いま作るならFabricNeoForgeの2択なのかな。Fabricのが作りやすいと思うけど、遊ぶ側的にはNeoForgeなのかなあ。
あとNeoForgeもいつまでForge風のAPIであり続けるか分からないし急いでやるか~~~。
ここまでが調べた限り、Redditの人たちが詳しい。

NeoForge はじめる

これがドキュメントです、結構充実してる
https://docs.neoforged.net/docs/gettingstarted/modfiles

で、これがMODのテンプレを作ってくれるやつです
これを開いて、パッケージ名MOD 名を埋めてzipをダウンロードする。Forgeのときよりずっと優しい。
https://neoforged.net/mod-generator/

パッケージ名はドメインを逆にしたものを使うのが王道だけど、持ってなかったからGitHub Pages (io.github)のをずっと使ってるんだよな、
多分被らなければ良いんじゃないかな(?)
https://docs.neoforged.net/docs/gettingstarted/structuring

解凍してzipIDEAで開けばGradleが作業を始めてくれる。

Imgur

終わるのを待ちます。BUILD SUCCESSFULみたいなのが出るはず

Imgur

処理が終わったら、Clientを実行します。ここです

Imgur

MOD Generator のわな

Javaのパッケージ名通りにフォルダを作ってくれないようです。
com.example.fooならcom/example/fooって感じに、それぞれフォルダを作って入れ子にする必要があるはずなのですが、(フォルダにドットがあるとダメなはず)
com.example.fooフォルダになってしまいます。これだとビルドは出来ますがなにか問題が起きる可能性があります、、

Imgur

というわけで各フォルダを作って入れ子にしました。
エクスプローラーの表示が>になってれば良いはず。

Imgur

起動してみた

クリエタブとアイテムがあります。
食えます。

Imgur

Forge のコードから NeoForge 対応作業をする

NeoForge.zip テンプレを解凍して、src/main/javasrc/main/resourcesを上書きすれば良さそう。
ビルドに必要なbuild.gradle周りはNeoForgeのが絶対必要。一方Javaコードとテクスチャとかの自分で書いたものはForgeのを今のところ入れておく。NeoForgebuild.gradleを元に開発環境を構築するので、あとはForge時代のJavaコードを直す作戦で行く。

というわけでForge時代のコードにNeoForgeのビルドに必要なsrc以外を持ってきた。

srcの中もsrc/main/templateフォルダだけはForgeには無いので必要です。
逆にsrc/main/resources/META-INF/mods.tomlForgeだけなので、NeoForgeでは消して良いはず。

Imgur

バージョン管理(git)を使ってForgeブランチからNeoForgeブランチを切った。
エクスプローラー上のチェックマークとかビックリマークはTortoiseGitを入れているからですね。

IDEAgit統合なら、neoforgeで上書きしても、こんな感じに上書きしたとしてもすぐ戻せるので便利
Imgur

Forge と NeoForge の API の違い

1.21.4時点です!!。あとimportも直してください。
importのパッケージ名がneoforgeなのと、本当に少しAPIが違う。ただ、かなり Forge の API に似てる。

// Forge
public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, ClickManaita.MOD_ID);
public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, ClickManaita.MOD_ID);
public static final DeferredRegister<CreativeModeTab> ITEM_GROUP = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, ClickManaita.MOD_ID);
 
public static final RegistryObject<ClickManaitaBaseBlock> CLICKMANAITA_WOOD_BLOCK = BLOCKS.register(KEY_CLICKMANAITA_WOOD_BLOCK.location().getPath(), () -> new ClickManaitaBaseBlock(BlockBehaviour.Properties.of().mapColor(MapColor.WOOD).instrument(NoteBlockInstrument.BASS).strength(2.5F).sound(SoundType.WOOD).ignitedByLava().setId(KEY_CLICKMANAITA_WOOD_BLOCK), 2));
 
public static final RegistryObject<ClickManaitaBaseItem> CLICKMANAITA_WOOD = ITEMS.register(KEY_CLICKMANAITA_WOOD.location().getPath(), () -> createItem(KEY_CLICKMANAITA_WOOD, 2, MaterialColor.MATERIAL_WOOD_COLOR));
 
public static final RegistryObject<CreativeModeTab> CREATIVE_TAB = ITEM_GROUP.register(/* 以下省略... */);
// NeoForge
public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(ClickManaita.MOD_ID);
public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(ClickManaita.MOD_ID);
public static final DeferredRegister<CreativeModeTab> ITEM_GROUP = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, ClickManaita.MOD_ID);
 
public static final RegistryObject<ClickManaitaBaseBlock> CLICKMANAITA_WOOD_BLOCK = BLOCKS.register(KEY_CLICKMANAITA_WOOD_BLOCK.location().getPath(), () -> new ClickManaitaBaseBlock(BlockBehaviour.Properties.of().mapColor(MapColor.WOOD).instrument(NoteBlockInstrument.BASS).strength(2.5F).sound(SoundType.WOOD).ignitedByLava().setId(KEY_CLICKMANAITA_WOOD_BLOCK), 2));
 
public static final DeferredItem<ClickManaitaBaseItem> CLICKMANAITA_WOOD = ITEMS.register(KEY_CLICKMANAITA_WOOD.location().getPath(), () -> createItem(KEY_CLICKMANAITA_WOOD, 2, MaterialColor.MATERIAL_WOOD_COLOR));
 
public static final DeferredHolder<CreativeModeTab, CreativeModeTab> CREATIVE_TAB = ITEM_GROUP.register(/* 以下省略... */);

コンストラクタ(MODのエントリーポイント)の引数の違いはこれ。
これもimportが変わってるので注意です。

// Forge
@Mod(ClickManaita.MOD_ID)
public class ClickManaita {
 
    /**
     * MODのID
     */
    public static final String MOD_ID = "clickmanaita";
 
    /**
     * コンストラクタ
     */
    public ClickManaita(FMLJavaModLoadingContext context) {
        IEventBus modEventBus = context.getModEventBus();
        // ブロック登録
        ClickManaitaBlocks.register(modEventBus);
        // アイテム(ブロックのアイテム)登録
        ClickManaitaItems.register(modEventBus);
    }
}
 
// NeoForge
@Mod(ClickManaita.MOD_ID)
public class ClickManaita {
 
    /**
     * MODのID
     */
    public static final String MOD_ID = "clickmanaita";
 
    /**
     * コンストラクタ
     */
    public ClickManaita(IEventBus modEventBus, ModContainer modContainer) {
        // ブロック登録
        ClickManaitaBlocks.register(modEventBus);
        // アイテム(ブロックのアイテム)登録
        ClickManaitaItems.register(modEventBus);
    }
}

あとはMinecraftForge.EVENT_BUSNeoForge.EVENT_BUSだし、
クラス名同じでパッケージ名だけ違うとかなのでimport直すだけとかがメインの仕事なんじゃないかな。IDEAならCtrl + Space (Windows は)連打のコード補完が強いからすぐ出来そう感。

Imgur

うごいた

狐がぐるぐる回るのをしばらく見てると起動した。
まだMODのメタデータとかは直せてないけど起動した。

Imgur

MOD ファイル作成

buildコマンドでMOD ファイル.jar ファイルが出来るはず。

Imgur

build/libsフォルダにあるはず。

Imgur

差分

大半がimportの修正。

https://github.com/takusan23/ClickManaita2/compare/1.21.4-forge...1.21.4-neoforge

事件簿

Error: could not open clientRunVmArgs.txt

cleanしたあと、Gradle Sync(更新ボタンみたいなやつ)を押したら治った。

Error: could not open `C:\\Users\\takusan23\\Desktop\\Dev\\Minecraft\\examplemod-template-1.21.4\\build\\moddev\\clientRunVmArgs.txt'

Imgur

おわりに

生成 AIにリリース時に使ってるテンプレ(NeoForge バージョン x.y.z 以降が必要)みたいなのを書かせてみた。
私の舌足らず感ある命令でもいい感じに解釈してくれてやってくれた。

ちなみに必要なNeoForgeのバージョンはgradle.propertiesに書いてあって、
またgitでバージョン管理してるのでgit grep 'neo_version='コマンドを全ブランチに対してやった。その結果がプロンプトの冒頭のあれ。

Imgur

Imgur

Imgur

おわりです。