MC 煉金工藝 – 自訂義配方

0. 前言


在生存當中你是否曾覺得某些道具取得麻煩?是否曾妄想過能夠合成特殊道具?

這些事情也能透過 Datapack 進行擴增,接著就來看看如何取代以及擴增物品的合成配方吧!

1. 重點


利用指令道具在 minecraft/recipe 目錄下的覆蓋配方是最基本的禁用方式
在 1.20.5 後配方可以透過 components 增加物品標籤建立客製化物品

版本變動

在 1.21 許多目錄的 s 都被移除了,並增加了許多過往沒有的架構,請先觀察欲開發版本 jar 檔案

2. 內容


2.1. 配方架構

老樣子先講解架構,我們進入版本的 JAR 執行檔,進入 data >> minecraft >> recipe,這個目錄底下是遊戲中所有的原本合成配方。

那關於合成方式設有兩種型態: shapelessshaped,代表就是是否需要擺為特定形狀。

這邊另外拿兩份檔案進行範例解說。

2.1.1. 相思木按鈕 acacia_button
JavaScript
{
  "type": "minecraft:crafting_shapeless",
  "category": "redstone",
  "group": "wooden_button",
  "ingredients": [
    {
      "item": "minecraft:acacia_planks"
    }
  ],
  "result": {
    "count": 1,
    "id": "minecraft:acacia_button"
  }
}

可以看到 shapeless 所對應的是 ingredients 只管要有那些素材而不論位置。那我挑選木造按鈕的原因在於它有 group 標籤,而 group 的概念在於相同配方架構下,可能因為不同木材不同顏色而有變化。

2.1.2. 釀造台 brewing_stand
JavaScript
{
  "type": "minecraft:crafting_shaped",
  "category": "misc",
  "key": {
    "#": {
      "tag": "minecraft:stone_crafting_materials"
    },
    "B": {
      "item": "minecraft:blaze_rod"
    }
  },
  "pattern": [
    " B ",
    "###"
  ],
  "result": {
    "count": 1,
    "id": "minecraft:brewing_stand"
  }
}

相對釀造台就是 shaped,那對照的是 pattern 與 key,其中 key 代表 pattern 內相對位置的素材條件。另外 pattern 不一定要擺滿九宮格,比如原版的樣式是兩行,所以我們在合成上可以是一二行或二三行。

剛才提到 group 的概念在於相同配方架構下。而 category 則代表物品合成出來後該歸在哪一類,最直觀的就是創造模式下能看到的物品分頁。尾端的 result 則對應合成結果與數量,那這是原版的情況,我們後續會再加上 components 創建自訂義物品的配方。

那雖然今天主軸都在合成台的配方上,還是多介紹下其他合成站的狀態。那在下方沒有 count 標記就代表沒法更動結果數量,但都可以加上 components 。

但根據 Minecraft Wiki 現在還有個致命缺點,就是只支援結果能設定 NBT Tag,也就是說我們沒法將客製化物品做為合成素材使用,因此這範疇還是要仰賴 Floor Crafting 達成。

2.1.3. 燒製型配方

包括熔爐, 高爐, 營火, 煙燻爐都是燒製的範疇,讀取的都是 ingredient,並配有給予玩家的經驗與燒製時長的設定。

2.1.4. 切石機配方

同樣也是讀取單個 ingredient,但輸出可以多設定數量,且能單個素材產出多個結果。

2.1.5. 鍛造台配方

我們知道在 1.20 系列更新我們多出了鍛造模板,而鍛造台呢也就是針對三個欄位讀取去合成結果。

2.2. 配方增減

我們接著就來實作看看如何覆蓋以及增加物品的合成方式吧。

2.2.1. 覆蓋配方

覆蓋原版配方可用來調整物品取得難度或禁止生存手段合成物品。那在這個案例中我將會以禁止釀造台為實作,後續我們的藥水將透過大鍋搭配 Floor Crafting 形成更好的視覺效果。

