我的世界模組制作教程:引言

§1 引言
原版模組指在不修改 Minecraft 游戲本體的前提下,通過命令方塊、一鍵命令、數(shù)據(jù)包、資源包等方式對(duì)游戲的可玩性做出修改。之所以稱之為原版模組,乃是為了和使用 Mod Loader/API 環(huán)境基于 Java 開發(fā)的 Mod 作區(qū)分,這些 Mod Loader/API 包括 Forge,Liteloader,F(xiàn)abric 等。自 Minecraft Java 版 1.13 起的數(shù)據(jù)包概念問世之后,原版模組的制作已變得十分便捷。本文內(nèi)的原版模組便是指利用數(shù)據(jù)包和可能的配套資源包對(duì)游戲的可玩性做出修改。
本文內(nèi)容適用于 Minecraft Java 版 1.19 版本,但大部分內(nèi)容也適合 1.13-1.18 版本,或只需要做簡(jiǎn)單修改,請(qǐng)讀者自行區(qū)分。系統(tǒng)環(huán)境為 Windows 10,其它環(huán)境下有較小的差異。本文參考和吸取了大量其他玩家的意見、建議和教程等,無法一一列出,在此一并表示感謝。
本文更側(cè)重教程而非開發(fā)手冊(cè),因此很多內(nèi)容的完整格式并沒有列出,此時(shí)請(qǐng)讀者自行查閱相關(guān)的 wiki 鏈接。由于國內(nèi)訪問?Minecraft Wiki?速度較慢,因此本文中 wiki 頁面鏈接均使用?biligame 的鏡像。由于?Minecraft 英文 Wiki?往往更新更及時(shí)且內(nèi)容更準(zhǔn)確,因此有英文閱讀能力的可直接查看英文 wiki 的相關(guān)內(nèi)容。
本文中青銅色楷體
表示其應(yīng)當(dāng)被替換為合適的字符串,綠色楷體
表示JSON文件中的注釋,點(diǎn)擊左下角顯/隱可切換顯示或隱藏注釋。
§1.1 命令基礎(chǔ)
本文不會(huì)介紹命令的基礎(chǔ)知識(shí),相關(guān)內(nèi)容請(qǐng)讀者通過如下鏈接自行了解。
命令?此為官方 wiki 的命令頁面,其中包括了命令的基本參數(shù)介紹:坐標(biāo)、目標(biāo)選擇器、數(shù)據(jù)標(biāo)簽 (NBT) 、原始JSON文本、命名空間ID等內(nèi)容。讀者需在學(xué)習(xí)命令過程中逐步了解這些概念。
記分板?此為官方 wiki 的記分板頁面,其中包括了記分板的所有準(zhǔn)則和相關(guān)命令格式,也包含了標(biāo)簽 (tag) 和組 (team) 的相關(guān)內(nèi)容。
實(shí)體格式和player.dat格式?這兩個(gè)頁面給出了所有物品和實(shí)體(含方塊實(shí)體)的 NBT。在游戲中,實(shí)體的 NBT 可通過命令?
data get entity/block
?來獲取,物品的 NBT 可通過手持并輸入命令?data get entity @s SelectedItem
?來獲取,以避免記憶大量的 NBT。新人手冊(cè)-MC命令方塊資源?該網(wǎng)站包含了很多基礎(chǔ)的教程,不過很多內(nèi)容會(huì)有些過時(shí)。還包含少量進(jìn)階的內(nèi)容,對(duì)于初學(xué)者可能較為復(fù)雜,請(qǐng)以理解其邏輯為主。
命令進(jìn)階?該網(wǎng)站雖名為命令進(jìn)階,實(shí)際上比前一項(xiàng)頁面更為初等,不過更為系統(tǒng)。
若你已對(duì) 1.18 之前版本的命令較為熟悉,可在Java版版本記錄中查看各版本間差異。
§1.2 工具準(zhǔn)備
§1.2.1 文本編輯器
原版模組涉及的文本文件,包括文本文檔(.txt)、函數(shù)文件(.mcfunction)、JSON文件(.json, .mcmeta)、頂點(diǎn)著色器(.vsh)和片段著色器(.fsh),均需使用?UTF-8
?編碼格式。注意不要誤選了?UTF-8 with BOM
?編碼格式。文本編輯器多如瀚海,讀者可自行選擇一種。我僅列出本人常用的兩個(gè)文本編輯器。
Visual Studio Code?下載安裝后,可以安裝插件?Chinese (Simplified) Language Pack for Visual Studio Code?以支持中文語言,以及Data-pack Helper Plus?用于數(shù)據(jù)包各項(xiàng)內(nèi)容的語法補(bǔ)全和糾錯(cuò)。
記事本為 Windows 系統(tǒng)自帶的極簡(jiǎn)編輯器。Windows10 的記事本已經(jīng)默認(rèn)是?
UTF-8
?編碼了。點(diǎn)擊查看->狀態(tài)欄
可以在右下角狀態(tài)欄看到,因此可以正常使用。舊版本 Windows 的記事本仍然不是,請(qǐng)勿使用。
編輯器右下角可以看到?LF
?或?CRLF
,分別表示兩種換行符,二者均可正常使用,建議使用?LF
。
為便于查看文件后綴,請(qǐng)將文件->文件夾選項(xiàng)->查看->隱藏已知文件類型的擴(kuò)展名
去掉勾選。我們可以在編輯器中新建文本文件,或者在文件夾中右鍵->新建->文本文檔
,除?txt
?以外的文本文件可通過修改文件后綴得到。
§1.2.2 壓縮軟件
數(shù)據(jù)包和資源包均可以為文件夾或 zip 文件,zip 文件需要壓縮軟件來打開和制作。游戲本體和模組本體的 jar 文件也需要使用壓縮軟件來打開。常見的壓縮軟件有:
7-Zip?是一款免費(fèi)的壓縮軟件。jar 文件可以通過
右鍵->7-zip->打開壓縮包
來打開。WinRAR?是一款付費(fèi)的壓縮軟件。
Windows 資源管理器是 Windows10 系統(tǒng)自帶的軟件。它可以使得 zip 文件如同文件夾般直接打開,壓縮則用
選擇->右鍵->發(fā)送到->壓縮文件夾
,但它的壓縮速度十分緩慢。
§1.2.3 NBT 編輯器
我們可以使用?NBTStudio?來打開 dat 文件和其它 NBT 格式文件。
§1.2.4 繪圖工具
我們可以使用?Adobe Photoshop?或其它繪圖工具來繪制紋理。Windows 自帶的畫圖由于無法生成透明背景,因此不建議使用。
§1.3 游戲文件夾
本節(jié)中我們將對(duì)游戲文件夾的結(jié)構(gòu)做簡(jiǎn)單的介紹,我們只介紹原版模組開發(fā)中涉及的內(nèi)容。.minecraft
?文件夾是 Minecraft 創(chuàng)建的并用于游戲運(yùn)行的文件夾,它包含了游戲的所有內(nèi)容。在第一次啟動(dòng)啟動(dòng)器時(shí),會(huì)自動(dòng)創(chuàng)建?.minecraft
?文件夾。參考?.minecraft。
.minecraft
?文件夾通常位于你的啟動(dòng)器目錄下。如果啟動(dòng)器中設(shè)置為各版本獨(dú)立,則位于?versions/版本號(hào)
下。另一種方式是在游戲內(nèi)點(diǎn)擊選項(xiàng)->資源包->打開壓縮包文件夾
并返回上級(jí)目錄,或者點(diǎn)擊單人游戲->選中世界->編輯->打開世界文件夾
并返回上上級(jí)目錄。
游戲本體位于?versions/版本號(hào)/版本號(hào).jar
。該文件包含了對(duì)應(yīng)版本的游戲資源和數(shù)據(jù)文件,使用壓縮軟件打開后,可以看到
原版資源包位于?
assets
?文件夾內(nèi),其中?minecraft
?文件夾為命名空間?minecraft
?下的資源文件。原版數(shù)據(jù)包位于?
data
?文件夾內(nèi),其中?minecraft
?文件夾為命名空間?minecraft
?下的數(shù)據(jù)文件。pack.mcmeta
?為原版資源包和數(shù)據(jù)包的元信息,1.17版本起不再包含該文件。pack.png
?為原版資源包和數(shù)據(jù)包的圖標(biāo)。

