主題

Minecraft資料包技術整理01 - 簡介、移植指令方塊

| 2022-06-24 22:46:25 | 巴幣 32 | 人氣 116

  前言 
這系列文章的目的是整理設計資料包所需的基本知識、提供設計思路。
發布於巴哈小屋,會挑幾篇拿去專板,小屋版比較常做內容維護。
巴哈闇黑模式的調色可能會導致閱讀困難,去叫站方修,不關我的事。

開始閱讀前,請確認自己擁有下列知識:
1. 基礎指令語法
更複雜的結構先不用,至少要解釋得出
/tellraw @r[limit=2] {"text": "Hello", "color": "gold"}
在幹嘛。
文章重點是組合各種指令達到想要的效果,不是手把手幫你把指令改到不會報錯。
2. 指令方塊用途
也沒多難,下圖兩條方塊的運作方式能清楚解釋就夠了。
3. 最基本的英文單字
文法那些沒有要求,反正沒用。
基礎英文單字還是要認得一些吧,每個詞都要翻譯好麻煩耶。
專有名詞和難一點的單字我還是會解釋。

  簡介 
資料包是透過外部檔案提供指令和其他資料,改變地圖行為模式的一種方式。
和指令方塊最大的差異在於,指令方塊在地圖間移植比較麻煩,不像檔案只要Ctrl+CCCCCV就能搬走。
還有和非指令資料互動的功能,可以做到的事情比指令方塊多。

資料包的檔案結構如下:
this_is_a_datapack.zip/
├─ pack.mcmeta
├─ pack.png
└─ data/
   └─ …
斜體字部分是可以任意命名的檔案名稱。
除了壓在.zip裡面以外,也可以裝在資料夾裡面,通常在開發&測試過程中會放資料夾,發布的時候改成壓縮檔。

根據安裝的時機,資料包大致上分成兩類:
1. 單純的擴充功能
在地圖玩到一半時加入/移除也沒什麼關係的東西,例如指令、進度、合成表。
2. 世界生成設定
在創造世界的選單上做修改、變更生成世界的規則等,在進到地圖前就必須存在的東西。
這系列文章主要講解1的部分,2之後看有沒有人寫,總之也是一個大坑,而且認真起來會需要一堆數學,難度比1高很多。

檔案結構看起來和資源包(材質包)很像,但資料包是跟隨單張地圖的,沒有裝在整個遊戲內的選項。

  安裝 
把資料包放進 saves/指定世界/datapacks/ 裡面,然後重新載入世界。
指令/reload或是單人模式退出重進都算。
新增的資料包會在重新載入的時候自動啟用。

指令/datapack list可以查看目前地圖所有的資料包。
/datapack disable停用目前啟用中的指定資料包。
/datapack enable啟用目前停用中的指定資料包,後面的參數before ??、after ??、first、last等,用來指定載入順序。

資料包從最前面的(first)開始,依序載入到最後面的(last)。
載入過程中如果發現兩個資料包試圖提供相同的檔案(例如,都想修改破壞石頭時掉落的物品),遊戲會採用比較後方的資料包。

裝過資源包(材質包)的話,可以用這張圖來理解:

  pack.mcmeta 
資料包的設定檔,同時也是遊戲識別資料包的檔案。
格式是標準JSON,內容類似這樣:
{
    "pack": {
        "pack_format": 10,
        "description": {"text": "Description here"}
    }
}

• pack_format
資料包適用的遊戲版本,近期版本的編號對照如下。
版本 編號
1.17.0~1.17.1 7
1.18.0~1.18.1 8
1.18.2 9
1.19.0 10
不同版本間可能會有不相容的狀況,升/降版本的時候請留意相關內容更動。
本文以format 10的內容為準,日後可能會更新至新版本。

• description
描述文字,會在部分介面中顯示。
直接使用raw JSON text格式。

• filter
可能有人知道1.19增加了這個,之後的章節再說,這個欄位不寫出來是沒關係的。

  命名空間 
對應的英文是namespace。

用來避免名稱衝突的一種設計,用來標記「這個內容是由誰提供的」。
例如銅錠的ID是minecraft:copper_ingot,這個minecraft就是一個命名空間。
這樣一來,就能和諸如whatever:copper_ingot等同名物品有分別,又同時不會讓銅錠的ID變成copper_ingot_from_minecraft之類很彆扭的東西。

  data/ 
this_is_a_datapack.zip/
├─ pack.mcmeta
├─ pack.png
└─
data/
   └─ …
標記紅字的資料夾。
裡面存放所有資料包提供的檔案,結構如下:
data/
└─ namespace/
   └─ category/
      ├─ file.ext
      └─ …

• namespace
可以任意取名的命名空間。
通常會用資料包名稱或作者名稱,以減少名稱衝突的可能性。

• category
檔案類別。
例如指令檔案的分類是functions。

• file.ext
指定格式的檔案,包括可以任意取名的檔名file和指定的副檔名ext。
「指定的副檔名」如:指令檔案是.mcfunction,進度檔案是.json等。

  指令檔案 
更常稱為「函數」。

以下述檔案為例:
data/
└─ demo/
   └─ functions/
      └─ test01.mcfunction

檔案內容:
tellraw @a {"text": "hello, world"}
tellraw @a {"text": "this function is executed by ", "extra": [{"selector": "@s"}]}

每一行相當於放在一個指令方塊裡的指令,由上而下執行。
指令的開頭不需要,而且不可以加上斜線「/」。

執行的時候,在遊戲中輸入指令
/function demo:test01
就可以看到聊天欄輸出:
hello, world
this function is executed by Merak_X
Executed 2 commands from function 'demo:test01'
第二行會顯示執行者的名字,不是固定成我的。
第三行是/function指令本身的輸出,跟執行/time set 0之後會有輸出是一樣的道理,可以透過關掉sendCommandFeedback規則來隱藏。

• /function
執行指定的指令檔,後面的函數名稱跟平常習慣的ID很像,冒號「:」前面是命名空間,後面是檔名。
注意,資料夾functions因為是檔案分類,所以沒有打出來,附檔名.mcfunction也不需要。

  指令註解 
指令檔案裡面以井號「#」開頭的一行字會被忽略,所以可以在後面打上任意文字。
作用類似貼在指令方塊旁邊的告示牌,跟幾個月後的自己說這段指令在做什麼。
所以,在剛才的demo:test01裡面多打這堆垃圾內容也不會影響執行結果:
# bla bla bla
#kill @a
tellraw @a {"text": "hello, world"}
tellraw @a {"text": "this function is executed by ", "extra": [{"selector": "@s"}]}

  資料包編輯器 
請問這段算是一種工商時間嗎
用Windows內建的記事本寫指令感覺很不方便嗎?
推薦試試看免費編輯器VS Code。

上面有人提供附加程式Datapack Helper。
附加程式安裝教學:

剛才的demo:test01看起來會像是這個樣子:

除了上色和基本的錯誤檢查以外,還附贈了輸入提示功能:
可以少記憶一堆細枝末節的東西,又不需要整天查wiki看標籤名稱叫什麼。

背後有開發團隊負責讓指令上色、提示內容和遊戲版本同步。
這是這個附加程式的優點也是缺點,到目前為止他們不支援舊版,以現在1.19期間來說,pack_format只允許是10,打9會被視為錯誤。

  Next up 

創作回應

更多創作