20.3.1 世界生成
一、群系过滤器
1.18.2中,你可以使用群系类别(Biome Categories)或者群系类型(Biome type,仅Forge可用)来作为群系过滤器。
下方示例以添加矿石为例展示的群系过滤器的使用方法。
onEvent('worldgen.add', event => {
event.addOre((ore) => {
// 1.16.5 及以上版本:
ore.biomes = "minecraft:plains" // 仅在单一群系生成
ore.biomes = /^minecraft:.*/ // 在所有ID与给定格式相符的群系中生成(此处为在所有原版群系中生成)
// 1.18.2 新增:
ore.biomes = "^nether" // 在群系类别“nether”包含的所有群系中生成
ore.biomes = "$hot" // (仅Forge)在群系类型带有“hot”的所有群系中生成
// 过滤器可以通过与、或、非三种逻辑任意组合
ore.biomes = {} // 空的“与”过滤器(默认为真)
ore.biomes = [] // 空的“或”过滤器(默认为真)
ore.biomes = {
not: "minecraft:ocean" // “非”过滤器(除"minecaraft:ocean"以外的群系)
}
// 因为“与”过滤器可以被表达为map,所以其还可以被表达为以下形式
ore.biomes = {
id: "minecraft:plains",
id: /^minecraft:.*/, // 正则表达式
category: "^nether",
biome_type: "$hot",
}
// 你可以将以上的各种过滤器组合起来,它们会被独立计算
// 在下面这种情况中,矿石将在符合以下条件之一的群系中生成:
// 1、平原
// 2、群系类型带有“hot”的非下界或热带草原类群系。
ore.biomes = [
"minecraft:plains",
{
biome_type: "$hot",
not: [
'#nether',
{
category: "savanna"
}
]
},
]
})
})二、规则测试和目标方块
在1.18中,世界生成变更为了“基于目标”的替换系统,也就是说在同一种结构中,你可以指定以特定方块来替换特定的目标方块。(例如在原版的生成矿石中,石头被普通矿石替代,而深板岩则被深板岩矿石所替代)
每个目标方块都有一个“规则测试”(RuleTest)作为输入(用于检测目标方块的方块状态是否应被替换)并生成一个特定的输出方块状态。在KubeJS脚本层面上,这两个概念都被表达为相同的类:BlockStatePredicate。
就格式上来说,BlockStatePredicate 与 群系过滤器 非常相似,即它们都能使用AND或者OR合并,并可用于匹配以下三种类型的条件:
方块(该类型被解析为字符串,使用形如
"minecraft:stone"来匹配石头)方块状态(该类型被解析为后加数组形式的方块状态的方块ID字符串,使用形如
"minecraft:furnace[lit=true]"来匹配燃烧中的熔炉方块。你可以使用F3界面来获得准星的方块状态,或者使用调试棒来获得方块状态可能的值。)方块标签(该类型被解析为类似标签的形式,使用形如
"#minecraft:base_stone_overworld"来匹配主世界中生成在地下的所有类型的石头。注意使用方块标签而不是物品标签,部分情况下他们可能不同,你可以在F3界面获得方块标签。)
注:
你可以在方块过滤器中使用正则表达式,
/^mekanism:.*_ore$/将匹配所有通用机械中以_ore结尾的方块。注意,这种写法不会匹配方块状态!你可以使用JavaScript Object来提供规则测试(它将会像原版解析JSON或NBT那样被解析)。例如,你可以通过这种方式设置匹配生效的概率。
三、高度提供器
另一个有些复杂的系统可能是“高度提供器”(Height Providers)系统,其被用于判定指定方块可能生成的Y坐标值和生成频率。与该系统同时使用的还有“垂直锚”(Vertical Anchors)概念,其可以用于获取相对于某锚点的相对高度(例如相对于世界最高点或最低点)。
在KubeJS中,该系统被简化以使其更容易在脚本开发中被使用:你可以使用AddOreProperties中的uniformHeight 和 traingleHeight方法来使用两种最常见的矿石生成逻辑(Uniform:在两个锚点间的任意位置有等大的概率生成矿石。Triangle:生成概率从两个锚点的中点向两锚点递减)。垂直锚概念也被简化了,你可以使用AddOreProperties中的辅助方法aboveBottom / belowTop(在世界最低点以上 / 在世界最高点以下)或新版本KubeJS中的VerticalAnchorWrapper Class;此外,你还可以以数字形式直接指定绝对高度
四、群系类别(Biome Categories)
群系类别是可用于将群系大致分为预定义的类别(具体类型见下)的原版系统(其他模组也可能添加更多的类别)
五、群系类型(Biome type,仅Forge可用)
类似于原版的群系类别(Biome Categories),Forge使用”群系字典“来根据群系的属性分类群系(其他模组也可能添加更多的类型)
六、示例脚本
这有帮助吗?