どんなfeature?
沼地や川底などに画像のように、粘土などが円形に広がっているのが見つかることがあります。これがdiskというtypeのfeatureです。
このfeatureは指定された場所のブロックを条件に応じて円形に置換して生成されます。
バニラでは主に水中で見つかりますが、このfeature自体は水中である必要はなく、バニラでも氷樹バイオームのように、地上で見つかることもあります。
JSONの書き方
JSONの構造は以下のようになっています。
{
"target": Block predicate,
"state_provider": {
"fallback": Blockstates provider,
"rules": [
{
"if_true": Block predicate,
"then": Block state provider,
...
]
},
"radius": 整数/Int provider,
"half_height": 整数/Int Provider
}
これは、指定した範囲(radius
、half_height
)を特定条件下でブロックに置換する、というものになっています。
置換範囲
radius
とhalf_height
で指定することができます。
radius
は、円の半径で、横方向の置換範囲になります。生成地点を起点に、ここに指定した数値×2分、横方向に加算されます。0から8までの値がとれます。
half_height
はfeatureの厚さで、上下方向の置換範囲になります。生成地点を起点に、ここに指定した数値×2分、上下に加算されます。0から4までの値がとれます。
置換のしくみ
target
とrules
、fallback
で行います。
まず、target
で置換する場所の条件を指定します。
この中からrules
のif_true
に合うものを上から照合し、置換されます。
ここに無かったもの、いわば「余り」の条件が全てfallback
として返ってくるわけです。

条件および置換先の指定の仕方
Block predicateを用いて指定します。
Block predicateとBlock state providerについてはこちらをご覧ください。
確実にブロック置換するためには
さて、実際にやってみると結構fallbackが暴発しちゃったりして思わぬ場所が置換されてしまったりしがちです。
普通にfeatureとして使う場合はこれでもいいのですが、後述の応用のように特定のブロックだけ置換したい場合や、ストラクチャー内でブロックを補正する場合には確実に置換したいものです。
これを防ぐにはどうしたらいいでしょうか?
その答えとして、
target
の時点で条件を絞り込みましょう。
そして、その中からrules
を指定します。
こうすれば、「余り」にあたる部分がなくなり、fallbackが適用されなくなります。
言い換えたら、targetとrulesをほぼ一緒にする、という感じです。
応用:条件分岐でブロックを置換する
これを含めた「置換系」のfeatureはsimple_block
等の「設置系」のfeatureとは違い、指定したブロックが置けないような状態(全部false
のヒカリゴケなど)でもお構いなく置け、ブロックアップデートを起こしません(「設置系」はブロックアップデートを起こすし、置けないものは置けません)。
更に、「どういうブロックをどのブロックに置換するか」の部分が配列になっており、上から順次試行していく、という流れになっています。
そのため、本来置けないブロックを強制的に設置できるほか、以下のようにブロックに応じて置換先を切り替えることができます。