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

フィーチャー

 ここまでに説明したカスタムバイオームの追加だけはつまらなくなってきます。なにせ、鉱石を生成するためにはfoundation_materialを石にしてバイオームタグoverworldを追加しなくてはなりませんし、その他既存のものでしかバイオームを装飾できません。題名にある、modに近づくとはとても言えないほど地味です。
 何より、カスタムブロックで鉱石を作っても無理やりな方法でしか生成させることはできません。
 そこで、フィーチャーです。フィーチャーの種類は大きく2つに分かれ、鉱石型と植物型です。

■ 鉱石型

 鉱石のカスタムブロックを生成できるように、ゆっくり難易度を上げていきましょうか。これぐらいは難しくてもやりたいですよね。jsonファイルは2つ作る必要があり、まずはfeatureのほうです。featureもentitiesフォルダと同じ層に「features」フォルダを作って中に入れます。
 今回は石炭をお手本にしましょう。これはapkから手に入ります。(coal_ore_feature.json)


{
  "format_version": "1.13.0",
  "minecraft:ore_feature": {
    "description": {
      "identifier": "coal_ore_feature"
    },
    "count": 17,
    "places_block": "minecraft:coal_ore",
    "may_replace": [
      { "name": "minecraft:stone", "states": { "stone_type": "andesite" } },
      { "name": "minecraft:stone", "states": { "stone_type": "andesite_smooth" } },
      { "name": "minecraft:stone", "states": { "stone_type": "diorite" } },
      { "name": "minecraft:stone", "states": { "stone_type": "diorite_smooth" } },
      { "name": "minecraft:stone", "states": { "stone_type": "granite" } },
      { "name": "minecraft:stone", "states": { "stone_type": "granite_smooth" } },
      { "name": "minecraft:stone", "states": { "stone_type": "stone" } }
    ]
  }
}

 上から説明していきます。descriptionのidentifierは、新しいものを作るときに変えてください。

■ count

 生成するブロックの塊の上限です。石炭は多くて17個もの塊からなっているんですね。

■ places_block

 何を生成するかです。もちろんカスタムブロックでも可能です。

■ may_replace

 どのブロックと置換するかのリストです。コマンドを使うひとはわかると思います、fillコマンドのreplaceと同じ感じです。生成される順番は、地形が先で装飾が後になるので、安山岩などが生成されていればそこに石炭を生成することができます。逆にこのリストに入ってるブロックがそのバイオームになければ生成されません。
 データ値が0のブロックを指定する場合は、例えば{ "name": "minecraft:stone", "states": { "stone_type": "andesite" } }のかたまりすべてを例えばminecraft:stoneのようにまるごと書き換えることができます
 ほかのデータ値が0でないブロック(色がついた羊毛など)を生成したいという場合は「modに近づく!?カスタムバイオームの基礎から応用まで#4」Sec.3の「ブロックステートでより詳細的にブロックを指定する」を参照してください。

 次はfeature_rulesです。確かこっちはファイルの名前とidentifierが一致していないと動かなかったと思うので注意してください。このファイルの名前はoverworld_underground_coal_ore_feature.jsonです。
 そしてこれはfeatureと同じくentitiesの層に「feature_rules」というフォルダを作ってその中に入れてください。

