ルートテーブルのメモ書き

ルートテーブル

以下のような時に手に入れるアイテムを設定できるJSON。データパックで指定可能。

  • ブロックを破壊した、された時
  • エンティティを倒した時
  • チェストなどを開いた時
  • 釣りをした時
  • 特定のモブからアイテムを貰う、交換する時
  • 進捗などの報酬で手に入れる時

.minecraft/versions/<バージョン>/<バージョン>.jarを7-zipなどで開いて、data/minecraft/loot_tablesからバニラのサンプルをゲットできる。

ルートテーブルの置き場所

datapacks/<データパック>/data/<パック>/loot_tables/<ルートテーブル名>.json

もしもバニラの挙動を置き換える場合は、

datapacks/<データパック>/data/minecraft/loot_tables/<置き換える対象>.json

JSONの内容

ルート

{
    "type": "minecraft:empty",
    "pools": [
        { (ルートテーブル情報) }
    ]
}
プロパティ 説明 定義値
type ルートテーブルの種類
- empty : なし
- entity : エンティティのドロップ
- block : ブロックのドロップ
- chest : チェストの中身
- fishing : 釣りの結果
- gift : 猫や村人からのギフト
- advancement_reward : 進捗達成時
- generic : その他
string
pools ドロップ情報のリスト。上から順番に適用される。 list

ルートテーブル情報

{
    "conditions": [
        { (動作条件) }
    ],
    "rolls": 1,
    "bonus_rolls": 1,
    "entries": [
        { (アイテムの候補) }
    ]
}
プロパティ 説明 定義値 必須
conditions ルートテーブルを動作させる条件。 list
rolls entriesの中からいくつ動作させるか。
{ "min": 1, "max": 3 } という書き方もできる。
この場合はentriesから1~3個動作させる。
バニラは、基本的に1しか無い。ほぼ固定値で良い。
number / object
bonus_rolls rollsに加えて、Luckの効果がついていた場合に、追加でrollsを実行させる。( rolls + bonus_rolls の回数だけentriesを実行 )
こちらも { "min": 1, "max": 3 }という書き方ができる。
バニラは、基本的に設定されてない。過去の遺物?
number / object
entries アイテムの候補。 list

動作条件

{
    "condition": "minecraft:survives_explosion",
    (conditionで設定した条件のサブパラメータ)
}
プロパティ 説明 定義値 必須
condition ルートテーブルの動作させる条件のタイプ。
ここのタイプはpredicateと一緒なため、predicateについて書いたブログを参照。
string
サブパラメータ conditionで設定した条件のサブパラメータ。
ここもpredicateを参照。
-

ちなみにブロック壊した系は、基本minecraft:survives_explosion。サブパラなし。

エンティティ倒した系は、基本minecraft:killed_by_player。サブパラなし。

他は基本的にconditionsが設定されていない。

アイテムの候補

{
    "type": "minecraft:item",
    "name": "minecraft:diamond",
    "weight": 10,
    "quality": 20,
    "conditions": [
        { (動作条件) }
    ],
    "functions": [
        { (追加機能) }
    ],
    "children": [
        { (アイテムのサブ候補) }
    ],
    "expand": false,
}
プロパティ 説明 定義値 必須
type アイテム候補のタイプ。
- item : アイテムを取得する
- tag : アイテムのタグ(data packのtags)で指定する
- loot_table : コピー元のルートテーブルを指定する
- group : childrenを使って複数候補を返す(後述)
- alternatives : childrenを使って最初の候補を返す(後述)
- sequence : childrenを使って失敗するまでの候補を返す(後述)
- dynamic : ブロック固有の情報付きで返す
- empty : 何も生成しない(アイテムを取得しない)
string
name - typeitemならば、アイテムID。
- typetagならば、アイテムのタグ。
- typeloot_tableならば、ルートテーブル。
- typedynamicならば、contentsもしくはself
 contentsはブロックエンティティの中身。(シュルカー)
 selfは旗やモブの頭に使われる。
