目次
概要
1.13以降、データパックによってレシピの追加・改変ができるようになった。
精錬レシピもクラフトレシピも同じシステムの上で扱われる。
書式はtype要素の値によって左右され、主要なものには
- crafting_shaped
- crafting_shapeless
- smelting
の3つがある。
一部の特殊なレシピは、コード上でほとんどが管理される特別のtypeが割り当てられている。
typeごとの違い
レシピを作るにあたって、まず重要なことはそのレシピがどのtypeに当たるかということだ。
書式がtypeによって大きく異なるので、先にその用途の違いについて理解する必要がある。
- crafting_shaped
- 定形レシピ
- クラフトグリッドの決まった位置に決まったアイテムを置くことによって、完成品が得られるレシピ
- ex) 各種ツール類、ベッド、エンチャント台、など
- crafting_shapeless
- 不定形レシピ
- 位置を問わず決まったアイテムをクラフトグリッドに置くことによって、完成品が得られるレシピ
- ex) 本、ファイヤーチャージ、など
- smelting
- 精錬レシピ
- かまどの材料スロットに決まったアイテムを置いて精錬することによって、完成品が得られるレシピ
- ex) 各種金属インゴット、各種焼き肉、など
- その他
- Jsonでは表現することができないため、コードでそのほとんどが記述されているレシピ
- ex) 革防具染色、アイテム修繕、旗、など
自分の追加したいレシピが、どの種類に当たるかを判断できたらそれぞれの段に進もう。
定形レシピの記述
概形
{ "type": "crafting_shaped", "group": "", "pattern": [], "key": {}, "result": {} }
"type": "crafting_shaped"
- "crafting_shaped"
- 必須
- 定形レシピであることを示している
"group": ""
- 文字列
- 任意:レシピをグループ化したい場合に指定する
- ここに指定された文字列が等しいレシピ同士はレシピ本でグループ化される
- 他のデータパックとの被りを避けたいのであれば、ネームスペースをプレフィックスに用いるなどの工夫が必要だろう
"pattern": []
- 配列<文字列 (最大文字列長3、文字列長は統一)> (最大配列長3)
- 必須
- レシピの"形"を定める
- 文字列の配列でレシピグリッドを表現し、各文字列がグリッドの各行に対応している
- スペースで空欄を、その他記号一文字で一つの素材を示す
- 3*3、つまり文字列の長さが3で文字列の個数が3が表現できる最大のレシピで、それ以上は弾かれる
"key": {}
- オブジェクト<文字列 (文字列長1),ItemList>
- 必須
- レシピの"素材"を定める
- patternで用いた記号をキーに、素材を値に定めることで対応付ける
- 値の詳しい書式はItemListの項で解説する
"result": {}
- ItemStack
- 必須
- 完成品を定める
- 値の詳しい書式はItemStackの項で解説する
全体図例1
dirt_pickaxe.json
{ "type": "crafting_shaped", "pattern": [ "XXX", " # ", " # " ], "key": { "#": { "item": "minecraft:stick" }, "X": { "item": "minecraft:dirt" } }, "result": { "item": "minecraft:diamond_pickaxe" } }
土と棒からダイアモンドピッケルを作るレシピである。
典型的な3*3の定形レシピであり、素材の指定も最も単純なものにしてある。
Xと#を用いてレシピの形を定め、#には"item": "minecraft:stick"
すなわち棒を、Xには"item": "minecraft:dirt"
すなわち土を対応付けている。
全体図例2
dirt_axe.json
{ "type": "crafting_shaped", "pattern": [ "XX", "X#", " #" ], "key": { "#": { "item": "minecraft:stick" }, "X": { "item": "minecraft:dirt" } }, "result": { "item": "minecraft:diamond_axe" } }
土と棒からダイアモンドの斧を作るレシピである。
3*2の縦長定形レシピの例として用意した。
その他は例1で上げたものとほぼ同様だろう。
注意すべきなのは、ミラーレシピが有効であることと、3*3グリッドにおいて左寄せ、右寄せの両方でレシピが認識されるという点だ。
あえて左寄せか右寄せかを固定したいのであれば適切にスペースを入れる必要がある。
ミラーレシピを無効にするすべはない。
全体図例3
hay_bed.json
{ "type": "crafting_shaped", "group": "bed", "pattern": [ "###", "XXX" ], "key": { "#": { "item": "minecraft:hay_block" }, "X": { "tag": "minecraft:planks" } }, "result": { "item": "minecraft:yellow_bed" } }
藁と木材から黄色のベッドを作るレシピである。
このように2*3のレシピを記述することも可能。
3*3のグリッドでは上段と中段、あるいは中段と下段を用いて作成することができるようになる。
あえて固定したいのであれば、スペース3つの文字列を適切な場所に挿入する必要がある。
"group"に"bed"を指定することで、他に"bed"が指定されているレシピと共にグループ化されるようになる。
今回はバニラに既にあるgroupに割り当てたが、そうでないgroupにも割り当てることができる。
不定形レシピの記述
概形
{ "type": "crafting_shapeless", "group": "", "ingredients": [], "result": {} }
"type": "crafting_shapeless"
- "crafting_shapeless"
- 必須
- 不定形レシピであることを示している
"group": ""
- 文字列
- 任意:レシピをグループ化したい場合に指定する
- ここに指定された文字列が等しいレシピ同士はレシピ本でグループ化される
- 他のデータパックとの被りを避けたいのであれば、ネームスペースをプレフィックスに用いるなどの工夫が必要だろう
"ingredients": []
- 配列<ItemList>
- 必須
- レシピの"素材"を定める
- 配列の一要素がグリッドの一マスを表現している
- 配列内のオブジェクトの詳しい書式はItemListの項で解説する
"result": {}
- ItemStack
- 必須
- 完成品を定める
- 値の詳しい書式はItemStackの項で解説する
精錬レシピの記述
{ "type": "smelting", "group": "", "ingredient": {}, "result": "", "experience": 0.0, "cookingtime": 200 }
"type": "smelting"
- "smelting"
- 必須
- 精錬レシピであることを示している
"group": ""
- 文字列
- 任意:レシピをグループ化したい場合に指定する
- ここに指定された文字列が等しいレシピ同士はレシピ本でグループ化される
- 他のデータパックとの被りを避けたいのであれば、ネームスペースをプレフィックスに用いるなどの工夫が必要だろう
"ingredient": {}
- ItemList
- 必須
- 素材を定める
- 値の詳しい書式はItemListの項で解説する
"result": ""
- Item
- 必須
- 完成品を定める
"experience": 0.0
- 浮動小数点数 (0 ~ 1)
- 任意:設定しなかった場合、0となる
- 精錬時の経験値を定める
- 1より上の数はすべて1に丸められる
- 経験値は整数であるため、小数は確率として扱われる
- 0.1の精錬を1回で取り出せば、10%の確率で1ポイントの経験値が得られる
- 0.1の精錬を5回で取り出せば、50%の確率で1ポイントの経験値が得られる
- 0.1の精錬を15回で取り出せば、1ポイントと50%の確率で更に1ポイントの経験値が得られる
- というように取り出すまでの精錬回数が加算されていき計算される
"cookingtime": 200
- 整数
- 任意:設定しなかった場合、200となる
- 精錬時間を定める
- バニラではこの値は常に一定(200)である
- 石炭の燃焼時間が1600という点が調整上で手がかりになるかもしれない
レシピにおけるアイテムの表現
レシピに登場するアイテムの表現について説明する。
それぞれの名称は識別のために便宜的に付けたものであるため、公式のものではなくこのページ外では通用しないことに注意してほしい。
Item
単の文字列であって、その文字列は内部名やIDとも呼称される。
内部名とはアイテムの識別子であって、アイテムを参照するための文字列である。
ゲーム内ではF3+Hを押すことによって表示される拡張ツールチップで確認することができる。
ItemList
Itemを複数種類保持するオブジェクト。
itemオブジェクト
{ "item": "" }
"item": ""
- Item
- 必須
tagオブジェクト
{ "tag": "" }
"tag": ""
- 文字列
- 必須
- タグを指定する。
- <ネームスペース>:<タグ名>の形式で指定することができる
- 適用できるタグは (当然) アイテムのもののみ
- タグについては別記事で詳解する
配列
配列にitemオブジェクトやtagオブジェクトをもたせることによって、それらを一括したItemListとして扱う。
Jsonとしては特別な記法ではないため、概略例だけ示す。
Jsonの仕様からして、入れ子にはできず、する必要もない。
[ { "item": "" }, { "tag": "" } ]
ItemStack
Itemとその個数を保持するオブジェクト。
{ "item": "", "count": 1 }
"item": ""
- Item
- 必須
"count": 1
- 整数
- 任意
- アイテムの個数を定める