{
  "format_version": "1.13.0",
  "minecraft:feature_rules": {
    "description": {
      "identifier": "overworld_underground_coal_ore_feature",
      "places_feature": "coal_ore_feature"
    },
    "conditions": {
      "placement_pass": "underground_pass",
      "minecraft:biome_filter": [
        {
          "any_of": [
            {
              "test": "has_biome_tag",
              "operator": "==",
              "value": "overworld"
            },
            {
              "test": "has_biome_tag",
              "operator": "==",
              "value": "overworld_generation"
            }
          ]
        }
      ]
    },
    "distribution": {
      "iterations": 20,
      "coordinate_eval_order": "zyx",
      "x": {
        "distribution": "uniform",
        "extent": [ 0, 16 ]
      },
      "y": {
        "distribution": "uniform",
        "extent": [ 0, 128 ]
      },
      "z": {
        "distribution": "uniform",
        "extent": [ 0, 16 ]
      }
    }
  }
}


 これも上から説明していきましょうか。
 identifierは新しいものをつくる場合は変えてください。places_featureは対応させるfeatureファイルのidentifierを書きましょう。
 placement_passはいろんなものがあるんですが、鉱石生成ならunderground_passで構いません。
 minecraft:biome_filterはエンティティのフィルターと同じ書き方です。どのバイオームに生成されるかをそのバイオームがどのバイオームタグを持っているかで決めます。
 iterations、これは説明が難しいんですが、簡単に雑に言ってしまえば密度です。指定した範囲にどれだけの密度で生成するか。この際自分でいじってその変化を実験してみるのもいいですね!
 2つ飛ばしてextent。x,zはチャンクの角からそれぞれの軸の方角にどれだけバラけるかです。0にするとそのチャンクのx,z座標の値がいちばん小さいところだけに生成されるので、チャンクの境が分かりますね。yはそのまま高さです。どの高さの範囲に生成されるか。

 できるだけ説明を簡単にしたので分かりやすかったでしょうか。jsonを丸ごと載せることが多い回なのでできるだけ簡潔に書きます。

☆ 鉱石型の応用

 「鉱石型」と言ってしまうとどうしても視野が狭くなりがちです。ちょっと頭を柔らかくすると、may_replaceに空気を指定して空中に鉱石──いや、鉱石とは限りませんね、石や草ブロックでもいいわけですからyのextentを高めに設定して空島を生成させることもできます。実はこれの1つ前の記事のサムネイルは、ちょっと低めの空島の下に広がる世界です。
 この低めの空島と合わせてx,zのextentを狭くした石を生成させれば石筍(せきじゅん)や鍾乳石(しょうにゅうせき)に見えたりするのでしょうか?
 空気を使う案はもうひとつあります。今度は空気を生成させましょうか。countを大きくすれば空気の塊が互いに繋がりあって人工的に(?)洞窟を作ることができます。これもわたしのサバイバルアドオンにある「巨大洞窟」の案です。

■ 植物型

 こっちが難しいほうです。なぜ難しいのかと言うと、連携するjsonファイルが多いからです。今回は例として高さ二マスの植物のひとつ、シダのjsonを使います。その前に、複雑なjsonの連携を画像で簡潔に説明します。それぞれのファイルはそれぞれの矢印に沿って参照しています。
 図を書かずにこれは理解できませんでした。簡潔にですが説明してみます。

 まずtaiga_first_double_plant_fern_feature.jsonで次のfern_double_plant_patch_feature.jsonのシダの集まり自体の分布を設定します。鉱石の分布を設定するのと似たような感じです。そこでfern_double_plant_patch_feature.jsonはというと、シダの集まりにあるひとつひとつのシダの分布を設定します。もう脱落者が出てきそうですね……。

 シダは二マスでできてるので、ひとつずつ指定したものをまとめる必要があります。それが次に参照されているfern_double_plant_feature.jsonです。

 ここで二手に別れ、上部分、下部分の生成を設定していきます。まずは下部分、これはふつうに以前のファイルで指定された分布で生成するだけなのでfern_double_plant_lower_feature.jsonで終わりです。

 次は上部分ですが、下部分に合わせて生成しなくてはならないので、下部分とどう合わせるかをfixup_fern_double_plant_upper_position_feature.jsonで指定してからfern_double_plant_upper_feature.jsonを参照します。

 あの図だけでも、ああそうなってたのかと理解してしまえばこっちの勝ちです。ここが一番難しいと思います。
 ちなみにあの図を見て、「じゃあ3ブロック以上の塊でも生成できるんじゃないか」とわかれば理解出来ていると思います。

taiga_first_double_plant_fern_feature.json