string
weight アイテム候補が複数ある場合に、選ばれやすさ。
面倒だったら、全部足した時に100にしておくと、そのまま%になる。
number
quality プレイヤーのLuckの効果によって、weightを書き換える値。 number
conditions アイテム候補を実行する条件。
内容は動作条件と同じ。
list
functions アイテムを取得する時に、アイテムに付与するオプション機能。 list
children typegroup, alternatives, sequecneの時にだけ指定する。
指定可能な内容は、アイテムの候補と同じ。効果は複雑なので、後述。
string
expand typetagの時にだけ指定する。
- trueなら、nameで指定したタグのアイテムを1つ取得する。
- falseなら、nameで指定したタグのアイテムを全部取得する。
bool

アイテムのサブ候補

まず、childrenの内容は、アイテムの候補と全く同じ。ただし、typeに指定した内容によって効果が変わる。

group

{
    "type": "minecraft:group",
    "children": [
        { (アイテムのサブ候補1) },
        { (アイテムのサブ候補2) },
        { (アイテムのサブ候補3) }
    ]
}

groupはアイテムのサブ候補を全部(1~3)を全部実行します。

これがある理由は、アイテムのサブ候補全部にconditionsを書くのを省略するため。

現在、バニラでは使われていない。

alternatives

{
    "type": "minecraft:alternatives",
    "children": [
        { (アイテムのサブ候補1) },
        { (アイテムのサブ候補2) },
        { (アイテムのサブ候補3) }
    ]
}

alternativesはアイテムのサブ候補を1(上)から順番にチェックしていって、最初にチェックに引っかかったアイテム候補だけ実行します。

要するに、1は失敗。2は成功。ならば、アイテムのサブ候補2だけが実行されます。

例えば、シルクタッチで破壊するとサブ候補1だけど、そうじゃなかったらサブ候補2みたいな書き方がバニラではメジャーです。

sequence

{
    "type": "minecraft:sequence",
    "children": [
        { (アイテムのサブ候補1) },
        { (アイテムのサブ候補2) },
        { (アイテムのサブ候補3) }
    ]
}

sequencegroupと似たようなものです。

ただし、groupは途中で失敗するサブ候補があっても、全部チェックしてくれますが、sequenceは1(上)から順番にチェックしていって、失敗したらそこまでのサブ候補しか実行されません。

現在、バニラでは使われていません。

追加機能

{
    "function": "minecraft:copy_name",
    (functionで設定した機能のサブパラメータ),
    "conditions": [
        { (動作条件) }
    ]
}
プロパティ 説明 定義値 必須
function アイテムに追加する機能のタイプ。
一覧は後述。
string
サブパラメータ functionで設定したサブパラメータ。
こちらも後述。
-
conditions 追加機能を実行する条件。
内容は動作条件と同じ。
list

追加機能の例

