KubeJSでレシピの追加・削除を行う

最近のレシピ追加はこれ

前置き

久々にマイクラ工業MODをやってみようと調べていたらMC1.20にgregtechがあるということで環境を作って遊んでいました。
で、遊んでいる内にどうしてもレシピを独自に追加してみたくなるのですが、
こういうときMC1.12時代はCraftTweakerを使うのが一般的だったのですが、
今はKubeJSっていうので書くのが一般的になっているみたいです。
ということでKubeJSについて勉強してみた。

KubeJSとは

名前からお察しの通りJavaScriptでスクリプトを作成するMODです。
CraftTweakerと異なり、基本構文はJSの知識があれば書けるというはメリット
あとはドキュメントとにらめっこして書いていくって感じか

KubeJS公式ドキュメント
https://kubejs.com/wiki

gregtechの話もしたいので
GregTech CEu modpack開発者向けドキュメント
https://gregtechceu.github.io/gtceu-modern-docs/Modpacks/

なおこの記事は全てMC1.20時点の情報です。

とりあえずレシピを追加してみる

まずMODを入れたら一度MCを起動してみる。
するとkubejsのフォルダができて、その配下にサンプル等が生成されています。
今回行いたいレシピ追加は「server_scripts」のフォルダに入れるので作成しておきます。

1.\kubejs\server_scripts

ここにスクリプトを書いていきます。
test.jsというファイルを作成して

 1ServerEvents.recipes(event => {
 2    event.shaped(
 3        '10x minecraft:stone',
 4        [
 5            'A B',
 6            ' C ',
 7            'B A'
 8        ],
 9        {
10            A: 'minecraft:andesite',
11            B: 'minecraft:diorite',
12            C: 'minecraft:granite'
13        }
14    )
15})

これを保存すると、焼石のレシピが追加できました。簡単!

なお、MCのコマンドで/reloadすれば起動中でもリロードできます。

で、上記のコードを一ずつ解説すると

1ServerEvents.recipes(event => {
2    // ここに追加レシピ追加削除していく
3})

この中にレシピを書いていきます。レシピ毎にこれをつける必要はなくカッコ内でeventを何度もつかっていけばよい。

今回は固定形クラフトなのでevent.shaped()を使っていく

1event.shaped(完成品, クラフト形状配列, 材料連想配列】)

完成品は
'10x minecraft:stone'で個数とアイテム名を設定できる。
1個の場合は個数の部分は不要で単純にアイテム名だけでよい

クラフト形状【配列】は
一つの文字をクラフトのマスとしてあてはめて、 3文字ずつ入った(空白含み)[上段,中段,下段]の配列を作成する。
これをぱっと見でわかるように改行しています。

材料【連想配列】は
クラフト形状で設定した文字の材料を連想配列で指定します。
{ 文字A: 材料1, 文字B: 材料2, 文字C: 材料3}のように作成する。
文字はA-Z a-z 自由に使えるので実際は頭文字なんかが使われると思います。

これでレシピの完成

アイテム指定

アイテム名を調べたい場合は、CraftTweakerと同じように
調べたいアイテムを持った状態でMC内コマンドで/kubejs handで表示され、チャットをクリックするとコピーもできます。

基本的に/kubejs handで調べれば大抵は解決できるはず

  • 一般的な方法。アイテムIDを指定する。F3+Hで表示されるもの。
1'minecraft:stone'
  • 複数個数指定する場合、個数x
    焼石64個なら
1'64x minecraft:stone'

実はItem.of()を使って第二引数に個数は指定でき

1Item.of('minecraft:stone', 64)

のようにも書けます。
ただ単純にアイテムを指定するだけならItem.of()は不要

  • 鉱石辞書で指定したい場合は#から始まっているもの
    羊毛いずれかでよいなら
1'#minecraft:wool'

但し完成品には指定できません。

  • エンチャントブックならこんな感じ
    このような特殊な指定をするときはItem.of()が必須となります。
    ※1や3の部分は個数ではなくエンチャントレベルです。
1Item.of('minecraft:enchanted_book').enchant('minecraft:silk_touch', 1)
2Item.of('minecraft:enchanted_book').enchant('minecraft:looting', 3)
  • あまりないかもしれませんが耐久値の指定もできます。
1Item.of('minecraft:stone_axe', '{Damage:0}')

基本的にはこれくらいか

あとこれはJSの仕様ですが、文字列を表すクォーテーションはシングル、ダブルどちらでも問題ありません。

追加できるレシピ

  • 固定形クラフト
1event.shaped(完成品, クラフト形状配列, 材料連想配列】))

これは上記で説明したので省略

  • 不定形クラフト
1event.shapeles(完成品, クラフト素材配列)

クラフト素材は固定形と異なり、形が重要ではないため単純に素材名を列挙するだけの配列になります。
当たり前ですが、9個以上を列挙することはできません。

  • 精錬レシピ
1// かまど
2event.smelting(完成品, 素材)
3// 溶鉱炉
4event.blasting(完成品, 素材)
5// 燻製器
6event.smoking(完成品, 素材)
7// 焚き火
8event.campfireCooking(完成品, 素材)

