結論

/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 をちゃんと調べたほうがよさそう

https://maven.fabricmc.net/docs/yarn-1.18.2+build.1/net/minecraft/world/biome/source/util/MultiNoiseUtil.html

このコードだと、注入なので、生成時に加えたわけではなさそう。ゆえに weight ではないと思われる

全体の仕組みとして、登録するオブジェクトの生成は普通のクラスでやってて、ワールドへの注入は Mixinでやる

https://github.com/mikanbox/MineCraft_OriginalBiome なんとか完了した。 あとは、コードを分析すればOK

所管だが、Forgeに比べてFabricは導入が大変…

mixin : ベースのゲームを変更する、つまりリフレクションを使うような感覚?

今回は、既存のバイオームを書き換えるために使っているっぽい

https://www.curseforge.com/minecraft/mc-mods/world-gen/world-biomes?filter-game-version=1738749986:73407&filter-sort=2

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

https://www.curseforge.com/minecraft/mc-mods/world-gen/world-biomes?filter-game-version=&filter-sort=2

https://github.com/DenisMasterHerobrine/MagicalForest/tree/master/src/main/java/dev/denismasterherobrine/magicalforest これがよさそう

https://www.curseforge.com/minecraft/mc-mods/world-gen/world-biomes?filter-game-version=1738749986%3A73407&filter-sort=2 ここで検索して確認する

https://github.com/SuperCoder7979/RiverRedux/blob/master/src/main/java/supercoder79/riverredux/biome/CarvedRiverBiome.java

記事はどこかで公開したい mod公開場所も探したいっすね

夏休み一週間ぐらいのタスク想定

手順

  • 環境確認
  • Biome クラス確認
  • Biomeクラス実装してみる
  • 手直しとか
  • 作ったModの公開

環境確認

IDE : Intellij Java : MineCraft : v1.19.1 知識状況:ブロック追加が初めてできたぐらい の知識

参考資料 https://github.com/Choonster-Minecraft-Mods/TestMod3/blob/59dc2a2c51f47848c754796ec6767ad50d56ee67/src/main/java/choonster/testmod3/init/levelgen/ModBiomes.java

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

リソースの作成場所をミスってたので再作成

隣接バイオーム設定が悪さしてる可能性はある

jsonデータの中身はこちら https://minecraftjapan.miraheze.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%91%E3%83%83%E3%82%AF/%E3%83%AF%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA

結局既存のものを見るしかなさそう

https://github.com/TelepathicGrunt/RepurposedStructures/tree/latest-released/src/main/java/com/telepathicgrunt/repurposedstructures

パッと見 Forge 使わないっぽい?確かにforgeのレジストリに登録しても反映されていないのが今

https://github.com/TelepathicGrunt/RepurposedStructures/blob/latest-released/src/main/java/com/telepathicgrunt/repurposedstructures/RepurposedStructures.java

        RSBiomeModifiers.BIOME_MODIFIER_SERIALIZERS.register(modEventBus);

方針としては既存のバイオーム追加 Mod から抜き出すしかなさそう

.\gradlew genIntellijRuns