- 致编者:请牢记我们的域名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) 是生物群系生成的核心,它告诉游戏这个生物群系的气候、地形和其它的重要内容。接下来我们的所有内容将围绕组件出发。
继承和覆写[编辑]
覆写官方声明[编辑]
继承[编辑]
继承是一类很糟糕的情况。仅继承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"
]