形はどれも一緒。

  • 石切台レシピ
1event.stonecutting(完成品, 素材)

これも製錬レシピと同じ

  • 鍛冶台レシピ
1event.smithing(完成品, 鍛冶型テンプレート, ベースアイテム, アップグレード素材)

ネザライト製のアイテムの作成に必要(らしい…)
1.20から鍛冶型テンプレートが必要になっているので4つ引数がある。

レシピ削除

追加できるようになると今度は元のレシピは削除したくなる。
ということで削除方法は

1// レシピIDで特定のレシピ削除
2event.remove({ id: 'minecraft:glowstone' })
3// 特定のアイテムのレシピ全て削除(鉱石辞書で指定も可)
4event.remove({ output: 'minecraft:stone_pickaxe' })
5event.remove({ output: '#minecraft:wool' })

この二種類が使いやすいと思われる。
レシピIDは、F3+Hでデバック有効にしている状態でJEIで確認できます。

大型MODPACKを作っていて特定のMOD加工で全てやらせたいんだってときは

1// 特定のMODのレシピ全て削除
2event.remove({ mod: 'farmersdelight' })
3// 特定のクラフト方法のレシピ全て削除
4event.remove({ type: 'minecraft:campfire_cooking' })

のような削除方法も可能。

MODで追加されたクラフト方法のレシピを追加する

MODで追加されるクラフト方法
JEIでレシピ確認しているときの上タブの部分
上で少し触れていますがクラフト方法はtypeで管理されています。
このtype名調べる方法ですが、、、

公式ドキュメントに書かれている通り、MOD側のレシピのjsonを見てtypeを見つけるという方法があります
Farmer's Delightのまな板を使うレシピは

 1{
 2  "type": "farmersdelight:cutting",
 3  "ingredients": [
 4    {
 5      "item": "minecraft:cake"
 6    }
 7  ],
 8  "tool": {
 9    "tag": "forge:tools/knives"
10  },
11  "result": [
12    {
13      "item": "farmersdelight:cake_slice",
14      "count": 7
15    }
16  ]
17}

これをevent.custom()で同じように作成してみる

 1event.custom({
 2    type: 'farmersdelight:cutting',
 3    ingredients: [{
 4        item: 'minecraft:honeycomb_block'
 5    }],
 6    tool: {
 7        tag: 'forge:tools/knives'
 8    },
 9    result: [{
10        item: 'minecraft:honeycomb',
11        count: 4
12    }]
13})

これでFarmer's Delightのまな板でハニカムブロックからハニカムに戻すレシピが追加できます。

ただぶっちゃけ大型MODPACKを覗くのが早いと思います。
jsonファイルはMODによって構成が違うと思うのですぐには見つからないと思います。
確認して書き方さえわかればあとは自由にレシピを作成するだけです。

gregtechは特殊で追加が容易にできるようになっています。これはCraftTweakerの時とほぼ一緒。
作ろうと思えば機械やマテリアルも追加できる。
ただ今回はレシピ関係だけの例
参考
https://gregtechceu.github.io/gtceu-modern-docs/Modpacks/Other-Topics/Adding-and-Removing-Recipes/

 1const greg = event.recipes.gtceu;
 2// 合金かまどでAE2のクォーツガラスのレシピを追加する
 3greg
 4    .alloy_smelter('gtceu:quartz_glass')  //レシピID(被らなければなんでもいい)
 5    .itemInputs('4x #forge:glass', '5x gtceu:certus_quartz_dust') //素材
 6    .itemOutputs('4x ae2:quartz_glass')  //完成品
 7    .duration(100) // 加工時間(tick) 20tick=1秒
 8    .EUt(8); // 必要電圧
 9// 
10
11// メモ
12// その他 入出力関係
13    .inputFluids('gtceu:rocket_fuel 1000')  //液体素材
14    .outputFluids('gtceu:rocket_fuel 1000') //液体完成品
15    .notConsumable("gtceu:rubber_sapling")  //消費しないアイテム(鋳型等)
16    .circuit(15)                            //回路番号
17    // アイテム、 確率、ティアブースト
18    //確率消費 20%の確率で消費する 機械ティアによるブーストはなし
19    .chancedInput('gtceu:fertilizer', 2000, 0)
20    //確率生成 20%の確率で生成する 機械ティアが上がる毎に10%UP
21    .chancedOutput('gtceu:fertilizer', 2000, 1000)
22
23// 機械
24    .assembler('') //組立機
25    .macerator('') //粉砕機
26// .etc 下記の「各機械のレシピタイプ」を確認
27
28// その他、クラフトで使いそうなアイテム
29    'gtceu:orange_glass_lens'   //レンズ
30    'gtceu:plate_casting_mold'  //鋳型
31    'gtceu:gear_extruder_mold'  //金型
32    '#forge:tools/wrench'       //レンチ 
33

各機械のレシピタイプ
https://github.com/GregTechCEu/GregTech-Modern/blob/1.20.1/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java

完全に自分用のメモになっちゃってるけど とりあえずレシピについては終わり
MODPACK作る気力が出たらアイテム追加やブロック追加も調べていく。