Ameba Ownd

アプリで簡単、無料ホームページ作成

MinecraftBEアドオン-ヒント倉庫

modに近づく!?バイオームの基礎から応用まで#4

2020.04.19 08:04

カスタムバイオーム(v1.16以降編)

 アップデート以前のバイオームのjsonを見てみると、たしかに試験的な雰囲気を感じさせます。そして、今回ガラッと一変してしまいました。おかげではじめはカスタムバイオームが追加できないバグが現れたのかと思いました。こちらの話ですが、こんなことになってしまうとチュートリアルの記事を新しいものに対応するようにしなくてはいけない……などいろいろ大変なんです。

 そこで今回はすべてイチから書きます。書きこぼしたこともすでに説明したこともすべて。part分けもすこし悩むくらいだったので、もしかしたら記事が長くなってしまうかもしれません>< うまく章で分けてキリをよくするので全部読んでられない場合は章区切りで読んでみてください。


Sec.1 バイオーム作りの基礎

 もう基礎はわかってる、というひともざっと目を通してみてください、以前との変更点はあとでまとめて紹介します。地味に古い記事で紹介しなかったことも基礎で紹介しちゃったりしています。

 相変わらずテンプレートにバイオームのjsonはなく、apkなどからとりだす必要があります。ただそれもすべてのバイオームのjsonを手にいれる場合の話で、リファレンスに平原のjsonが載っています。わたしの例が不安ならそれを使ってみてください(ただし、それも古い場合があります。v1.16でのリファレンスには新しいのが載るといいですね[これを書いている時期はv1.16がまだベータです])

 こちらが今回のお手本です。


{

  "format_version": "1.13.0",

  "minecraft:biome": {

    "description": {

      "identifier": "custom_biome"

    },

    "components": {

      "minecraft:climate": {

        "downfall": 0.4,

        "snow_accumulation": [ 0.0, 0.125 ],

        "temperature": 0.8

      },

      "minecraft:overworld_height": {

        "noise_type": "lowlands"

      },

      "minecraft:surface_parameters": {

        "sea_floor_depth": 7,

        "sea_floor_material": "minecraft:diamond_block",

        "foundation_material": "minecraft:gold_block",

        "mid_material": "minecraft:redstone_block",

        "top_material": "minecraft:lapis_block",

        "sea_material": "minecraft:netherite_block"

      },

      "minecraft:surface_material_adjustments": {

        "adjustments": [

          {

            "materials": {

              "mid_material": "minecraft:iron_block",

              "top_material": "minecraft:coal_block"

            },

            "noise_range": [ -0.1, 0.1 ]

          }

        ]

      },

      "minecraft:overworld_generation_rules": {

        "generate_for_climates": [

          [ "medium", 3 ],

          [ "warm", 1 ],

          [ "cold", 1 ]

        ]

      },

      "animal": {},

      "monster": {},

      "overworld": {},

      "plains": {},

      "bee_habitat": {}

    }

  }

}


 このjsonをcustom_biome.jsonという名前でビヘイビアパックのbiomesというフォルダにいれるだけで(要 試験的ゲームプレイON)このようなバイオームが生成されるはずです。見つけやすいはずなので根気よく探してください。

 ファイル名とアイデンティファイアは同じにしないと追加できないので注意しましょう

 jsonの16行目の「minecraft:surface_parameters」の中身とこの写真を見比べてみてください。どの箇所がどの部分の生成に関わってくるのかがだいたいわかると思います。百聞は一見にしかずです。

 ひとによってこういうのをとらえる感覚は違うので一応説明しておきます。

■ minecraft:surface_parameters

 このコンポーネントがバイオームを構成するブロックを決めます

 平原で例えると、top_materialが草ブロックmid_materialが土ブロックfoundation_materialが石ブロックにあたる部分です。sea_materialはそのバイオームが海に面しているときの海のブロックです。平原なら水ブロックのはずです。この画像で言うとネザライトブロックの部分ですが、この場合は川バイオーム(画像の水の部分)と隣り合っている部分です。

■ minecraft:surface_material_adjustments

 バイオームの表面のブロックが一種類だと味気ないときがあります。そんなときに使うのがこのコンポーネント。minecraft:surface_parametersで生成した表面をキャンバスとしてその上からさらに模様をつけていくイメージです

 プロパティの名前はminecraft:surface_parametersと同じなのでそこと対応していると思ってください。画像をよく見ると、ラピスラズリブロックの下は必ずレッドストーンブロック、石炭ブロックの下は必ず鉄ブロックになっています。

 noise_rangeや例にはないですがnoise_frequency_scale(小数)で濃度や模様の形態を決めましょう。コツは──ないです。

