はじめに
Minecraft、Java版を遊んでいると、こう思うことがあります。
これが統合版であれば、「アドオン」という選択肢が取り得ます。JSONで簡単に制作できるため、そのハードルも低く、気軽に始められます。しかし、Java版はそうはいきません。レシピはデータパックで何とかなるとしても、アイテムの制作に関しては原則的にMODの制作が必要だからです。
しかしながら、そのようなJava版において、JavaScriptという強力な武器を引っ提げ、マイクラのカスタマイズに「革命」を起こしているMODがあります。それが「KubeJS」です。この記事では、KubeJSとは一体何なのか、その導入方法から、簡単なカスタムレシピやカスタムアイテムの作り方までを、サンプルコードを交えて徹底的に解説していきます。
KubeJSとは何か?

KubeJSというのは、MinecraftJava版向けのMODです。その最大の特徴は、何と言っても「JavaScript」という、世界中で広く使われているプログラミング言語を使って、マインクラフトのゲーム内容を自在に書き換えることができる点にあります。おそらくJavaなどの他の言語と違って習得しやすいし書きやすいのではないかと思います。
さて、このKubeJSですが、単なるレシピ追加MODに留まりません。新しいアイテムの追加、新しいブロックの追加、特定のイベント(例:MOBを倒した時)の処理まで、まるで新しいMODを開発するかのように非常に様々なことが可能になります。この自由度こそが、KubeJSを「革命的」と言わしめています。唯一、難点があるとすればこのMODに関する情報がネット上にほとんどないことくらいでしょうか。
導入方法と準備
KubeJSの導入に関してですが、大きくは他のMODと変わりません。以下よりMODの本体(.jarファイル)をダウンロードして、modsフォルダに入れるだけです:
ただし、KubeJSは連携したいMOD専用のアドオンが別途必要になる場合があるため、環境に合わせて導入しましょう。例えば、Mekanismと連携したければ「KubeJS Mekanism」が、Createと連携したければ「KubeJS Create」がそれぞれ必要になる感じですね。
KubeJSを導入してマイクラを一度起動すると、Minecraftのインストールフォルダ直下にkubejsというフォルダが自動で生成されます。ここが、スクリプトを記述していくワークスペースになります。

スクリプトファイルは、主に以下の2つのフォルダに分けて保存します。実際、Kubejsのフォルダを開けると以下のような名前のフォルダが見つかるはずです:
startup_scripts
このフォルダ内に入れたjsファイルは、マインクラフトの起動時に読み込まれます。主に、新しいアイテムやブロックを追加する処理など、ゲームの根本に関わる定義を記述するものです。更新時には、Minecraftのゲームそのものの再起動が必要です。
server_scripts
ワールドの読み込み時に読み込まれます。主に、レシピの変更やイベント処理など、ゲームプレイ中のルールに関する定義を記述するものです。こちらは先とは異なり、「reload」コマンドで簡単に再読み込みが可能です。
レシピの作成
まずは、KubeJSの最も基本的な使い方である「レシピの変更」を試してみましょう。kubejs/server_scriptsフォルダ内に、任意の名前のjsファイルを作って開くか、もとからあるjsファイルである、example.jsを開きます。
まずは、レシピ追加の前段階として以下のスクリプトを覚えましょう:
ServerEvents.recipes(event => {
// ここにスクリプトを記述
});
これは、何らかのレシピを作るものではなく、その準備を行うものです。ここでの「ServerEvents」はKubeJSにおいてよく使われるもので、このスクリプトが全ての土台になります。この中に、レシピを追加するスクリプトを記述することになります。
定型レシピの追加
実際に、作業台で使うことができる、簡単な定型レシピを追加してみましょう。先ほどのスクリプトを少し変えて、以下のように記述します:
ServerEvents.recipes(event => {
event.shaped(
'minecraft:diamond_block', // 出力
[
' D ',
'D D',
' D '
],
{
// キーの定義
'D': 'minecraft:emerald'
}
)
});
これは、エメラルドを4つ、以下のように配置することでダイヤモンドブロックを制作するレシピの例です:

ここでは3×3の形でレシピを定義することができます。このときのキー「D」は何でもよくて、「A」や「Z」など好きな文字を使用することができます。
実際にこのjsファイルをserver_scripts内に保存してゲームを起動してみましょう。すると、以下のようにエメラルド4つからダイヤモンドブロック1個がクラフトできることが確認できると思います:

不定形レシピの追加
同様に、不定形レシピも追加することができます。不定形レシピとは、上記とは違って特に配置が決まっていないレシピのことですね。以下のように、スクリプトを記述することで不定形レシピを追加できます:
ServerEvents.recipes(event => {
event.shapeless(
'2x minecraft:diamond', // 出力: 2個のダイヤモンド
[
'minecraft:dirt',
'minecraft:emerald'
]
)
});
このように、単にlistの中にアイテムidを列挙することで特に配置の形を定めないレシピを作成できます。なお、「2x ~~」というのは個数を表します。ここでは2個のダイヤモンドということですね。
実際にゲーム内で挙動を確認してみると、以下のようになります:

このように、作業台に土とエメラルドさえ配置すればダイヤモンドが2個完成することが分かりますね。
かまどのレシピ
続いて、かまどのレシピも見てみましょう。KubeJSにおけるかまどのレシピの例は以下です:
ServerEvents.recipes(event => {
event.smelting(
'minecraft:glass', // 出力
'minecraft:dirt' // 入力
)
});
このように、「event.smelting」によって燃焼時のレシピを定義できます。すこしややこしい点として、この関数の引数は出力が先で入力が跡であることには留意しましょう。つまり、この場合には土を1個っ消費してガラスを得るレシピなわけですね。
実際に上記を保存して挙動を確認すると、以下のようになります:

正常に土を焼いてガラスを得られることが分かりますね。
さて、「smelting」以外にも、KubeJSは様々なレシピに対応しています。この辺りについては、公式ドキュメントも詳しいと思いますので、参考にしてみてください:
他のMODのレシピ
他のMODのレシピを作成するには、前述の通り「KubeJS Mekanism」など、それぞれのMODに対応したKubeJSが別途必要になります。ここでは、「Mekanism」という有名な工業MODにおける「粉砕機」の新レシピを追加することをやってみましょう。
まずは、KubeJSとは別に「KubeJS Mekanism」というMekanismに対応したものを追加で導入します。
これを追加したら、以下のようにスクリプトを記述してみましょう:
ServerEvents.recipes(event => {
event.recipes.mekanism.crushing('mekanism:dust_coal','minecraft:coal_block')
});
「event.recipes.mekanism.crushing」によって粉砕機のレシピを追加することができます。例に漏れず、引数のうち出力が先で入力が後です。すなわち、今回の場合は石炭ブロックから石炭の粉を生成するわけですね。
実際にこれを保存してゲーム内で挙動を確認すると、以下のように正常に動作することが分かります。

ここでは「crushing」を用いて粉砕機のレシピを定義しましたが、CombiningやInfusingなど、様々なレシピを追加できます。詳細は公式のドキュメントが詳しいです:
その他のレシピ
ここで触れなかった、あるいは非対応のレシピであっても、それがJSONによって定義可能である限り、KubeJSによって定義可能です。それを可能にするのが、「event.custom」というもの。以下は、KubeJSにおいて「加圧反応器」(※公式ドキュメントによると非対応)のレシピを追加する例です:
ServerEvents.recipes(event => {
event.custom({
"type": "mekanism:reaction",
"itemInput": {
"ingredient": { "item": "mekanism:dust_coal" }
},
"fluidInput": {
"amount": 100,
"fluid": "minecraft:water"
},
"gasInput": {
"amount": 100,
"gas": "mekanism:hydrogen"
},
"duration": 200,
"itemOutput": { "item": "mekanism:dust_sulfur" },
"gasOutput": { "gas": "kubejs:petroleum_gas", "amount": 100 }
}).id('kubejs:prc/crude_oil_gas_from_coal')
});
結構複雑ですが、要はJSONを用いて複数のアイテム、液体、気体からなるレシピを追加しています。このようにKubeJSは柔軟にレシピの追加を行うことができます。実際にゲーム内で挙動を見てみると、こんな感じ:

- 石油ガスはカスタム気体です。詳細は後述。
なお、ここで使用した「events.custom」ですが、実はNBTの付与が可能です。つまり、制作したアイテムに名前を付けたりエンチャントを付けたりすることが可能なわけですね:

詳細については以下の記事で解説しています:
あた、event.customで定義するレシピはJSONでありさえすればいいので、通常のMODやデータパックで使用するJSONがほとんどそのまま使えます。以下の記事のJSONもそのままKubeJSに流用できるので参考にしてみてください:
レシピの削除
最後に、レシピの削除について示します。これは案外簡単で、以下のように記述するだけです:
ServerEvents.recipes(event => {
event.remove({ output: 'minecraft:diamond_pickaxe' })
});
ここでカギを握るのが、「event.remove」というもの。ここでは、完成品が「ダイヤモンドのツルハシ」であるようなレシピをすべて削除しています。確かにゲーム内を見てもダイヤモンドのツルハシが制作可能の一覧にありませんよね:

JEIとの関係
このKubeJSで制作したレシピですが、実はレシピを確認できるMODとして知られる「JEI」との高い親和性があります。即ち、何もせずともJEIでレシピが確認できるのです。特に何かする必要はありません。先のかまどのレシピですが、実際にJEIでレシピが確認できることが分かります:

ちなみにJEIはこちらからダウンロード可能です:
アイテムの追加
前述のように、KubeJSではアイテムの追加も行うことができます。以下は、例として「お金」という名前のオリジナルアイテムを制作する例です。これを、kubejs/startup_scripts内に任意のjsファイルを追加してそこにこれをコピーしてください。
StartupEvents.registry('item', event => {
event.create('money')
.displayName('お金') // 表示名
.tooltip('§bなぜだか価値のあると信じられているもの') // 説明文
.maxStackSize(16); // 最大スタック数
});
- server_scriptsではない点に注意
ここでのcreateの関数、「money」が追加するアイテムです。名前空間無しでアイテムの登録はできますが、その場合はデフォルトで「kubejs」が割り当てられます。これを変更したい場合は、「myitem:money」のように登録すればOKです。
なお、このまま登録すると黒と紫のテクスチャーになると思います。これはテクスチャーが定義されていない状態だからですね。テクスチャーを登録するには、kubejsの中にある、assets/kubejs/textures/items内にアイテムと同名の名前で画像ファイルを入れればOKです。今回でいえば「money.png」となりますね。
さて、以上を終えたら実際にゲームでの挙動を確認してみましょう。このとき、一旦Mincraftを完全に終了させて、再び再起動する必要があります。ここでgiveコマンドを実行することで、以下のようにカスタムアイテムが追加されているはずです:

実際に俯瞰で見ても、正常にテクスチャーも含めて読み込まれていることが分かると思います:

特殊なアイテムの追加
さて、以上では単純なアイテムの追加を行いましたが、続いて特殊なアイテム─ここではカスタム気体の追加をやってみましょう!
やることは大きくは変わりません。startup_scripts内に以下を記述したjsファイルを新規に作成しましょう。これは、「石油ガス」という気体を作成する例です:
StartupEvents.registry('mekanism:gas', event => {
event.create('petroleum_gas')
.texture('mekanism:gas/liquid')
.color(0x303030)
.displayName('石油ガス')
})
- このカスタム気体はMekanism依存のため、KubeJS Mekanismが必要です
実際に挙動を確認すると、石油ガスというカスタム気体が追加されていることが分かると思います。
おわりに
KubeJSは、単なるMODというよりは、「マインクラフトの中で動く、専用のプログラミング開発環境」といったほうがいいでしょうか。単なるレシピの変更に留まらず、カスタムアイテムの作成、複雑なイベント処理など意外とできることは多いです。
最初は少し難しく感じるかもしれませんが、まずはこの記事のサンプルコードを参考に、簡単なレシピ変更から試してみてもいいかもしれないですね。