【トレードアイテム】

はじめに

ここでは職業を持った村人とのアイテム取引を定義するためのルートテーブル(Loot Table)の書き方をご紹介します。
基本的な書き方は▶基本の書き方の方でご紹介していますのでそちらをご覧ください。

※ルートテーブルの記述はJSON形式なのでJSONの仕様を理解している前提で話を進めます。

ファイル構成

バニラのビヘイビアパック内でのファイル構成は以下のようになっています。
以下の黄色の部分が今回対象にしているファイルです。
/<ビヘイビアパックのルート>
    /trading
        armorer_trades.json
        butcher_trades.json
        cartographer_trades.json
        cleric_trades.json
        farmer_trades.json
        fisherman_trades.json
        fletcher_trades.json
        leather_worker_trades.json
        librarian_trades.json
        shepherd_trades.json
        stone_mason_trades.json
        tool_smith_trades.json
        weapon_smith_trades.json

        /economy_trades
            armorer_trades.json             防具鍛冶
            butcher_trades.json             肉屋
            cartographer_trades.json        製図家
            cleric_trades.json              聖職者
            farmer_trades.json              農民
            fisherman_trades.json           釣り人
            fletcher_trades.json            矢師
            leather_worker_trades.json      革細工師
            librarian_trades.json           司書
            shepherd_trades.json            羊飼い
            stone_mason_trades.json         石工
            tool_smith_trades.json          道具鍛冶
            wandering_trader_trades.json    行商人
            weapon_smith_trades.json        武器鍛冶

                    

このうちtrading配下のものとeconomy_trades配下のものとに大きく分かれていてwandering_trader_trades.jsonファイルの有無に違いがあります。
wandering_trader_trades.jsonは行商人のトレードテーブルを定義するためのファイルですが、行商人は比較的新しいバージョンで導入されたエンティティなのでeconomy_trades配下のものが新しい定義である事が伺えます。
念のためtrading配下のファイルを変更して試してみましたが現在のバージョン(確認時は1.21.73)では反映されなかった為、下位互換のため残されているものと思われます。
というわけで、ここではeconomy_trades配下のファイルを見ていきます。

定義ファイルの概要

定義内容はまず行商人とそれ以外に大きく分かれます。
それぞれのファイル内でのレイアウトは以下の通りです(黄色の部分は固定だとお考えください)。

「行商人」用の定義


{
    "tiers": [
        {
            "groups": [
                {

                    "num_to_select": 5,
                    "trades": [
                        <トレード項目の定義>
                    ]

                },
                {

                    "num_to_select": 1,
                    "trades": [
                        <トレード項目の定義>
                    ]

                }
            ]
        }
    ]
}

                    

groupsの項目が2つの定義ブロックに分かれています。

画面上では以下のピンク色の枠で示した部分で分かれています。

行商人の取引画面

それぞれのnum_to_selectの数値はトレード項目の数を表していて、定義できる最大値ではなく、trades項目内で定義されているトレード項目のうちnum_to_selectの件数分選出する事を表しています。
つまり<トレード項目の定義>の部分は、選出候補としてnum_to_selectの件数を超えて定義する事ができます。


「行商人」以外の定義


{
    "tiers": [
        {   // レベル1(新米)

            "total_exp_required": 0,
            "groups": [
                {
                    "num_to_select": <職業やレベルに応じた数値>,
                    "trades": [
                        <トレード項目の定義>
                    ]
                }
                
            ]

        },
        {   // レベル2(見習い)

            "total_exp_required": 10,
            "groups": [
                {
                    "num_to_select": <職業やレベルに応じた数値>,
                    "trades": [
                        <トレード項目の定義>
                    ]
                }
                
            ]

        },
        {   // レベル3(一人前)

            "total_exp_required": 70,
            "groups": [
                {
                    "num_to_select": <職業やレベルに応じた数値>,
                    "trades": [
                        <トレード項目の定義>
                    ]
                }
                
            ]

        },
        {   // レベル4(熟練者)

            "total_exp_required": 150,
            "groups": [
                {
                    "num_to_select": <職業やレベルに応じた数値>,
                    "trades": [
                        <トレード項目の定義>
                    ]
                }
                
            ]

        },
        {   // レベル5(達人)

            "total_exp_required": 250,
            "groups": [
                {
                    "num_to_select": <職業やレベルに応じた数値>,
                    "trades": [
                        <トレード項目の定義>
                    ]
                }
                
            ]

        }
    ]
}

                    

上のレイアウトは村人の各職業でほぼ共通です。
tiersの項目が5つの定義ブロックに分かれているのは、職業別のレベル項目(一番の上の項目がレベル1で下に向かってレベルが上がっていく配置)と一致しているからで、全ての職業で最大5レベルまである事を表しています。
各レベルで定義されているtotal_exp_requiredの数値は村人が次のレベルアップに必要な経験値を表しています。
あとの構成は行商人の場合と同じですが、groupsの要素数が各々の職業やレベルに応じて異なります。

groupsの項目について

