教學:製作附加包/生態域

出自Minecraft基岩版开发Wiki
生態域
系列教學
所屬系列
難易度
高級
前置知識
實踐裝置
WindowsAndroid
所需軟件
  • 假日創作者功能
  • 自訂生態域

注意事項[編輯]

  1. 生態域有關的內容現在是實驗性玩法,必須為每個使用包含生態域定義的行為包的世界啟用實驗性玩法。
  2. 現在遊戲內的有關生態域除錯內容工作的極其差,如果宣告的有效,那一切都正常執行,否則將拋出錯誤。這個錯誤不僅僅是出現了多餘的鍵的那一項,而是幾乎除format_version外的所有的鍵都拋出錯誤。(但官方正在改進,面對大部分有誤的地方,記錄GUI都正常的拋出錯誤)
  3. 官方並沒有給出良好的文件,現在本文件提供的大部分內容都來自於其它Wiki和社群的開發人員,在感謝他們的同時,本文件也儘量使用最新正式基岩版的語法格式。

引言[編輯]

生態域(Biome)是Minecraft世界中形態各異的地區,有著多樣的地理特徵、植物群海拔高度、溫度、濕度、天空及植被顏色。生態域將生成的世界劃分為一個個不同的自然環境,譬如森林、叢林、沙漠和針葉林。

透過編寫 生態域資料 您可以:

  • 變更生態域的一般形狀
  • 變更生態域生成的比例
  • 變更生態域的裝飾特徵(例如樹和草的分布)
  • 變更生態域的氣候
  • 變更生態域的生物
  • 變更生態域的霧效

接下來讓我們開始。

群系基本宣告[編輯]

想要宣告修改任何群系,都必須要先有行為包,接下來在行為包的biomes資料夾中,建立群系檔案。其格式必須如下:

*biome_name*.json*biome_name*.biome.json

這裡有以下幾點要注意:

  1. 任何以.開頭的檔案都將使遊戲崩潰。這可能導致某些開發會受到影響,如macOS上的.DS_Store 檔案
  2. 不要使用任何子資料夾biomes資料夾中不應該放入任何其它的子資料夾(用於分類之類的事),因為子目錄中的所有宣告都將被忽略。
  3. biome_name必須與接下來檔案內部中的identifier一致。要注意的是biome_name並不包括命名空間,這個同樣於檔案內部的identifier相一致,故而你不應該在檔案中出現任何的:
  4. 對於3中提到的問題,BedrockWiki為我們提供了一種使用.的方法。這個例子如下:biomes/fancycraft.fantasy_realms.magical_springs.hills.mutated.json。在這裡,fancycraft是開發人員,fantasy_realms是行為包名稱,magical_springs是頂級生物群落名稱,hillsmutated是子生物群落型別,json是必需的副檔名(這個例子中可選的.biome被省略)。不過在本教學中,我們不使用這種方法。
  5. 無法正確讀取的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.01.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_versionidentifier,然後宣告所有元件中的屬性。您也可以根據文件來加入一些屬性,但舊的屬性必須全部重新宣告,然後再嘗試修改屬性的值。依照下面的教學了解每個屬性的功能後,就可以完成修改。此時官方宣告已被複寫。一般情況下,覆寫官方宣告都是想要自訂生成的結構和生物,這些由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,類似於山地生態域中較小的丘陵。對於它的值改變,我們有這樣一個簡單的公式:

f(y)=y6716

注意:a參數的值為-2或更小將導致生成錯誤。在a的值為-2時將只生成基岩層。若a的值較低,其他生態域擁有「正常」的高度時,它們間的過渡將極為可怕。

b的值則控制平滑效果。負值的效果未被確定,一般情況下不應使用;0將使地形變化變小,但不會使生態域完全平坦;0.125的值將生成特別平滑的地形,大於此值的值開始形成懸崖、海灣和凹陷。較大的懸崖和小浮空島嶼從0.25開始形成;到 0.5 時,這些地形要素變得更加常見。1時,地形開始變得參差不齊且難以穿越,大的、不自然的懸垂很常見。邁向 4,美麗、巨大的浮空島嶼將會生成,然而這是以玩家的體驗感為代價。此外,當第一個噪聲參數較溫和時,大部分表面會下降到海平面以下。

一般來說,對於bΔ1對應Δ±16的方塊高度。

如果您需要完全平坦的表面,可以將a設定為4,b設定為0。

注意事項

  1. 生物群落的高度圖只能針對主世界進行自訂。地獄和終界由遊戲自己控制,以創造符合它們一致觀感的效果。
  2. 生態域的高度圖,透過噪聲平滑化。無法可靠地實現海拔的逐漸下降和對角線變化。
  3. 高度圖不能讓y值高於128,這可能使地形趨向於平緩,同時也不能低於32。除了特徵(如洞穴)沒有誰能打破這些限制。
  4. 對於繼承有一些注意,在繼承鏈上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_rangenoise_frequency_scale

noise_range

noise_range是用來限定Perlin噪波曲線生成值的,它代表著接下來我們的所有操作只在這個值中進行(這並不意味世界只生成這個值間的噪聲,而是說我們接下來的方塊替換之類的操作只對這個值有效),與其它限定值一樣,它僅對目前列表子項起效。

"noise_range": [0.5, 1]

noise_frequency_scale

noise_frequency_scalenoise_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"
]

洞穴與其它[編輯]

引用[編輯]