ルートテーブル(英:Loot Table)とは、ゲーム内の様々な場面においてどのようにアイテムを生成するかを決定している技術的なJSONファイルである。具体的には、自然生成された収納ブロックの中身、Mobからのドロップアイテム、釣りで得られるアイテムなどの場面で使用されている。なお、ルートテーブルはMobからドロップする経験値や、アイテム以外のドロップするエンティティ(虫食いブロックからのシルバーフィッシュや分裂したスライムなど)には関与しない。
定義方法[]
カスタムデータパックでは、自然生成される収納ブロックの中身やMobのドロップアイテムを変更する目的でルートテーブルを使用することができる。但し、岩盤やネザーポータルなどサバイバルでは破壊できないブロックはルートテーブルを持たないこと、また看板と壁にかけられた看板など一部のブロックはルートテーブルを共有していること、および特定のドロップアイテム(帯電クリーパーに巻き込まれたMobの頭のドロップ、ウィザーのネザースターなど)はルートテーブルを使用していないこと[1] に注意が必要である。
ルートテーブルは、データパックの次の位置に配置することで機能する。
- (データパック名)
- data
- (名前空間名)
- loot_tables
- (ルートテーブル名).jsonおよびルートテーブルの下位フォルダ
- loot_tables
- (名前空間名)
- data
バニラのMinecraftで使用されるルートテーブルは5つの下位グループに分類される。その4グループとは、
archeology
- 怪しげなブロックに埋まっているアイテムblocks
- ブロック破壊時のドロップアイテムchests
- 構造物などのチェストの戦利品entities
- エンティティのドロップ品gameplay
- 釣り、猫の贈り物、ピグリンの物々交換など
である。例えばzombie.json
はdata pack name/data/minecraft/loot_tables/entities
に配置し、これを編集したデータパックを使用することで通常のドロップ品ではなくここで設定したアイテムをゾンビにドロップさせることができる。
呼び出し方[]
ルートテーブルを召喚する際は、ルートテーブルを使用するエンティティおよびブロックエンティティのNBTタグに 使用するルートテーブルと 使用するシード値を設定する必要がある。同じルートテーブルとシード値を使用した場合、必ず同じアイテムが生成される。なおルートテーブルはどのスロットにアイテムを配置するかまでは決定しておらず、これはシード値によってランダムに決定される。
実際のNBTタグの記述方法は次の通り。
樽、チェスト、トラップチェスト、ホッパー、チェスト付きのトロッコ、チェスト付きのボート、ホッパー付きのトロッコ、ディスペンサー、ドロッパー、シュルカーボックス、怪しげな砂、怪しげな砂利、飾り壺の場合:
- 上位のオブジェクト。
- LootTable: 収納ブロックが何らかの操作(開く、および破壊・ホッパーでのアイテムの移動など)を受けた時に中身のアイテムを生成するために使用するルートテーブル。ラージチェストに関しては、このタグが付いている方のチェストに該当するスロットのみが影響する。サブフォルダの中のルートテーブルを使用する場合は、サブフォルダ名から書き始める必要がある。
- LootTableSeed: ルートテーブルが使用するシード値。指定しない場合及び0を指定した場合は、ランダムなシード値を使用する。
これらのタグは、アイテムが生成されるとともに即座に削除される。
Mobの場合:
- 上位のオブジェクト。
- DeathLootTable: このエンティティが死んだときのドロップアイテムを生成するのに使用するルートテーブル。サブフォルダの中のルートテーブルを使用する場合は、サブフォルダ名から書き始める必要がある。
- DeathLootTableSeed: ルートテーブルが使用するシード値。指定しない場合及び0を指定した場合は、ランダムなシード値を使用する。
Mobおよび収納ブロックのルートテーブルは、/execute store
または/data
を用いて変更することができる。またプレイヤーは、/loot
を用いることでもルートテーブルを召喚することができる。
構造[]
本項では、ルートテーブルの記述方法を解説する。ルートテーブルはJSON形式によって記述され、以下の構造をもつ。
- ルートテーブルの最上位のオブジェクト。
- type: 任意の要素。ルートテーブルを呼び出す状況を指定する。アイテム関数、プレディケート、ナンバープロバイダーは、使用されているパラメータにこのルート状況が対応しているかどうかを検証したうえで使用され、対応していない状況パラメータが検出された場合には警告メッセージが出力される。有効な値の一覧は後項を参照。
- functions: このルートテーブルによって生成されたすべてのアイテムスタックに使用するアイテム関数のリスト。施したい順序に従ってリスト内に指定する。使用範囲を限定したい場合はここではなく、プールや項目の階層の functionsを用いる。
- それぞれのアイテム関数。このオブジェクトのJSON構造は、アイテム修飾子のページを参照されたい。
- pools: このルートテーブル内のすべてのプールのリスト。それぞれのプールはアイテムのスタックをその試行回数だけ生成する。プールは記述されている順番通りに使用される。
- それぞれのプール。この部分のJSON構造は、次項を参照。
- random_sequence:このルートテーブルがアイテムの生成に使用するランダム配列。これとシード値の組み合わせによりアイテム配列が生成される。同じパラメータと同じシード値を用いた場合は、同じアイテム配列が生成される。任意の要素であり、配列のIDが与えらなかった場合は、非決定的なランダム配列を使用する。
プール[]
- 最上位のオブジェクト
- conditions: このプールが使用されるために通過が必要なプレディケートのリスト。
- それぞれのプレディケート。この部分のJSON構造は当該記事を参照。
- functions: このプールが生成したアイテムスタックに作用するアイテム関数のリスト。作用させたい順番通りに記述する。
- それぞれのアイテム関数。この部分のJSON構造はアイテム修飾子の記事を参照。
- rolls: このプールの試行回数(抽選回数)を指定する。後述するナンバープロバイダーで指定する。
- bonus_rolls: 属性値「運」(
minecraft:generic.luck
)1ポイント当たりの追加の生成試行回数を指定する。乗算の後四捨五入される。ナンバープロバイダーで指定する。デフォルトでは0.0。 - entries: ルートテーブルの「中身」にあたる、「設定項目」。1回の試行で、この中のどれか1つがランダムに抽選される。後述する weightで抽選を偏らせることができるが、この処理は個々のオブジェクトに対して行われる。
- それぞれのエントリプロバイダー。そのJSON構造は次項を参照のこと。
- conditions: このプールが使用されるために通過が必要なプレディケートのリスト。
エントリプロバイダー[]
entriesに記述する項目で、次のJSON構造によって記述される。
有効な typeの値によって、それ以降の項目が以下のように変化する。
- item - 1スロット分のアイテムをルート項目に追加する。
- functions: アイテムのスロットに作用させるアイテム関数のリスト。
- それぞれのアイテム関数。この部分のJSON構造は、アイテム修飾子を参照のこと。
- weight: エントリが、どの程度の確率でプールから選出されるかを決定する比重。選ばれる確率は、
この項目の比重/プール内に生成されるすべての項目の比重
となる。 - quality: ルート状況によって与えられたエンティティの属性値「運」(
minecraft:generic.luck
)に準じて、この項目の weightの値を補正する。属性値を参照するエンティティはルート状況の種類によって異なり、entity
の場合はkiller_entity
のエンティティを、それ以外のルート状況の種類においてはthis
のエンティティの属性値が参照される。補正公式は、floor(weight + (quality × generic.luck))
である。 - name:
minecraft:diamond
など、生成するアイテムの名前空間IDを指定する。アイテム関数によって編集を受けていない場合、ここで指定したアイテムが1つ、生成される。
- functions: アイテムのスロットに作用させるアイテム関数のリスト。
- tag - 特定のアイテムタグに含まれる一つ一つのアイテムをそれぞれすべてプール内の項目に追加するか、またはタグに含まれるすべてのアイテムの中から一つアイテムを選出する項目を一つだけプールに追加する。
- functions: アイテムのスロットに作用させるアイテム関数のリスト。
- それぞれのアイテム関数。この部分のJSON構造は、アイテム修飾子を参照のこと。
- weight: 生成されたそれぞれの項目が、どの程度の確率でプールから選出されるかを決定する比重。選ばれる確率は、
この項目の比重/プール内に生成されるすべての項目の比重
となる。 - quality: ルート状況によって与えられたエンティティの属性値「運」(
minecraft:generic.luck
)に準じて、この項目の weightの値を補正する。属性値を参照するエンティティはルート状況の種類によって異なり、entity
の場合はkiller_entity
のエンティティを、それ以外のルート状況の種類においてはthis
のエンティティの属性値が参照される。補正公式は、floor(weight + (quality × generic.luck))
である。 - name: 参照するアイテムタグの名前空間ID(例:
minecraft:arrows
) - expand:
true
の場合はタグ内のすべてのアイテムについて一つずつ、指定された比重と比重補正値で項目を生成する。false
の場合はタグ内のすべてのアイテムを生成しうる項目を一つだけ生成する。アイテム関数によって編集を受けていない場合、アイテムは1つ生成される。
- functions: アイテムのスロットに作用させるアイテム関数のリスト。
- loot_table - プールの項目として、別のルートテーブルを与える。
- functions: アイテムのスロットに作用させるアイテム関数のリスト。
- それぞれのアイテム関数。この部分のJSON構造は、アイテム修飾子を参照のこと。
- weight: 生成されたそれぞれの項目が、どの程度の確率でプールから選出されるかを決定する比重。選ばれる確率は、
この項目の比重/プール内に生成されるすべての項目の比重
となる。 - quality: ルート状況によって与えられたエンティティの属性値「運」(
minecraft:generic.luck
)に準じて、この項目の weightの値を補正する。属性値を参照するエンティティはルート状況の種類によって異なり、entity
の場合はkiller_entity
のエンティティを、それ以外のルート状況の種類においてはthis
のエンティティの属性値が参照される。補正公式は、floor(weight + (quality × generic.luck))
である。 - name: 使用するルートテーブルの名前空間ID(例:
minecraft:gameplay/fishing/junk
)。
- functions: アイテムのスロットに作用させるアイテム関数のリスト。
- dynamic - チェストを破壊した際など、それぞれのブロック特有のドロップアイテムを生成する項目を生成する。
- functions: アイテムのスロットに作用させるアイテム関数のリスト。
- それぞれのアイテム関数。この部分のJSON構造は、アイテム修飾子を参照のこと。
- weight: 生成されたそれぞれの項目が、どの程度の確率でプールから選出されるかを決定する比重。選ばれる確率は、
この項目の比重/プール内に生成されるすべての項目の比重
となる。 - quality: ルート状況によって与えられたエンティティの属性値「運」(
minecraft:generic.luck
)に準じて、この項目の weightの値を補正する。属性値を参照するエンティティはルート状況の種類によって異なり、entity
の場合はkiller_entity
のエンティティを、それ以外のルート状況の種類においてはthis
のエンティティの属性値が参照される。補正公式は、floor(weight + (quality × generic.luck))
である。 - name:
contents
に指定すると、ブロックエンティティの中身のアイテムが生成される。
- functions: アイテムのスロットに作用させるアイテム関数のリスト。
- empty - 選択された際に何もアイテムを生成しない項目を作成するための項目。
- functions: アイテムのスロットに作用させるアイテム関数のリスト。
- それぞれのアイテム関数。この部分のJSON構造は、アイテム修飾子を参照のこと。
- weight: 生成されたそれぞれの項目が、どの程度の確率でプールから選出されるかを決定する比重。選ばれる確率は、
この項目の比重/プール内に生成されるすべての項目の比重
となる。 - quality: ルート状況によって与えられたエンティティの属性値「運」(
minecraft:generic.luck
)に準じて、この項目の weightの値を補正する。属性値を参照するエンティティはルート状況の種類によって異なり、entity
の場合はkiller_entity
のエンティティを、それ以外のルート状況の種類においてはthis
のエンティティの属性値が参照される。補正公式は、floor(weight + (quality × generic.luck))
である。
- functions: アイテムのスロットに作用させるアイテム関数のリスト。
- group - グループ化する。1個の条件を複数のエントリに適用したい場合などに便利。
- children: エントリプロバイダーのリスト。
- それぞれの項目。
- children: エントリプロバイダーのリスト。
- alternatives - リスト内を順番に参照していき、最初に条件を通過したエントリプロバイダーのみを適用する。
- children: エントリプロバイダーのリスト。
- エントリプロバイダー。
- children: エントリプロバイダーのリスト。
- sequence - リスト内を順番に参照していき、条件を通過できないエントリプロバイダーが出現するまですべての項目を適用する。条件を通過出来なくなった時点で試行は終了となる。
- children: 項目のリスト。
- エントリプロバイダー。
- children: 項目のリスト。
ルートテーブルおよびその他のデータパックファイルで繰り返し使用されるJSON構造[]
プレディケート[]
プレディケートは、ルートテーブル内においてはドロップの発生、アイテムの生成、プールの使用、関数の使用に条件を設定するために使用される。
プレディケートはルートテーブル内に直接組み込んで記述する以外にも個別のJSONファイルとして定義することができ、この場合にはルートテーブル以外にも様々な場面で使用することができる。
プレディケートのJSON構造については当該記事を参照のこと。
アイテム関数[]
アイテム関数およびルート関数は、ルートテーブル内においては生成されたアイテムのスタックに個数の変更やエンチャントの追加など様々な変更を施すために使用される。
アイテム関数はルートテーブルに直接記述される以外にも、一つまたは複数のアイテム関数のセットでありアイテム修飾子と呼ばれる個別のファイルで定義することが可能であり、この場合はルートテーブル以外の場面においても/item
を介してインベントリや収納ブロック内のアイテムに変更を加えることができる。
アイテム関数のJSON構造は当該記事を参照のこと。
ナンバープロバイダー[]
ナンバープロバイダーは、ルートテーブルやアイテム関数などの随所で整数や単精度浮動小数点数を指定するのに使用されている。
定数を指定する場合と、オブジェクトで指定する場合がある。
- 定数型
- : 使用する定数。
- 範囲型
- : ナンバープロバイダーの最上位のタグ。
- type: ナンバープロバイダーの形式。この値に従って、ナンバープロバイダーは対応する追加のプロパティと機能を持つ。
typeの取り得る値と対応する追加のプロパティは次の通り。
- constant - 定数を生成する。
- value: 指定したい値。
- uniform - 指定した数値間の範囲(閉区間)から、均一な確率で数値を生成する。
- min: 最小値を生成するナンバープロバイダー。
- max: 最大値を生成するナンバープロバイダー。
- binomial - 指定したnとpに拠る二項分布に従った確率で数値を生成する。
- n: ナンバープロバイダー。二項分布の試行回数の値。
- p: ナンバープロバイダー。二項分布の確率の値。
- score - 数値をスコアボードの値から取得する。
- target: スコアボードの値の参照先となるエンティティやプレイヤーを指定するコンパウンド。
- score: 値を取得するスコアボードのオブジェクト。
- scale: 任意の要素。スコアボードの値を何倍にしてルートテーブル内で使用するかを決定する倍率。
ルート状況[]
ルート状況(英:Loot context)とは、ルートテーブルが召喚された状況に対応したさまざまなパラメータをプレディケート、ルート関数、ナンバープロバイダーに与えるための仕組みである。ルート状況はフィールド typeを用いて指定する。
データパックの読み込み時には、ルートテーブル内で使用されている状況パラメータが指定されているルート状況に対応しているかどうかを検証することができ、ゲーム内で実際にルートテーブルを使用する前にエラーを検出することができる。状況パラメータの中には、そのルート状況において必ず値を提供するものと場合によって提供しないものがあり、ルートテーブルが召喚された際にはルートテーブルが今回提供されていない状況パラメータが使用されていないか改めて確認される。
有効なルート状況の値とその用途、対応している状況パラメータは下表の通り。
ルート状況の値 | 用途 | 必ず提供される状況パラメータ | 場合によって提供される状況パラメータ |
---|---|---|---|
empty |
|
なし | なし |
chest |
|
|
|
command |
|
| |
selector |
|
|
|
fishing |
|
| |
entity |
|
|
|
archaeology |
|
|
|
gift |
|
|
|
barter |
|
||
advancement_reward |
|
|
|
advancement_entity |
| ||
advancement_location |
|
| |
generic |
|
なし | なし |
block |
|
|
|
歴史[]
Java Edition | |||||
---|---|---|---|---|---|
1.9 | 2015年10月19日 | Dinnerbone がルートテーブルについて発表した。 | |||
15w43a | ルートテーブルが追加された。 | ||||
15w43b | entity_scores の条件が追加された。 | ||||
15w43c | 「villager_golem.json」が「iron_golem.json」に改名された。 | ||||
釣り、羊毛をドロップしないヒツジ、ゾンビおよびスケルトンホースのルートテーブルが追加された。 | |||||
item: タグが name: に、 items: タグが entries: に改名された。 | |||||
type: タグとアイテムの代わりにルートテーブルを読み込むサポートが追加された。 | |||||
luck: タグのデフォルトファイルとして追加された。当時は特に機能を持たなかった。 | |||||
set_damage の関数が追加された。 | |||||
15w44a | enchant_randomly と set_attributes の関数が追加された。 | ||||
15w44b | quality タグが追加された。 | ||||
luck と luck_multiplier タグが削除された。 | |||||
bonus_rolls タグが追加された。 | |||||
15w51a | スペクテイターモードのプレイヤーが収納ブロックの中身を閲覧しようとした際に、ルートテーブルによって中身が生成されなくなった。 | ||||
1.9.1 | 1.9.1-pre1 | ディスペンサーとドロッパーで使用可能になった。 | |||
デフォルトのルートテーブルchests/jungle_temple_dispenser が追加された。 | |||||
1.11 | 16w32a | ロバ、ラバ、ハスク、村人ゾンビは、ウマやゾンビで使用されるルートテーブルではなく、それぞれ個別のルートテーブルを持つようになった。 | |||
16w43a | 村人、ヴェックス、エンダードラゴンが自身のルートテーブルを持つようになった。 | ||||
1.13 | 17w43a | カスタマイズしたルートテーブルの格納場所が、データパック内に移動した。 | |||
1.14 | 18w43a | 破壊したブロックからのドロップに、ルートテーブルが使用されるようになった。 | |||
ルートテーブルに様々な設定項目が追加された。 | |||||
チェスト及びブロックのルートテーブルにおいて、エンティティを指定するところでルート状況パラメータthis を使用すると、プレイヤーを指定できるようになった。 | |||||
18w44a | ネコの贈り物用のルートテーブルcat_morning_gift と、プレイヤーおよびウィザーのルートテーブルが追加された。
| ||||
新しいブロック用のルートテーブルが追加された。 | |||||
アイテム関数set_lore が追加された。 | |||||
18w46a | イリュージョナーのルートテーブルが追加された。 | ||||
18w48a | 村のチェスト用の様々なルートテーブルが追加されたが、一部は当時は使用されていなかった。 | ||||
ルートテーブルvillage_blacksmith が削除された。 | |||||
18w49a | village_savanna_house およびvillage_snowy_house が実際に使用されるようになった。
| ||||
村のチェスト用の追加のルートテーブルが追加された。 | |||||
18w50a | village_desert_house village_taiga_house が使用されるようになった。これにより、未使用だったルートテーブルがすべて実装された。 | ||||
? | 空のルートテーブルがハードコード化された。 | ||||
1.15 | 19w34a | アイテム関数copy_state が追加された。 | |||
1.16 | 20w12a | 釣り竿の浮きのプロパティを確認するため、サブプレディケート fishing_hook が追加された。 | |||
1.20 | Pre-release 1 | ルートテーブルからアイテムを生成する際に、名前付きの乱数列を使用するようになった。 | |||
各ランダム配列は、ワールドのシード値と配列IDに従って特有のアイテムの配列を生成する。これにより、同じワールド・同じパラメータでルートテーブルを機能させた場合には同じ結果が帰って来る。 | |||||
ルートテーブルが使用する乱数列のIDを指定する新しいフィールドrandom_sequence が追加された。 | |||||
Pre-release 6 | ランダム配列のID( random_sequences)の指定が任意になった。配列のIDが与えらなかった場合は、非決定的な乱数列を使用する。 | ||||
1.20.2 | 23w32a | アイテム関数を使用する際に、ルートテーブル上からでもJSON配列形式を使用することで複数のルート関数をアイテム関数sequence と同様の振る舞いで実行することができるようになった。
| |||
プレディケートを使用する際に、ルートテーブル上からでもJSON配列形式を使用することで条件の種類all_of と同様の振る舞いで実行することができるようになった。 |
問題点[]
「ルートテーブル」に関する問題点は、バグトラッカーにて管理されている。問題点の報告はそちらで行ってほしい。
脚注[]
要素 |
| ||
---|---|---|---|
データパック |
| ||
チュートリアル |