■ minecraft:climate

 気温、湿度、降水量などの気象条件を管理するコンポーネントです。

 snow_accumulationは雪が積もる量temperatureは気温です。平原の気温は0.8、砂漠の気温は2.0、雪原の気温は0.0となり、0.0にするともれなく雪がはじめから積もり、水も凍ります

 そして、今回追加されたwhite_ash(白い灰)、red_spores(赤い胞子)、ash(灰)、blue_spores(青い胞子)というものもあります(すべて小数)。順に玄武岩デルタ、真紅の森、ソウルサンドの谷、歪んだ森で空中に漂うパーティクルです。ネザーだけでなく、地上にも適用できます。ちなみにこのパーティクルのテクスチャはenvironmentフォルダのwether.pngに雨や雪といっしょに描かれています。

■ minecraft:overworld_height

 地形の生成スタイルを指定するコンポーネントです。次のうちから選べます。

 英単語の意味から推測したイメージをカッコ書きしておきました。

 例にはないですが、noise_typeの代わりにnoise_params: [ (小数), (小数) ]で自分で生成スタイルを決められます。

■ minecraft:overworld_generation_rules

 そのバイオームを生成するルールです。これはすこし推測をいれながら説明します。よくわからなかったら手本のとおりのままでいいと思います。

 バイオームは、バイオームより大きな「気候」のくくりをもとに生成されていると思います。雪原が砂漠と川一本隔てて隣り合っているということはないでしょう(シード値によっては奇跡的にあるかもしれませんが、普通は見かけませんね)。「暖かい気候」には砂漠、平原、熱帯の海、レアですがジャングル、のように決まっていると考えています。それである気候に対するそのバイオームの出現率をwightで指定するものがgenerate_for_climatesです。

 書き方は例のように[ 気候区分, wight ]と書きます。このコンポーネント全体のカッコは四角カッコ[]なので注意してください。気候区分は次のうちから選べます。

 実際これらの数値を10000などに指定すればその気候区分のなかでほぼそのバイオームしか生成されなくなります。

■ minecraft:nether_generation_rules

 minecraft:overworld_generation_rulesの代わりで、ネザーにバイオームを生成するときに使われるようです。現状、ネザーへのカスタムバイオームの生成が成功したことないので自分で使うことはなさそうです。

■ バイオームタグ

 手本のjsonの下のほうにカッコの中身が空なオブジェクトがたくさんあります。要素名に「minecraft:」がつかないこのオブジェクトたちがバイオームタグですカッコの中身にはなにもいれずに使います

 主にほかのjsonで「has_biome_tag」というフィルターを使ってバイオームを識別するために使います。蜂の巣のフィーチャールールでは「bee_habitat」というバイオームタグを持っているバイオームに生成されると書かれており、このお手本バイオームはそのバイオームタグを持っているので、木があれば蜂の巣が生成される可能性があります。

 このバイオームタグはエンティティのリファレンスのフィルター章のひとつ前に、どのバイオームがどのバイオームタグを持っているかが一覧で載っています

 そしてこのバイオームタグ、自分で簡単に作ることができます例と同じように"(任意の文字列)": {}と書いて並べればいいだけです。ただし、任意の文字列はアルファベットまたは数字、記号(アンダーバー(_)、コロン(:)、ドット(.))で構成してください。

 そのカスタムバイオームだけ何かが起こる・何かができるというふうにするならば、自分でバイオームタグを作ってそのバイオームだけに格納しましょう。environment_sensorやschedulerで検知するもよし、スポーンルールであるモブがこのバイオームだけにしか湧かないようにするのもよし、このバイオームだけにフィーチャーを適用するもよし、既存のバイオームタグを自分のバイオームに使って既存のバイオームのフィーチャーを自分のバイオームに適用させるもよし、意外と有能です。

■ アイデア

 できるかぎり、#1で書いたのにここには書いてないということは避けたいので過去のわたしの言葉を引用しておきます。

 初めのうちはこれらのブロックを自分の好きなブロックに変更して遊んでみましょう。top_materialをソウルサンドにして厄介なバイオームにしてもよし、foundation_materialをスライムブロックにしてブランチマイニングが捗るバイオームにしてもいいですね。ただ、top_materialをTNTにするのはやめておいた方がいいでしょう。foundation_materialを空気にするとどうなるでしょうか……?? アイデアは尽きないですね〜
 もちろんカスタムブロックを生成させることもできますよ♪

■ 備考

 minecraft:surface_parametersやminecraft:surface_material_adjustmentsでデータ値が0でないブロック(色がついた羊毛など)を生成したいという場合はSec.3の「ブロックステートでより詳細的にブロックを指定する」を参照してください。



 基礎はこれにて終わりです。やっぱりバイオームだけでできることは少ないです。フィーチャーでいろんなことができるのでフィーチャーをマスターしてバイオームを飾っていきましょう。

 #1でバージョンが違うと言われてぜんぶ飛ばしてここに来て基礎を勉強したひとはこちらを次に読むといいでしょう。

 


