たくさんの自由帳
Androidのお話
たくさんの自由帳
投稿日 : | 0 日前
文字数(だいたい) : 4455
どうもこんばんわ。
UMPC (排熱目当て)
を持っておふとんに潜って暖を取る時期がもう終わりそう。へーくちゅん
NeoForge
でMOD
を遊びたいって、GitHub
のIssue
に来たので対応してみる。
https://github.com/takusan23/ClickManaita2/issues/3
neoforge-1.21.4
!!!!
マイクラに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
や内部の仕様変更がまとめられているという開発者にめちゃ優しい。
Forge
はMDK(SDK)
だけ配ってじゃあ後やってね~だから何もわからないんだよな。
ドキュメントだってあってないようなものだし。
そのあと、NeoForge
ていうのがForge
をフォークして登場したそうな。
名前が似ているけど互換性が無い。ただmodding
書いて見た感じ限りなくForge
のAPI
に似ている。
1.21あたりでかなりの開発者がこっちに移住したそう。で、私のMOD
はこのMOD ローダー
では遊べないのでIssue
が来た。
NeoForge
に移行しているあたり、いま作るならFabric
かNeoForge
の2択なのかな。Fabric
のが作りやすいと思うけど、遊ぶ側的にはNeoForge
なのかなあ。
あとNeoForge
もいつまでForge
風のAPI
であり続けるか分からないし急いでやるか~~~。
ここまでが調べた限り、Reddit
の人たちが詳しい。
これがドキュメントです、結構充実してる
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
解凍して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
の修正。
https://github.com/takusan23/ClickManaita2/compare/1.21.4-forge...1.21.4-neoforge
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='
コマンドを全ブランチに対してやった。その結果がプロンプトの冒頭のあれ。
おわりです。