开启辅助访问     
收藏本站

站内搜索

搜索

Minecraft(我的世界)苦力怕论坛

[BE教程] 附加包教程:59.生物群系(二)

 发表于 2025-10-19 21:53:51 来自手机|显示全部楼层|阅读模式 IP:天津
前言
上次讲解生物群系还是在大约两年半之前。等了两年半之后,自定义生物群系可算是基本定型了,我们可以较为简单地自定义生物群系了。
定义新生物群系
现在(游戏版本为 1.21.130)我们有两种方法可以让自定义生物群系出现在世界里。第一种是直接修改原版的生物群系,但是原版的生物群系是改一个少一个的,各种附加包这个改一个那个改一个,最后很可能没一个正常。而第二种方法就好很多了,那就是替换部分原版的生物群系,即使不同附加包替换了同一个原版生物群系,也不会导致严重的冲突问题。至于为什么说是“替换原版生物群系”而不是“为新生物群系开辟空间”,这涉及到新生物群系系统的运行原理,过于复杂,没必要解释。接下来我们主要讨论第二种方法。
打开行为包根目录,打开 biomes 文件夹,这里用于存放生物群系文件。首先为要加入的生物群系起名,比如 test_biome。接下来创建一个叫 test_biome.json 的文件,打开它,写入以下数据:
  1. {
  2.   "format_version": "1.21.130",
  3.   "minecraft:biome": {
  4.     "description": {
  5.       "identifier": "example:test_biome"
  6.     },
  7.     "components": {
  8.       // ...
  9.     }
  10.   }
  11. }
复制代码

format_version 字段指定生物群系的格式版本,旧版是 1.13.0,目前填写 1.21.130 即可。
生物群系的定义和方块定义以及物品定义差不多,都带着很多组件(实际上生物群系的组件不多),当然还有最重要的包含了 ID 的 description 字段。其中,identifier 字段指定了这个生物群系的 ID,需要有命名空间,比如 complementary: 这样的。这里命名空间是 example:,整个 ID 就是 example:test_biome。
components 字段指定生物群系带有的组件。我们首先来决定生物群系要替换世界的哪些原版生物群系而生成,所以首先指定 minecraft:replace_biomes 组件。它可以这样写:
  1. "minecraft:replace_biomes": {
  2.   "replacements": [
  3.     {
  4.       "dimension": "minecraft:overworld",
  5.       "targets": [
  6.         "beach",
  7.         "plains"
  8.       ],
  9.       "amount": 0.5,
  10.       "noise_frequency_scale": 25
  11.     }
  12.   ]
  13. }
复制代码

其中,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 来构建生物群系表面。大多数情况下,我们首先从最基本的表面构建器开始。
  1. "minecraft:surface_builder": {
  2.   "builder": {
  3.     "type": "minecraft:overworld",
  4.     "sea_floor_depth": 7,
  5.     "sea_floor_material": "minecraft:gravel",
  6.     "foundation_material": "minecraft:stone",
  7.     "mid_material": "minecraft:dirt",
  8.     "top_material": "minecraft:grass_block",
  9.     "sea_material": "minecraft:water"
  10.   }
  11. }
复制代码


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,还可以通过对象表示带有特定方块状态的状态。比如:
  1. {
  2.   "name": "test:test_block",
  3.   "states": {
  4.     "test:state1": "a",
  5.     "test:state2": 1,
  6.     "test:state3": true
  7.   }
  8. }
复制代码


除了 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 组件。

  1. "minecraft:surface_material_adjustments": {
  2.   "adjustments": [
  3.     {
  4.       "materials": {
  5.         "top_material": "minecraft:soul_sand",
  6.         "mid_material": "minecraft:soul_sand",
  7.         "sea_floor_material": "minecraft:soul_sand"
  8.       },
  9.       "height_range": [
  10.         "v.sea_level - 3",
  11.         "v.sea_level + 2"
  12.       ],
  13.       "noise_frequency_scale": 0.03125,
  14.       "noise_range": [
  15.         0.4,
  16.         1.0
  17.       ]
  18.     }
  19.   ]
  20. }
复制代码


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,它也被弃用了,目前它仅影响地图(物品)的绘制。

如果要制作山地生物群系,那么可以指定下面这个组件,提供一些山地生成的信息。

  1. "minecraft:mountain_parameters": {
  2.   "steep_material_adjustment": {
  3.     "material": "minecraft:stone",
  4.     "south_slopes": false,
  5.     "west_slopes": false,
  6.     "north_slopes": true,
  7.     "east_slopes": true
  8.   },
  9.   "top_slide": {
  10.     "enabled": false
  11.   }
  12. }