{
  "format_version": "1.13.0",
  "minecraft:feature_rules": {
    "description": {
      "identifier": "taiga_first_double_plant_fern_feature",
      "places_feature": "fern_double_plant_patch_feature"
    },
    "conditions": {
      "placement_pass": "first_pass",
      "minecraft:biome_filter": [
        {
          "test": "has_biome_tag",
          "operator": "==",
          "value": "taiga"
        }
      ]
    },
    "distribution": {
      "iterations": 1,
      "x": {
        "distribution": "uniform",
        "extent": [ 0, 16 ]
      },
      "y": "query.heightmap(variable.worldx, variable.worldz)",
      "z": {
        "distribution": "uniform",
        "extent": [ 0, 16 ]
      }
    }
  }
}


 これだけ唯一feature_rulesなので、これをfeature_rulesフォルダに入れれば残りはfeaturesフォルダです。
 そしてfeature_rulesに鉱石型と植物型で違いはほとんどありません。知っている項目はその知識で変更を加えても通用するはずです。

■ places_feature

 次に参照するjsonのidentifierを明記します。

■ distribution

 yにmolangで直接値を入れてますね。クエリの名前から、おそらく地面に合わせた高さに生成されるようになるんだと思います。いじるのはx,zにしておきましょうか。(ただし、地面に合わせた高さと言えど平地では確かに正確ですが、段差や水場では正確な値をとってくれなさそうです。)

fern_double_plant_patch_feature.json

{
  "format_version": "1.13.0",
  "minecraft:scatter_feature": {
    "description": {
      "identifier": "fern_double_plant_patch_feature"
    },
    "iterations": 64,
    "coordinate_eval_order": "zyx",
    "x": {
      "extent": [ -8, 8 ],
      "distribution": "gaussian"
    },
    "z": {
      "extent": [ -8, 8 ],
      "distribution": "gaussian"
    },
    "y": {
      "extent": [ -4, 4 ],
      "distribution": "gaussian"
    },
    "project_input_to_floor": false,
    "places_feature": "fern_double_plant_feature"
  }
}

 これはscatter_featureというものですが見たところfeature_rulesと書き方が似ていますね。これも知っている名前の要素はfeature_rulesと同じ扱いで大丈夫そうです。

■ project_input_to_floor

 詳しいことは分かりません。trueにすると上部分と下部分が逆になったり少しズレた生成になります。

■ places_feature

 先程と同様に次に参照するjsonのidentifierが書かれています

fern_double_plant_feature.json

{
  "format_version": "1.13.0",
  "minecraft:aggregate_feature": {
    "description": {
      "identifier": "fern_double_plant_feature"
    },
    "early_out": "first_failure",
    "features": [
      "fern_double_plant_lower_feature",
      "fixup_fern_double_plant_upper_position_feature"
    ]
  }
}

 ここには変更できる要素はなさそうです。ただしシダの分布を設定するjsonとシダ一つひとつの生成を設定するjsonを繋ぐ役割があるので重要ではあります。
 ここで上下が分岐するので、3ブロックの組を生成したい場合は8行目のfeaturesの中に付け加えます。
 このjsonはfeaturesで参照するjsonをまとめています。

fern_double_plant_lower_feature.json

{
  "format_version": "1.13.0",
  "minecraft:single_block_feature": {
    "description": {
      "identifier": "fern_double_plant_lower_feature"
    },
    "places_block": { "name": "minecraft:double_plant", "states": { "double_plant_type": "fern", "upper_block_bit": false } },
    "enforce_survivability_rules": false,
    "enforce_placement_rules": true,
    "may_replace": [
      "minecraft:air"
    ]
  }
}

 下部分の生成ですね。形はore_featureと似ています。何度も言うように、知っている名前の要素はore_featureと同じような扱いで通用すると思います。

■ places_block

 データ値が0のブロックを指定する場合は、{ "name": "minecraft:double_plant", "states": { "double_plant_type": "fern", "upper_block_bit": false } }のかたまりすべてを例えばminecraft:stoneのようにまるごと書き換えることができます
 ほかのデータ値が0でないブロック(色がついた羊毛など)を生成したいという場合は「modに近づく!?カスタムバイオームの基礎から応用まで#4」Sec.3の「ブロックステートでより詳細的にブロックを指定する」を参照してください。

 enforce_survivability_rulesやenforce_placement_rulesは大きな変化が伺えなかったので動かす必要はなさそうです。

