Minecraft 伺服器安裝資料包:確認已經載入,沒有作用時從訊息找出原因

摘要

資料包能替 Minecraft 世界加上新功能,但放進伺服器後常常沒有任何效果,有些情況也不會顯示錯誤。只要放對位置並檢查資料包清單,就能分辨是放錯地方、多包一層,還是資料包太舊。

文章目錄

下載了資料包(Data Pack)放進 Minecraft 伺服器後,資料包常常沒有任何效果,有些情況伺服器也不會顯示錯誤。只要把資料包放到正確的位置並檢查清單,就能找出沒有作用的原因並修正。

本文的測試環境是 Windows 11、Java 25 與原版伺服器 26.3。開始前要先有一台能啟動的伺服器,還沒有的話可以先架設 Java 原版伺服器。如果資料包會修改世界的內容,安裝前要先備份伺服器的世界。

資料包的位置

資料包要放在世界資料夾裡的 datapacks,也就是伺服器資料夾裡的 world/datapacks。伺服器開著時也可以放入資料包,server.jar 與世界的其他檔案都不用動。

資料包可以是資料夾,也可以是不用解壓縮的 .zip 檔。打開資料包後要直接看到 pack.mcmeta 與 data,就像下面這樣:

檔案總管打開資料包 hello,裡面直接看得到 data 資料夾與 pack.mcmeta 檔案

如果打開後只看到另一個資料夾,就代表多包了一層,放進去也不會有作用。放對與放錯的差別如下:

左邊是伺服器讀得到的放法,world/datapacks 裡的 hello 或 hello.zip 打開就有 pack.mcmeta 與 data。右邊是讀不到的放法,一個是 datapacks 直接放在伺服器資料夾,另一個是 hello 裡又包了一層 hello

載入與確認

資料包放好後,在伺服器視窗輸入 reload,新放入的資料包會自動啟用。接著輸入 datapack list 查看清單,資料包的名稱出現在已啟用的那一行,就代表載入成功。訊息裡的 [Not Secure] 不用理會:

伺服器視窗依序輸入 reload、datapack list 與 function hello:hi,已啟用的清單有 file/hello,最後一行印出 hello from datapack

資料包有效果時,進遊戲也看得到。下圖是測試資料包執行後,文字出現在遊戲聊天欄的樣子:

遊戲畫面左下角的聊天欄顯示 Server hello from datapack,背景是莽原地形

如果資料包在 available 那行,就輸入 datapack enable "file/hello" 啟用它。名稱要照清單寫,壓縮檔要含 .zip,引號也不能省略。

大多數資料包只要 reload 就能使用。資料包新增的是維度或附魔時,則要輸入 stop 再重新啟動,否則清單雖然顯示已啟用,使用時卻會出現 Unknown dimension 或 Can't find element 這類訊息。

沒有作用時的排查

資料包沒有作用時,先看 datapack list 有沒有這個資料包,再看 reload 時伺服器視窗印出的訊息:

datapack list 情況 伺服器視窗的訊息 處理方式
沒有出現 放錯資料夾 沒有訊息 移到 world/datapacks
沒有出現 壓縮檔多包一層 印出 Missing metadata in pack 解壓縮後把內層資料夾移到 datapacks
沒有出現 資料夾多包一層,或 pack.mcmeta 檔名不對 印出 Found non-pack entry 把 pack.mcmeta 放到第一層並修正檔名
已啟用 舊版資料包,資料夾是 functions 沒有訊息,執行時顯示 Unknown function 下載支援目前版本的資料包
已啟用 資料包裡有舊指令或錯誤的指令 印出 Failed to load function 下載支援目前版本的資料包
伺服器無法啟動 資料包新增的維度或附魔有錯 印出 Failed to load datapacks 把資料包移出 datapacks 再啟動

伺服器不會因為版本號碼太舊或太新就拒絕資料包,舊版的資料包也會顯示已啟用。因此資料包已啟用卻沒有作用時,多半是資料包太舊,直接下載支援目前版本的檔案最簡單。要移除資料包時,把它移出 datapacks 再輸入 reload 即可。

自己修改資料包時

如果找不到新版的檔案,或資料包是自己寫的,就要自己修改內容。Minecraft 在 1.21 的開發版把資料包的資料夾由複數改成單數,舊版資料包要把 data/<命名空間> 底下的 functions 改成 function,tags/functions 改成 tags/function,再輸入 reload。

function 裡只要有一行無法解析,reload 時伺服器視窗就會印出 Failed to load function,下一行則是錯誤原因。下圖的 hello:bad 把第 2 行的 setblock 打成 setblok,line 2 就是出錯的行數,下方一長串 at 開頭的內容不用理會:

伺服器視窗輸入 reload 後印出 Failed to load function hello:bad,下一行寫著 Whilst parsing command on line 2: Unknown or incomplete command,再輸入 function hello:bad 則顯示 Unknown function

function 寫了舊指令時也是同樣的訊息,舊的遊戲規則名稱可以查 Minecraft gamerule 新舊名稱對照。26.3 的 pack.mcmeta 要用 min_format 與 max_format 宣告支援的版本,資料包版本是 121:

1{
2  "pack": {
3    "description": "test pack",
4    "min_format": 121,
5    "max_format": 121
6  }
7}

實測紀錄

我用只有一行 say 的測試資料包,在原版 26.3 伺服器逐一重現上面的情況。每種情況都從新世界開始,放入資料包後先 reload,再重開伺服器確認一次。維度與附魔的錯誤則用另外的測試資料包確認。

總結

資料包要放在世界資料夾裡,打開後不能多包一層,放好後重新載入就能使用。實測伺服器不會因為版本號碼不符就拒絕資料包,因此已啟用卻沒有作用時,要先懷疑資料包太舊。

接著可以做什麼

上一篇Minecraft BlueMap 3D 網頁地圖:朋友不用進遊戲也能看世界與玩家位置Games下一篇Minecraft 伺服器卡頓排查:用 spark 找出延遲來自實體、漏斗還是外掛Games
Ted Liou

Ted Liou

現役軟體工程師,Unity、AI 技術開發經驗分享與諮詢。