Minecraft Wiki
登録
Advertisement

ルートテーブル(英:Loot Table)とは、ゲーム内の様々な場面においてどのようにアイテムを生成するかを決定している技術的なJSONファイルである。具体的には、自然生成された収納ブロックの中身Mobからのドロップアイテム釣りで得られるアイテムなどの場面で使用されている。なお、ルートテーブルはMobからドロップする経験値や、アイテム以外のドロップするエンティティ(虫食いブロックからのシルバーフィッシュや分裂したスライムなど)には関与しない。

定義方法[]

カスタムデータパックでは、自然生成される収納ブロックの中身やMobのドロップアイテムを変更する目的でルートテーブルを使用することができる。但し、岩盤やネザーポータルなどサバイバルでは破壊できないブロックはルートテーブルを持たないこと、また看板と壁にかけられた看板など一部のブロックはルートテーブルを共有していること、および特定のドロップアイテム(帯電クリーパーに巻き込まれたMobの頭のドロップ、ウィザーのネザースターなど)はルートテーブルを使用していないこと[1] に注意が必要である。

ルートテーブルは、データパックの次の位置に配置することで機能する。

  • (データパック名)
    • data
      • (名前空間名)
        • loot_tables
          • (ルートテーブル名).jsonおよびルートテーブルの下位フォルダ

バニラのMinecraftで使用されるルートテーブルは5つの下位グループに分類される。その4グループとは、

である。例えばzombie.jsondata 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構造は次項を参照のこと。

エントリプロバイダー[]

 entriesに記述する項目で、次のJSON構造によって記述される。

  • エントリプロバイダーの最上位のオブジェクト。
    •  conditions: この項目が、自身の属するプールに項目を生成する為に通過する必要のあるプレディケートのリスト。
      • 個々のプレディケート。この部分のJSON構造はプレディケートのページを参照のこと。
    •  type: entriesのタイプを名前空間IDで指定する。この種類に応じて以降の項目が変化する。

有効な 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つ、生成される。


  • 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つ生成される。


  • 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)。


  • dynamic - チェストを破壊した際など、それぞれのブロック特有のドロップアイテムを生成する項目を生成する。
    •  functions: アイテムのスロットに作用させるアイテム関数のリスト。
      • それぞれのアイテム関数。この部分のJSON構造は、アイテム修飾子を参照のこと。
    •  weight: 生成されたそれぞれの項目が、どの程度の確率でプールから選出されるかを決定する比重。選ばれる確率は、この項目の比重/プール内に生成されるすべての項目の比重となる。
    •  quality: ルート状況によって与えられたエンティティの属性値「」(minecraft:generic.luck)に準じて、この項目の weightの値を補正する。属性値を参照するエンティティはルート状況の種類によって異なり、entityの場合はkiller_entityのエンティティを、それ以外のルート状況の種類においてはthisのエンティティの属性値が参照される。補正公式は、floor(weight + (quality × generic.luck))である。
    •  name: contentsに指定すると、ブロックエンティティの中身のアイテムが生成される。


  • empty - 選択された際に何もアイテムを生成しない項目を作成するための項目。
    •  functions: アイテムのスロットに作用させるアイテム関数のリスト。
      • それぞれのアイテム関数。この部分のJSON構造は、アイテム修飾子を参照のこと。
    •  weight: 生成されたそれぞれの項目が、どの程度の確率でプールから選出されるかを決定する比重。選ばれる確率は、この項目の比重/プール内に生成されるすべての項目の比重となる。
    •  quality: ルート状況によって与えられたエンティティの属性値「」(minecraft:generic.luck)に準じて、この項目の weightの値を補正する。属性値を参照するエンティティはルート状況の種類によって異なり、entityの場合はkiller_entityのエンティティを、それ以外のルート状況の種類においてはthisのエンティティの属性値が参照される。補正公式は、floor(weight + (quality × generic.luck))である。


  • group - グループ化する。1個の条件を複数のエントリに適用したい場合などに便利。
    •  children: エントリプロバイダーのリスト。
      • それぞれの項目。


  • alternatives - リスト内を順番に参照していき、最初に条件を通過したエントリプロバイダーのみを適用する。
    •  children: エントリプロバイダーのリスト。
      • エントリプロバイダー。


  • sequence - リスト内を順番に参照していき、条件を通過できないエントリプロバイダーが出現するまですべての項目を適用する。条件を通過出来なくなった時点で試行は終了となる。
    •  children: 項目のリスト。
      • エントリプロバイダー。