复制代码


steep_material_adjustment 字段用于指定陡坡的材料。它是一个对象,其中有几个字段:

  material - 字符串,指定陡坡的材料。

  north_slopes - 布尔值,指定是否在北面生成陡坡。

  south_slopes - 布尔值,指定是否在南面生成陡坡。

  west_slopes - 布尔值,指定是否在西面生成陡坡。

  east_slopes - 布尔值,指定是否在东面生成陡坡。

top_slide 字段控制发生在世界顶部的密度渐变,防止地形变得过高。它是一个对象,其中的 enabled 字段用于启用或禁用此功能。

接下来我们可以指定生物群系的气候和湿度。首先看气候,它通过 minecraft:climate 组件指定。

  1. "minecraft:climate": {
  2.   "downfall": 0.9,
  3.   "snow_accumulation": [
  4.     0.125,
  5.     0.25
  6.   ],
  7.   "temperature": -0.7
  8. }
复制代码


downfall 是浮点数,指定降水值,降水值影响颜色和方块变化。设为 0 后,生物群系不会降水。

temperature 是浮点数,指定温度。原版的温度范围是 [-2.0, 2.0],但是自定义温度也可以超出这个范围。温度影响类似于天空颜色、降雨还是降雪、冰雪是否融化、海绵是否自动蒸干等等特性。

snow_accumulation 是浮点数数组,如果这个生物群系能下雪,则指定雪层可以积累的深度。第一个值是下限,第二个值是上限,每 0.125 表示一层雪。无论最大值设为什么,都不能使积雪深度超过 1 个方块深。

然后是湿度,通过 minecraft:humidity 组件指定。

  1. "minecraft:humidity": {
  2.   "is_humid": true
  3. }
复制代码


这个组件比较简单,is_humid 指定生物群系是否湿润。湿度决定火的蔓延概率与速率。

还可以通过 minecraft:creature_spawn_probability 组件设置生物在生物群系中生成的概率,这影响的是第一次生成这个生物群系的区块时生物生成的概率。

  1. "minecraft:creature_spawn_probability": {
  2.   "probability": 0.06
  3. }
复制代码


probability 指定生物生成的概率,取值范围 [0.0, 0.75]。

我们可以指定生物群系中植被在地图上的颜色,通过 minecraft:map_tints 组件。

  1. "minecraft:map_tints" : {
  2.   "grass": {
  3.     "type": "tint",
  4.     "tint": "#aea42a"
  5.   },
  6.   "foliage": "#90814d"
  7. }
复制代码


foliage 是字符串或整数数组,指定树叶的颜色。表达颜色时可以用 #aaaaaa 的格式,也可以用含有三个整数的数组表示红绿蓝三个颜色分量。

grass 是对象,指定草地的颜色。将其中的 type 字段设为 noise 会导致使用噪声染色草地,此时不需要额外字段;设为 tint 会导致使用自定义颜色染色草地,此时需要同级的 tint 字段指定染色颜色值。

最后,我们可以为生物群系添加一些标签,这些标签可以用于地物生成等。

  1. "minecraft:tags": {
  2.   "tags": [
  3.     "animal",
  4.     "monster",
  5.     "overworld",
  6.     "plateau",
  7.     "savanna",
  8.     "spawns_savanna_mobs",
  9.     "spawns_warm_variant_farm_animals"
  10.   ]
  11. }
复制代码


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 标签的生物群系将使用普通的主世界花,而不是森林类花。

以上就是生物群系的所有可用组件了。
总结
这一期,我们解释了生物群系的全部可用组件。下期可能会讲解客户端生物群系。


评分

参与人数 2铁粒 +60收起理由
 采矿*** + 50赞一个!
 星空*** + 10苦力怕论坛感谢有你~

查看全部评分

苦力怕论坛,感谢有您~
 发表于 2025-10-20 20:21:18 来自手机|显示全部楼层 IP:山东省
太棒了,以前只能通过修改原本群系。
2#2025-10-20 20:21:18回复收起回复
苦力怕论坛,感谢有您~
回复支持

使用道具举报

本版积分规则

本站
关于我们
联系我们
坛史纲要
官方
哔哩哔哩
技术博客
下载
网易版
安卓版
JAVA
反馈
意见建议
教程中心
更多
捐助本站
QQ群
QQ群

QQ群

访问手机版

访问手机版

手机版|小黑屋|系统状态|klpbbs.com

| 由 木韩网络 提供支持 | GMT+8, 2026-2-3 04:50

声明:本站与Mojang以及微软公司没有从属关系

Powered by Discuz! X3.4