概述参考资料生物群系生物群系生成编写格式群系开发模板自定义spawn_rules自定义特征文件存放规则结构结构方块的获取&放置结构导出Netease Structure FeatureFeature Rules文件解读Feature Rules部分变量、函数解释placement_passvariable.originx与variable.originzvariable.worldx与variable.worldzcoordinate_eval_orderscatter_chancemath.modquery.is_biomequery.get_height_atquery.noiseNetease Structure Feature文件解读Netease Structure Feature放置规则Netease Structure Feature放置事件demo解释自定义维度自定义特征MOD卸载常见报错

概述

该功能仅在结构保存时需要开启实验性玩法。

开发者可以通过继承原版的生物群系,并修改其中的一些属性,从而控制自定义维度中的地貌及生物生成。

还可通过配置Netease Structure Feature和Feature Rules的方式,在地形生成时自动在区块上放置多个由结构方块导出的结构。

群系json格式对应微软1.13.0版本

 

通过该方法定义的自定义维度不可以与“MirrorDimension”接口一起使用

下界和超平坦世界无法生成自定义特征

 

参考资料

  1. 生物群系的介绍:https://minecraft-zh.gamepedia.com/%E7%94%9F%E7%89%A9%E7%BE%A4%E7%B3%BB
  2. 官方wiki上的自定义生物群系json格式及说明:https://minecraft.gamepedia.com/Bedrock_Edition_beta_biomes_documentation
  3. 原版生物群系的json:见“Mod PC开发包”的data/definitions/biomes目录
  4. 官方wiki上的Features及Feature Rules文档: https://minecraft.gamepedia.com/Bedrock_Edition_features_documentation
  5. 原版features的json:见“Mod PC开发包”的data/definitions/features目录
  6. 原版feature rules的json:见“Mod PC开发包”的data/definitions/feature_rules目录

 

生物群系

生物群系生成

目前基岩版生物群系生成的管线还处于硬编码的阶段,为了让开发者对配置自定义群系有一个基本的思路,先简单描述一下生物群系生成的各个步骤。如果有兴趣或者想有更深入的了解可以参考java版的源码以及网上的一些解析。

 

编写格式

  1. 在行为包中新建一个netease_biomes文件夹。

  2. 为每个需要自定义生物群系的自定义维度创建一个以维度命名的文件夹。

    关于自定义维度:

    • 每个维度对应一个id,原生维度中主世界为0,地狱为1,末地为2。自定义维度的id从3开始,一直到20。
    • 自定义维度的名称为"dm"前缀加数字id。如id为3的维度,命名为“dm3”。
  3. 在文件夹中编写需要重写的生物群系。对每个自定义群系,命名为原版群系加上维度名字及下划线为前缀。例如dm3维度的desert群系命名为"dm3_desert"。

    对每个自定义群系,必须继承一个原版的生物群系,在description中用inherits表示,新群系的identifier需要与文件名相同。例如dm3维度重写desert群系,则需要编写一个dm3_desert.json:

    对每个自定义维度,每个原版群系都会有一个对应了继承他的自定义群系。在生成群系时,流程不会改变,但是生成时取到的是当前维度中继承后的群系。

  4. 在新群系中重写属性来覆盖原版群系的属性。

    没有进行重写的属性会使用原版群系的属性。

    没有进行重写的群系,会自动生成一个所有属性与原版群系相同的,带维度名称前缀的群系

    • 目前支持的原版biomes json的字段包括:

      • minecraft:overworld_height

      • minecraft:overworld_surface

        • 不支持带有block entity的方块,也不支持门,床等占多个位置的方块
        • 可使用nbt设置带有auxvalue的方块。目前仅支持设置特殊沙子及特殊泥土类型。可参考原版群系的mesa_plateau_stone.json以及savanna_mutated
      • minecraft:world_generation_rules

    • 自定义tag

    所有的hills_transformation,mutate_transformation,值必须为当前维度的群系。

    若原版群系带有这两个transformation,都需要重写为当前维度的群系。

    例如原版desert群系,hills_transformation为desert_hills,mutate_transformation为desert_mutated,那么在自定义维度中,保持原有规则需要重写为

    如果想要删除群系的hills_transformation,mutate_transformation,generate_for_climates属性,可以参考以下方法:

    需要注意,修改后的维度,陆地(不含ocean的tag)、海洋(含ocean的tag,但没有deep的tag)、深海(同时包含ocean及deep的tag)三种类型,每种类型的五种温度必须至少有1点权重

  5. 在新群系中添加新的标签,可用于spawn_rules等其他功能。

    在“群系开发模板中”,默认给所有自定义维度添加了一个与维度名称一样的标签,便于开发。

    开发者可以按需添加其他标签。

群系开发模板

