(この記事は一連の解説記事の一つになります)
先頭記事:入門編
前の記事:5. 防具の追加
次の記事:7. 進捗の追加
レシピの追加
さて、1. アイテムの追加、2. ブロックの追加、4. ツールの追加、5. 防具の追加と各種アイテムを追加してきましたが、これらをクラフトするレシピがまだありません。今回はいくつかのパターンのレシピを追加していきます。
1.14.4においてレシピの追加はコードを書く必要はなく、jsonベースで追加できます。
定型レシピ
例えば剣のレシピを追加してみましょう。
\src\main\resources
├ assets
└ data
└ example_mod
├ loot_tables
└ recipes
└ example_sword.json
\src\main\resources\data\recipes
フォルダを作り、その中にレシピファイルを配置します。
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#",
"#",
"X"
],
"key": {
"#": {
"item": "example_mod:example_ingot"
},
"X": {
"item": "minecraft:stick"
}
},
"result": {
"item": "example_mod:example_sword"
}
}
type
にminecraft:crafting_shaped
を与えることで、定型レシピを作ることができます。定型レシピとはすなわち、素材の配置が決まっているクラフトのレシピです。
key
で任意のトークン(ここでは#とXですが、何でもよいです)と対応するアイテムを決定し、このトークンを用いてpattern
に3×3以下の行列のような形で配置を決定します。
result
にクラフトの結果得られるアイテムを指定します。
剣が作れるようになりました。
この例では素材の配置に1列しか使っていないため、図のようにどの位置で縦に並べても作ることができます。
半角空白で「何もない」を示すので、明示的に以下のようにしてもいいですが、この場合でも左あるいは右の縦1列でも作れるようになるようです。
"pattern": [
" # ",
" # ",
" X "
]
不定形レシピ
次に素材の配置に指定のない不定形レシピを追加してみましょう。
例としてはやや不適ですが、ブロック2つからインゴット18個に分解するレシピを考えてみます。
\src\main\resources
├ assets
└ data
└ example_mod
├ loot_tables
└ recipes
└ example_ingot.json
{
"type": "minecraft:crafting_shapeless",
"ingredients": [
{
"item": "example_mod:example_block"
},
{
"item": "example_mod:example_block"
}
],
"result": {
"item": "example_mod:example_ingot",
"count": 18
}
}
type
にminecraft:crafting_shapeless
を与えることで、不定型レシピを作ることができます。
ingredients
は材料の配列で、ここにクラフトに使うアイテムを列挙します。
result
は定型レシピ同様です。count
で個数を指定できます(デフォルト1のため前項では省略していました)。
任意の配置からインゴットが得られました。
精錬レシピ
続いてかまどによる精錬のレシピを追加します。例えば、ダイヤモンドを精錬したらインゴットが得られるようにしましょう。
\src\main\resources
├ assets
└ data
└ example_mod
├ loot_tables
└ recipes
└ furnace
└ example_ingot.json
(recipes
以下のファイルは全部登録してくれるようなので、多分フォルダ構成やファイル名は自由でいいと思います。)
{
"type": "minecraft:smelting",
"ingredient": {
"item": "minecraft:diamond"
},
"result": {
"item": "example_mod:example_ingot"
},
"experience": 3.0,
"cookingtime": 200
}
type
にminecraft:smelting
を指定して精錬レシピを追加します。
ingredient
(単数なので注意)は材料、result
が精錬後のアイテムです。
experience
は精錬で得る経験値、cookingtime
は精錬時間です。ちなみにバニラの鉄がそれぞれ0.7, 200です。
精錬できました。
発展
Q. レシピブックに出てないんだけど?
A. 一度作れば載ります。先に乗せたい場合advancements(実績)にかかわる部分で手を加える必要がありますが、まだ私も学習していないので、後に追記できればと思います。
Q. 複数の素材から同じアイテムを作りたい
A. 3つの解決法があります。
1つ目は単純にレシピのjsonファイルをその数だけ作る方法です。推奨しません。
2つ目はkey
あるいはingradient
にアイテムを複数渡す方法です。
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#",
"#",
"X"
],
"key": {
"#": {
"item": "example_mod:example_ingot"
},
"X": [
{
"item": "minecraft:stick"
},
{
"item": "minecraft:oak_wood"
}
]
},
"result": {
"item": "example_mod:example_sword"
}
}
{
"type": "minecraft:smelting",
"ingredient": [
{
"item": "minecraft:diamond"
},
{
"item": "minecraft:gold_ingot"
}
],
"result": {
"item": "example_mod:example_ingot"
},
"experience": 3.0,
"cookingtime": 200
}
(shapeless
なレシピについてはこの手法が使えるか不明でした。使えなさそう?)
3つ目はtag
を使う方法です。例えばバニラの木炭などは、あらゆる種類の原木から1つのアイテムをクラフトしています。以下にコードを示します。
{
"type": "minecraft:smelting",
"ingredient": {
"tag": "minecraft:logs"
},
"result": "minecraft:charcoal",
"experience": 0.15,
"cookingtime": 200
}
このタグはnet\minecraft\tags\BlockTags.java
で宣言されています。もちろん自分で新しいタグを定義することも可能なので、代替可能な素材をまとめたタグを作り、それを使ってレシピを定めるのはよい方法でしょう。
Q. バニラのレシピを改変したい
A. 追加は容易です。変更は困難。
つまり、A→Bのクラフトに対して、C→Bを追加することは簡単ですが、A→Dのクラフトに変更することは難しいです。前者は単に新しくレシピを追加すればバニラのものと共存しますが、後者は同じ素材からなるレシピを追加してもどうやらバニラのほうが優先されるようです。そのため、レシピを登録するコードの方までさかのぼって手を加える必要がありそうです。
Q. 醸造のレシピを作りたい
恐らくですが、醸造のレシピについては上記のようなjsonベースの追加ができません。(参考)
参考
Recipes - Forge Documentation
Minecraft 1.14.4 Forge Modの作成 その9 【レシピの追加】