例外として以下のようなgroups要素が存在しない職業である「石工」の定義がありますが、このファイルにはnum_to_selectの項目も存在しないので、複数のトレード項目から採用する項目を選定したい場合に限りgroups要素を使うようです。

{
    "tiers": [
        {   // レベル1(新米)

            "total_exp_required": 0,
            "trades": [
                {
                    <トレード項目の定義1つ目>
                },
                {
                    <トレード項目の定義2つ目>
                }
            ]

        },
        {   // レベル2(見習い)

            "total_exp_required": 10,
            "trades": [
                {
                    <トレード項目の定義1つ目>
                },
                {
                    <トレード項目の定義2つ目>
                }
            ]

        },
        {   // レベル3(一人前)

            "total_exp_required": 70,
            "trades": [
                {
                    <トレード項目の定義1つ目>
                },
                {
                    <トレード項目の定義2つ目>
                }
            ]

        },
        {   // レベル4(熟練者)

            "total_exp_required": 150,
            "trades": [
                {
                    <トレード項目の定義1つ目>
                },
                {
                    <トレード項目の定義2つ目>
                }
            ]

        },
        {   // レベル5(達人)

            "total_exp_required": 250,
            "trades": [
                {
                    <トレード項目の定義1つ目>
                }
            ]

        }
    ]
}

                    

これを画面で表すと以下のようになります。

石工師の取引画面

画面上ではレベル2までしか見えていませんが、各レベル毎にトレード項目が固定で2件ずつ表示されていることがわかります。

trades項目内で設定できる内容

この部分は行商人も含めて共通の内容になります。
"trades": [
    {

        "wants": [
            {
                "item": "minecraft:emerald",
                "quantity": 3,
                "price_multiplier": 0.2
            },
            {
                "item": "minecraft:diamond",
                "quantity": 1,
                "price_multiplier": 0.2
            }
        ],
        "gives": [
            {
                "item": "minecraft:fishing_rod",
                "quantity": 1,
                "functions": [
                    {
                        "function": "enchant_with_levels",
                        "treasure": false,
                        "levels": {
                            "min": 5,
                            "max": 19
                        }
                    }
                ]
            }
        ],
        "trader_exp": 10,
        "max_uses": 3,
        "reward_exp": true

    }
]
                    

・wants
この要素は最大2件まで定義でき、トレードの対象アイテムを指定します。

item
トレードの対象アイテムを指定します。

quantity
トレードの対象アイテムの数量を指定します。

price_multiplier
以前はトレードの対象アイテムの価格調整係数として機能していたようですが、現在は機能していないようです。

・gives
この要素は最大1件まで定義でき、トレードの結果得られるアイテムを指定します。

item
トレードの結果得られるアイテムを指定します。

quantity
アイテムの数量を指定します。

functions
アイテムに関数を適用する場合に指定します。
ここではエンチャントを付与する関数を指定していますが、▶基本の書き方でご紹介したような関数が使用できます。

・trader_exp
トレードを行った際に村人が得られる経験値を指定します。
ここでは10と指定しているので、トレードを行う度に村人は10の経験値を得る事になります。

・max_uses
トレードの最大使用回数を指定します。
ここでは3と指定しているので、トレードを行うと3回までトレードが可能になります。
例え3回トレードを行ったとしても、村人の職業が変わったり村のイベントが発生したりすると、max_usesの回数はリセットされます。

・reward_exp
トレードを行った際にプレイヤーが経験値を得られるかどうかを指定します。
ここではtrueと指定しているので、トレードを行う度にプレイヤーは経験値を得る事になります。
falseと指定すると、トレードを行っても経験値は得られません。
得られる経験値はtrader_expで指定した数値に比例しているようです。

wants定義のアイテムを2件登録した場合、画面には以下のピンク色の枠囲いのように表示されます。
取引アイテムが2件ある場合の取引画面
"trades": [
    {
        "wants": [
            {

                "choice" : [
                    {
                        "item": "minecraft:emerald",
                        "quantity": 3,
                        "price_multiplier": 0.2
                    },
                    {
                        "item": "minecraft:diamond",
                        "quantity": 1,
                        "price_multiplier": 0.2
                    }

                ]
            }
        ],
        "gives": [
            {

                "choice" : [
                    {
                        "item": "minecraft:fishing_rod",
                        "quantity": 1
                    },
                    {
                        "item": "minecraft:diamond_sword",
                        "quantity": 1
                    }
                ]

            }
        ],
        "trader_exp": 10,
        "max_uses": 3,
        "reward_exp": true
    }
]
                    

この場合、choiceの要素を使う事でトレードの対象アイテムを選択できるようになります。
wants項目の場合は、エメラルドとダイヤモンドのどちらかが選ばれ、gives項目の場合は、釣り竿とダイヤモンドのどちらかが選ばれます。

おわりに

本環境では、以下の職業の村人と取引できるアイテムを実装例として登録しています。

・武器鍛冶師と取引できるアイテム
▶ファンネルユニットの構成要素である「サイコフレーム」
▶ホバーユニットの構成要素である「Eパック」
▶エヴォーカーファングの杖

・行商人と取引できるアイテム
▶ホバーユニットの構成要素である「Nジャマー」