教程:制作附加包/生物群系

来自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) 是生物群系生成的核心,它告诉游戏这个生物群系的气候、地形和其它的重要内容。接下来我们的所有内容将围绕组件出发。

继承和覆写[编辑]

覆写官方声明[编辑]

继承[编辑]

继承是一类很糟糕的情况。仅继承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"
]

洞穴与其它[编辑]

引用[编辑]