ルートテーブルおよびその他のデータパックファイルで繰り返し使用されるJSON構造[]

プレディケート[]

詳細は「プレディケート」を参照

プレディケートは、ルートテーブル内においてはドロップの発生、アイテムの生成、プールの使用、関数の使用に条件を設定するために使用される。

プレディケートはルートテーブル内に直接組み込んで記述する以外にも個別のJSONファイルとして定義することができ、この場合にはルートテーブル以外にも様々な場面で使用することができる。

プレディケートのJSON構造については当該記事を参照のこと。

アイテム関数[]

詳細は「アイテム修飾子」を参照

アイテム関数およびルート関数は、ルートテーブル内においては生成されたアイテムのスタックに個数の変更やエンチャントの追加など様々な変更を施すために使用される。

アイテム関数はルートテーブルに直接記述される以外にも、一つまたは複数のアイテム関数のセットでありアイテム修飾子と呼ばれる個別のファイルで定義することが可能であり、この場合はルートテーブル以外の場面においても/itemを介してインベントリや収納ブロック内のアイテムに変更を加えることができる。

アイテム関数のJSON構造は当該記事を参照のこと。

ナンバープロバイダー[]

ナンバープロバイダーは、ルートテーブルやアイテム関数などの随所で整数や単精度浮動小数点数を指定するのに使用されている。

定数を指定する場合と、オブジェクトで指定する場合がある。

定数型
  • : 使用する定数。
範囲型
  • : ナンバープロバイダーの最上位のタグ。
    •  type: ナンバープロバイダーの形式。この値に従って、ナンバープロバイダーは対応する追加のプロパティと機能を持つ。

 typeの取り得る値と対応する追加のプロパティは次の通り。

  • constant - 定数を生成する。
    •  value: 指定したい値。


  • uniform - 指定した数値間の範囲(閉区間)から、均一な確率で数値を生成する。
    •  min: 最小値を生成するナンバープロバイダー。
    •  max: 最大値を生成するナンバープロバイダー。


  • binomial - 指定したnとpに拠る二項分布に従った確率で数値を生成する。
    •  n: ナンバープロバイダー。二項分布の試行回数の値。
    •  p: ナンバープロバイダー。二項分布の確率の値。


  • score - 数値をスコアボードの値から取得する。
    •  target: スコアボードの値の参照先となるエンティティやプレイヤーを指定するコンパウンド。
      •  type: プレイヤー名やエンティティのUUIDで指定する場合はfixedを、ルート状況によって与えられるエンティティを使用する場合はcontextを指定する。
      •  name:  typefixedの場合のみ使用される。スコアボードの値を参照するプレイヤーの名前またはエンティティの UUID(ハイフン付き16進形式)を指定する。
      •  target:  typecontextの場合のみ使用される。スコアボードの値を参照するエンティティを、ルート条件によって与えられる引数で指定する。取りうる値は、thiskillerdirect_killerkiller_playerのいずれかである。
    •  score: 値を取得するスコアボードのオブジェクト。
    •  scale: 任意の要素。スコアボードの値を何倍にしてルートテーブル内で使用するかを決定する倍率。

ルート状況[]

ルート状況(英:Loot context)とは、ルートテーブルが召喚された状況に対応したさまざまなパラメータをプレディケート、ルート関数、ナンバープロバイダーに与えるための仕組みである。ルート状況はフィールド typeを用いて指定する。

データパックの読み込み時には、ルートテーブル内で使用されている状況パラメータが指定されているルート状況に対応しているかどうかを検証することができ、ゲーム内で実際にルートテーブルを使用する前にエラーを検出することができる。状況パラメータの中には、そのルート状況において必ず値を提供するものと場合によって提供しないものがあり、ルートテーブルが召喚された際にはルートテーブルが今回提供されていない状況パラメータが使用されていないか改めて確認される。