Sec2. 前バージョンとの変更点

・jsonのコード構成

 一つ前の章を読めばなんとなくわかると思いますが、やっぱりjsonが全体的に変わってしまっています。古いほうはほかのjsonとは一風変わったような形をしていましたが、大きな箱にdescriptionとcomponentsという特有の、アドオンをたくさんやっているひとなら"よくみる形"に統一されました。いままでは試験段階だったのでしょうか。

・コンポーネントの名前

 よく見るとコンポーネントの名前も若干変わっているようです。コードの「形」を変えるだけでなく「中身」もすべて一新する必要がありそうです。

・ファイル名の重要性

 たしかいままではファイル名とアイデンティファイアが一致していなくても追加できましたが、新しくなってダメになったようです。これがわたしを苦しめた原因。フィーチャールールもそうなので「統一」といった感じでしょうか?

 ファイル名にはコロン(:)は使えないので「○○:○○」のようなアイデンティファイアにしなくてもいい、むしろできません。

・新しいプロパティ

 minecraft:surface_parametersにsea_materialというプロパティが増えましたね。別段これで新しいことができるということはないと思います。

 minecraft:climateにもwhite_ash、red_spores、ash、blue_sporesというものが追加されました。上でも述べているように、新しいネザーのバイオームに降るパーティクルです。ほんとに、新しく降らせるパーティクルを作れないのが残念です……まだアニコンでガマンしましょう。

・新しいコンポーネント

 v1.16ではネザーに新しいバイオームが追加されているわけなので、minecraft:nether_generation_rulesといったネザー関連のコンポーネントが増えるのは当然ですね。

・コード以外の変更

 なかなか気づきにくいと思いますが、minecraft:surface_material_adjustmentsの生成方法がたぶん変わっています。前のがよかったという場合はnoise_rangeをまた調整する必要がありそうです。


Sec3. より詳細な内容

 いちばんJEのmodぽくて、何かを追加するというなかではいちばんバイオームがワクワクすると思うんですがどうでしょう? わたしはいろんなアドオン技術者を知っていますが、嬉々としてバイオームを追加しているひとをあまり見かけません。最終的にはダンジョンなども自然生成させるのが夢なんですが、とにかく今できることをほぼ100%できるように、うまく利用したいという思いからいろいろしていましたが、気づいたら誰も後ろにいなかった、そんな気分です。

 その「探検」において見つけた、誰も知らないであろう要素をできるだけすべてここで紹介していきたいと思います。

■ カスタムバイオームを作るjsonの全貌

 バイオームのリファレンスを見ていると下のほうに何やらjsonのようでjsonじゃない、設計図のようなものがあります。「設計図」という例えをしたのも、これは本当に設計図だからです。

 こういうのを見れば、意外と知られていなかったなにか有能な事実を発掘できるんじゃないかとか思ったのがきっかけです。

 古いほうの構文ですが、その設計図をよりjsonに近づけたものを作りました。

 optはオプショナル、書いても書かなくてもいいということです。その他floatは小数、intは整数、strは文字列、boolはブーリアン型です。block_referenceブロックのアイデンティファイア、biome_referenceはバイオームのアイデンティファイア、feature_referenceはフィーチャーのアイデンティファイア、enumerated_valueは決まった値で選択肢をとなりに書きました。

 それでは、このスキーマだけに載っている、バニラでも使われていないコンポーネントを紹介します。

○minecraft:forced_features

 文章量の嵩(かさ)増しのだいたいの原因はこのコンポーネントです。中身を見てみると、どうやら見たことある形があります。フィーチャールールの形がそのまま入っています。ということで試しにこのコンポーネントを使ってみたところ、動きました! ただそこまで特別なことができるわけでもなさそうです。このバイオームだけに生成するフィーチャーならこのコンポーネントを使ってjson削減──ぐらいでしょうか。そのフィーチャーのためだけにバイオームタグを作っているのであればそれも削減できます。今のところそういう使い道しかない気がします。。。地味にこれはv1.16でも動きます。

○minecraft:ignore_automatic_features

 これの使い道は全くわかりません……

○minecraft:swamp_surface / minecraft:frozen_ocean_surface 

 正直言ってminecraft:surface_parametersとの違いがわかりません。

○minecraft:mesa_surface

 これは上の二つと違って、二つブロックの生成の指定が増え、bryce_pillarsとhas_forestというプロパティがあります。前者は単語の意味からも全くわかりません。後者はそのまま森があるかどうかとしか言いようがないですね……