機能 説明 バニラでの使用例
apply_bonus エフェクトによってボーナスを受ける。 ダイヤ鉱石を幸運状態で採掘したらアイテム増える。
copy_name 破壊されたブロックの名前をコピーする。 旗を壊したら旗についてた名前をコピー。
copy_nbt NBTを一部コピーする。
壊した、倒した相手のNBTも可能。
旗を壊したら旗の柄をコピー。
copy_state ブロックのBlockStateTagをコピーする。
(ブロックを見た時にF3の右に出てくるブロック情報)
ミツバチの巣をシルクタッチで壊したら巣のレベルをコピー。
enchant_randomly ランダムにエンチャントを付ける。
エンチャントリストを指定することもOK。
ピラミッドのチェストにある革装備にランダムエンチャントをつける。
enchant_with_levels エンチャントのレベルを指定する。 エンドシティのチェストの本にレベル30のエンチャントをつける。
exploration_map 何も書かれていないマップに近くの建造物付近を描く。 海底遺跡のチェストの地図を宝の地図にする。
explosion_decay ブロックが爆発で壊された場合に、一定数アイテムが減る。 草が爆破された場合に小麦の種を一定数減らす。
furnace_smelt かまどで精錬した後のアイテムになるようにする。 鶏が燃えて死んだ場合に、焼き鳥になる。
fill_player_head モブの頭を壊した、殺したプレイヤーやモブの頭にする。 -
limit_count set_countで指定したアイテム数に制限をかける。 グロウストーンが普通に壊された場合に、1~4個、グロウストーンダストを落とす。
looting_enchant ドロップ増加のエンチャントによってアイテム数を増減させる。 鶏を倒した場合に0~1個、追加で羽を落とす。
set_attributes アイテムにAttributeを付与する。 -
set_contents コンテナの中身を保持する。 シュルカーボックスを破壊した時に中身を保持する。
set_count アイテム数を設定する。
ランダムで数値を決定することも可能。
本棚を壊した場合に、本を3個落とす。
set_damage ツール系アイテムの耐久値を設定する。 釣りで手に入れた釣り竿の耐久値を減らす。
set_lore アイテムに説明文を設定する。 -
set_name アイテムの名前を設定する。 -
set_nbt アイテムにNBTを設定する。 釣りで手に入れたポーションの効果をただの水にする。
set_stew_effect 怪しげなシチューを飲んだ時に発生するステータス効果を設定する。
怪しげなシチューはクリエイティブのインベントリからは取得できない。(ただし、サバイバルで作れる)
怪しげなシチューを飲むと、エフェクトを一定時間付ける。

その他、細かいところは英語Wiki参照。

Loot table – Official Minecraft Wiki

サンプル

石を壊した時のルートテーブル

{
  "type": "minecraft:block", // ブロックを破壊した時
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:alternatives", // 上から順番に見ていって最初のやつだけ実行
          "children": [
            { // サブ候補その1
              "type": "minecraft:item", // アイテムを取得
              "conditions": [
                {
                  "condition": "minecraft:match_tool", // ツールが一致していれば
                  "predicate": {
                    "enchantments": [
                      {
                        "enchantment": "minecraft:silk_touch", // シルクタッチLv1以上
                        "levels": {
                          "min": 1
                        }
                      }
                    ]
                  }
                }
              ],
              "name": "minecraft:stone" // 石を取得
            },
            { // サブ候補その2
              "type": "minecraft:item", // アイテムを取得
              "conditions": [
                {
                  "condition": "minecraft:survives_explosion" // 普通に破壊した時
                }
              ],
              "name": "minecraft:cobblestone" // 丸石を取得
            }
          ]
        }
      ]
    }
  ]
}

旗を壊した時のルートテーブル

{
  "type": "minecraft:block", // ブロックを破壊した時
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item", // アイテムを取得
          "functions": [ // 追加機能を付与
            {
              "function": "minecraft:copy_name", // ブロック自身の名前をコピー
              "source": "block_entity"
            },
            {
              "function": "minecraft:copy_nbt", // ブロック自身のNBTをコピー
              "source": "block_entity",
              "ops": [
                {
                  "source": "Patterns", // 絵柄だけ置き換え
                  "target": "BlockEntityTag.Patterns",
                  "op": "replace"
                }
              ]
            }
          ],
          "name": "minecraft:black_banner" // 黒の旗を取得
        }
      ],
      "conditions": [
        {
          "condition": "minecraft:survives_explosion" // 普通に破壊した時
        }
      ]
    }
  ]
}

鶏を倒した時のルートテーブル

{
  "type": "minecraft:entity", // エンティティを倒した時
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item", // アイテムを取得
          "functions": [
            {
              "function": "minecraft:set_count", // 0~2個落とす
              "count": {
                "min": 0.0,
                "max": 2.0,
                "type": "minecraft:uniform"
              }
            },
            {
              "function": "minecraft:looting_enchant", // ドロップ増加がついてたら追加で0~1個
              "count": {
                "min": 0.0,
                "max": 1.0
              }
            }
          ],
          "name": "minecraft:feather" // 羽を取得
        }
      ]
    },
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item", // アイテムを取得
          "functions": [
            {
              "function": "minecraft:furnace_smelt", // 精錬した結果を取得
              "conditions": [
                {
                  "condition": "minecraft:entity_properties", // エンティティ自身が燃えていた場合
                  "predicate": {
                    "flags": {
                      "is_on_fire": true
                    }
                  },
                  "entity": "this"
                }
              ]
            },
            {
              "function": "minecraft:looting_enchant", // ドロップ増加がついてたら追加で0~1個
              "count": {
                "min": 0.0,
                "max": 1.0
              }
            }
          ],
          "name": "minecraft:chicken" // 鶏肉を取得
        }
      ]
    }
  ]
}

