【トレードアイテム】
はじめに
ここでは職業を持った村人とのアイテム取引を定義するためのルートテーブル(Loot Table)の書き方をご紹介します。
基本的な書き方は▶基本の書き方の方でご紹介していますのでそちらをご覧ください。
※ルートテーブルの記述はJSON形式なのでJSONの仕様を理解している前提で話を進めます。
基本的な書き方は▶基本の書き方の方でご紹介していますのでそちらをご覧ください。
※ルートテーブルの記述は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
配下のファイルを見ていきます。定義ファイルの概要
定義内容はまず行商人とそれ以外に大きく分かれます。
それぞれのファイル内でのレイアウトは以下の通りです(黄色の部分は固定だとお考えください)。
画面上では以下のピンク色の枠で示した部分で分かれています。

それぞれの
つまり<トレード項目の定義>の部分は、選出候補として
上のレイアウトは村人の各職業でほぼ共通です。
各レベルで定義されている
あとの構成は行商人の場合と同じですが、
これを画面で表すと以下のようになります。

画面上ではレベル2までしか見えていませんが、各レベル毎にトレード項目が固定で2件ずつ表示されていることがわかります。
それぞれのファイル内でのレイアウトは以下の通りです(黄色の部分は固定だとお考えください)。
「行商人」用の定義
{ "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件登録した場合、画面には以下のピンク色の枠囲いのように表示されます。
"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ジャマー」