結論
- Fabricを使うこと
- https://www.curseforge.com/minecraft/mc-mods/world-gen/world-biomes?filter-game-version=1738749986:73407&filter-sort=2 で参考になるModを探す
/locate biome forest
/locate biome example:brokencity
精査
mixin : Fabricの機能。ベースとなるゲームに機能を注入する。必ずjavaで生成しないといけない
- カスタムロジックの挿入
- メカニズムの削除
- 値の変更
使用方法
- resources/fabric.mod.json にまずは mixinを使うことを登録
{
"mixins": [
"modid.mixins.json"
]
}
modidは 使用する ModのIDで置き換え
mixin設定ファイルの確認
{
"required": true,
"minVersion": "0.8",
"package": "net.fabricmc.example.mixin",
"compatibilityLevel": "JAVA_8",
"mixins": [],
"client": [
"TitleScreenMixin"
],
"server": [],
"injectors": {
"defaultRequire": 1
}
}
- クライアントサーバー両方:mixins
- クライアントのみ: client
- サーバーのみ:server
Injects : 既存のメソッドの指定された位置にカスタムコードを配置
@Inject(method = "METHOD NAME OR SIGNATURE", at = @At("INJECTION POINT REFERENCE"))
private void injectMethod(METHOD ARGS, CallbackInfo info) {
}
- Injection Point : 注入ポイントを決める
- メソッドの先頭
- メソッドのreturn直前
- 呼び出し直前
- returnが複数ある時に、最後のreturnの直前 コンストラクタへの注入も可能
example
@Mixin(TitleScreen.class)
public class ExampleMixin {
@Inject(at = @At("HEAD"), method = "init()V")
private void init(CallbackInfo info) {
System.out.println("This line is printed by an example mod mixin!");
}
}
アクセサー
@Mixin(MinecraftClient.class)
public interface MinecraftClientAccessor {
@Accessor
int getItemUseCooldown();
}
@Mixinで指定したクラスの指定したメソッドにアクセスできる(private / finalはアクセスできない) 例の場合は MinecraftClient クラスの getItemUseCooldown
Samples https://fabricmc.net/wiki/tutorial:mixin_examples
雑多調査
アノテーション
コンパイラや実行環境に対してなにかを通知するためのもの 必要に応じてユーザーに通知をしたり処理を変更したりします。 C言語のプリプロセッサの#defineや#ifと似た概念です。
中身の確認は Intellijで参照してくれる
@shadow
Package org.spongepowered.asm.mixin
Annotation Interface Shadow
@Target ({METHOD ,FIELD }) @Retention (RUNTIME ) public @interface Shadow
Used to indicate a Mixin class member which is acting as a placeholder for a method or field in the target class
Mixinクラスのメンバーであることを示す。
@Final
フィールドを実際に final として宣言する代わりに使用できます。
Biome登録する場合は、 VanillaBiomeParameters クラスを改変する メソッドは writeBiomeParameters HEADで呼び出し前に呼び出し
private void tryRemoveRiver(
Consumer<Pair<MultiNoiseUtil.NoiseHypercube, RegistryKey<Biome>>> parameters,
MultiNoiseUtil.ParameterRange temperature,
MultiNoiseUtil.ParameterRange humidity,
MultiNoiseUtil.ParameterRange continentalness,
MultiNoiseUtil.ParameterRange erosion,
MultiNoiseUtil.ParameterRange weirdness,
float offset,
RegistryKey<Biome> biome,
CallbackInfo ci
) {
MultiNoiseUtil は minecraftの Utilクラス
おそらく biome がカギ
今回は、追加するというより、既存の River を書き換えるっぽい挙動
MultiNoiseUtil をちゃんと調べたほうがよさそう
このコードだと、注入なので、生成時に加えたわけではなさそう。ゆえに weight ではないと思われる
全体の仕組みとして、登録するオブジェクトの生成は普通のクラスでやってて、ワールドへの注入は Mixinでやる
https://github.com/mikanbox/MineCraft_OriginalBiome なんとか完了した。 あとは、コードを分析すればOK
所管だが、Forgeに比べてFabricは導入が大変…
mixin : ベースのゲームを変更する、つまりリフレクションを使うような感覚?
今回は、既存のバイオームを書き換えるために使っているっぽい
https://github.com/SuperCoder7979/RiverRedux/blob/master/src/main/java/supercoder79/riverredux/biome/CarvedRiverBiome.java これはちゃんと登録できているプロジェクト が、おそらくFabric経由で登録しているっぽい
https://github.com/SuperCoder7979/RiverRedux/blob/master/src/main/java/supercoder79/riverredux/RiverRedux.java これが EntryPoint どうやら Fabricだとリージョンという定義で登録できるっぽい
登録が反映されてない or locateで確認できない のいずれかを解決する
level-name 任意の名前 ワールドの名前とワールドデータが保存されるディレクトリ名の設定
エラーログ見る
[22:04:21] [Worker-Main-4/DEBUG] [ne.mi.re.ResourceCacheManager$NamespacedResourceCacheManager/]: Failed to cache resources, the directory does not exist!
cpw.mods.niofs.union.UnionFileSystem$NoSuchFileException: /assets/brokencity
記事はどこかで公開したい mod公開場所も探したいっすね
夏休み一週間ぐらいのタスク想定
手順
- 環境確認
- Biome クラス確認
- Biomeクラス実装してみる
- 手直しとか
- 作ったModの公開
環境確認
IDE : Intellij Java : MineCraft : v1.19.1 知識状況:ブロック追加が初めてできたぐらい の知識
Blockと同じように Registoryを作成して登録する感じだが、登録タイミングや内容が重要
テストは、Intellijで server / client を同時実行する
client 側で multiplayerを選択し、localhost 実行で入れるはず
run->server.properties の online-mode=false にすることでクライアントからの接続を試みる これをオフにしないと、アカウントチェックが入るため、検証失敗する
権限付与とかは runserver タブからコマンド実行できる
/locate biome minecraft:mushrooms
[18:47:17] [Server thread/INFO] [minecraft/MinecraftServer]: The nearest minecraft:mushrooms is at [2336, 60, -3104] (3884 blocks away)
[18:47:17] [Server thread/WARN] [minecraft/MinecraftServer]: Can't keep up! Is the server overloaded? Running 2586ms or 51 ticks behind
/locate biome minecraft:desert_test
biome ID がどう割り振られるかなぞ
/locate biome originambiomes:brokencity
/locate biome minecraft:forest
/locate biome minecraft:originambiomes:brokencity
/locate biome minecraft:brokencity
多分こんな感じで検索できる。 あとは Biome ID の生成方法を検索
GitHubで見てみる
ID生成方法がわからんので、一般的なものを調べてみる
起動後に、全バイオームを削除することで、自作バイオームのみの生成にする
Unidentified mapping from registry minecraft:worldgen/biome 身元不明のマッピングとのことなので、何かのマッピングができてない
Registry minecraft:worldgen/biome: Object did not get ID it asked for. Name: originalbiomes:brokencity Expected: 63 Got: 64
古いデータが残ってたからっぽいのと、ID一致ミス worldデータ削除でいけたっぽい。 おそらく前のデータですでに63が埋まっていた
addSpawnBiome : 初期スポーン地点になる可能性のあるバイオーム
利用している Java のライブラリを見て確認する jump to source で確認できる
あ~これ dimention の設定だから間違えてるわ https://github.com/ZhuckovAlex/Tutorial-41-1.16.5/blame/2355801b7290c14ec37b68b7f84dbeb107351c7d/src/main/resources/data/project/dimension/rdim.json
リソースの作成場所をミスってたので再作成
隣接バイオーム設定が悪さしてる可能性はある
結局既存のものを見るしかなさそう
パッと見 Forge 使わないっぽい?確かにforgeのレジストリに登録しても反映されていないのが今
RSBiomeModifiers.BIOME_MODIFIER_SERIALIZERS.register(modEventBus);
方針としては既存のバイオーム追加 Mod から抜き出すしかなさそう
.\gradlew genIntellijRuns