クリーパーを倒した時のルートテーブル

{
  "type": "minecraft:entity", // エンティティを倒した時
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item", // アイテムを取得
          "functions": [
            {
              "function": "minecraft:set_count", // 0~2個落とす
              "count": {
                "min": 0.0,
                "max": 2.0,
                "type": "minecraft:uniform"
              }
            },
            {
              "function": "minecraft:looting_enchant", // ドロップ増加だと0~1個追加で落とす
              "count": {
                "min": 0.0,
                "max": 1.0
              }
            }
          ],
          "name": "minecraft:gunpowder" // 火薬を取得
        }
      ]
    },
    {
      "rolls": 1.0,
      "entries": [
        {
          "type": "minecraft:tag", // アイテムタグを取得
          "name": "minecraft:music_discs", // レコードのタグ
          "expand": true // タグの中のどれか1つを落とす
        }
      ],
      "conditions": [
        {
          "condition": "minecraft:entity_properties", // スケルトン系を倒した時
          "predicate": {
            "type": "#minecraft:skeletons"
          },
          "entity": "killer"
        }
      ]
    }
  ]
}

武器屋のチェストを開いた時のルートテーブル

{
  "type": "minecraft:chest", // チェストを開いた時
  "pools": [
    {
      "rolls": { // アイテム候補を1~5個実行する
        "min": 1.0,
        "max": 5.0,
        "type": "minecraft:uniform"
      },
      "entries": [
        {
          "type": "minecraft:item", // アイテムを取得
          "weight": 2, // 2/8 (2/2+4+1+1) の確率で実行する
          "functions": [
            {
              "function": "minecraft:set_count", // アイテム数を1~3個にする
              "count": {
                "min": 1.0,
                "max": 3.0,
                "type": "minecraft:uniform"
              }
            }
          ],
          "name": "minecraft:iron_ingot" // 鉄インゴットを取得
        },
        {
          "type": "minecraft:item", // アイテムを取得
          "weight": 4, // 4/8 (4/2+4+1+1) の確率で実行する
          "functions": [
            {
              "function": "minecraft:set_count", // アイテム数を1~4個にする
              "count": {
                "min": 1.0,
                "max": 4.0,
                "type": "minecraft:uniform"
              }
            }
          ],
          "name": "minecraft:bread" // パンを取得
        },
        { // 何も書いてない場合は、weightは1、set_countも1
          "type": "minecraft:item", // アイテムを取得
          "name": "minecraft:iron_helmet" // 鉄ヘルメットを取得
        },
        {
          "type": "minecraft:item", // アイテムを取得
          "name": "minecraft:emerald" // エメラルドを取得
        }
      ]
    }
  ]
}

ルートテーブルを設定する方法

パック名をminecraftにして、バニラの情報を書き換える

全てに反映されてしまうので、注意。

コマンドでルートテーブルを上書きする

# コンテナ系はsetblockでLootTableをNBTに書いて設定
setblock 0 60 0 minecraft:chest{LootTable:"x:original_chest"}

# エンティティ系はsummonでDeathLootTableをNBTに書いて設定
summon minecraft:creeper 0 60 0 {DeathLootTable:"x:original_creeper"}

# ルートテーブルの設定をminecraft:emptyで消す
summon minecraft:creeper 0 60 0 {LootTable:"minecraft:empty"}

進捗でルートテーブルを設定する

{
    :
    "rewards": {
        "loot": ["x:original_advance"]
    }
}

こんな感じで進捗達成時にルートテーブルで報酬が書ける。