はじめに
マインクラフトには、デフォルトで自動生成される建造物がいくつか存在します。ピラミッドや森の洋館などがそうですね。こうした建造物によって、マインクラフトというゲームを「単なるバイオームの集合」ではなく「探索する価値のあるマップ」へと昇華させています。
さて、オリジナルの世界観をアドオンを用いて作成するにあたって、こうしたオリジナルの建造物を自動生成出来たら楽しそうです。幸い、マインクラフトには「features」という仕組みがあり、これを用いることで、マップ生成時に自作の建造物を自動生成する仕組みを作ることができます。本記事では、このfeaturesの基本的な部分を解説し、建造物の自動生成を可能にしていきます。

前提
自動生成を行うにあたって、まずは「アドオンそのもの」の準備が必要です。アドオンの作り方については、以下の記事で説明していますので、ご参照ください。ここでは割愛します:
- manifest.jsonがあればOKです
自作アドオンをゲーム内で選択できる状態にしておきましょう。
フォルダ構成
建造物の自動生成にあたっては、アドオンのフォルダ内で「structures」、「features」、「feature_rules」の3つを作成することが必要です。それぞれの概要は後述します。
MyAddon_BP/
├─ manifest.json
├─ structures/
│ └─ house.mcstructure
├─ features/
│ └─ house.json
└─ feature_rules/
└─ house.json
建造物の定義
まずは、ビヘイビアパックのフォルダ内に「structures」というフォルダを作成しましょう。続いて、Minecraftを起動し、自動生成したい建造物を建築します。

- ただし、ストラクチャーブロックを使う都合上、64×64を超えることはできません
建築が終わったら、以下のコマンドを実行してストラクチャーブロックを入手します:
give @s structure_block
ストラクチャーブロックを設置・右クリックして、この建造物の全体がストラクチャーブロックの範囲に収まるよう設定します。この建造物に適当な名前をつけて、「エクスポート」を選択しましょう。今回は「mystructure:house」と命名してみました。

エクスポートされた.mcstructureファイルを、先ほど作成したstructuresフォルダ直下に保存しましょう。これによって自動生成する建造物の定義が完了します。
featuresの定義
これは、「何を」生成するかを定義するファイルです。先ほどと同様に、ビヘイビアパックのフォルダ内に「features」というフォルダを作成し、さらに適当な名前の.jsonファイルを作成しましょう。
{
"format_version": "1.13.0",
"minecraft:structure_template_feature": {
"description": {
"identifier": "test:house"
},
"structure_name": "mystructure:house",
"adjustment_radius": 8,
"facing_direction": "random",
"constraints": {
"grounded": {},
"block_intersection": {
"block_whitelist": [
"minecraft:air"
]
}
}
}
}
これをベースに作成していきます。まずidentifierは、このfeatures固有のIDであり、“名前空間:名前”の形式に従う必要があります。例えば”test:house”などですね。これは何でもいいです(ただし、後で使います)。
続いて、structure_nameも設定しましょう。これは、どのような構造体を生成するかを決定するものであり、先ほどストラクチャーブロックで決めた建造物の名前をそのまま入れます。今回は”mystructure:house”でした。
最後に必要になる設定が、”block_whitelist”です。これは、「どのようなブロックを置き換えて自動生成するか」を設定する項目であり、list形式で指定することとなっています。
"block_whitelist":[
"minecraft:air","minecraft:dirt","minecraft:stone"
]
のように、ご自由に設定しましょう。
feature_rulesの定義
先ほどfeaturesを定義しましたが、最後に、「どこに」「どれくらいの頻度で」このfeaturesを生成するかを決定していきます。同様に、ビヘイビアパックのフォルダ内に「feature_rules」というフォルダを作成し、任意の名前のjsonファイルを作成しましょう。
{
"format_version": "1.13.0",
"minecraft:scatter_feature": {
"description": {
"identifier": "test:house",
"places_feature": "test:house"
},
"conditions": {
"placement_pass": "first_pass",
"minecraft:biome_filter": [{
"any_of":[
{
"test": "has_biome_tag",
"operator": "==",
"value": "forest"
},
{
"test": "has_biome_tag",
"operator": "==",
"value": "plains"
}
]
}]
},
"distribution": {
"iterations": 1,
"scatter_chance": 50,
"x": {
"extent": [0, 16],
"distribution": "uniform"
},
"y": "query.heightmap(v.worldx, v.worldz)",
"z": {
"extent": [0, 16],
"distribution": "uniform"
}
}
}
}
jsonファイルの例は上で示す通りです。identifierは、先と同様に”(名前空間):(名前)“の形式である必要があります。これは何でもいいですが、featuresのidentifierと同じにしておくことが望ましいです。
続いて、places_featureも設定しましょう。これは、「どのfeatureの頻度・場所を設定するか」という重要な項目です。必ず、先ほど設定したfeaturesのidentifierと同じものを指定しましょう。
- これがないとエラーを吐きます
また、”biome_filter”も設定しましょう。これは、どのバイオームにこの建造物を自動生成するかを設定する項目であり、list形式で指定します。ここでは森と平原のバイオームに生成するよう設定していますね。詳細は公式ドキュメントが詳しいです。
最後に、”scatter_chance”も確認しておきましょう。これは、「どのくらいの頻度で生成するか」を決定する、カスタム建造物においては無くてはならない設定です。ここでは50を設定していますが、実のところ、これは多すぎるくらいです。どのくらい多いかは後で示しますが、確認のために意図的に大きい値を設定しています。
確認
以上で準備は整いました。実際にアドオンを有効化し、ワールドの挙動を確認してみましょう。

このように、多くの自作建造物が自然生成されていることが分かるでしょう。このようにfeatures機能を用いることで、任意の建造物をワールド生成時に自動で生成させることが可能になります。
なお、同様の機能を用いることで自作の鉱石の生成も可能になります。この話はまた次回…。