○minecraft:the_end_surface

 これを書くだけで表面がエンドストーンになります。それだけです。

○minecraft:legacy_world_generation_rules

 これもよくわからないです……



 結果、掘り出し物はそんなになさそうです……

■ 応用分野のプロパティ

 基礎で紹介したコンポーネントはまだ紹介しきれていません。そこまで革新的なものはないですが、すべてを知ってできることを広くしておきたいひとのために紹介しておきます。

○minecraft:surface_material_adjustments

 jsonの構文からなんとなくわかるかもしれませんが、adjustmentsの中のオブジェクトはいくつでも増やせます。


"minecraft:surface_material_adjustments": {

  "adjustments": [

    {

      "materials": {

        "top_material": "minecraft:gravel",

        "sea_floor_material": "minecraft:gravel"

      },

      "height_range": [ "variable.sea_level - 3", "variable.sea_level + 2" ],          

      "noise_frequency_scale": 0.03125,

      "noise_frequency_scale": 0.03125,

      "noise_range": [ -1.0, -0.4 ]

    },

    {

      "materials": {

        "top_material": "minecraft:soul_sand",

        "mid_material": "minecraft:soul_sand",

        "sea_floor_material": "minecraft:soul_sand"

      },

      "height_range": [ "variable.sea_level - 3", "variable.sea_level + 2" ],

      "noise_frequency_scale": 0.03125,

      "noise_range": [ 0.4, 1.0 ]

    }

  ]

}


 ここで新しく増えたheight_rangeというのは高さの範囲です。例ではmolangを使っていますが、整数で書いてもよさそうです。

○ minecraft:overworld_generation_rules

 hills_transformation、mutate_transformation、river_transformation、shore_transformationでバイオームの一部または全体を確率で別のバイオームに変異させることができると考えています。直接バイオームのアイデンティファイアか、generate_for_climatesのように気候区分のところをバイオームのアイデンティファイアに変えたものを値にできます。


"minecraft:overworld_generation_rules": {

  "hills_transformation": [

    [ "forest_hills", 1 ],

    [ "forest", 2 ]

  ],

  "mutate_transformation": "sunflower_plains",

  "generate_for_climates": [

    [ "medium", 3 ],

    [ "warm", 1 ],

    [ "cold", 1 ]

  ]

}

○ minecraft:nether_generation_rules

 基礎でさらっと紹介したときにプロパティは紹介しなかったのでここにのせておきます。効能は不明です。


"minecraft:nether_generation_rules": {

  "target_temperature": 0.0,

  "target_humidity": 0.0,

  "target_altitude": 0.0,

  "target_weirdness": 0.0,

  "weight": 0.40

}

■ ブロックステートでより詳細的にブロックを指定する

 バイオームやフィーチャーでデータ値が0でないブロックは生成できないと考えていました。できたとしても既存のバイオームにあるもの(荒れた土、安山岩など)、つまりテンプレートのjsonに載っているものしか指定のしかたがわかりませんでした。

 しかし、最近(この記事を書いている時期)わたしが方法を解明したので紹介していきます。

 例えば、平原バイオームの表面を草ブロックから模様つき砂岩に変えたい!!というときはこう指定します。センスの話はまた別です。


"minecraft:surface_parameters": {

  "sea_floor_depth": 7,

  "sea_floor_material": "minecraft:gravel",

  "foundation_material": "minecraft:stone",

  "mid_material": "minecraft:dirt",

  "top_material": { "name": "mineraft:snadstone", "states": { "sand_stone_type": "heiroglyphs" } },

  "sea_material": "minecraft:water"

}


 指定のしかたはなんとなく予想がつくんじゃないかとか思ったことはあります。しかしこの例を見るとわかるように、ものによっては「そんなんわかるわけねえだろッ!!」なわけです。

 ということで、指定するときのプロパティと値の一覧を下のリンクにのせておきます。

 書き方はあの例を見ればわかると思いますが、ブロックのアイデンティファイアを書くところにそのまま{}のかたまりを書いてしまえばOKです。minecraft:surface_parametersだけでなく、ブロックのアイデンティファイアを書くところは大体通用すると思います

 ちなみに、わたしはあのオブジェクト全体がブロックを表現していることがすぐにわかるようにカッコがあっても一行にしています(どこかで似たような形を見たことありますね……?)。

 そして後日わかったんですが、どうやらwikiにまとまっているそうです。こちらは英語ですがすべて載っていると思うので、こちらを参照するのもいいと思います。


 これでバイオームについてほぼすべて紹介できたと思います! これらをマスターしてどんどんmodのようなバイオームを作っちゃってください!!

 そしていくつかわたしがわからなかったところはぜひ研究して、なにかわかったことがあったらわたしにお伝えください!