featureの設置条件を決めるために用意されたのがこのfeature_rulesとforced_featuresです。
こいつがないとfeatureが使えません。(キッパリ)。めちゃくちゃ重要です。
この二つ名前こそ違いますが、機能としては瓜二つですので一緒に解説してしまいますね。
解説内の表記について
解説内で出てくる丸括弧はデータを表しています。つまり各々で変える部分。例は下記の通り
(String)
⇒"abcdef"
,"Hello World"
(Integer)
⇒123456
,1024
(Float)
⇒0.625
,10000000000.0
(Value)
⇒0.625
,10000000000.0
(Bool)
⇒true
,false
(Object)
⇒{"data": (Integer), ... , "data_256": (String)}
(Molang)
⇒"variable.size = math.sin((query.ground_speed/30)*360);"
(*****+)
とは通常の(Integer)
,(Value)
などの使い方に加え、設定した範囲内でランダムな値も使えるということです。{"min": (Integer),"max": (Integer)}
のようにすると、ランダムな値を設定できます。
(List ****)
はそれぞれの配列型を示します。例:["egg","chicken"]
(***/***)
は複数の型に対応してます。
Molangについて
MolangとはMinecraft内で使うことができるスクリプト言語(のようなもの)です。
エンティティデータの読み出しや、単純な数学演算ができるようになります
記述方法は(String)
と同じくダブルクォーテーションを用います。
いくつかの例
"math.abs(math.sin(variable.vertical));"
"query.is_eating ? variable.test = math.random(1, 10) : variable.test = 0;"
"variable.age_progress=variable.emitter_age/variable.emitter_lifetime;variable.active_time = 10;"
feature_rulesとは
feature_rulesはfeatureとセットで使用する、とある設置物を置くための条件を決定します。
featuresの解説記事はこちら↓
featuresの解説記事ではかなり大雑把な説明だったので、具体的にfeature_rulesは(featuresの設置できる)バイオーム、設置するタイミング、設置できる大まかな範囲等を設定し、条件に合致した座標で指定したfeatureを発生(トリガ)させます。
ちなみに設置条件があるfeatureではfeature_rulesトリガされても設置されない場合があります。
実はfeatureにも同じようなもの(Search feature,Scatter feature)がありますが、あれはfeature_rulesの簡易劣化版にあたるものなのでできることは少ないです。
forced_featuresについて
forced_featuresは機能としてはほぼfeature_rulesと同じです。異なる点としては条件にバイオームが使用できないこと、複数のルールが設定可能になっていることがあります。
条件にバイオームが使用できないのはforced_featuresがカスタムバイオーム内で使用するコンポーネントだからですね。(当たり前)
あと、書式も若干異なります。
カスタムバイオームの記事はこちら↓
feature_rulesのサンプル
まあまあ詰め込んだ感じのサンプルを作ってみました。
下記の解説にある各座標軸の設定がとれる物をいろいろ詰め込んでいます。
ファイル構造はこんな感じ
-
feature_rules
- testfeaturerule_singleblock.json
-
features
- testfeature_singleblock.json
- manifest.json
- pack_icon.png
使っているフィーチャはSingle block featureです。
ワールドを開いて見ると...
画像ではわかりやすいようにチャンクのx=0,y=0のところに別のフィーチャールールでエメラルドブロックを置いています。
見事な波模様(正弦波形)が出ていますね。x軸に設定しているMolang式がこの模様を作っています。
feature_rulesのサンプルその2
構造物を生成するfeature_rulesのサンプルですね。
バイオームフィルタをもりもりにしています。
オーバーワールドで森と海と川以外に生成されるようになっています。
ファイル構造はこんな感じ↓
-
feature_rules
- testfeaturerule_structure.json
-
features
- testfeature_structure.json
-
structures
- teststructure.mcstructure
- manifest.json
- pack_icon.png
使っているフィーチャはStructure template featureですね。
サンプル1と比べるとstructuresが追加されています。
こんな感じになります。
ちゃんと森と川には構造物が生成されていませんね~
forced_featuresのサンプル
カスタムバイオーム内で使用するので全文を載せておきます。
forced_featuresは55行~116行の部分ですね
3つのフィーチャールールが設定されています。
singleblockのfeatureを球体(のようなもの)をy=120当たりに生成するものと、チャンク全体に鉱石をばら撒く物、そして生成された地形+10のところにsingleblockのfeatureを覆うようにするものが含まれています。
ファイル構造はこんな感じ
-
biomes
- testbiomes.json
-
features
- testfeature_ore.json
- testfeature_singleblock.json
- testfeature_singleblock_2.json
- manifest.json
- pack_icon.png
これを確認してみるとこんな感じ
球体のようになっているもの、そして鉱石がちゃんと確認できます
そして地形+10のところにsingleblockのfeatureがちゃんとあります。
定義済みMolang式と変数
feature_rulesで使えるクエリ関数と変数です。解説中でMolangをサポートするコンポーネント内で使用することができます。
クエリ関数
引数に応じて値を返すクエリ関数です。
-
query.heightmap(value_1, value_2)
- value_1をx座標、value_2をz座標としたときの地表もしくは水面の高さ+1を返します。
- 下記の
variable.worldx
とvariable.worldz
と併用して基本的に使用します。 -
query.above_top_solid(value_1, value_2)
- value_1をx座標、value_2をz座標としたときの最も高い場所にある固体ブロックの高さ+1を返します。
- 下記の
variable.worldx
とvariable.worldz
と併用して基本的に使用します。 -
query.noise(value_1, value_2)
- value_1, value_2を用いてノイズを発生させます。
変数
利用可能な変数です。
変数 | 詳細 |
---|---|
variable.is_legacy |
ワールドタイプがoldかどうかを返す。old→true ,infinite→false |
variable.worldx |
現在のx座標 |
variable.worldy |
現在のy座標 |
variable.worldz |
現在のz座標 |
variable.originx |
現在チャンクの原点のx座標 |
variable.originy |
現在チャンクの原点のy座標 |
variable.originz |
現在チャンクの原点のz座標 |
variable.worldx
、variable.worldy
、variable.worldz
は"coordinate_eval_order"のタイミングによって値が入っていない(未定義の変数でエラーになる)場合があるので注意してください。
feature_rulesのコンポーネント解説
feature_rulesの各コンポーネントの解説をしていきます。forced_featuresと共通のコンポーネントもあります。
-
"format_version": (String)
- このfeature_rulesが作成されたバージョン。必須
"1.13.0"
が最低バージョン-
"description": (Object)
- このfeature_rulesのID等の設定。必須
-
-
"identifier": (String)
- このfeature_rulesのID。必須
名前空間:ID
の形式で書く。名前空間はアドオン(パック)の名前。- IDは小文字(a-z)で指定する必要があります。
/placefeature
に登録されません(1.18.20~) - IDとファイル名は一緒でなければダメ。
-
"places_feature": (String)
- このfeature_rulesで発生(トリガ)させるfeatureのID。必須
名前空間:ID
の形式で書く。
-
-
"conditions": (Object)
- 発生(トリガ)するための条件や優先度の設定。必須
-
-
"placement_pass": (String)
- feature_rulesの設置タイミングの設定。必須
- 複数のfeature_rulesがある場合に設置順序に前後関係を付けられるようにするためのもの。パス(pass)と呼ばれる。
- バニラの要素もfeature_rulesを使用しているものがあるので必須の要素になる。
- 各パス内での順序は保障されないので注意。
- 使用できるパスの値は以下のとおり。設置順序の値が大きいほど後に設置される。
-
値 設置順序 first_pass
1 before_underground_pass
2 underground_pass
3 after_underground_pass
4 before_surface_pass
5 surface_pass
6 after_surface_pass
7 before_sky_pass
8 sky_pass
9 after_sky_pass
10 final_pass
11 - バニラで使用されているfeature_rulesに則っているため、数値ではなくskyやsurfaceといった名称になっている。(例えばダイアモンド鉱石のfeature_rulesはunderground_passになっている)
- バニラではafter_surface_pass以降の値は使われていない。(1.16.100.x)
-
"minecraft:biome_filter": (List object)
- featuresの設置できるバイオーム(の条件、バイオームフィルタ)を設定します。
- バイオームフィルタはエンティティjsonのフィルタと同様の書式を持っているのでパラメータは
"test": (String)
、"value": (String)
、"operator": (String)
、"subject": (String)
の4つのタグから構成される。ただし、テストはhas_biome_tag
しか動作しない(検証僅か)。 - このバイオームフィルタではfeatureがトリガしようとするチャンクのバイオームタグ※とこのテストの値(
"value"
バイオームタグ)を比較する。条件が合致(true,真)したならば、そのチャンクでfeatureをトリガする。 - ※チャンクのバイオームタグというのは厳密にいうとチャンクの相対座標x=15,y=15のバイオームタグ
"test"
はテストするフィルタの種類を記述する。上記でも述べた通りhas_biome_tag
しか動作しないので、値は"has_biome_tag"
固定になる。"operator"
は比較条件(演算子)を設定する。- 基本的な演算子はすべて使えるが、バイオームタグは数値ではないので事実上以下の表にあるものが使える。
-
比較演算子 説明 ==
=
equals
チャンクのバイオームタグとテストの値が同一の場合trueを返す !=
not
チャンクのバイオームタグとテストの値が異なる場合trueを返す "value"
にはバイオームタグを設定する。使えるのは各バイオーム名の他、現状確認がされている物は以下の表のとおり-
値 説明 overworld
オーバーワールド overworld_generation
上記とセットで使用される。詳細は不明 forest_generation
forest
とセットで使用される。詳細は不明monster
モンスターがスポーンするかの設定。古いoceanバイオームとの区別に使用 バイオーム名 各バイオーム名。_(アンダースコア)で繋がっているバイオーム名は前後とも使用できる( birch_forest
ならばbirch
もforest
もタグとして使用できる) - 各バイオーム名は公式Wikiを参照してください。
"subject"
はこのテストの対象を設定する。基本的にこの項目は省略する。例外を除いて値は"self"
を使う。- 各List object(フィルタ)同士はAND演算子で繋がっている。例)サンプル2の条件式は(overworld || overworld_generation)&&(!forest)&&(!(ocean && river))と言い換えることができる。
- 複数のフィルタを結合する
"all_of": (List object)
、"any_of": (List object)
、"none_of": (List object)
も使用可能 -
-
"all_of": (List object)
- すべてテストがtrue(真)だった場合にtrue(真)を返します。AND
-
"any_of": (List object)
- いずれかのテストがtrue(真)だった場合にtrue(真)を返します。OR
-
"none_of": (List object)
- すべてテストでfalse(偽)だった場合にtrue(真)を返します。NAND
-
-
-
"distribution": (Object)
- 各チャンク内でのfeatureの分布に関する設定。必須
-
-
"iterations": (Float/Molang)
- 各チャンク内でfeatureをトリガする数。必須
-
"scatter_chance": (Object/Float/Molang)
- 各チャンクでのトリガする確率。デフォルトでは100%(すべてのチャンクでfeatureをトリガする。)
"iterations"
ごとにトリガすることを決めているわけではないことに注意- 分母分子を指定する方法とMolangで記述する方法がある。
-
-
分母分子を指定する方法
- パラメータとして
"numerator": (Integer)
と"denominator": (Integer)
を使用する。 "numerator"
は分子、"denominator"
は分母を設定する。両方とも1
以上の整数を指定する- サンプル2の場合分子は1、分母は2なので、1/2、50%となる。
-
Molangで記述する方法
- Molang式の結果が0~100までの値する。単位は%
-
-
"coordinate_eval_order": (String)
- 各featureのトリガする座標の評価順序(決定順序)を設定します。
xzy
がデフォルトの値- 評価順序は文字の順になっている。使用できる値は以下のとおり。
-
値 評価順序 xyz
x軸→y軸→z軸 xzy
x軸→z軸→y軸 yxz
y軸→x軸→z軸 yzx
y軸→z軸→x軸 zxy
z軸→x軸→y軸 zyx
z軸→y軸→x軸 -
"x": (Object/Float/Molang)
- featureをトリガするx座標を設定します。必須
- 座標はチャンクごとの相対座標を指定する。x軸の場合
0
~15
までの整数を指定する。(16以上の整数を指定することも可能だが意図した挙動にはならない) - 座標を一定の分布法則に則って決定する場合、以下のパラメータを使用する。
-
-
"distribution": (String)
- 座標の分布方法を設定します。分布法則を使用する際必須
- 使用できる値は以下のとおり
-
値 説明 uniform
範囲内で座標を一様に分布させます。 gaussian
範囲内で正規分布に則って座標を決定させます。(範囲の中央付近に寄る) inverse_gaussian
範囲内で逆正規分布に則って座標を決定させます。(gaussianの逆) fixed_grid
範囲内で一定のステップごとに座標を決定します。 jittered_grid
範囲内でランダムなステップごとに座標を決定します。 -
"step_size": (Integer)
- gridのステップを設定します。
1
以上の整数を指定できます。"distribution"
のfixed_grid
かjittered_grid
を設定している場合に使用します。-
"grid_offset": (Integer)
- gridのオフセット(始点)を設定します。
- オフセットは分布範囲内で折り返します。
0
以上の整数を指定できます。"distribution"
のfixed_grid
かjittered_grid
を設定している場合に使用します。-
"extent": (List Float/List Molang)
- 分布範囲を設定します。分布法則を使用する際必須
- チャンクごとの範囲の上限値と下限値を設定します。上限値と下限値は相対座標です。x軸の場合
0
~15
までの整数を指定する。(16以上の整数を指定することも可能だが意図した挙動にはならない)
-
-
"y": (Object/Float/Molang)
- featureをトリガするy座標を設定します。必須
- 座標はチャンクごとの相対座標を指定する。y軸の場合
0
~255
までの整数を指定する。 - 座標を一定の分布法則に則って決定する場合、以下のパラメータを使用する。
-
-
"distribution": (String)
- 座標の分布方法を設定します。分布法則を使用する際必須
- 使用できる値は以下のとおり
-
値 説明 uniform
範囲内で座標を一様に分布させます。 gaussian
範囲内で正規分布に則って座標を決定させます。(範囲の中央付近に寄る) inverse_gaussian
範囲内で逆正規分布に則って座標を決定させます。(gaussianの逆) fixed_grid
範囲内で一定のステップごとに座標を決定します。 jittered_grid
範囲内でランダムなステップごとに座標を決定します。 -
"step_size": (Integer)
- gridのステップを設定します。
1
以上の整数を指定できます。"distribution"
のfixed_grid
かjittered_grid
を設定している場合に使用します。-
"grid_offset": (Integer)
- gridのオフセット(始点)を設定します。
- オフセットは分布範囲内で折り返します。
0
以上の整数を指定できます。"distribution"
のfixed_grid
かjittered_grid
を設定している場合に使用します。-
"extent": (List Float/List Molang)
- 分布範囲を設定します。分布法則を使用する際必須
- チャンクごとの範囲の上限値と下限値を設定します。上限値と下限値は相対座標です。y軸の場合
0
~255
までの整数を指定する。
-
-
"z": (Object/Float/Molang)
- featureをトリガするz座標を設定します。必須
- 座標はチャンクごとの相対座標を指定する。z軸の場合
0
~15
までの整数を指定する。(16以上の整数を指定することも可能だが意図した挙動にはならない) - 座標を一定の分布法則に則って決定する場合、以下のパラメータを使用する。
-
-
"distribution": (String)
- 座標の分布方法を設定します。分布法則を使用する際必須
- 使用できる値は以下のとおり
-
値 説明 uniform
範囲内で座標を一様に分布させます。 gaussian
範囲内で正規分布に則って座標を決定させます。(範囲の中央付近に寄る) inverse_gaussian
範囲内で逆正規分布に則って座標を決定させます。(gaussianの逆) fixed_grid
範囲内で一定のステップごとに座標を決定します。 jittered_grid
範囲内でランダムなステップごとに座標を決定します。 -
"step_size": (Integer)
- gridのステップを設定します。
1
以上の整数を指定できます。"distribution"
のfixed_grid
かjittered_grid
を設定している場合に使用します。-
"grid_offset": (Integer)
- gridのオフセット(始点)を設定します。
- オフセットは分布範囲内で折り返します。
0
以上の整数を指定できます。"distribution"
のfixed_grid
かjittered_grid
を設定している場合に使用します。-
"extent": (List Float/List Molang)
- 分布範囲を設定します。分布法則を使用する際必須
- チャンクごとの範囲の上限値と下限値を設定します。上限値と下限値は相対座標です。z軸の場合
0
~15
までの整数を指定する。(16以上の整数を指定することも可能だが意図した挙動にはならない)
-
-
forced_featuresのコンポーネント解説
forced_featuresの各コンポーネント解説をします。大部分がforced_featuresと共通なため大部分を省略します。
forced_features自体はカスタムバイオームの"components"
内に設置できるコンポーネントです。
カスタムバイオームの記事はこちら↓
-
"first_pass": (List object)
"before_underground_pass": (List object)
"underground_pass": (List object)
"after_underground_pass": (List object)
"before_surface_pass": (List object)
"surface_pass": (List object)
"after_surface_pass": (List object)
"before_sky_pass": (List object)
"sky_pass": (List object)
"after_sky_pass": (List object)
"final_pass": (List object)
- feature_rulesのコンポーネント解説にある設置タイミング(
"placement_pass"
)と同じもの。複数のフューチャールールを設定可能になっているためこのようになっている - 各Object内のコンポーネントはfeature_rulesのコンポーネント解説の
"distribution"
内のと同様のコンポーネントに加え以下のものが加わる -
-
"identifier": (String)
- このフューチャールールのID。必須
名前空間:ID
の形式で書く。名前空間はアドオン(パック)の名前。- IDは小文字(a-z)で指定する必要があります。(1.18.20~)
- IDとファイル名は一緒でなければダメ。
-
"places_feature": (String)
- このフューチャールールで発生(トリガ)させるfeatureのID。必須
名前空間:ID
の形式で書く。
-
- 更新
- ID名の規則について明記しました