CustomBiomesMod中的tools\template中提供了模板工具生成符合编写格式最低要求的自定义维度。生成的自定义群系有以下特征:

  1. 对两种transformation都进行了对应当前维度群系的重写
  2. 保留了原有generate_for_climates的字段
  3. 给每个群系添加了与维度名相同的标签
  4. 对每个自定义群系,都可以找到一个与之对应的去掉维度名称前缀的原版群系(见参考资料3)

开发者在编写自己的维度时,可以以此为模板进行开发。

使用方法:

  1. CustomBiomesMod\customBiomesBehaviorPack\tools目录打开命令行,输入

维度名称为自定义维度的名称,例如要更改dm6自定义维度的群系,则输入

然后tools文件夹下会生成一个维度命名的文件夹。

  1. 将生成的文件夹拷贝到您的mod的netease_biomes下
  2. 前面完成了“编写格式”2-4步中编写一个合法自定义维度的最低要求。开发者可以在此基础上进行开发,修改群系的components。

自定义spawn_rules

1.在addon的bevavior目录下新增spawn_rules文件夹

2.创建一个json文件并命名,如example.json,例子:

3.在minecraft:spawn_rules里必须存在descriptionconditions

所有的Spawn Rules必须存在一个Id,格式也是namespace:name,填写在identifier中,注意该值的唯一性

description中还有一个population_control

4.population_control种类,每一种类都有生成个数的限制,该值可以为以下类型:

类型
animal
monster
water_animal
villager
ambient
cat
pillager

5.生成条件condition可做如下设置:

NameDescription
minecraft:spawns_on_surface允许mob在地上生成
minecraft:spawns_underwater允许mob在水里生成
minecraft:brightness_filter允许mob生成的光照条件
minecraft:weightmob生成的权重,默认为0
minecraft:difficulty_filtermob生成的困难模式
minecraft:herdherd的大小
minecraft:biome_filter允许mob生成的biome

 

自定义特征

文件存放规则

自定义特征相关文件存放规则如下:

微软的Feature及Feature Rules文件若放置在netease_features及netease_feature_rules目录下可在非实验性玩法下加载

结构

结构的编辑和导出需要玩家处于创造模式下,并开启实验性玩法。

结构方块的获取&放置

可通过指令/give @p structure_block获取结构方块

结构方块放置后,可在世界中看到结构的白色轮廓。使用结构方块可打开其GUI,可在GUI中编辑结构的大小、距离结构方块的偏移。

结构中红、蓝、绿三线交汇点为该结构方块的坐标最小点,结构的放置都是从该点所在方块开始的。

若不希望结构中的空气方块在放置时覆盖掉其他方块,可通过指令/give @p structure_void获取结构空位,并放置在相应的空气方块上。

avatar

结构导出

Netease Structure Feature支持的单个结构最大尺寸为16 * 255 * 16,若超过最大尺寸,超出范围的方块可能不会成功放置;若方块在世界中的高度超过255也不会成功放置,建议结构高度不要设置过高。

通过Netease Structure Feature放置的结构不支持包含实体功能,即使结构中保存了实体,也不会生成。

结构名称应命名为 文件夹名:结构名,文件夹名由开发者自定,用于放置结构文件。需要注意的是行为包的 structures目录与结构文件之间必须有且仅有一层中间目录,即结构文件路径应为 行为包/文件夹1/结构文件 ,而不应为 行为包/文件夹1/文件夹2/结构文件 或其他。

在结构方块GUI界面模式选择"保存",点击导出即可导出该结构了。

若结构中包含火方块,通过NeteaseStructureFeature放置的火与永恒之火相似,不会熄灭、不会扩散,但依旧有燃烧伤害

Netease Structure Feature

Feature Rules文件解读

Feature Rules编写例子可参考官方文档

Feature Rules部分变量、函数解释

placement_pass

variable.originx与variable.originz

variable.worldx与variable.worldz

coordinate_eval_order

scatter_chance

math.mod

query.is_biome

参数名数据类型说明
xintx世界坐标
zintz世界坐标
biomesArgs...生物群系的枚举值int,可参照3-3 minecraft枚举值文档中BiomeType项

query.get_height_at

参数名数据类型说明
xintx世界坐标
zintz世界坐标

query.noise

参数名参数类型说明
num1float传入参数一
num2float传入参数二

Netease Structure Feature文件解读

Netease Structure Feature格式如下:

Netease Structure Feature放置规则

生成地形时,当区块加载完后,才会尝试在该区块放置Netease Structure Feature。Feature Rules文件中distribution里的坐标决定了结构中坐标最小方块的放置位置,若结构过大,可能会有部分方块落在未加载的区块中,这些方块将无法成功放置在世界中。

若要使Netease Structure Feature自动生成 16 * 合法高度 * 16 的结构,需要将Feature Rules中的x和z均设为0,才能保证结构会被完全加载。