資源包文件夾位于?resourcepacks
,其下方子文件夾或?zip
?文件即為一個(gè)資源包,具體結(jié)構(gòu)見資源包。服務(wù)器下載的資源包位于?server-resource-packs/服務(wù)器
,可使用壓縮軟件打開。
資源文件?部分資源文件不被包含在原版資源包內(nèi),而是位于資源文件夾下,這主要包括各種語言文本和音效文件。資源文件索引位于?assets/indexes/版本號(hào).json
,打開后通過鍵值可知相應(yīng)資源的 hash 值,對(duì)應(yīng)的資源位于?assets/objects/hash前2位/hash
。例如打開?assets/indexes/1.17.json
,找到鍵?minecraft/lang/zh_cn.json
?的?hash
?為?8fb4f6725d8317a37e7f823ff424e66a46b9ef75
,因此簡(jiǎn)體中文的語言文本位于文件夾?assets/objects/8f/8fb4f6725d8317a37e7f823ff424e66a46b9ef75
,使用文本編輯器打開即可看到游戲內(nèi)的所有名稱的中文譯名。注意該文件中的中文均被轉(zhuǎn)化成了相應(yīng)的 Unicode 表達(dá)方式,參考字體。
日志位于?logs/latest.log
,可由此實(shí)時(shí)查看游戲運(yùn)行中的各種反饋。對(duì)于我們而言,它可以在加載資源包和數(shù)據(jù)包時(shí)告訴我們它們是否有錯(cuò)誤以及錯(cuò)誤信息,包括錯(cuò)誤的文件名稱、位置、錯(cuò)誤的行列數(shù)等,因此這對(duì)于我們調(diào)試非常重要。簡(jiǎn)體中文下需要設(shè)置文件編碼為?gbk
,否則除 ASCII 外的字符會(huì)顯示亂碼。歷史日志位于?logs/年-月-日-序號(hào).log.gz
,使用壓縮軟件打開后使用文本編輯器打開即可查看。崩潰報(bào)告位于?crash-reports/crash-年-月-日_時(shí).分.秒-server.txt
,如果是由于資源包或數(shù)據(jù)包引起的崩潰,可以在該文件中看到原因。
存儲(chǔ)的物品欄位于?hotbar.nbt
,存儲(chǔ)了游戲內(nèi)使用?C+數(shù)字
?存儲(chǔ)、X+數(shù)字
?取出的創(chuàng)造模式物品快捷欄。
存檔文件位于?saves/世界名稱
,由于世界格式上該內(nèi)容已較為詳盡且與原版模組聯(lián)系甚遠(yuǎn),因此我們僅提及部分內(nèi)容。該文件夾包含的區(qū)塊文件、地圖文件等內(nèi)容雖然也可以使用 NBT 編輯器來編輯,但較為不便,我們建議使用 MCEdit、地圖文件生成工具等專門的工具來編輯。存檔的備份文件位于?backups/年-月-日_時(shí).分.秒_世界名稱.zip
,為存檔的備份文件,解壓后復(fù)制到?saves
?即可使用。
進(jìn)度位于?
advancements/玩家UUID.json
,記錄了玩家已完成的進(jìn)度和進(jìn)度判據(jù)的完成時(shí)間。對(duì)于需要完成多個(gè)判據(jù)才能達(dá)成的進(jìn)度,該文件中記錄了已完成的那些判據(jù)的完成時(shí)間。區(qū)塊、實(shí)體、實(shí)體興趣點(diǎn)、襲擊等信息分維度存儲(chǔ),主世界、下界、末地、自定義維度的相應(yīng)文件分別位于根文件夾、
DIM-1
、DIM1
、dimensions/命名空間/路徑
下。世界信息文件?
level.dat
?中?WorldGenSettings
?包含了世界生成時(shí)的所有維度的生成信息,玩家可以在創(chuàng)建新的世界->更多世界的選項(xiàng)->導(dǎo)入設(shè)置
使用JSON文件導(dǎo)入,格式見自定義世界。之后還會(huì)加入數(shù)據(jù)包中的自定義維度。數(shù)據(jù)包文件夾位于?
datapacks
,其下方子文件夾或?zip
?文件即為一個(gè)數(shù)據(jù)包,具體結(jié)構(gòu)見數(shù)據(jù)包。結(jié)構(gòu)位于?
generated/命名空間/structures/文件.nbt
,其記錄了游戲內(nèi)使用結(jié)構(gòu)方塊保存的結(jié)構(gòu),將其移動(dòng)至數(shù)據(jù)包內(nèi)方可使用。
§1.4 JSON文件
參考JSON。數(shù)據(jù)包的進(jìn)度、戰(zhàn)利品表、戰(zhàn)利品表謂詞、物品修飾器、配方、標(biāo)簽、維度、維度類型、自定義世界生成,資源包的語言文件、模型、音效、字體、credits.json
?等文件均為JSON文件。.mcmeta
?文件也是JSON文件,因此格式也是相同的。
JSON文件中用于分割的空格、制表符(Tab)、回車和換行符都是可去的,它們僅用于提高可讀性。編寫時(shí),使用空格或制表符縮進(jìn),以便于查看括號(hào)匹配和層次。JSON文件通常包含用于封裝文件數(shù)據(jù)的一對(duì)大括號(hào){}
,即它是一個(gè)JSON對(duì)象,但戰(zhàn)利品表謂詞和物品修飾器文件的根數(shù)據(jù)類型還可以為JSON數(shù)組。它包含類似?"abc": "def"
?這樣的?"鍵": 值
?對(duì),一般使用單引號(hào)也可以。同一個(gè)文件中如果允許有相同的鍵,則后者會(huì)覆蓋前者。
JSON數(shù)據(jù)類型有下述幾種。Wiki 上有關(guān)頁面使用了 NBT 的數(shù)據(jù)類型標(biāo)注,但其實(shí)并不適用于JSON文件,我們應(yīng)當(dāng)將其視為相應(yīng)內(nèi)容的可取值范圍。
布爾型,值為?true
?和?false
。
數(shù)值,值為任何數(shù)字。2
?和?2.0
?沒有差異。
字符串,值使用雙引號(hào)/單引號(hào)圈住,可以使用顏色代碼如?§6
、換行符?\n
。
數(shù)組,值使用中括號(hào)圈住。
對(duì)象,使用大括號(hào)圈住。整個(gè)JSON文件內(nèi)容本身就是一個(gè)JSON對(duì)象。
JSON中沒有注釋的語法,但可以使用不被使用的鍵來表示注釋。通常使用?"_comment", "_comment1", "_comment2"
?這種鍵。
我們常常在JSON中用整數(shù)來表示RGB格式顏色,對(duì)應(yīng)值為:?65536×R+256×G+B
。