那我們偷個懶用這個視覺化的網站幫忙編寫,在上方選用合成配方後,稍微往下滑記得先選取你的遊戲版本,接著參照版本 JAR 內的規格在 Output Recipe 取名為 brewing_stand,接著我們往上勾選 “Exactly where placed (準確放哪)” 。

我們首先搜尋 brewing 並找到釀造台放到結果欄位,接著從右側的素材中搜尋 barrier 這只能靠指令拿到的物品並拖拉進合成表之中。那接著我們要簡略的第二層保險,避免用戶意外在遊戲內發現配方,我們多拉幾個屏障並且不規則的放入。

接著你可以選用是否要設第三層保險,比如我就多搜尋 knowledge 把其中一個屏障改為知識之書。

完成之後滑到最底層,點選 Download JSON,並且將這放檔案放到 Datapack 的 minecraft/recipe 中。返回遊戲之中首先輸入 /reload,將著嘗試看看原版的合成配方是否已被取代。

2.2.2. 增添配方

相對的有減少我們就來操作增加,我們刷新網站並命名配方,那由於我們是超出原版的內容,只要確保檔名在目錄內沒有重複就能隨便亂取,比如我打 testing123 。那我們這次改用 shapeless 進行示範,我們將結果設為麵包(bread)素材設為一綑小麥(wheat),完成之後就進行輸出。

接著將 JSON 放到 Datapack 的其他分支,比如我的在 course/recipe 之中,這時我們就有原版的 bread 與我們的 testing123 兩個配方。我們回到遊戲 /reload 後進行測試,測試原版的新增的兩種合成方式。

當然放到 minecraft/recipe 因為檔名沒相衝也可以使用,但建在分支的優點就在於方便跟著更動並且能使用原版物件的名稱。比如我今天突然將整個分支移到其他 Datapack,我不用另外再搬動合成配方。

2.3. 合成客製化物品

接著我們就要進行 components 的調整,那我們所使用的網站可以對合成表上的物件右建刪除或設定 custom_data,但由於該網站能改動的部分很少,因此還是以編譯器直接進行修改。

我們就拿過往製作的材質包來練習,再度刷新清空合成表後我們合成蜂蜜瓶,為求簡單選個 shapeless,拿個空瓶 bottle 跟紅石 redstone dust,我們命名為 932230 後輸出 JSON,並將其複製到分支的 recipe。

JavaScript
{
    "type": "minecraft:crafting_shapeless",
    "ingredients": [
        {
            "item": "minecraft:redstone"
        },
        {
            "item": "minecraft:glass_bottle"
        }
    ],
    "result": {
        "id": "minecraft:honey_bottle",
        "count": 1,
        "components": {
            "minecraft:custom_model_data": 932230,
            "minecraft:custom_name": "\"Healing Potion\""
        }
    }
}

上述範例看到最底層的 components,這個是在 1.20.5 才加入的 NBT 架構,因此你可以到參考資料找下我過往整理的「1.20.5 物品常用標籤」或官方的「Snapshot 更新誌」。

那我們上面範例就練習到 Custom Model Data 與物品名稱的設定,完成之後就能進到遊戲實驗啦,阿別忘記先載入過往練習的材質包,應該要能看到之前設定的樣式。

注意事項

若有裝光影的話 objmc 的 3D 模型基本上是會壞的,可以嘗試換成 2D 的圖樣進行

3. 後話


目前客製化藥水的合成只是作為範例,我所希望的是透過 Floor Crafting 在大鍋中更有視覺化的進行釀造,這也是前面封禁釀造台的主因。

那麼下回我們就會透過辨識物品底下的方塊或物體設定特製的合成台,先讓物品準確的落在中心點。

4. 參考


[1] Minecraft 1.20.5 物品參數更新 — 八寶周的研究小屋
https://babaochou2420.com/2024/06/14/minecraft-1-20-5-item_cmd_update/

[2] 官方 Snapshot 更新誌
https://www.minecraft.net/en-us/article/minecraft-snapshot-24w09a

[3] Recipe — Minecraft Wiki
https://minecraft.wiki/w/Recipe

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.