# KubeJS 6 基礎教學
KubeJS是流行於1.16.5級以上版本的遊戲魔改模組(也有1.12.2),支援Forge和Fabric,可以使用javascript來改變物品的製作方式,或是修改一些有的沒的遊戲內容。
更詳細的內容請查看[官方wiki](https://wiki.latvian.dev/books/kubejs)。
**此教學適用於KubeJS 6+,Minecraft 1.19.2+。**(1.18.2及以下版本的部分語法不同)
在編輯javascript程式碼時,建議可以使用[Visual Studio Code](https://code.visualstudio.com/)來編輯。
需要安裝的模組:
* [KubeJS](https://www.curseforge.com/minecraft/mc-mods/kubejs)
* [Architectury API](https://www.curseforge.com/minecraft/mc-mods/architectury-api)(前置模組)
* [Rhino](https://www.curseforge.com/minecraft/mc-mods/rhino)(前置模組)
* [ProbeJS](https://www.curseforge.com/minecraft/mc-mods/probejs)
* vscode延伸模組ProbeJS
啟動遊戲後,輸入指令`/probejs dump`並等待文件生成就可以使用ProbeJS的功能了
接下來使用vscode打開.minecraft資料夾中的kubejs資料夾

裡面會有這些文件

JS腳本主要存放在 server_scripts、startup_scripts 和 client_scripts 這三個資料夾中。如果腳本數量較多,建議使用資料夾進行組織,或者使用不同的文件名進行細分。
* server_scripts : 每次伺服器資源重新加載時加載的腳本,用於修改配方、標籤、戰利品表以及處理伺服器事件(可以使用 ```/reload``` 重新加載)
* startup_scripts : 在遊戲啟動期間僅加載一次的腳本,用於添加物品等只能在遊戲加載時進行的事情(可以使用 ```/kubejs reload_startup_scripts``` 重新加載,但可能不起作用)
* client_scripts : 每次客戶端資源重新加載時加載的腳本,用於 JEI 事件、工具提示和其他客戶端方面的事務(可以使用 F3+T 重新加載)
---
# 物品配方 (server_scripts)
KubeJS 可以刪除、新增、編輯物品的合成配方。
程式碼需要寫在`ServerEvents.recipes((event) => {})`的大括號中
```javascript=
ServerEvents.recipes((event) => {
//寫在這裡面
})
```
## 物品配方刪除
使用語法`event.remove()`來刪除合成配方。
而他還有多種刪除條件:
* output
* input
* mod
* id
* type
以下是官方wiki的範例:
```javascript=
// 移除所有配方(明顯不推薦使用空條件):
event.remove({})
// 移除所有輸出為石鎬的配方:
event.remove({ output: 'minecraft:stone_pickaxe' })
// 移除所有輸出包含羊毛標籤的配方:
event.remove({ output: '#minecraft:wool' })
// 移除所有包含紅石粉標籤的任何輸入的配方:
event.remove({ input: '#forge:dusts/redstone' })
// 移除所有屬於 Farmer's Delight 的配方:
event.remove({ mod: 'farmersdelight' })
// 移除所有營火烹飪的配方:
event.remove({ type: 'minecraft:campfire_cooking' })
// 移除掉所有提供石頭但不包括熔煉配方的配方:
event.remove({ not: { type: 'minecraft:smelting' }, output: 'stone' })
// 移除掉所有輸出為烤雞且在營火上烹飪的配方:
event.remove({ output: 'minecraft:cooked_chicken', type: 'minecraft:campfire_cooking' })
// 移除任何高爐或熔爐配方且輸出為 minecraft:iron_ingot 的配方:
event.remove([{ type: 'minecraft:smelting', output: 'minecraft:iron_ingot' }, { type: 'minecraft:blasting', output: 'minecraft:iron_ingot' }])
// 依據ID移除一個配方,例如 data/minecraft/recipes/glowstone.json:
// 注意:配方ID和輸出是不同的!
event.remove({ id: 'minecraft:glowstone' })
```
## 新增物品配方
### 有序合成
需要特定的排列方式才能合成的物品,例如鎬子
```javascript=
event.shaped("10x minecraft:netherite_pickaxe", [ //設定要製作的物品以及數量
"AAA",
" B ", //依這工作台的九宮格排列
" B "
], {
A: "minecraft:netherite_block", //設定用來製作的物品
B: "minecraft:nether_star"
});
```
也可以讓九宮格變成一行:
```javascript=
event.shaped("3x minecraft:stone", ["AAA", " B ", "AAA"], {
A: "minecraft:dirt",
B: "minecraft:glass"
});
```
### 無序合成
不需要特定排列方式就能合成出物品,例如書
```javascript=
event.shapeless("64x fire_charge", [
"8x minecraft:egg",//拿火焰彈當範例,新增了一個只要8顆雞蛋跟一個火藥就能和出64顆火焰彈的配方
"minecraft:gunpowder"
])
```
### 新增模組的特殊配方
有些模組的物品不是透過工作檯合成,而如果想要幫這些物品新增合成方式,可以利用`event.custom({})`語法以及json來新增合成表。
安裝[winrar](https://www.rarlab.com/)或[7-zip](https://7-zip.org/)。
對模組的jar檔案點右鍵,並選擇開啟方式

進入到`\data\<模組名>\recipes`之後,就可以看到所有物品的合成方式。
比如我想要更改這個手槍的合成。

從`recipes`資料夾中找到

打開檔案後,把裡面的內容複製起來
```json=
{
"type": "cgm:workbench",
"materials": [
{
"count": 14,
"tag": "forge:ingots/iron"
}
],
"result": {
"item": "cgm:pistol"
}
}
```
把這些內容貼到`event.custom()`中
```javascript=
event.custom({
"type": "cgm:workbench",
"materials": [
{
"count": 14,
"tag": "forge:ingots/iron"
}
],
"result": {
"item": "cgm:pistol"
}
});
```
並更改`materials`中的內容
```javascript=
event.custom({
"type": "cgm:workbench", //使用的工作檯
"materials": [ //材料
{"item":"minecraft:iron_ingot", "count":64}, //64個鐵錠
{"item":"minecraft:oak_log", "count":10} // 10個橡木原木
],
"result": { //合成出手槍
"item": "cgm:pistol"
}
});
```

其他模組的做法也一樣,把合成表複製下來,然後把材料改掉就可以了。
### 熔煉(熔爐、高爐、煙燻爐、營火)
熔爐 : `event.smelting()`
高爐 : `event.blasting()`
煙燻爐 : `event.smoking()`
營火 : `event.campfireCooking()`
官方wiki範例:
```javascript=
//在熔爐裡把一顆石頭燒成三個礫石
event.smelting("3x minecraft:gravel", "minecraft:stone")
//在高爐裡把一個鐵錠燒成十個鐵粒
event.blasting("10x minecraft:iron_nugget", "minecraft:iron_ingot")
//在煙燻爐裡把一個玻璃燒成遮光玻璃
event.smoking("minecraft:tinted_glass", "minecraft:glass")
//在營火上把木棒燒成火把
event.campfireCooking("minecraft:torch", "minecraft:stick")
```
#### 切石機
跟上面的語法基本上一樣,使用以下語法:
```javascript
event.stonecutting("9x minecraft:redstone", "minecraft:redstone_block")
```
前者為輸出項(9個紅石粉),後者為輸入項(紅石磚)
### 輔助函式
有時候會遇到合成表的排列方式相同的情況,為了減少不必要的重複程式碼,可以使用函式來簡化程式碼。
```javascript=
let example = (output, materials1, materials2) => { //建立一個函式,名稱可以自訂,這個函式有三個變數,變數名稱也都可以自訂,變數數量也都可以自行增加
event.shaped(output, [ //這行的output要對應到上面建立的第1個變數
"BCB",
" B ", //合成表
" C "
], {
B: materials1, //對應到materials1
C: materials2 //對應到materials2
});
}
example("minecraft:netherite_pickaxe", "minecraft:netherite_block", "minecraft:nether_star");
/*先呼叫函式example,在括號中依序輸入 合成出來的物品(第一項)、materials1(第二項)、materials2(第二項),
* 所以這行程式的意思就是 輸出獄髓鎬, materials1(B)為獄髓磚, materials2(C)為地獄之星*/
example('minecraft:blast_furnace', 'minecraft:furnace', "cgm:mini_gun");
//輸出高爐, materials1(B)為熔爐, materials2(C)為mini gun
```
# 自訂方塊、物品 (startup_scripts)
此功能的程式碼需要放置在startup_script資料夾,透過重新開啟遊戲來載入新內容。
可以使用`/kubejs reload startup_scripts`重新載入(可能不起作用)
## 物品
一個簡單的自訂物品:
```javascript=
StartupEvents.registry("item", (event) => {
event.create("test_item")
})
```
## 方塊
一個簡單的自訂方塊:
```javascript=
StartupEvents.registry("block", (event) => {
event.create("example_block")
});
```

這串程式會創建一個名叫`Example Block`的方塊,方塊id為`example_block`。由於沒有指定顯示名稱,在遊戲裡顯式的方塊名稱會跟方塊id一樣,只是底線變成空格。
外觀可以放在kubejs中的assets資料夾中。
如果想要更改方塊資訊,可以在下一行加上"方法(Method)"
如果想指定顯示名稱,可以加上`.displayName()`
```javascript=
StartupEvents.registry("block", (event) => {
event.create("example_block")
.displayName("範例方塊")
});
```
如果還想設定其他方塊資訊,只要在下面一行再加上其他的方法就好了
[其他的方法](https://wiki.latvian.dev/link/106#bkmrk-all-block-builder-me)

# tags(標籤)
# 擴充模組
## [MoreJS](https://www.curseforge.com/minecraft/mc-mods/morejs)
MoreJS在KubeJS的基礎上增加了更多的事件。
主要是村民以及附魔還有NBT結構加載。
---
## [KubeJS Create](https://www.curseforge.com/minecraft/mc-mods/kubejs-create)
---
## [KubeJS Thermal](https://www.curseforge.com/minecraft/mc-mods/kubejs-thermal)
---
## [KubeJS Mekanism](https://www.curseforge.com/minecraft/mc-mods/kubejs-mekanism)
---
## [KubeJS Immersive Engineering](https://www.curseforge.com/minecraft/mc-mods/kubejs-immersive-engineering)
---
## [KubeJS Blood Magic](https://www.curseforge.com/minecraft/mc-mods/kubejs-blood-magic)
---
## [KubeJS Tinkers Construct](https://www.curseforge.com/minecraft/mc-mods/kubejs-tinkers-construct)
---
## [Ponder for KubeJS](https://www.curseforge.com/minecraft/mc-mods/ponder)
未完成