这是适用于Minecraft Java版1.21.4的Fabric模组开发系列教程专栏第十九章——自定义生物群系。想要阅读其他内容,请查看或订阅上面的专栏。
生物群系(Biome) 是Minecraft中世界不同区域呈现特定的地貌景观,这些区域与现实世界类似,都具有和其他区域不同的地理特征,如地表方块、温度、湿度以及海拔高度等。当然,处于下界和末地的部分生物群系不存在于现实世界。据统计,原版游戏中大约有80个生物群系。
生物群系的加入需要在创建维度(Dimension) 之后进行。我们可以将自定义生物群系加入到原版游戏中的维度中,也可以将生物群系加入到自定义维度,因此,想要将生物群系加入到维度,需要有一定的维度系列JSON编写能力。更多信息可以参考我的世界Java版1.21.4的Fabric模组开发教程(十七)自定义维度。
生物群系是地物(Feature) 生成的基础。所有地物的生成需要在生物群系JSON中配置。关于结构和地物的相关概念将在后续章节推出。
创建生物群系定义JSON
生物群系定义JSON用于定义生物群系的诸多属性,是创建生物群系的核心文件,也是创建生物群系需要的唯一JSON。
生物群系定义JSON应当位于(generated)/data/{mod-id}/worldgen/biome
目录中,文件名为生物群系的命名空间ID。整个文件中的配置项应当包含在一个根对象{}
内,它们包括:
“carvers”
:指定可以在生物群系中生成的雕刻器。提供一个以#
开头的雕刻器标签、雕刻器命名空间ID,或者写成一个数组,其中提供一个雕刻器命名空间ID的列表。该项为必选项,但可以为空;“downfall”
:指定生物群系的降水值,提供单精度型数据,即float。此值和“temperature”
的值共同影响植物颜色;“effects”
:指定生物群系的环境效果。需要写成一个对象,所有的配置项都需要提供一个十进制的RGB颜色值,包括:“fog_color”
:指定迷雾颜色;“sky_color”
:指定天空颜色;“water_color”
:指定水体颜色;“water_fog_color”
:指定水下迷雾颜色;
以上配置项为必选项,更多配置项请参考官方Wiki;
“features”
:指定在该生物群系放置的地物。需要写成一个数组,其中的每一个配置项都代表地物放置的一个阶段,且都需要写成一个数组,其中的值为该阶段需要放置的地物。地物的放置是有序的,且仅有11个阶段,包括:RAW_GENERATION
:原始生成;LAKES
:湖;LOCAL_MODIFICATIONS
:本地修改;UNDERGROUND_STRUCTURES
:地下结构;SURFACE_STRUCTURES
:地表结构;STRONGHOLDS
:要塞;UNDERGROUND_ORES
:地下矿物;UNDERGROUND_DECORATION
:地下装饰;FLUID_SPRINGS
:涌泉;VEGETAL_DECORATION
:植被装饰TOP_LAYER_MODIFICATION
:顶层修改;
所有的阶段都可以为空,但必须提供一个空的数组作为该阶段的值。每个阶段中的地物放置也是有顺序的;
“has_precipitation”
:指定生物群系是否有降水,提供一个布尔值;“spawn_costs”
:指定生物群系中生物的生成代价,亦称生成势,用于控制生物生成的密度,写成一个数组,其中的每一项是某个实体的生成代价对象。该项为必选项,但可以为空;“spawners”
:指定生物群系以类别的形式进行生物生成,需要写成一个对象,其中的每个配置项都是一个类别,需要写成一个数组,这样的数组共有8个,包括:“ambient”
:环境生物;“axolotls”
:美西螈;“creature”
:动物;“misc”
:其他;“monster”
:怪物;“underground_water_creature”
:地下水生生物;“water_ambient”
:水下环境生物;“water_creature”
:水生生物;
如果不需要生成指定类别的实体,则可以不添加该类别的配置项,或将配置项设置为一个空数组。每个类别中可以添加多个实体对象,每个对象的名称应当为该实体的命名空间ID,并在其中提供以下必选的配置项:“type”
:指定实体的命名空间ID;“weight”
:指定实体的生成权重;“minCount”
:指定实体成群生成时的最低数量,取值不得小于0;“maxCount”
:指定实体成群生成时的最高数量,取值不得小于0;
更多配置项请参考官方Wiki;
“temperature”
:指定生物群系的温度值,提供单精度型数据,即float。此值和“downfall”
的值共同影响植物颜色。
关于部分配置项的详细信息,请参考生物群系定义格式 - 中文 Minecraft Wiki。此外,还要注意两点:
不是所有实体都能加入到生物群系实体生成列表的类别中。所有实体都有自己独有的类别。在“spawners”
配置项中,将实体加入到错误的类别时,实体不会生成或被直接替换为“猪(minecraft:pig)”。另外,有些实体不能自然生成在生物群系中,即不能加入到“spawners”
配置项的任何一个类别之中,即使在所有类别中都添加该实体的命名空间ID,实体也不会自然生成。
例如,将雪傀儡(minecraft:snow_golem)添加到“spawners”
配置项的“creature”
类别中,会导致其被替换为猪,但数量和权重等其他配置保持不变。
关于生物类别,更多信息可以参考生成 - 中文 Minecraft Wiki。
不是所有地物都能加入到生物群系中。 所有地物都有属于自己的生成阶段。在“features”
配置项中,将地物添加到错误的生成阶段时,地物不会在生物群系中生成。另外,有些地物的生成是有顺序的,在某个阶段中添加地物的命名空间ID时需要按照一定的顺序,否则地物同样不会生成。而且,有些地物的生成需要条件,尤其是某些生成在地表的地物,对使用了噪声型区块生成器维度的表面规则有着严格的要求,地表被维度的噪声设置JSON控制而覆盖了错误的方块时,地物同样不会生成。
例如,将冰刺(minecraft:ice_spike)添加到“features”
配置项的SURFACE_STRUCTURES
类别中,会发现生物群系中没有冰刺生成,这是因为冰刺要求在雪块(minecraft:snow_block)上生成。即使将生物群系的温度降低,又或者通过噪声设置JSON修改表面规则使生物群系表面生成覆雪草方块,由于其本质始终为草方块(minecraft:grass_block),而并非雪块,冰刺始终不会在生物群系中生成。
下面这个例子添加了一个具有指定的环境效果、会在地面上生成杜鹃花树(minecraft:rooted_azalea_tree)且会自然生成猫(minecraft:cat)的生物群系:
{"carvers": [],"downfall": 0.0,"effects": {"fog_color": 12638463,"sky_color": 7254527,"water_color": 4159204,"water_fog_color": 329011},"features": [[],["minecraft:lake_lava_underground","minecraft:lake_lava_surface"],[],[],[],[],[],[],[],["minecraft:rooted_azalea_tree"],["minecraft:freeze_top_layer"]],"has_precipitation": false,"spawn_costs": {},"spawners": {"creature": [{"type": "minecraft:cat","maxCount": 5,"minCount": 1,"weight": 100}]},"temperature": 1.0
}
然后将生物群系加入到维度中:
{"type": "test:new_dimension","generator": {"type": "minecraft:noise","biome_source":{"type": "minecraft:fixed","biome": "test:test_biome"},"settings":"test:new_dimension"}
}
需要使用生物群系的命名空间IDtest:test_biome
,这里使用了噪声型区块生成器,生物群系源为固定型。启动游戏,使用命令或传送门来到新维度,可以看到生物群系的设置均已生效;
也可以将生物群系加入原版游戏的维度中,可能需要使用到第三方库。
本章小结
本章详细阐述了创建自定义生物群系JSON的编写过程,并提供了可供调试的例子,是创建自定义生物群系的入门级教程。本文总体难度不大,篇幅适中,但文件中的配置项比较繁杂,一些配置项要求严格,仍需要开发者细心学习。感谢各位的阅读,有兴趣可以订阅此专栏!