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合并,并可用于匹配以下三种类型的条件:

  1. 方块(该类型被解析为字符串,使用形如 "minecraft:stone"来匹配石头)

  2. 方块状态(该类型被解析为后加数组形式的方块状态的方块ID字符串,使用形如"minecraft:furnace[lit=true]"来匹配燃烧中的熔炉方块。你可以使用F3界面来获得准星的方块状态,或者使用调试棒来获得方块状态可能的值。)

  3. 方块标签(该类型被解析为类似标签的形式,使用形如"#minecraft:base_stone_overworld"来匹配主世界中生成在地下的所有类型的石头。注意使用方块标签而不是物品标签,部分情况下他们可能不同,你可以在F3界面获得方块标签。)

注:

  • 你可以在方块过滤器中使用正则表达式,/^mekanism:.*_ore$/将匹配所有通用机械中以_ore结尾的方块。注意,这种写法不会匹配方块状态!

  • 你可以使用JavaScript Object来提供规则测试(它将会像原版解析JSON或NBT那样被解析)。例如,你可以通过这种方式设置匹配生效的概率。

三、高度提供器

另一个有些复杂的系统可能是“高度提供器”(Height Providers)系统,其被用于判定指定方块可能生成的Y坐标值和生成频率。与该系统同时使用的还有“垂直锚”(Vertical Anchors)概念,其可以用于获取相对于某锚点的相对高度(例如相对于世界最高点或最低点)。

在KubeJS中,该系统被简化以使其更容易在脚本开发中被使用:你可以使用AddOreProperties中的uniformHeighttraingleHeight方法来使用两种最常见的矿石生成逻辑(Uniform:在两个锚点间的任意位置有等大的概率生成矿石。Triangle:生成概率从两个锚点的中点向两锚点递减)。垂直锚概念也被简化了,你可以使用AddOreProperties中的辅助方法aboveBottom / belowTop(在世界最低点以上 / 在世界最高点以下)或新版本KubeJS中的VerticalAnchorWrapper Class;此外,你还可以以数字形式直接指定绝对高度

四、群系类别(Biome Categories)

群系类别是可用于将群系大致分为预定义的类别(具体类型见下)的原版系统(其他模组也可能添加更多的类别)

五、群系类型(Biome type,仅Forge可用)

类似于原版的群系类别(Biome Categories),Forge使用”群系字典“来根据群系的属性分类群系(其他模组也可能添加更多的类型)

六、示例脚本

这有帮助吗?