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/
  • 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は資料なし

https://mcmodding.jp/modding/index.php/%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E4%B8%80%E8%A6%A7#1.8Modding_MinecraftForgeUniversal_1.8-11.14.0.231239-1.8.EF.BD.9E

サンプルコード生成

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 ライフサイクルイベント

ミニマム Mod の適用 (V1.18.2)

Block追加