UID82897性别保密经验 EP铁粒 粒回帖0主题精华在线时间 小时注册时间2021-7-23最后登录1970-1-1
| 前言 | | 上次讲解生物群系还是在大约两年半之前。等了两年半之后,自定义生物群系可算是基本定型了,我们可以较为简单地自定义生物群系了。 |  | 定义新生物群系 | 现在(游戏版本为 1.21.130)我们有两种方法可以让自定义生物群系出现在世界里。第一种是直接修改原版的生物群系,但是原版的生物群系是改一个少一个的,各种附加包这个改一个那个改一个,最后很可能没一个正常。而第二种方法就好很多了,那就是替换部分原版的生物群系,即使不同附加包替换了同一个原版生物群系,也不会导致严重的冲突问题。至于为什么说是“替换原版生物群系”而不是“为新生物群系开辟空间”,这涉及到新生物群系系统的运行原理,过于复杂,没必要解释。接下来我们主要讨论第二种方法。
打开行为包根目录,打开 biomes 文件夹,这里用于存放生物群系文件。首先为要加入的生物群系起名,比如 test_biome。接下来创建一个叫 test_biome.json 的文件,打开它,写入以下数据:
- {
- "format_version": "1.21.130",
- "minecraft:biome": {
- "description": {
- "identifier": "example:test_biome"
- },
- "components": {
- // ...
- }
- }
- }
复制代码
format_version 字段指定生物群系的格式版本,旧版是 1.13.0,目前填写 1.21.130 即可。
生物群系的定义和方块定义以及物品定义差不多,都带着很多组件(实际上生物群系的组件不多),当然还有最重要的包含了 ID 的 description 字段。其中,identifier 字段指定了这个生物群系的 ID,需要有命名空间,比如 complementary: 这样的。这里命名空间是 example:,整个 ID 就是 example:test_biome。
components 字段指定生物群系带有的组件。我们首先来决定生物群系要替换世界的哪些原版生物群系而生成,所以首先指定 minecraft:replace_biomes 组件。它可以这样写:
- "minecraft:replace_biomes": {
- "replacements": [
- {
- "dimension": "minecraft:overworld",
- "targets": [
- "beach",
- "plains"
- ],
- "amount": 0.5,
- "noise_frequency_scale": 25
- }
- ]
- }
复制代码
其中,replacements 是一个数组,可以在里面定义很多替换规则,每个替换规则都是一个对象,对象里面可以指定要替换哪个维度的哪些生物群系的多少部分,以及替换的频率。对于里面的每个对象,有四个字段:
dimension 字段表示要部分替换的生物群系所在的维度,minecraft:overworld 表示主世界。目前只能填写 minecraft:overworld,也就是只能替换主世界的生物群系,不能替换下界或末地的,也不能替换其他维度的。
targets 字段表示要部分替换的生物群系的 ID,如果命名空间是 minecraft:,则可以省略,否则不能省略。它是一个数组,这意味着我们可以部分替换多个原版生物群系。
amount 字段表示要替换多少生物群系,它是浮点数,取值范围是 [0.0, 1.0],0.0 表示不替换,1.0 表示完全替换,0.5 表示替换 50%。
noise_frequency_scale 字段比较复杂,它控制噪声函数值的频率缩放。简单来说,这个值越高,生物群系的替换越零散,越破碎;值越低,生物群系的替换越平滑,越集中。值为 5 - 10 时效果比较好,生物群系的连续程度适中。
定义了生物群系会在哪里生成之后,我们可以定义生物群系的表面要使用什么方块了。我们需要使用表面构建器,Surface Builder 来构建生物群系表面。大多数情况下,我们首先从最基本的表面构建器开始。
- "minecraft:surface_builder": {
- "builder": {
- "type": "minecraft:overworld",
- "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:surface_builder 是组件的名称,其中只有一个 builder 字段,指定要使用的表面构建器。其中,type 是表面构建器的类型,这里是最基本的 minecraft:overworld,也就是主世界表面构建器。
sea_floor_depth 表示海床的深度,一般设为 7。sea_floor_material 指定组成海床的方块,这里是 minecraft:gravel,也就是沙砾。sea_material 表示组成海洋的方块,一般是水(minecraft:water),除非想要生成熔岩海或其他特殊的海,否则一般不修改此值。以上三个字段仅用于此生物群系需要生成海洋的地方,对于海洋生物群系,全部适用;对于与海洋接壤的生物群系,适用于它的海洋部分;对于不与海洋接壤的生物群系,全部不适用。
foundation_material 表示生物群系地基的方块。一般来说,这里定义的生物群系会包含从高度为 40 左右的地方一直到地表的区域,40 格之下就不属于这个生物群系了。1.18 之后,生物群系是三维的,地下的生物群系可以和地表的不一样,所以在这里设置地基只会影响到那里。大多数生物群系的地基都是石头,也就是 minecraft:stone。top_material 指定生物群系表面一层的方块,这里是 minecraft:grass_block;mid_material 指定生物群系表面与地基层之间几层的方块,这里是 minecraft:dirt。注意,草方块的 ID 现在是 minecraft:grass_block,而不是以前的 minecraft:grass;以前的 ID 已经弃用,非常不建议继续使用。
指定方块时,我们不仅可以直接写方块的 ID,还可以通过对象表示带有特定方块状态的状态。比如:- {
- "name": "test:test_block",
- "states": {
- "test:state1": "a",
- "test:state2": 1,
- "test:state3": true
- }
- }
复制代码
除了 minecraft:overworld 表面构建器,还有一些其他表面构建器。主世界的所有表面构建器都包含上述所有字段,有些还有额外字段,而且会为生物群系添加一些独特的特征。全部表面构建器如下:
minecraft:overworld - 已介绍过。
minecraft:frozen_ocean - 为生物群系表面加入了冰山,适用于表面冰封的生物群系。
minecraft:mesa - 为生物群系表面加入了彩色地层,还可以在表面加入巨柱,类似于恶地。它有一些额外字段:
bryce_pillars - 布尔值,指定是否加入巨柱。
has_forest - 布尔值,如果为 true,则在高处生成砂土和草丛。
clay_material - 字符串或对象,指定作为基底黏土的方块。
hard_clay_material - 字符串或对象,指定作为基底陶瓦的方块。
minecraft:swamp - 为生物群系表面加入了睡莲和水坑,类似于沼泽。它有一个额外字段:
max_puddle_depth_below_sea_level - 整数,指定水坑的相对于海平面而言的深度,值必须 ≤ 127。
接下来是下界和末地的表面构建器,它们的字段与主世界的大不相同。首先来看下界的。
minecraft:capped - 用于在固体方块之间生成表面,构建出类似于下界生物群系的表面。所谓 capped(封顶的),就是指生物群系被顶部的某些方块“封住”了。它的全部字段如下:
sea_material - 与主世界的同名字段作用相同。一般是 minecraft:lava。
foundation_material - 与主世界的同名字段作用相同。一般是 minecraft:netherrack。
floor_materials - 作为地板的方块。是数组,可以指定多个不同的方块。
ceiling_materials - 作为天花板的方块。是数组,可以指定多个不同的方块。
beach_material - 指定接近海的地方的方块,例如 minecraft:gravel(沙砾)。
然后是末地的。
minecraft:the_end - 末地的表面构建器。它没有任何字段可以指定,完全不可自定义。将它用于主世界生物群系会导致那片区域生成为末地石。
接下来,我们可以替换一些生物群系表面的方块,使用 minecraft:surface_material_adjustments 组件。
- "minecraft:surface_material_adjustments": {
- "adjustments": [
- {
- "materials": {
- "top_material": "minecraft:soul_sand",
- "mid_material": "minecraft:soul_sand",
- "sea_floor_material": "minecraft:soul_sand"
- },
- "height_range": [
- "v.sea_level - 3",
- "v.sea_level + 2"
- ],
- "noise_frequency_scale": 0.03125,
- "noise_range": [
- 0.4,
- 1.0
- ]
- }
- ]
- }
复制代码
adjustments 是一个数组,里面有全部要做的调整。每个调整都是一个对象,它可以取代一些原本的设置进行生成。
materials - 对象,其中可以有 sea_floor_material sea_material foundation_material mid_material top_material 字段,含义与之前的主世界表面构建器的相同。
height_range - 整数数组或字符串数组,只有在这个数组指定的高度范围内的方块才会被替换。其中可以直接指定高度数值,也可以指定 Molang 表达式。表达式中,目前唯一已知可用的变量是 v.sea_level,它代表海平面高度。
noise_frequency_scale - 浮点数,检验噪声函数值所用的因数,见 noise_range。
noise_range - 浮点数数组,噪声函数值乘以 noise_frequency_scale 得到的值只有在这个数组指定的范围内才会使用 materials 指定的方块进行生成。
还有两个以前可用但现在不再可用的组件,minecraft:overworld_generation_rules 和 minecraft:multinoise_generation_rules。这两个组件不应该再被使用。还有 minecraft:overworld_height,它也被弃用了,目前它仅影响地图(物品)的绘制。
如果要制作山地生物群系,那么可以指定下面这个组件,提供一些山地生成的信息。
- "minecraft:mountain_parameters": {
- "steep_material_adjustment": {
- "material": "minecraft:stone",
- "south_slopes": false,
- "west_slopes": false,
- "north_slopes": true,
- "east_slopes": true
- },
- "top_slide": {
- "enabled": false
- }
- }
复制代码
steep_material_adjustment 字段用于指定陡坡的材料。它是一个对象,其中有几个字段:
material - 字符串,指定陡坡的材料。
north_slopes - 布尔值,指定是否在北面生成陡坡。
south_slopes - 布尔值,指定是否在南面生成陡坡。
west_slopes - 布尔值,指定是否在西面生成陡坡。
east_slopes - 布尔值,指定是否在东面生成陡坡。
top_slide 字段控制发生在世界顶部的密度渐变,防止地形变得过高。它是一个对象,其中的 enabled 字段用于启用或禁用此功能。
接下来我们可以指定生物群系的气候和湿度。首先看气候,它通过 minecraft:climate 组件指定。
- "minecraft:climate": {
- "downfall": 0.9,
- "snow_accumulation": [
- 0.125,
- 0.25
- ],
- "temperature": -0.7
- }
复制代码
downfall 是浮点数,指定降水值,降水值影响颜色和方块变化。设为 0 后,生物群系不会降水。
temperature 是浮点数,指定温度。原版的温度范围是 [-2.0, 2.0],但是自定义温度也可以超出这个范围。温度影响类似于天空颜色、降雨还是降雪、冰雪是否融化、海绵是否自动蒸干等等特性。
snow_accumulation 是浮点数数组,如果这个生物群系能下雪,则指定雪层可以积累的深度。第一个值是下限,第二个值是上限,每 0.125 表示一层雪。无论最大值设为什么,都不能使积雪深度超过 1 个方块深。
然后是湿度,通过 minecraft:humidity 组件指定。
- "minecraft:humidity": {
- "is_humid": true
- }
复制代码
这个组件比较简单,is_humid 指定生物群系是否湿润。湿度决定火的蔓延概率与速率。
还可以通过 minecraft:creature_spawn_probability 组件设置生物在生物群系中生成的概率,这影响的是第一次生成这个生物群系的区块时生物生成的概率。
- "minecraft:creature_spawn_probability": {
- "probability": 0.06
- }
复制代码
probability 指定生物生成的概率,取值范围 [0.0, 0.75]。
我们可以指定生物群系中植被在地图上的颜色,通过 minecraft:map_tints 组件。
- "minecraft:map_tints" : {
- "grass": {
- "type": "tint",
- "tint": "#aea42a"
- },
- "foliage": "#90814d"
- }
复制代码
foliage 是字符串或整数数组,指定树叶的颜色。表达颜色时可以用 #aaaaaa 的格式,也可以用含有三个整数的数组表示红绿蓝三个颜色分量。
grass 是对象,指定草地的颜色。将其中的 type 字段设为 noise 会导致使用噪声染色草地,此时不需要额外字段;设为 tint 会导致使用自定义颜色染色草地,此时需要同级的 tint 字段指定染色颜色值。
最后,我们可以为生物群系添加一些标签,这些标签可以用于地物生成等。
- "minecraft:tags": {
- "tags": [
- "animal",
- "monster",
- "overworld",
- "plateau",
- "savanna",
- "spawns_savanna_mobs",
- "spawns_warm_variant_farm_animals"
- ]
- }
复制代码
tags 是字符串数组,里面可以有很多标签。
很多原版标签的功能通过 JSON 体现了出来,然而一些原版标签的功能是硬编码的,列表如下:
birch - 生成野花簇(与其他花类生物群系标签互斥)。hills 标签会使其失效。
cold - 村民将是雪原村民。
deep - 在 1.18.0 之前,防止海洋出现岛屿或相连的河流,使生物群系不太可能出现丘陵。
desert - 允许生成部分掩埋的废弃传送门。玩家在附近时,沙子将播放环境声音。
extreme_hills - 废弃传送门的允许生成高度更高。带有 forest 标签或 forest_generation 标签的生物群系将使用普通的主世界花,而不是森林类花。
flower_forest - 生成森林类花(与其他花类生物群系标签互斥)。
forest - 生成森林类花(与其他花类生物群系标签互斥)。extreme_hills 标签和 taiga 标签都会使其失效。
forest_generation - 等价于 forest 标签。
frozen - 村民将是雪原村民。与 ocean 标签一起出现会防止生物群系包含熔岩泉。
ice - 在废弃传送门周围,熔岩总会被下界岩取代,而下界岩不能被岩浆块取代。
ice_plains - 与 mutated 标签一起出现会防止生物群系包含熔岩泉。
jungle - 废弃传送门将会长满苔藓。
hills - 带 meadow 标签或 birch 标签的生物群系将使用普通的主世界花,而不是野花簇。
meadow - 生成野花簇(与其他花类生物群系标签互斥)。hills 标签会使其失效。
mesa - 玩家在附近时,沙子将播放环境声音。
mountain - 废弃传送门的允许生成高度更高。
mutated - 在 1.18.0 之前,防止生成为在 mutate_transformation 指定的突变变种,因为生物群系已经是突变的了。与 ice_plains 标签一起出现会防止生物群系包含熔岩泉。
no_legacy_worldgen - 防止生物群系使用旧的世界生成行为,除非生物群系放置在主世界中。
ocean - 与 frozen 标签一起出现会防止生物群系包含熔岩泉。允许在水下生成废弃传送门。在 1.18.0 之前,在生物群系边缘生成海岸线和河流,并将生物群系识别为用于放置岛屿的浅海,除非存在 deep 标签。
pale_garden - 生成闭合的眼眸花(与其他花类生物群系标签互斥)。
plains - 生成平原类花(与其他花类生物群系标签互斥)。
rare - 在 1.18.0 之前,将生物群系标记为特殊生物群系,对海洋不起作用。
swamp - 允许在水下生成废弃传送门。生成沼泽类花(与其他花类生物群系标签互斥)。
taiga - 带 forest 标签或 forest_generation 标签的生物群系将使用普通的主世界花,而不是森林类花。
以上就是生物群系的所有可用组件了。 |  | 总结
| | 这一期,我们解释了生物群系的全部可用组件。下期可能会讲解客户端生物群系。 |
|
评分查看全部评分
|