開天辟地 —— 用數據包自定義維度(序&一)
自從1.16以后,Minecraft開始允許數據包開發(fā)者通過json文件的方式,向Minecraft中注冊和添加新的維度和生物群系。而在1.18更新后,自定義世界的功能變得更為強大,當然也更加復雜。本系列文章旨在以Wiki資料為基礎的介紹中,結合作者本人的開發(fā)經驗和研究,對Minecraft地形生成進行淺析,以幫助更多的開發(fā)者學習和使用自定義世界的功能。
我們不會滿篇幅地引用源碼或者介紹一些深入的知識,只會用數據包本身特有的方式,即json文件作為例子,來介紹如何使用數據包對世界生成進行設計和自定義。
在之前,筆者搬運過一個視頻,原作者是原Mojang的員工。讀者可以從這個視頻中了解到地形生成的大致機制,從而對數據包控制地形生成的原理有大致的掌握。
https://www.bilibili.com/video/BV13u411j7KX/
引子
在開始詳細介紹前,我們需要先簡要了解一下一個Minecraft世界是怎樣被數據包控制的。事實上,你可以從數據包的文件夾結構中略知一二。如果你熟悉數據包的話,你應該能知道數據包的一個命名空間下可以有很多注冊項,其中我們最需要關注的項則是dimension
和dimension_type
,以及worldgen
下的各種內容。前兩個決定了Minecraft中的維度,而后者則決定了這個世界(維度)應該怎樣生成。而在worldgen
文件夾下,你又能看到一連串令人頭暈目眩的各種文件夾,不過別著急,我們將會慢慢介紹它們。根據它們的功能,我們將這些文件夾分類列在了下方。
維度生成
dimension
dimension_type
地形生成
noise
noise_settings
density_function
configured_carver
生物群系
biome
地物
configured_feature
placed_feature
結構生成
processor_list
structure
structure_set
template_pool
在寫本文的時候,Minecraft正式版的版本號為1.20.1,所以文章的一切都會以1.20.1的格式為準。
基礎準備
首先,要使用數據包編輯世界,你首先需要了解數據包的基本框架和結構。數據包的世界生成并不需要任何命令的參與,因此不用擔心命令方面的基礎問題。其次,你還應當了解json文件的編寫方式,以及學會閱讀minecraft wiki中的json的表示格式。由于世界生成的json一般又臭又長,因此建議使用vscode中的datapack-helper plus插件進行自動補全以及格式糾正。同時,你也可以使用misode制作的在線編輯器數據包生成器 – Minecraft 1.18, 1.19, 1.20 (misode.github.io),它可以實時預覽很多json文件的結果,同時也提供了大量的原版預設可供參考。
要在Minecraft中自定義世界,首先需要學會的便是定義一個新的維度。有了新的維度,你可以在里面做很多的事情,哪怕是一個超平坦世界,也可以意味著你能在一個普通的世界中通過添加一個新的超平坦維度來加入一個超平坦的世界。同時,一個簡單的多維度世界也能作為很好的測試場地,避免直接對主世界造成破壞。
首先,讓我們找到wiki中相應的參考頁面——自定義維度 – Minecraft Wiki_BWIKI_嗶哩嗶哩 (biligame.com)。參考wiki是一個很重要的能力,因為隨著版本的更新,會新增或者改變很多東西,在沒有其他人的介紹的時候,wiki就是最好的參考的資料了。處于網絡連接方面的考慮,本文將會直接使用鏡像站網頁,如果需要最新的參考資料,還是建議去原wiki站點參考。
wiki告訴我們,自定義維度的定義主要由兩個部分組成,一個是維度(dimension),一個是維度類型(dimension_type)。前者主要用于控制維度的地形、生物群系生成等,后者則用于維度中的各種設置,例如晝夜循環(huán)、床會不會爆炸、環(huán)境光照等等。
維度類型(Dimension Type)
維度類型以Json文件的形式存儲在數據包的data/<命名空間>/dimension_type/<維度類型名稱>.json
內。它的基本格式如下:

Wiki中的描述很詳細,每一個鍵都有對應的詳細解釋,我們這里就不贅述了。唯一需要說明的一點東西便是這個整數提供器,這里其實只用寫一個整數就好了,不用考慮那么多。
給出一個主世界的維度類型作為例子:
維度(Dimension)
維度以JSON文件的形式存儲在數據包的data/<命名空間>/dimension/<維度名稱>.json
下。它的基本內容如下:

首先一個便是type
,即維度類型,也就是咱們上面剛剛提到過的東西了。當然,除了自定義以外,你也可以使用原版的四種設置,也就是wiki中列出來的四個(從左到右分別是,主世界,地下版的主世界,下屆,末地)。
然后是一個被折疊的生成設置,它展開后是這樣樣子的:

