たくさんの自由帳
Androidのお話
たくさんの自由帳
投稿日 : | 0 日前
文字数(だいたい) : 4455
どうもこんばんわ。UMPC (排熱目当て)を持っておふとんに潜って暖を取る時期がもう終わりそう。へーくちゅん
NeoForgeでMODを遊びたいって、GitHubのIssueに来たので対応してみる。NeoForgeIt's time to develop the NeoForge version. · Issue #3 · takusan23/ClickManaita2
I think there are a lot of people who want to use this mod on NeoForge, including myself
https://github.com/takusan23/ClickManaita2/issues/3
マイクラにMODを入れて遊ぶには前提 MOD(MOD ローダー)を入れる必要があるのですが、種類が3つくらいある。
遊ぶ側としては遊びたい MOD に合わせればいいと思う。どれも互換性はない。 どれも互換性がないので開発側としては厳しそう(こなみかん)。
ForgeFabricよりもやっぱりこっちなんですかね?FabricKotlinでも書ける!!NeoForgeForgeのフォークだそう。互換性はない。MOD開発者は1.21あたりでみんなForgeからこれに引っ越したらしいForgeからの移植は多分難しくない、import直すだけとか(後述)1.6.4とか1.7.10とか1.10.2とか1.12.2まで(同窓会かな)はForgeだけだったはず。
そのあとにFabricっていうバニラのアップデートに速攻対応するMOD ローダーが登場した。Forgeが数週間待ちに対して、これは次の日くらいにはリリースノートが投稿され、その中でAPIや内部の仕様変更がまとめられているという開発者にめちゃ優しい。
ForgeはMDK(SDK)だけ配ってじゃあ後やってね~だから何もわからないんだよな。
ドキュメントだってあってないようなものだし。
そのあと、NeoForgeていうのがForgeをフォークして登場したそうな。
名前が似ているけど互換性が無い。ただmodding書いて見た感じ限りなくForgeのAPIに似ている。
1.21あたりでかなりの開発者がこっちに移住したそう。で、私のMODはこのMOD ローダーでは遊べないのでIssueが来た。
NeoForgeに移行しているあたり、いま作るならFabricかNeoForgeの2択なのかな。Fabricのが作りやすいと思うけど、遊ぶ側的にはNeoForgeなのかなあ。
あとNeoForgeもいつまでForge風のAPIであり続けるか分からないし急いでやるか~~~。
ここまでが調べた限り、Redditの人たちが詳しい。
MODのテンプレを作ってくれるやつですパッケージ名、MOD 名を埋めてzipをダウンロードする。Forgeのときよりずっと優しい。
Mod Generator
A tool to quickly generate new mod projects.
https://neoforged.net/mod-generator/
パッケージ名はドメインを逆にしたものを使うのが王道だけど、持ってなかったからGitHub Pages (io.github)のをずっと使ってるんだよな、Structuring Your Mod | NeoForged docs
Structured mods are beneficial for maintenance, making contributions, and providing a clearer understanding of the underlying codebase. Some of the recommendations from Java, Minecraft, and NeoForge are listed below.
https://docs.neoforged.net/docs/gettingstarted/structuring
解凍してzipをIDEAで開けばGradleが作業を始めてくれる。
終わるのを待ちます。BUILD SUCCESSFULみたいなのが出るはず
処理が終わったら、Clientを実行します。ここです
Javaのパッケージ名通りにフォルダを作ってくれないようです。com.example.fooならcom/example/fooって感じに、それぞれフォルダを作って入れ子にする必要があるはずなのですが、(フォルダにドットがあるとダメなはず)com.example.fooフォルダになってしまいます。これだとビルドは出来ますがなにか問題が起きる可能性があります、、
というわけで各フォルダを作って入れ子にしました。
エクスプローラーの表示が>になってれば良いはず。
クリエタブとアイテムがあります。
食えます。
NeoForgeの.zip テンプレを解凍して、src/main/javaとsrc/main/resourcesを上書きすれば良さそう。
ビルドに必要なbuild.gradle周りはNeoForgeのが絶対必要。一方Javaコードとテクスチャとかの自分で書いたものはForgeのを今のところ入れておく。NeoForgeがbuild.gradleを元に開発環境を構築するので、あとはForge時代のJavaコードを直す作戦で行く。
というわけでForge時代のコードにNeoForgeのビルドに必要なsrc以外を持ってきた。
srcの中もsrc/main/templateフォルダだけはForgeには無いので必要です。
逆にsrc/main/resources/META-INF/mods.tomlはForgeだけなので、NeoForgeでは消して良いはず。
バージョン管理(git)を使ってForgeブランチからNeoForgeブランチを切った。エクスプローラー上のチェックマークとかビックリマークはTortoiseGitを入れているからですね。
IDEAのgit統合なら、neoforgeで上書きしても、こんな感じに上書きしたとしてもすぐ戻せるので便利
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_BUSはNeoForge.EVENT_BUSだし、
クラス名同じでパッケージ名だけ違うとかなのでimport直すだけとかがメインの仕事なんじゃないかな。IDEAならCtrl + Space (Windows は)連打のコード補完が強いからすぐ出来そう感。
狐がぐるぐる回るのをしばらく見てると起動した。
まだMODのメタデータとかは直せてないけど起動した。
buildコマンドでMOD ファイルの.jar ファイルが出来るはず。
build/libsフォルダにあるはず。
大半がimportの修正。
cleanしたあと、Gradle Sync(更新ボタンみたいなやつ)を押したら治った。
Error: could not open `C:\\Users\\takusan23\\Desktop\\Dev\\Minecraft\\examplemod-template-1.21.4\\build\\moddev\\clientRunVmArgs.txt'生成 AIにリリース時に使ってるテンプレ(NeoForge バージョン x.y.z 以降が必要)みたいなのを書かせてみた。
私の舌足らず感ある命令でもいい感じに解釈してくれてやってくれた。
ちなみに必要なNeoForgeのバージョンはgradle.propertiesに書いてあって、
またgitでバージョン管理してるのでgit grep 'neo_version='コマンドを全ブランチに対してやった。その結果がプロンプトの冒頭のあれ。
おわりです。