- 致编者:请牢记我们的域名wiki.mcbe-dev.net!
- 致编者:欢迎加入本Wiki的官方交流QQ群或Discord服务器!
- 基岩版1.19.31现已发布!(了解更多)
- Inner Core现已支持Xbox模组联机!(了解更多)
- 如果您是第一次来到本Wiki,欢迎注册一个账户
- 点击顶部的“编辑”或“编辑源代码”按钮即可编辑当前页面
- 请知悉:在不登录时也可以编辑和新建页面,但是您当前的IP地址会记录在编辑历史中
教學:製作附加包/生態域
該頁面的編輯正在進行中。 請幫助我們擴充或改進這篇文章。 |
注意事項[編輯]
- 生態域有關的內容現在是實驗性玩法,必須為每個使用包含生態域定義的行為包的世界啟用實驗性玩法。
- 現在遊戲內的有關生態域除錯內容工作的極其差,如果宣告的有效,那一切都正常執行,否則將拋出錯誤。這個錯誤不僅僅是出現了多餘的鍵的那一項,而是幾乎除
format_version
外的所有的鍵都拋出錯誤。(但官方正在改進,面對大部分有誤的地方,記錄GUI都正常的拋出錯誤) - 官方並沒有給出良好的文件,現在本文件提供的大部分內容都來自於其它Wiki和社群的開發人員,在感謝他們的同時,本文件也儘量使用最新正式基岩版的語法格式。
引言[編輯]
生態域(Biome)是Minecraft世界中形態各異的地區,有著多樣的地理特徵、植物群、海拔高度、溫度、濕度、天空及植被顏色。生態域將生成的世界劃分為一個個不同的自然環境,譬如森林、叢林、沙漠和針葉林。
透過編寫 生態域資料 您可以:
- 變更生態域的一般形狀
- 變更生態域生成的比例
- 變更生態域的裝飾特徵(例如樹和草的分布)
- 變更生態域的氣候
- 變更生態域的生物
- 變更生態域的霧效
接下來讓我們開始。
群系基本宣告[編輯]
想要宣告修改任何群系,都必須要先有行為包,接下來在行為包的biomes
資料夾中,建立群系檔案。其格式必須如下:
*biome_name*.json
或 *biome_name*.biome.json
這裡有以下幾點要注意:
- 任何以
.
開頭的檔案都將使遊戲崩潰。這可能導致某些開發會受到影響,如macOS上的.DS_Store 檔案。 - 不要使用任何子資料夾。
biomes
資料夾中不應該放入任何其它的子資料夾(用於分類之類的事),因為子目錄中的所有宣告都將被忽略。 biome_name
必須與接下來檔案內部中的identifier
一致。要注意的是biome_name
並不包括命名空間,這個同樣於檔案內部的identifier
相一致,故而你不應該在檔案中出現任何的:
。- 對於3中提到的問題,BedrockWiki為我們提供了一種使用
.
的方法。這個例子如下:biomes/fancycraft.fantasy_realms.magical_springs.hills.mutated.json
。在這裡,fancycraft
是開發人員,fantasy_realms
是行為包名稱,magical_springs
是頂級生物群落名稱,hills
和mutated
是子生物群落型別,json
是必需的副檔名(這個例子中可選的.biome
被省略)。不過在本教學中,我們不使用這種方法。 - 無法正確讀取的
json
會被遊戲忽略,另外遊戲現支援的不允許使用注釋。
好,接下來我們正式開始。在剛剛的注意事項中,相信您已經發現了群系的宣告與其他宣告同樣使用.json
檔案。下面我們來看遊戲中1.21.51
版本的一個例子:
// 以下来自于游戏安装包的/assets/definitions/biomes目录下
{
"format_version": "1.20.60",
"minecraft:biome": {
"description": {
"identifier": "forest"
},
"components": {
"minecraft:climate": {
"downfall": 0.8,
"snow_accumulation": [ 0.0, 0.125 ],
"temperature": 0.7
},
"minecraft:multinoise_generation_rules": {
"target_temperature": 0.0,
"target_humidity": 0.5,
"target_altitude": 0.0,
"target_weirdness": 0.0,
"weight": 0.375
},
"minecraft:overworld_height": {
"noise_type": "default"
},
"minecraft:surface_parameters": {
"sea_floor_depth": 7,
"sea_floor_material": "minecraft:gravel",
"foundation_material": "minecraft:stone",
"mid_material": "minecraft:dirt",
"top_material": "minecraft:grass_block",
"sea_material": "minecraft:water"
},
"minecraft:overworld_generation_rules": {
"hills_transformation": "forest_hills",
"mutate_transformation": "flower_forest",
"generate_for_climates": [
[ "medium", 1 ],
[ "cold", 1 ]
]
},
"minecraft:tags": {
"tags": [
"animal",
"forest",
"monster",
"overworld",
"bee_habitat"
]
}
}
}
}
是的,identifier
告訴我們這是有關森林群系的宣告。按照之前的內容,我們可以知道它的檔案名必然是forget.json
,事實也正是這樣。但令人意外的是format_version
告訴我們它的格式版本是1.21.60
,而它所在的安裝包卻只是1.21.51
,但這無傷大雅,讓我們繼續。
我們來簡單的看一下這裡面包括一些什麼:
格式版本
"format_version": "1.20.60"
format_version
我們已經並不陌生,它在其他的諸如清單檔案,實體定義之類的地方都出現過,目前您能在其他Wiki看到的幾個主流版本是1.13.0
,1.12.0
。我們接下來將使用1.21.51
(或1.21.60
)。這三類格式版本之間的差異不小,您可以在其他Wiki瀏覽其他格式版本的宣告。
生態域詳述
"minecraft:biome": {
//…
}
它規定了生態域的其他所有內容。
元資料
"description": {
"identifier": "forest"
}
這屬於minecraft:biome
的一部分,用於控制生態域的元資料,一般情況下裡面只有identifier
。有關注意事項請看前文。
元件
"components": {
//…
}
元件(Components) 是生態域生成的核心,它告訴遊戲這個生態域的氣候、地形和其它的重要內容。接下來我們的所有內容將圍繞元件出發。
繼承和覆寫[編輯]
覆寫官方宣告[編輯]
我們不推薦去嘗試繼承官方宣告進行修改,理由可以在下面看到,所以這裡我們採用覆寫的方式,首先從安裝包中提取有關生態域的定義(Github上的範例檔案中並不提供這些內容,所以請從您下載到的安裝包中提取)。
接下來我們以bamboo_jungle.json
來進行範例(這些修改相當的簡單):
{
"format_version": "1.20.60",
"minecraft:biome": {
"description": {
"identifier": "bamboo_jungle"
},
"components": {
"minecraft:climate": {
"downfall": 0.9,
"snow_accumulation": [ 0.0, 0.125 ],
"temperature": 0.95
},
"minecraft:overworld_height": {
"noise_type": "default"
},
"minecraft:surface_parameters": {
"sea_floor_depth": 7,
"sea_floor_material": "minecraft:gravel",
"foundation_material": "minecraft:stone",
"mid_material": "minecraft:dirt",
"top_material": "minecraft:grass_block",
"sea_material": "minecraft:water"
},
"minecraft:overworld_generation_rules": {
"hills_transformation": "bamboo_jungle_hills"
},
"minecraft:tags": {
"tags": [
"animal",
"bamboo",
"jungle",
"monster",
"overworld"
]
}
}
}
}
接下來我們可以開始覆蓋操作,首先我們至少要在檔案中包含format_version
和identifier
,然後宣告所有元件中的屬性。您也可以根據文件來加入一些屬性,但舊的屬性必須全部重新宣告,然後再嘗試修改屬性的值。依照下面的教學了解每個屬性的功能後,就可以完成修改。此時官方宣告已被複寫。一般情況下,覆寫官方宣告都是想要自訂生成的結構和生物,這些由tags
控制,在接下來的文章中會介紹到這些。
繼承[編輯]
繼承是一類很糟糕的情況。僅繼承components
屬性中的元件。單個元件中的屬性通常也是繼承的。不幸的是,某些元件或元件屬性物件需要完全重新宣告其所有屬性才能工作,這意味著在重寫時重新宣告整個元件通常更好。除非新元件會干擾以前存在的元件,否則始終會發生繼承,就像實體一樣。
同樣也無法在繼承的情況下刪除一些元素。
注意事項[編輯]
維度[編輯]
主世界[編輯]
地獄[編輯]
維度之間[編輯]
特徵[編輯]
氣候[編輯]
地形[編輯]
方塊型別[編輯]
minecraft:surface_parameters
元件控制了用於生成地形的預設塊,這是一種極其方便的方法來控制地形的生成,先來看它的格式:
"minecraft:surface_parameters": {
"foundation_material": "Object of type Block Specifier",
"top_material": "Object of type Block Specifier",
"mid_material": "Object of type Block Specifier",
"sea_floor_depth": "int",
"sea_material": "Object of type Block Specifier",
"sea_floor_material": "Object of type Block Specifier"
}
上面我們介紹了一種特殊的型別Object of type Block Specifier
,它表示說明塊型別的物件。它一般有兩種情況,一種是字串形式(部分Wiki也稱之為簡單表示法),一種是object
形式(部分Wiki也稱之為有狀態表示法):
"Object of type Block Specifier": "minecraft:concrete"
字串形式下,它所對應的內容必須是方塊ID。如果未提供命名空間,則遊戲會嘗試在所有宣告的命名空間中查找具有該名稱的已註冊塊。所以我們推薦您總是使用完整的名稱(包括命名空間),以防止出現意外。
"Object of type Block Specifierjso": {
"name": "minecraft:concrete",
"states": {
"color": "red"
}
}
object
形式必須有兩個屬性,name
(表示方塊ID,與前文一樣),states
(表示方塊型別,如顏色、朝向等,具體支援的可以參見指令中的表示形式)。
熟悉了這些型別之後,我們來看看這些屬性都有什麼意義:
foundation_material
控制此生態域中地下深處使用的方塊型別。您可以嘗試與forest
群系中的minecraft:stone
對應起來。
mid_material
控制此生態域表面以下的圖層中使用的方塊型別。您可以嘗試與forest
群系中的minecraft:dirt
對應起來。
sea_floor_depth
控制此生態域海底應與海面的深度。要注意的是,這具有一定誤導性。由於噪聲參數的變化,平滑等各種其他情況的修復,最終對應的實際深度要遠遠大於此項的設定。
sea_material
控制此生態域中水體中使用的物塊型別。在主世界的大部分生態域中,這對應的是minecraft:water
,而在地獄這對應的是minecraft:lava
,有時也可以對應minecraft:ice
(即使它並不算流體)。
top_material
控制此生態域表面的物塊型別。在主世界的大部分生態域中,這對應的是minecraft:grass
。
上面這些僅僅是簡單的設定,更複雜的由其他元件控制。
高度圖[編輯]
高度圖(Heightmap) 的具體工作依賴於世界生成時提供的種子。對主世界而言,我們使用minecraft:overworld_height
來進行操作:
"minecraft:overworld_height": {
"noise_type": "string",
"noise_params": [
"float",
"float"
]
// noise_type noise_params只能选择其一,不可两者皆选,也不可不选
}
noise_type
noise_type
是一組已經給出的高度噪聲預設,它可以幫助我們創造更好的生態域環境。下面是它可以使用的所有值:
預設 | 值 |
---|---|
預設 | "default"
|
預設的突變 | "default_mutated"
|
河 | "river"
|
海洋 | "ocean"
|
深海 | "deep_ocean"
|
低地 | "lowlands"
|
針葉林 | "taiga"
|
山脈 | "mountains"
|
高地 | "highlands"
|
極端 | "extreme"
|
較極端 | "less_extreme"
|
沙灘 | "beach"
|
石頭沙灘 | "stone_beach"
|
蘑菇地 | "mushroom"
|
沼澤 | "swamp"
|
上面的這些預設,所對應的高度和縮放值可以在這裡檢視。
noise_params
噪聲參數使用一個陣列,該陣列的兩個值都是單精度浮點數。為了方便,接下來我們用[ a, b ]來表示它的兩個值。
a表示生態域的平均高度,這個參數並不直接使用方塊高度(y座標),其0值被設定為67格的高度,並且對於其值的Δ1對應Δ16的方塊高度。因此,將此值設定為1將導致平均y高度約為 83,類似於山地生態域中較小的丘陵。對於它的值改變,我們有這樣一個簡單的公式:
注意:a參數的值為-2或更小將導致生成錯誤。在a的值為-2時將只生成基岩層。若a的值較低,其他生態域擁有「正常」的高度時,它們間的過渡將極為可怕。
b的值則控制平滑效果。負值的效果未被確定,一般情況下不應使用;0將使地形變化變小,但不會使生態域完全平坦;0.125的值將生成特別平滑的地形,大於此值的值開始形成懸崖、海灣和凹陷。較大的懸崖和小浮空島嶼從0.25開始形成;到 0.5 時,這些地形要素變得更加常見。1時,地形開始變得參差不齊且難以穿越,大的、不自然的懸垂很常見。邁向 4,美麗、巨大的浮空島嶼將會生成,然而這是以玩家的體驗感為代價。此外,當第一個噪聲參數較溫和時,大部分表面會下降到海平面以下。
一般來說,對於bΔ1對應Δ±16的方塊高度。
如果您需要完全平坦的表面,可以將a設定為4,b設定為0。
注意事項
- 生物群落的高度圖只能針對主世界進行自訂。地獄和終界由遊戲自己控制,以創造符合它們一致觀感的效果。
- 生態域的高度圖,透過噪聲平滑化。無法可靠地實現海拔的逐漸下降和對角線變化。
- 高度圖不能讓y值高於128,這可能使地形趨向於平緩,同時也不能低於32。除了特徵(如洞穴)沒有誰能打破這些限制。
- 對於繼承有一些注意,在繼承鏈上
noise_type
總會覆蓋noise_params
。簡單來講,只要在繼承鏈上有任何一個noise_type
,那麼所有的noise_params
都將被忽略。可惜的是,幾乎所有的原版生態域都使用了noise_type
。
複雜的表面構建[編輯]
minecraft:surface_parameters
給予我們方便的簡單的設定生態域的方法,但對於一些複雜的情況卻實在不夠用。
表面調整(Surface Adjustments)(或稱表面建構器(Surface Builders)) 為我們提供了更多的可能(在已有minecraft:surface_parameters
時,它可以附加的替換塊)。這依賴於元件minecraft:surface_material_adjustments
。
"minecraft:surface_material_adjustments": {
"adjustments": [
{
"materials": {
"top_material": "Object of type Block Specifier",
"mid_material": "Object of type Block Specifier",
"sea_floor_material": "Object of type Block Specifier",
"foundation_material": "Object of type Block Specifier",
"sea_material": "Object of type Block Specifier"
},
"noise_range": [
"float[0..0]",
"float[1..1]"
],
"height_range": [
"molang[0..0]",
"molang[1..1]"
],
"noise_frequency_scale": "float"
},
//...
]
}
表面的調整利用adjustments
這個屬性,它裡面是一個任意長度的列表,透過多個列表內容之間的相互疊加以完成複雜的表面調整。
表面調整允許微調生態域的表面方塊。儘管這些調整被稱為「表面」調整,但實際上會影響在符合條件的表面建構器中宣告的所有塊。這些調整不能修改表面建構器範圍之外的物塊,因此不能用於改變基岩或空氣。下面我們來看如何使用adjustments
內的這些可選項(adjustments
中的任何一個列表子項中如materials
等都是可選的):
噪聲[編輯]
表麵條件提供了兩種噪聲選項:noise_range
和noise_frequency_scale
。
noise_range
noise_range
是用來限定Perlin噪波曲線生成值的,它代表著接下來我們的所有操作只在這個值中進行(這並不意味世界只生成這個值間的噪聲,而是說我們接下來的方塊替換之類的操作只對這個值有效),與其它限定值一樣,它僅對目前列表子項起效。
"noise_range": [0.5, 1]
noise_frequency_scale
noise_frequency_scale
與noise_range
不同,它不是一個限定值,而是一個調整值。它是一個浮點數,用於表示在取得需調整的噪聲值時所乘以的位置的比例。
"noise_frequency_scale": 0.125
表面調整噪聲曲線使用相對於維度座標的預設映射,該映射將形成極小的轉換。當把這個參數值設定得更小的時候,噪點交集會變大,像0.125
這樣比較小的值,對形成大片的轉換(比如灰壤或者粗泥土簇)很關鍵。而這個參數比較大的值通常用來讓地形看起來更混亂。一般不建議使用大於預設值1的值,除非想要棋盤格圖案那種效果。
高度限制[編輯]
從標題就可以知,它跟noise_range
一樣是一個限定量:
"height_range": [
"molang(min)",
"molang(max)"
]
height_range
用於限定高度,它是一個molang列表。用於限定需要修改的範圍。高度限制以間隔形式提供,並且僅以y高度範圍為目標。
我們這裡簡單的將height_range
表示為[ a, b ]的形式。a是最小值,b是最大值。限定高度便是ab間的範圍。我們推薦a,b使用math.random_integer
這個函式隨機生成,以最佳化生態域的隨機觀感。
"height_range": [
"math.random_integer(30, 40)",
"math.random_integer(60, 70)"
]
此外還提供了一個變數sea_level
,它傳回目前維度的海平面高度:
維度 | 高度 |
---|---|
主世界 | 63 |
地獄 | 32 |
終界 | 63 |
方塊替換[編輯]
其它注意[編輯]
在完成了上面的這些之後,我們還要注意到tags
。它是一組用於幫助遊戲進行一些特殊操作的標籤,這在前文有提到過。我們剛剛的這些操作都是對於主世界來說的(它們也可以對於地獄,就需要您把前文和這裡的知識融會貫通,本文不多贅述),事實上僅僅這些標籤還不足以讓生態域正常的在這個主世界生成,我們需要編輯元件中的minecraft:tags
。
"minecraft:tags": {
"tags": [
"string",
// ...
]
}
這個元件下只有一個屬性tags
,它是一個全部是字串的列表。如果您的維度要正常的在主世界生成,我們需要加入一個標籤overworld
。在官方的定義中,對於突變群系,可能需要使用overworld_generation
(而不是overworld
)。
"tags": [
"overworld"
]
"tags": [
// "overworld" tag cannot be present in order to match legacy behavior, but is
// required for correct world generation -- hence: overworld_generation
// 上文取自官方的定义,下文是翻译:
// "overworld" 标签不能存在以匹配遗留行为,但它
// 需要正确世界生成所必需的 -- 因此:overworld_generation
"overworld_generation"
]