有効なルート状況の値とその用途、対応している状況パラメータは下表の通り。

ルート状況の値 用途 必ず提供される状況パラメータ 場合によって提供される状況パラメータ
empty
  • 使用されていないルート状況。特に状況パラメータを与えない。
  • "type":"empty"を指定した場合、このルートテーブル内では状況パラメータが一切使用できないことを示す。
なし なし
chest
  • Origin ブロックの座標。
  • this 収納ブロックを開いたエンティティ
command
  • ルートテーブルでは使用されないため、ルートテーブル内で"type":"command"を指定しても意味を為さない。
  • /item modify/execute (if|unless) predicateのコマンドを実行した際には、内部的にこのルート状況が使用されている。
  • Origin:コマンドの実行地点
  • this:コマンドの実行時の文脈上で@sに設定されているエンティティ。
selector
  • ルートテーブルでは使用されないため、ルートテーブル内で"type":"selector"を指定しても意味を為さない。
  • predicateターゲットセレクターの引数として内部的に使用される。
  • Origin:エンティティがプレディケートによって確認を受けた地点。
  • this:確認を受けたエンティティ。
fishing
  • 釣り
  • コマンド/loot … fish <loot_table>の実行時。
  • Origin:釣り竿の浮きの座標。
  • Tool:プレイヤーが手に持っている釣り竿。
  • this:釣り竿の浮き(エンティティ)。
entity
  • 生物エンティティからのドロップ時。
  • コマンド/loot … kill <target>の実行時。
  • this:死亡したエンティティ。
  • Origin:死亡位置。
  • Damage source:致命打のダメージ源。
  • killer:致命打の根本的な原因 となったエンティティ。例えばエンティティが矢などの飛翔体によって死亡した場合、これを発射したエンティティがkillerに該当する。
  • direct_killer:致命打を直接与えたエンティティ。例えばエンティティが飛翔体によって死亡した場合、発射者ではなく飛翔体自身がこれに該当する。
  • killer_player:死亡したエンティティを最も直近で攻撃したプレイヤー。
archaeology
  • Origin:Suspicious Sand/Gravelの座標。
  • this:Suspicious Sand/GravelにBrushを使用したエンティティ。
gift
  • ネコの朝の贈り物、スニッファーが地面から古代の種を発掘した際、または襲撃撃破時の村人からの贈り物を生成する際。
  • Origin:村人及びネコの位置。
  • this:贈り物の対象となるエンティティ。
barter 
  • this:物々交換をしたピグリン。
advancement_reward
  • 進捗達成報酬のアイテム生成に使用するように設定されたルートテーブル内。
  • this:進捗を達成したプレイヤー。
  • Origin:進捗達成時のプレイヤーの位置。
advancement_entity
  • ルートテーブル内では使用されないため、ルートテーブル上で"type":"advancement_entity"を指定しても意味を為さない。
  • 進捗が、エンティティに関する達成要件の確認などの目的でプレディケートを呼び出す際に内部的に用いられる。
advancement_location
  • ルートテーブル内では使用されないため、ルートテーブル上で"type":"advancement_location"を指定しても意味を為さない。
  • 進捗が、ブロックに関する達成要件の確認などの目的でプレディケートを呼び出す際に内部的に用いられる。
  • this:プレディケートによる確認を受けたエンティティ。
  • Origin:この達成要件トリガーを発生させたプレイヤーの座標。
  • Block state:設置・操作を受けたブロック及びそのブロック状態。
  • Tool:操作・設置に使用された道具。
generic
  • 使用されていない。これを使用する場合、データパック読み込み時状況パラメータの確認を行わない。
なし なし
block
  • 破壊されたブロックからのドロップ時。
  • コマンド/loot … mine <pos>の実行時。
  • Block state:破壊されたブロック及びそのブロック状態。
  • Origin:破壊されたブロックの座標。
  • Tool:破壊に使用された道具。
  • this:ブロックを破壊したプレイヤー。
  • Block entity:破壊されたブロックがブロックエンティティであった場合のみ与えられる、ブロックエンティティデータ。
  • Explosion radius:ブロックが爆風によって破壊された場合にのみ与えられる、幕臣からの半径。