fixup_fern_double_plant_upper_position_feature.json

{
  "format_version": "1.13.0",
  "minecraft:scatter_feature": {
    "description": {
      "identifier": "fixup_fern_double_plant_upper_position_feature"
    },
    "iterations": 1,
    "x": 0,
    "y": 1,
    "z": 0,
    "project_input_to_floor": false,
    "places_feature": "fern_double_plant_upper_feature"
  }
}

 これは下部分と上部分を上手く合わせるためのものです。
 これもscatter_featureなのでfeature_rulesと似た書き方できます。
 ただし違う点がひとつ、x,y,zの値は全て下部分のブロックが基準になっているので、基準からそれぞれの方角にずらして配置するということになります。今回は真上なのでyを1にしてあとは0ですね。
 これはあくまで下部分と上部分を接着するような役割なので上部分を生成するjsonと繋ぐ必要があります。places_featureに次のjsonのidentifierを書きましょう。

fern_double_plant_upper_feature.json

{
  "format_version": "1.13.0",
  "minecraft:single_block_feature": {
    "description": {
      "identifier": "fern_double_plant_upper_feature"
    },
    "places_block": {
      "name": "minecraft:double_plant",
      "states": {
        "double_plant_type": "fern",
        "upper_block_bit": true
      }
    },
    "enforce_survivability_rules": false,
    "enforce_placement_rules": false,
    "may_replace": [
      "minecraft:air"
    ]
  }
}

 説明することは、2つ前のfern_double_plant_lower_feature.jsonと同じです。


 関わるjsonが多く難しいのでまずはブロックとフィルターを変えるだけにするのがいいでしょう。
 jsonの中身自体は見たことあるような構文だったりするので、一番大事なのはそれぞれのjsonの連携でしょう。

☆ 植物型の応用

 鉱石型のようにひねった考えのブロックをmay_replaceやplaces_blockに指定する考えはアイデアはあまりありません。
 先程からチラチラ出ている、3ブロック以上の組で生成するという応用があります。一つのブロックを増やすためにjsonは2つ新しく加える必要があることに気づくでしょうか。基準になるブロック(シダなら下部分)に対して、基準からどの位置に配置するかのjson(シダならfixup_fern_double_plant_upper_position_feature.json)と、そのブロックをどう生成するかのjson(シダならfern_double_plant_upper_feature.json)とで2つです。そしてこの2つのjsonと他のjsonに繋がりを持たせるためにfern_double_plant_feature.jsonのfeaturesにそれらのidentifierを書き加えます。
 何ブロックの塊でも生成できるので、実質ストラクチャを自然生成させているようなものです。ただし生成頻度がそれなりなのでちゃんと生成頻度に見合った大きさのストラクチャを生成させましょう。
 今回の記事のサムネイルの場合は丸石の柵、石レンガ、丸石10個の計12ブロックのストラクチャです。may_replaceは空気(と水源)なので石レンガを基準として地面まで丸石が伸びているようになります。

 これは応用するひとでもそうでもないひとに知ってもらいたいのですが、may_replaceにフィーチャーで生成されるブロック(草や花など)を指定するとクラッシュするということに注意しましょう。

 長くなってしまいましたね。フィーチャーを極めれば地味なカスタムバイオームを一気にmodっぽくデコレーションすることができます。
 may_blockやplaces_blockに指定するブロックは、頭を柔らかくして考えるとおもしろいアイデアが浮かんだりするので、応用編の内容を参考にして、あなたも突飛なバイオームを作ってみましょう!
 または、わたしが今回不明だと説明した要素について何か分かればわたしに伝えてくれるとありがたいです。

次↓

MinecraftBEアドオン-ヒント倉庫

MimecraftBEのアドオン作りで困ったときにここで解決できるようにと個人によって作られたものです

1コメント

  • 1000 / 1000

  • hihihitoshi

    2024.04.19 03:16

    minecraft:biome_filterの書き方が分かりません。教えて欲しいです。