Cat_Anchor 发表于 2024-11-1 20:08:29

附加包教程:51.拼图结构(三)

本帖最后由 Cat_Anchor 于 2024-11-2 10:29 编辑




前言

上期,我们讲解了定义拼图结构的文件。这期,我们将介绍拼图结构集。拼图结构集就是一个或多个拼图结构组成的集合,可以在一个大范围内分散多个拼图结构。其功能主要是决定拼图结构之间的距离(就像原版中试炼密室之间的距离一样,这个距离通常以区块为单位)。


https://klpbbs.com/static/image/hrline/line5.png


拼图结构集

拼图结构集是根据一组规则放置的拼图结构的集合。
如果要定义一个拼图结构集,要在行为包根目录的 worldgen 文件夹中新建一个 structure_sets 文件夹,在其中新建文件并定义拼图结构集。示例如下。{
"format_version": "1.21.20",
"minecraft:structure_set": {
    "description": {
      "identifier": "complementary:debug_hallway_spread"
    },
    "placement": {
      "salt": 415411,
      "separation": 6,
      "spacing": 14,
      "spread_type": "triangular",
      "type": "minecraft:random_spread"
    },
    "structures": [
      {
      "structure": "complementary:debug_hallway",
      "weight": 20
      }
    ]
}
}以下是这些字段的描述。值的范围使用“区间”表示。
字段功能描述类型
identifier拼图结构集的ID。字符串
placement放置模式,即集合中的结构相对于彼此的生成位置。目前仅支持random_spread类型,即以给定的间隔和分布随机分散结构。对象
salt用于随机生成器的种子。防止多个结构集使用相同配置时相互重叠。范围是整型的范围,即 -2147483648 到 2147483647。整数
separation每个网格单元内的填充(以区块为单位)。填充区域内不会生成结构。值必须大于等于0,而且小于 spacing 值的一半。整数
spacing生成结构时使用的网格单元大小(以区块为单位)。结构将尝试在每个单元格内的随机位置生成。值必须大于等于1。整数
spread_type可选,放置结构时使用的随机性算法。字符串
type拼图结构集的类型,目前只能写minecraft:random_spread。字符串
structures集合中拼图结构的加权列表。对象列表
structure拼图结构的ID。字符串
weight拼图结构在集合中的权重。更高的权重更有可能被选择。范围是。整数




https://klpbbs.com/static/image/hrline/line3.png


参数解释

| 放置模式
放置模式代表集合中的结构相对于彼此的生成位置。
| type
这是这个拼图结构集要使用的放置模式的类型。类型决定了拼图结构的分布特征。目前只能填写 minecraft:random_spread,以指定的距离和范围随机分布结构。推测以后可能会添加其他选项,其他字段的填写情况根据这个字段决定。

| spread_type
随机分布拼图结构时需要用到随机算法,这个字段用于决定使用什么随机算法。可以选择填写二者之一:linear 或 triangular。linear 对应均匀分布(Uniform Distribution),在给定范围内均匀分布拼图结构。triangular 对应三角分布(Triangular Distribution),拼图结构将更有可能放置在给定范围的中心,越向四周走,拼图结构就越少。

| salt
随机分布拼图结构时不仅需要用到随机算法,还需要加“盐”,也就是用于随机分布的种子。其他参数相同时,如果不同的拼图结构集使用同样的种子,那么拼图结构的分布就是完全一致的。此时不同的拼图结构会交叠在一起,无法正常生成。如果指定不同的种子,多个结构集使用相同配置放置时就不会相互重叠了。

| spacing
这个字段指定放置拼图结构时使用的网格单元大小(以区块为单位)。结构将尝试在每个单元格内的随机位置生成。
这么说不好理解,让我们做个比喻。假设现在有网格状排列的一块一块的草地区域,每块草地中都要选择一个地方盖一座房子。那么这个字段就决定了草地的边长,以区块为单位。注意草地只是限制了房子地基的位置,房子的一部分可能会超出它所在的草地,因为房子代表拼图结构,而拼图结构通常可以蔓延出去一段距离。

| separation
继续上一段里的比喻,每块草地中,任意一个位置都可以盖房子。现在甲有一块草地A,乙有一块草地B,两块草地水平紧挨着——注意草地与草地之间用一根假想的没有宽度的线划分。如果甲决定把房子盖在草地A的右上角,而乙决定把房子盖在草地B的左上角,那么两座房子是紧挨着的。如果甲想要向右扩建一个平台,乙想要向左挖个地下室,他们都不能这样做,因为没有空间了。为了避免这种情况,给每座房子留下向四周扩建的空间,引入了这个字段。现在给草地的边缘铺一条环绕草地的路,有路的地方就不能盖房子了。separation 的值就是这条路的宽度,以区块为单位。

https://pic.imgdb.cn/item/671b8eb0d29ded1a8c2eaf08.png(示意图。由于“路”是两片草地的四周拼起来的,separation * 2 才是路的宽度。)

| 结构列表
结构列表中包含所有可能放置的拼图结构。一个对象代表一个拼图结构和它的权重,因此每个对象中有如下两个字段:
| structure
填写拼图结构的 ID。

| weight
指定这个拼图结构有多大可能被放置。值越高,概率越大,范围是 1 和 200 之间的整数(含)。概率计算公式是:此结构的 weight 值 / 全部结构的 weight 值之和。


https://klpbbs.com/static/image/hrline/line9.png


原版示例

以下是原版的古迹废墟的定义文件,作为参考。我也会在下面附上解释。
{
"format_version": "1.21.20",
"minecraft:structure_set": {
    "description": {
      "identifier": "minecraft:trail_ruins"
    },
    "placement": {
      "type": "minecraft:random_spread",
      "salt": 83469867,
      "separation": 8,
      "spacing": 34,
      "spread_type": "linear"
    },
    "structures": [
      {
      "structure": "minecraft:trail_ruins",
      "weight": 1
      }
    ]
}
}
这个文件定义了古迹废墟拼图结构集,这个拼图结构集中只有一个结构,即 minecraft:trail_ruins,古迹废墟。它使用 83469867 作为种子,线性的生成模式生成拼图结构。在给定生物群系内,它会按照定义好的 spacing 和 separation 值生成。


https://klpbbs.com/static/image/hrline/line8.png


后记

这一期,我初步讲解了拼图结构集,我们离生成拼图结构又近了一步。下期介绍模板池。




第五十期 第五十一期 第五十二期
页: [1]
查看完整版本: 附加包教程:51.拼图结构(三)