若目标结构尺寸超过最大尺寸,可将其分割成多个16 * 合法高度 * 16的结构,通过配置多个Feature Rule使它们在相邻区块上生成,可参考CustomBiomesMod中的羊毛Feature Rule。

Netease Structure Feature放置事件

通过Netease Structure Feature放置结构的事件为PlaceNeteaseStructureFeatureEvent,可通过服务端feature组件添加、移除对某个结构的监听,详见 3-1 MOD SDK文档。

需要注意的是,在PlaceNeteaseStructureFeatureEvent监听事件中,由于该事件较为特殊,仅能进行是否取消放置该结构的设置,此时若调用其他mod SDK接口将不会生效。

demo解释

请对照示例中的CustomBiomesMod阅读

该demo定义了3个自定义维度,1个自定义生物,以及对生物生成做了一些调整。

还定义了10个Feature Rule,每个Feature Rule对应不同的Netease Structure Feature,每个Netease Structure Feature对应一个结构。

该demo的python脚本较简单,实现了玩家输入维度名称时把他传送到对应维度的功能。

还添加了对test:pumpkins结构的监听,并在尝试放置test:pumpkins时以50%的概率取消生成。

自定义维度

以下解释3个自定义维度的功能及实现方法:

自定义特征

本demo提供的10种结构中,有9种结构为由16 * 3 * 16的玻璃-羊毛-玻璃方块(下面简称为羊毛结构),区别仅在于羊毛颜色不同。

剩余一种结构为尺寸为2 * 2 * 2的四个南瓜灯方块(简称为南瓜结构),并且在空气方块位置均放置了结构空位避免覆盖该位置的方块。

这十个结构共同组成了一个大型结构,并且整个大型结构在X、Z方向上每隔96格(6个区块)放置一次,可以在末地完整观测到。

在Feature Rule的iterations中根据区块最小坐标判断是否应放置该Feature,9个羊毛结构Feature放置时均会判断最中间黄色羊毛所在区块的生物群系是否在 0(oceans)、1(plains)、2(desert)、9(末地)、12(冰原)、46(冻洋)中,是则会尝试放置结构一次,并且放置高度均为黄色羊毛结构所在区块坐标最小点的最高非空气方块的高度。

南瓜结构放置条件与羊毛相同,不同点在于它会尝试放置三次,且x和z坐标偏移在[0, 16]内随机,高度为最终x、z坐标所在最高非空气方块的高度。

羊毛结构仅会在维度4、维度5以及末地生成,南瓜结构则会在维度4和末地生成。

下图展示了这些Feature实际放置在末地的结构:

avatar

下面以粉色羊毛结构、浅蓝色羊毛结构为例解释distribution的配置:

MOD卸载

当存档卸载带自定义生物群系的mod时,地图的已探索区域会保持自定义的形态,但卸载后新探索的区域会变回原版生物群系。

若对存档重新加载mod,卸载后新探索的区域会保持原版群系的形态。

 

常见报错

  1. JSON: xxx has an error

    一般为json格式有问题,可以检查一下逗号时候漏写或多写,括号是否对应。

    图为多写逗号的报错

    avatar

  2. lookupByName can not find biome

    一般为两种transform填写的群系名有问题

    图为群系名多写了一个s

    avatar

  3. different Dimension between

    一般为没有重写原版的transform,或者填写的群系与当前群系不是同一维度。

    若使用“群系开发模板”进行开发,检查是否漏了第2步

    图为在dm5的bamboo_jungle群系中,把hillsTransformation误填为dm3的群系

    avatar

  4. total weight of xxx is zero

    某个温度的总权重为0。检查generate_for_climates属性的编写

    图为陆地的medium温度的权重为0

    avatar

  5. empty Biome in xxxTransformation

    transformation填写了空字符串

  6. Definition of biome xxx is invalid!

    继承关系有问题,检查是否继承不带维度前缀的原版群系

  7. value of json is not valid

    检查json的内容是否合法,例如component的拼写,各个属性的拼写等

  8. Feature rule identifier xxx does not match filename yyy

    一般为Feature Rules文件名与文件中的identifier不匹配。

    图为文件名为overworld_gray_wool_feature的Feature Rules文件配置identifier为overworld_graywool_feature的报错。

avatar

  1. No definition found for feature xxx

    一般为找不到Feature Rules文件中填写的"places_feature"项对应的feature文件

    图为将Feature Rules中"places_feature"值填写为error_name的报错。

avatar

  1. The feature name XXX did not match the expected name of YYY

    一般为Feature文件名与文件中的identifier不匹配。

    图为文件名为netease_pumpkins_structure_feature的Feature文件配置identifier为pumpkins的报错。

avatar

  1. Failed to load feature XXX

    一般为Feature文件中places_structure项对应的结构名称填写错误,或结构文件放错了目录。

    图为将test:pumpkins写为test:pumpkin导致无法正常加载结构的报错。

avatar