歴史[]

Java Edition
1.92015年10月19日Dinnerbone がルートテーブルについて発表した。
15w43aルートテーブルが追加された。
15w43bentity_scores の条件が追加された。
15w43c「villager_golem.json」が「iron_golem.json」に改名された。
釣り、羊毛をドロップしないヒツジ、ゾンビおよびスケルトンホースのルートテーブルが追加された。
 item: タグが  name: に、 items: タグが  entries: に改名された。
 type: タグとアイテムの代わりにルートテーブルを読み込むサポートが追加された。
 luck: タグのデフォルトファイルとして追加された。当時は特に機能を持たなかった。
set_damage の関数が追加された。
15w44aenchant_randomlyset_attributes の関数が追加された。
15w44b quality タグが追加された。
 luck luck_multiplier タグが削除された。
 bonus_rolls タグが追加された。
15w51aスペクテイターモードのプレイヤーが収納ブロックの中身を閲覧しようとした際に、ルートテーブルによって中身が生成されなくなった。
1.9.11.9.1-pre1ディスペンサードロッパーで使用可能になった。
デフォルトのルートテーブルchests/jungle_temple_dispenser が追加された。
1.1116w32aロバ、ラバ、ハスク、村人ゾンビは、ウマやゾンビで使用されるルートテーブルではなく、それぞれ個別のルートテーブルを持つようになった。
16w43a村人、ヴェックス、エンダードラゴンが自身のルートテーブルを持つようになった。
1.1317w43aカスタマイズしたルートテーブルの格納場所が、データパック内に移動した。
1.1418w43a破壊したブロックからのドロップに、ルートテーブルが使用されるようになった。
ルートテーブルに様々な設定項目が追加された。
チェスト及びブロックのルートテーブルにおいて、エンティティを指定するところでルート状況パラメータthisを使用すると、プレイヤーを指定できるようになった。
18w44aネコの贈り物用のルートテーブルcat_morning_giftと、プレイヤーおよびウィザーのルートテーブルが追加された。
新しいブロック用のルートテーブルが追加された。
アイテム関数set_loreが追加された。
18w46aイリュージョナーのルートテーブルが追加された。
18w48a村のチェスト用の様々なルートテーブルが追加されたが、一部は当時は使用されていなかった。
ルートテーブルvillage_blacksmithが削除された。
18w49avillage_savanna_houseおよびvillage_snowy_houseが実際に使用されるようになった。
村のチェスト用の追加のルートテーブルが追加された。
18w50avillage_desert_house village_taiga_houseが使用されるようになった。これにより、未使用だったルートテーブルがすべて実装された。
?空のルートテーブルがハードコード化された。
1.1519w34aアイテム関数copy_stateが追加された。
1.1620w12a釣り竿の浮きのプロパティを確認するため、サブプレディケート fishing_hook が追加された。
1.20Pre-release 1ルートテーブルからアイテムを生成する際に、名前付きの乱数列を使用するようになった。
各ランダム配列は、ワールドのシード値と配列IDに従って特有のアイテムの配列を生成する。これにより、同じワールド・同じパラメータでルートテーブルを機能させた場合には同じ結果が帰って来る。
ルートテーブルが使用する乱数列のIDを指定する新しいフィールドrandom_sequenceが追加された。
Pre-release 6ランダム配列のID( random_sequences)の指定が任意になった。配列のIDが与えらなかった場合は、非決定的な乱数列を使用する。
1.20.223w32aアイテム関数を使用する際に、ルートテーブル上からでもJSON配列形式を使用することで複数のルート関数をアイテム関数sequenceと同様の振る舞いで実行することができるようになった。
プレディケートを使用する際に、ルートテーブル上からでもJSON配列形式を使用することで条件の種類all_ofと同様の振る舞いで実行することができるようになった。

問題点[]

「ルートテーブル」に関する問題点は、バグトラッカーにて管理されている。問題点の報告はそちらで行ってほしい。

脚注[]


Advertisement