Summary
Tasks
- SetUp方法をまとめる
- Smple Mod を適用する
- Biome を追加する
- []Biome を生成させる(Dimension)を追加する
SetUp
Java を DL
今回は Corret v17 をインストール。IntelliJ IDEA のプロジェクト設定から使用する JDK バージョンを選べるので 選択
Forge をDL
https://files.minecraftforge.net/net/minecraftforge/forge/index_1.18.2.html バージョンを指定して zip をダウンロード。その後、解凍してワークディレクトリに配置。
IntelliJ IDEA の利用
DLしたディレクトリを IntelliJ で指定して開く 開いたディレクトリでターミナルを開き、以下を実行することで Gradle プロジェクトの初期設定を行い、カスタムビルド設定を追加する
./gradlew genIntellijRuns
実行 > runServer を実行し、その後 run/eula.txt で eula に同意する。 再度 runServer を実行、同時に runClient を実行しローカルホストの MineCraft Custom Server に接続。 Example Mod が導入されていることを確認
block mod 作成時の注意点(V1.18.2)
- runData は必要ではない。コードが正常であればブロック表示される
- mods.toml における dependency は一つの mod に必要なもの(minecraft, forge)を記載しておけば十分
- ブロックを登録する場合は、ブロックとしての登録後、アイテムとしての登録が必要
- assetのフォルダ構成は以下
- asset//<マイクラ本体と同じく、マテリアルに応じたフォルダ配置>/*/<登録時のオブジェクト名>.json
- マイクラ公式だと以下
- assets/
- minecraft/
- models/
- font/
- lang/
- icons/
- realms/
- minecraft/
- assets/
- assetにおける参照関係のうち、判明しているもは以下 (参照→被参照)
- models.block → textures (必須)
- models.item → models.item (必須)
- lang → models.block
- blockstates → models.block
おそらくほかのリソース系 Mod も注意点としては同じ
memo
Biome 作成
Biome の情報について確認
- Asset に記載がないので、おそらくコード上での管理
forge側の資料検索
site:https://docs.minecraftforge.net biome
- Biome はレジストリへの登録が必要
一般検索
site:https://mcmodding.jp/modding/ Biome
https://mcmodding.jp/modding/index.php/1.8%E3%81%AE%E3%83%90%E3%82%A4%E3%82%AA%E3%83%BC%E3%83%A0%E8%BF%BD%E5%8A%A0 めちゃくちゃ助かります。将来的にはここに情報投稿できるとよいかも が、これは v1.8 ぽい。 v1.18は資料なし
サンプルコード生成
Biome を登録するときのエラー
Exception caught during firing event: You are missing parameters to build a proper biome
BiomeBuilder{
precipitation=null,
biomeCategory=null,
temperature=null,
temperatureModifier=NONE,
downfall=null,
specialEffects=null,
mobSpawnSettings=null,
generationSettings=null,
}
→設定して別エラー出現
[2611月2022 15:12:09.313] [modloading-worker-0/ERROR] [net.minecraftforge.fml.javafmlmod.FMLModContainer/LOADING]: Failed to create mod instance. ModID: addbiome, class dev.test.addbiome.BiomeEntryPoint
java.lang.reflect.InvocationTargetException: null
at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?]
at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[?:?]
at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:?]
at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[?:?]
at java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[?:?]
at net.minecraftforge.fml.javafmlmod.FMLModContainer.constructMod(FMLModContainer.java:67) ~[javafmllanguage-1.18.2-40.1.85.jar%2380!/:?]
at net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$4(ModContainer.java:106) ~[fmlcore-1.18.2-40.1.85.jar%2383!/:?]
at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) [?:?]
at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1796) [?:?]
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) [?:?]
at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182) [?:?]
at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655) [?:?]
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622) [?:?]
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165) [?:?]
Caused by: java.lang.ExceptionInInitializerError
at dev.test.addbiome.BiomeEntryPoint.<init>(BiomeEntryPoint.java:14) ~[%2384!/:?]
... 14 more
Caused by: java.lang.IllegalStateException: Missing 'fog' color.
at net.minecraft.world.level.biome.BiomeSpecialEffects$Builder.lambda$build$0(BiomeSpecialEffects.java:195) ~[forge-1.18.2-40.1.85_mapped_official_1.18.2-recomp.jar%2379!/:?]
at java.util.OptionalInt.orElseThrow(OptionalInt.java:273) ~[?:?]
at net.minecraft.world.level.biome.BiomeSpecialEffects$Builder.build(BiomeSpecialEffects.java:194) ~[forge-1.18.2-40.1.85_mapped_official_1.18.2-recomp.jar%2379!/:?]
at dev.test.addbiome.SampleBiome.<clinit>(SampleBiome.java:15) ~[%2384!/:?]
at dev.test.addbiome.BiomeEntryPoint.<init>(BiomeEntryPoint.java:14) ~[%2384!/:?]
... 14 more
- ロード中にエラー発生
- リフレクション中に例外が発生した場合は、InvocationTargetExceptionに例外が包含される
- 文字列指定してメソッドにアクセスしているときにエラーが発生した場合
- Missing ‘fog’ color.
- at net.minecraft.world.level.biome.BiomeSpecialEffects$Builder.lambda$build$0(BiomeSpecialEffects.java:195)
エラー発生せず登録完了
登録確認
/locatebiome modドメイン:バイオーム名 で検索可能。
実際に出現したことを確認。 検索したところ、出現はしていない。
<画像あり>
Could not find a biome of type '' within reasonable distance.
マップに出現させる
登録まではできたので、マップ生成時のアルゴリズムに自作バイオームを混ぜるステップを追加
BiomeGenerationSettings
what’s carver https://minecraft.fandom.com/wiki/Custom_world_generation/carver https://minecraft.fandom.com/wiki/Custom_world_generation
Custom world generation allows data packs to change how the world generate. データパックに対して、「ワールド」生成方法をいじることを許可するとのこと。
ワールドに影響を与えるっぽい
設定
- ノイズ
- バイオーム
- バイオーム
- Carver : 洞窟系のオブジェクトのこと
builder method一覧
- addCarver : 洞窟系オブジェクト追加?
- addFeature : placefeature が引数
- placefeature : 自然生成される構造体。例えば、壊れたネザーゲートや、池、地表の溶岩 など
Feature周りの記事 https://json-fileman.hatenablog.com/entry/2020/03/17/011641
一般的な調査
Forge でワールド生成ロジックがどこにあるかの調査が必要
https://forums.minecraftforge.net/topic/108855-adding-custom-biomes/ →こちらのコードで昔はできていたらしい。
https://forums.minecraftforge.net/topic/90560-1162-how-to-add-custom-ore-to-world-generation/?tab=comments#comment-420294 昔はワールド生成系はアセットだったのが、コードになったぽい?
読み取り系のサンプル。今回は関係なし http://www.java2s.com/example/java-api/net/minecraftforge/common/biomedictionary/hastype-2-0.html
https://misode.github.io/worldgen/ 興味深いデータ どうやらデータとして Dimension を作らないといけないっぽい? これは Forge といより、データとしてカスタム Dimension を登録して対応するっぽい? マイクラの追加系 Mod は大体カスタムディメンション追加している雰囲気あるかも…
調査
site:https://docs.minecraftforge.net dimension
DataPack調査
https://docs.minecraftforge.net/en/1.18.x/gettingstarted/
https://docs.minecraftforge.net/en/1.16.x/concepts/resources/#ResourceLocation おそらく、resources 配下に data/ を生成すれば良さそう。
Sample https://minecraft.fandom.com/wiki/Custom_dimension
- リソースパックをクライアント側の改造パックとするなら、データパックはサーバー側の改造パックということができる。
Sample 確認
https://github.com/Darkhax-Minecraft/Bookshelf/tree/1.19.2/Forge
https://github.com/TeamTwilight/twilightforest/tree/1.19.x/src/main/resources データも Mod と同じようにクラスパスが必要?
一覧 https://www.curseforge.com/minecraft/mc-mods/search?search=dimension ここから探す
https://www.curseforge.com/minecraft/mc-mods/just-another-void-dimension https://github.com/nanite/JAMD
確認1
https://github.com/TelepathicGrunt/Bumblezone/tree/1.18-Forge →やはりクラスと同じディレクトリ配置している
やってみる
- resources/data/dimension/sampleworld.json
導入確認:以下コマンドで候補を確認
/execute in
候補として3つしかでないので、おそらくだめっぽい
https://github.com/nanite/JAMD これを試したところ、確かに起動できることを確認。 ついでに新バイオームへ移動するブロックも作成できているっぽい。 これはかなり参考になるので、一旦これを試す方向でいろいろやる。
ミニマム Mod の適用
[2511月2022 22:08:56.834] [Render thread/FATAL] [net.minecraftforge.fml.ModLoader/LOADING]: File C:\Users\shuaki\Minecraft\forge-1.18.2-40.1.85-mdk\build\resources\main constructed 1 mods: [simpleblock], but had 2 mods specified: [exampleblock, simpleblock]
Memo
1 project で 複数 mod を扱いたい→結局無理そう
mods.toml と build.gradle の二か所が重要。
MInecraft Java Eidition を公式サイトからDL(要ログイン、購入)
https://www.minecraft.net/ja-jp/store/minecraft-java-bedrock-edition-pc →これMOD開発にはいらないかも。
Forge をDL
https://files.minecraftforge.net/net/minecraftforge/forge/index_1.18.2.html バージョンを指定して zip をダウンロード。その後、解凍してワークディレクトリに配置。
IntelliJ IDEA の利用
DLしたディレクトリを IntelliJ で指定して開く 開いたディレクトリでターミナルを開き、以下を実行することで Gradle プロジェクトの初期設定を行い、カスタムビルド設定を追加する
./gradlew genIntellijRuns
実行 > runServer を実行し、その後 run/eula.txt で eula に同意する。 再度 runServer を実行、同時に runClient を実行しローカルホストの MineCraft Custom Server に接続。 Example Mod が導入されていることを確認
memo
Forge QuickStart
https://docs.minecraftforge.net/en/1.18.x/ https://docs.minecraftforge.net/en/1.18.x/gettingstarted/
mod 開発に厳密に必要なものはごくわずか
- build.gradle
- gradlew.bat
- gradlew
- gradle
Mod 情報の編集
実行構成を更新するには、すべての出現examplemod箇所を mod の mod id に置き換える必要がある
手動ビルド
./gradlew build
./gradlew runClient
Mod の構造化
https://docs.minecraftforge.net/en/1.18.x/gettingstarted/structuring/
- パッケージ名:
- domain : 例: com.hogehoge.fugamod
- mods.toml
- mod のメタデータを定義
- modid: annotation indicating to the Forge Mod Loader that the class is a Mod entry point.
- modid はクラス名である。 modid で指定したクラスが mod のエントリーポイントであると FOrge のクラスローダーに伝える
Forge のコアとなる概念
レジストリ
- ゲームで登録を必要とするほとんどのものは、Forge レジストリによって処理
- レジストリへの登録は2パターンある
- DeferredRegister クラス
- and the RegistryEvent$Register ライフサイクルイベント