とかさんのブログ

Minecraftについていろいろ投稿していきます。 主にBedrockEdition(BE, 旧Poket Edition, PE)のアドオン解説記事を投稿しています。アドオン製作最後の砦

Feature Rules・Forced Featuresを攻略する【Minecraft】

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です。

ワールドを開いて見ると...

2020-09-09 (4)

画像ではわかりやすいようにチャンクの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が追加されています。

こんな感じになります。

2020-09-10

ちゃんと森と川には構造物が生成されていませんね~

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

これを確認してみるとこんな感じ

2020-09-10 (3)

球体のようになっているもの、そして鉱石がちゃんと確認できます

そして地形+10のところにsingleblockのfeatureがちゃんとあります。

2020-09-09 (3)

定義済みMolang式と変数

feature_rulesで使えるクエリ関数と変数です。解説中でMolangをサポートするコンポーネント内で使用することができます。

クエリ関数

引数に応じて値を返すクエリ関数です。

query.heightmap(value_1, value_2)

value_1をx座標、value_2をz座標としたときの地表もしくは水面の高さ+1を返します。
下記のvariable.worldxvariable.worldzと併用して基本的に使用します。

query.above_top_solid(value_1, value_2)

value_1をx座標、value_2をz座標としたときの最も高い場所にある固体ブロックの高さ+1を返します。
下記のvariable.worldxvariable.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.worldxvariable.worldyvariable.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ならばbirchforestもタグとして使用できる)
各バイオーム名は公式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軸の場合015までの整数を指定する。(16以上の整数を指定することも可能だが意図した挙動にはならない)
座標を一定の分布法則に則って決定する場合、以下のパラメータを使用する。
"distribution": (String)
座標の分布方法を設定します。分布法則を使用する際必須
使用できる値は以下のとおり
説明
uniform 範囲内で座標を一様に分布させます。
gaussian 範囲内で正規分布に則って座標を決定させます。(範囲の中央付近に寄る)
inverse_gaussian 範囲内で逆正規分布に則って座標を決定させます。(gaussianの逆)
fixed_grid 範囲内で一定のステップごとに座標を決定します。
jittered_grid 範囲内でランダムなステップごとに座標を決定します。
"step_size": (Integer)
gridのステップを設定します。
1以上の整数を指定できます。
"distribution"fixed_gridjittered_gridを設定している場合に使用します。
"grid_offset": (Integer)
gridのオフセット(始点)を設定します。
オフセットは分布範囲内で折り返します。
0以上の整数を指定できます。
"distribution"fixed_gridjittered_gridを設定している場合に使用します。
"extent": (List Float/List Molang)
分布範囲を設定します。分布法則を使用する際必須
チャンクごとの範囲の上限値と下限値を設定します。上限値と下限値は相対座標です。x軸の場合015までの整数を指定する。(16以上の整数を指定することも可能だが意図した挙動にはならない)

"y": (Object/Float/Molang)

featureをトリガするy座標を設定します。必須
座標はチャンクごとの相対座標を指定する。y軸の場合0255までの整数を指定する。
座標を一定の分布法則に則って決定する場合、以下のパラメータを使用する。
"distribution": (String)
座標の分布方法を設定します。分布法則を使用する際必須
使用できる値は以下のとおり
説明
uniform 範囲内で座標を一様に分布させます。
gaussian 範囲内で正規分布に則って座標を決定させます。(範囲の中央付近に寄る)
inverse_gaussian 範囲内で逆正規分布に則って座標を決定させます。(gaussianの逆)
fixed_grid 範囲内で一定のステップごとに座標を決定します。
jittered_grid 範囲内でランダムなステップごとに座標を決定します。
"step_size": (Integer)
gridのステップを設定します。
1以上の整数を指定できます。
"distribution"fixed_gridjittered_gridを設定している場合に使用します。
"grid_offset": (Integer)
gridのオフセット(始点)を設定します。
オフセットは分布範囲内で折り返します。
0以上の整数を指定できます。
"distribution"fixed_gridjittered_gridを設定している場合に使用します。
"extent": (List Float/List Molang)
分布範囲を設定します。分布法則を使用する際必須
チャンクごとの範囲の上限値と下限値を設定します。上限値と下限値は相対座標です。y軸の場合0255までの整数を指定する。

"z": (Object/Float/Molang)

featureをトリガするz座標を設定します。必須
座標はチャンクごとの相対座標を指定する。z軸の場合015までの整数を指定する。(16以上の整数を指定することも可能だが意図した挙動にはならない)
座標を一定の分布法則に則って決定する場合、以下のパラメータを使用する。
"distribution": (String)
座標の分布方法を設定します。分布法則を使用する際必須
使用できる値は以下のとおり
説明
uniform 範囲内で座標を一様に分布させます。
gaussian 範囲内で正規分布に則って座標を決定させます。(範囲の中央付近に寄る)
inverse_gaussian 範囲内で逆正規分布に則って座標を決定させます。(gaussianの逆)
fixed_grid 範囲内で一定のステップごとに座標を決定します。
jittered_grid 範囲内でランダムなステップごとに座標を決定します。
"step_size": (Integer)
gridのステップを設定します。
1以上の整数を指定できます。
"distribution"fixed_gridjittered_gridを設定している場合に使用します。
"grid_offset": (Integer)
gridのオフセット(始点)を設定します。
オフセットは分布範囲内で折り返します。
0以上の整数を指定できます。
"distribution"fixed_gridjittered_gridを設定している場合に使用します。
"extent": (List Float/List Molang)
分布範囲を設定します。分布法則を使用する際必須
チャンクごとの範囲の上限値と下限値を設定します。上限値と下限値は相対座標です。z軸の場合015までの整数を指定する。(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の形式で書く。

featureはfeature_rulesがないと動きませんからね。重要です。

フィーチャー機能全体はほかのどの機能より内容がたくさんあります。

それではまた~

質問や修正箇所がありましたらTwitterまでお願いします。

img

変更履歴
更新
ID名の規則について明記しました
コメント一覧を開く

 コメント一覧 (2)

    • 1. セケメケ
    • 2020年10月27日 23:46
    • 名前空間ってmanifest.jsonで決めたやつでいいんですか?
    • 0
      とかさん

      とかさん

      likedしました

      liked
      • 2.  とかさん とかさん
      • 2020年10月28日 01:04
      • >>1
        基本的にパック名で構いませんが、あまりにも長すぎたりする場合には適宜変えてください。
        最悪ほかのパックと被らなければ関係ない物でも構いません
      • 0
        とかさん

        とかさん

        likedしました

        liked
コメントフォーム
記事の評価
  • リセット
  • リセット

質問はdiscordの利用を推奨します。