哇,又是超級多的設置,不過仔細一看,其實是包含了很多種類。具體來說,生成設置分為噪聲、超平坦和調試世界三種。噪聲就是普通的主世界使用的方式,超平坦應該是非常熟悉的了,調試模式可能冷門一些,是一種技術性的內容,基本不會用到。如果不知道的話,可以看看這里:調試模式 – Minecraft Wiki_BWIKI_嗶哩嗶哩 (biligame.com)
那么,讓我們著重把目標放在噪聲和超平坦這兩個類型中。
記得填寫一下type
的說!
超平坦(flat)
超平坦,也就是,沒有地形的起伏,每一層都是一樣的方塊。它的生成設置相當簡單:

咱們一個一個看。
首先是layers
。正如wiki中所說,這是一個列表,控制了每一層方塊的合成。例如
就代表了會在y=1的位置生成一層石頭。很可惜,即使是多層連續(xù)生成相同的方塊也不能寫一個范圍區(qū)間什么的(mojang你給點勁兒呀?。?/p>
第二、三、四個鍵按照wiki填寫即可。地物就是地面生成的各種裝飾物,例如樹、草、花等等。
第五個參數表示了一些將會生成的結構集。至于結構集具體是什么,會在以后的內容中說明,這里的話,就把它理解為結構的命名空間id,也就是你在/locate
后面會填寫的東西,比如minecraft:stronghold
代表一個要塞。
下面是一個例子,這是最常見的超平坦,也就是一層基巖加三層泥土和草方塊的那種:
它的結構中只會生成村莊,因為structure_overrides
中只有minecraft:villages
這一種。
噪聲(noise)
噪聲是最常用的世界生成方式,也是Minecraft中默認世界的所有維度采用的生成方式。它的格式如下:

在這里,我們看到第三個鍵,即biome_source
又有五種類型,即minecraft:vanilla_layered
、minecraft:fixed
、minecraft:checkerboard
、minecraft:multi_noise
和minecraft:the_end
。其中,minecraft:multi_noise
就是噪聲生成,是最復雜也是最常用到的,因為它的自定義程度最高。但是我們這一章節(jié)主要講解維度的基本定義和注冊方式,目標是讓你能夠在幾分鐘內學會定義一個新的維度,因此不會細細講解世界生成的過多內容。為了簡便起見,我們只會講另外四種,而噪聲相關的內容,我們會放在下一個章節(jié)中詳細講解。
minecraft:vanilla_layered
就是主世界生成的方式。如果填寫這個,將會用主世界一樣的方式生成生物群系。minecraft:fixed
代表了單一的生物群系,它會讓世界中只存在一種生物群系。minecraft:checkerboard
則會像棋盤一樣生成格子狀的生物群系。minecraft:the_end
則會用和末地一樣的方式生成生物群系。

第二個鍵是setting
,它是世界地形生成的核心部分,我們也會放在接下來的幾個章節(jié)進行詳細介紹。這一章節(jié)中,為了簡便起見,你可以使用原版預設好的噪聲設置,比如overworld
代表主世界,nether
代表下屆,caves
代表洞穴,end
代表末地,floatning_islands
代表空島,large_biomes
是超大生物群系等等。
總結
可以看到,即使我們已經進行了大量的簡化,維度的注冊和定義依然耗費了我們相當的篇幅來講解?,F在,我們來稍微總結一下在Minecraft中新建一個維度需要一些什么。
首先,維度分為兩個部分進行定義,一個是維度類型,代表了維度會有的各種性質,另一個是維度設置,即維度是如何生成的。維度的設置又分為生物群系的設置和地形的設置兩種,我們這篇文章主要講解的是幾種比較簡單的生成方式,但是也足夠玩上一陣子了。
通過一個簡明的例子可能會有更好的理解呢。比如,我們要新增一個維度,這個維度有足足1024格高(y軸上下各512層),同時它和主世界一樣有晝夜循環(huán),天空光照。然后,我們再讓這個維度豬靈友好,這樣的話豬靈也能欣賞主世界一樣的晝夜輪回。最后,我們加一些小小的惡趣味,讓這個世界的床會像下屆和末地一樣發(fā)生爆炸。當然,它也有一些基本的生物群系,呈現小小的棋盤分布,那么,我們可以這么寫:
首先寫出維度類型data\test\dimension_type\test.json
:
然后設置維度的生成方式\data\test\dimension\test.json
,讓它擁有棋盤一樣的生物群系生成方式:
值得注意的是,由于我們將控制地形生成的settings
填寫為了minecraft:overworld
,因此它會擁有和主世界一致的地形起伏。