Cat_Anchor 发表于 2024-11-3 18:57:59

附加包教程:53.拼图结构(五)

本帖最后由 Cat_Anchor 于 2024-11-9 14:09 编辑




前言

上期,我们讲解了模板池。这期,我要尝试讲解一个很复杂的东西——处理器列表。


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


基本架构

处理器列表是拼图结构使用的规则,用于确定在世界中放置结构模板时要修改或替换哪些方块。
如果要建一面石砖、圆石、苔石砖和裂纹石砖混合材料的墙,那么使用处理器会让这个过程变得简单许多。如果要给箱子、陶罐和可疑的沙砾添加战利品表,也可以用处理器。
如果要定义一个处理器列表,要在行为包根目录的 worldgen 文件夹中新建一个 processors 文件夹,在其中新建文件并定义处理器列表。示例如下。{
"format_version": "1.21.20",
"minecraft:processor_list": {
    "description": {
      "identifier": "complementary:debug_hallway_processor"
    },
    "processors": [...]
}
}以下是这些字段的描述。
字段功能描述类型
identifier处理器列表的ID。在将处理器与结构模板配对时,模板池会引用这个ID。字符串
processors要在结构模板上运行的处理器的列表。其中对象可以是四种处理器之一。对象列表



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


处理器Ⅰ

下面,我们来介绍第一种处理器。这种处理器基于一系列规则替换和修改方块。下面是它的示例。
{
"processor_type": "minecraft:rule",
"rules": [
    {
      "block_entity_modifier": {...},
      "input_predicate": {...},
      "location_predicate": {...},
      "position_predicate": {...},
      "output_state": {...}
    }
]
}以下是这些字段的描述。
字段功能描述类型
processor_type定义处理器的类型,这里是 minecraft:rule(即处理器Ⅰ)。字符串
rules在结构模板的所有方块上使用的替换规则。按顺序使用规则。如果成功使用了 output_state,那么 output_state 中指定的方块将被用作后续规则的 input_predicate 值。对象列表
rules/*在结构模板的所有方块上使用的替换规则。对于任意方块,如果全部谓词都为true,那么用 output_state 指定的方块替换这个方块。对象
rules/*/input_predicate可选。在结构模板方块上计算的谓词。对象
rules/*/location_predicate可选。在世界方块上计算的谓词。对象
rules/*/position_predicate可选。根据结构的原点和世界方块之间的距离计算的谓词。对象
rules/*/block_entity_modifier可选。当所有谓词为 true 时,用于方块实体的方块状态修饰符,主要用于添加战利品表。对象
rules/*/output_state如果所有谓词都为 true,则使用这里指定的方块替换世界中的方块。字符串或对象

接下来,我们将介绍所有谓词、修饰符和语法模式。

| 谓词

首先是 input_predicate 字段和 location_predicate 字段通用的谓词。

| 谓词Ⅰ
"predicate_type": "minecraft:always_true"
始终为true的谓词。如果没有指定其他谓词,这是默认谓词。

| 谓词Ⅱ
"predicate_type": "minecraft:block_match",
"block": ""
如果指定位置的方块是指定的方块,则为true。
block:要匹配的方块。

| 谓词Ⅲ
"predicate_type": "minecraft:random_block_match",
"block": "",
"probability": 0.5
如果指定位置的方块是指定的方块,则有给定的概率为true的谓词。用于随机选择部分方块进行操作。
block:要匹配的方块。
probability:浮点数,范围是[0.0,1.0),当方块匹配时结果为true的概率。

| 谓词Ⅳ
"predicate_type": "minecraft:tag_match",
"tag": ""
如果指定位置的方块拥有指定标签,则为true。
tag:要匹配的标签。

接下来是 position_predicate 字段使用的谓词。

| 谓词Ⅰ
"predicate_type": "minecraft:always_true"
始终为true的谓词。如果没有指定其他谓词,这是默认谓词。

| 谓词Ⅴ
"predicate_type": "minecraft:axis_aligned_linear_pos",
"axis": "y",
"max_chance": 0.75,
"min_chance": 0.25,
"max_dist": 16,
"min_dist": 2
如果方块在沿着所提供的轴的距离范围内,而且随机数在随机范围之间,则为true。
axis:判断的轴向。
max_chance:浮点数,范围是[0.0,1.0),指定最大概率
min_chance:浮点数,范围是[0.0,1.0),指定最小概率
max_dist:大于等于0的整数,指定最大距离
min_dist:大于等于0的整数,指定最小距离

| 修饰符

然后是 block_entity_modifier 字段使用的修饰符。

| 修饰符Ⅰ
"type": "minecraft:passthrough"
保持状态不变的修饰符。如果没有指定其他修饰符,这是默认的修饰符。

| 修饰符Ⅱ
"type": "minecraft:append_loot",
"loot_table": ""
试图给一个方块实体增加战利品的修饰符。
loot_table:要添加的战利品表路径。

| 语法模式

最后是 output_state 字段的语法模式。

| 模式Ⅰ
""
此时 output_state 需要填写字符串,字符串的内容是方块名称。

| 模式Ⅱ
{
"name": "",
"states": {
    "state_name": true
}
}
此时 output_state 需要填写对象,对象内容是方块的名称和状态。
name:方块名称。
states:包含以方块状态为名称的键,具有布尔值、整数或字符串值。
state_name:方块状态的名称。它的值可以是布尔值、字符串或整数。



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


处理器Ⅱ和处理器Ⅲ

下面,我们来介绍第二和第三种处理器。第二种处理器保护方块不受此结构在世界中的放置影响,使用时需要确保它不会替换世界上的匹配方块。下面是它的示例。
{
"processor_type": "minecraft:protected_blocks",
"value": ""
}以下是这些字段的描述。
字段功能描述类型
processor_type定义处理器的类型,这里是 minecraft:protected_blocks(即处理器Ⅱ)。字符串
value受保护的方块拥有的方块标签。字符串

第三种处理器指定模板中其他处理器应该忽略的方块类型。下面是它的示例。
{
"processor_type": "minecraft:block_ignore",
"blocks": [
    ""
]
}以下是这些字段的描述。
字段功能描述类型
processor_type定义处理器的类型,这里是 minecraft:block_ignore(即处理器Ⅲ)。字符串
value处理结构模板时,忽略此列表中的方块。字符串列表



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


处理器Ⅳ

下面,我们来介绍第四种处理器。这种处理器可以封装其他处理器并执行指定次数。下面是它的示例。
{
"processor_type": "minecraft:capped",
"delegate": {...},
"limit": {...}
}以下是这些字段的描述。
字段功能描述类型
processor_type定义处理器的类型,这里是 minecraft:capped(即处理器Ⅳ)。字符串
delegate将被执行的处理器。可以是处理器Ⅰ或处理器Ⅱ或处理器Ⅲ。对象
limit处理器执行的次数。整数或对象

| 语法模式

下面介绍 limit 字段的语法模式。

| 模式Ⅰ
1
此时 limit 需要填写整数。

| 模式Ⅱ
{
"type": "constant",
"value": 1
}
此时 limit 需要填写对象,指定一个常量整数。
type:字段类型,这里是 constant。
value:常量值。

| 模式Ⅲ
{
"type": "uniform",
"min_inclusive": 1,
"max_inclusive": 1
}
此时 limit 需要填写对象,指定均匀分布的随机整数。
type:字段类型,这里是 uniform。
min_inclusive:整数,最小值(含)。
max_inclusive:整数,最大值(含)。



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


原版示例

以下是原版古迹废墟的一个处理器的定义文件,作为参考。为了便于理解,我给这个文件加上了注释,实际上它没有注释。
{
"format_version": "1.21.20",
"minecraft:processor_list": {
    "description": {
      "identifier": "minecraft:trail_ruins_houses_archaeology" //处理器列表的ID。
    },
    "processors": [ //处理器列表。
      { //一个处理器。
      "processor_type": "minecraft:rule", //这说明它是替换方块的处理器。
      "rules": [ //替换的规则。
          { //第一条规则。
            "input_predicate": { //输入要检测的方块。
            "predicate_type": "minecraft:random_block_match", //选定方块后根据概率替换。
            "block": "minecraft:gravel", //检测沙砾方块。
            "probability": 0.2 //有20%的概率选中并替换,也就是说,有大约20%的沙砾会被替换。
            },
            "output_state": {
            "name": "minecraft:dirt" //替换成泥土方块。
            }
          },
          { //第二条规则,这条规则的语法模式和上面那条规则一样,所以不写重复的注释了。
            "input_predicate": {
            "predicate_type": "minecraft:random_block_match",
            "block": "minecraft:gravel", //检测沙砾。
            "probability": 0.1
            },
            "output_state": {
            "name": "minecraft:dirt", //替换成泥土...吗?
            "states": {
                "dirt_type": "coarse" //替换成砂土。泥土有个方块状态dirt_type,如果把它设置为coarse,那么这个泥土方块就是砂土方块。
            }
            }
          },
          { //第三条规则。
            "input_predicate": {
            "predicate_type": "minecraft:random_block_match",
            "block": "minecraft:mud_bricks", //检测泥砖。
            "probability": 0.1
            },
            "output_state": {
            "name": "minecraft:packed_mud" //替换成泥坯。
            }
          }
      ]
      },
      { //封装的处理器。这里其实是根据首字母排的字段顺序,不符合阅读习惯,一般来说 processor_type 要写在前面。
      "delegate": {
          "processor_type": "minecraft:rule", //替换方块的处理器。
          "rules": [ //检测规则。这里也是根据首字母排的字段顺序,不符合阅读习惯,一般来说先写 input_predicate,然后写 output_state,最后写 block_entity_modifier,这样读起来比较方便。
            { //不过这里面的字段的顺序不影响最后的效果,所以怎么开心怎么来。
            "block_entity_modifier": { //修改方块实体。
                "type": "minecraft:append_loot", //添加战利品表。
                "loot_table": "loot_tables/entities/trail_ruins_brushable_block_common.json" //这里指定了战利品表的路径。
            },
            "input_predicate": {
                "predicate_type": "minecraft:block_match",
                "block": "minecraft:gravel" //检测沙砾。
            },
            "output_state": {
                "name": "minecraft:suspicious_gravel" //替换成可疑的沙砾。
            }
            }
          ]
      },
      "limit": 6, //里面的处理器执行六次。
      "processor_type": "minecraft:capped" //这里说明了它是封装的处理器。
      },
      { //这个和上一个差不多,只不过改了执行次数和战利品表的路径。
      "delegate": {
          "processor_type": "minecraft:rule",
          "rules": [
            {
            "block_entity_modifier": {
                "type": "minecraft:append_loot",
                "loot_table": "loot_tables/entities/trail_ruins_brushable_block_rare.json" //不同的战利品表路径。
            },
            "input_predicate": {
                "predicate_type": "minecraft:block_match",
                "block": "minecraft:gravel"
            },
            "output_state": {
                "name": "minecraft:suspicious_gravel"
            }
            }
          ]
      },
      "limit": 3, //执行三次。
      "processor_type": "minecraft:capped"
      }
    ]
}
}
这个文件定义了古迹废墟的 minecraft:trail_ruins_houses_archaeology 处理器。这个处理器会用泥土随机替换 20% 的沙砾,用砂土替换 10% 的沙砾,然后用泥坯随机替换 10% 的沙砾,最后将 6 块沙砾替换为可疑的沙砾,并且设置战利品表为普通战利品(路径:loot_tables/entities/trail_ruins_brushable_block_common.json);将 3 块沙砾替换为可疑的沙砾,并且设置战利品表为稀有战利品(路径:loot_tables/entities/trail_ruins_brushable_block_rare.json)。

以下是原版古迹废墟的另一个处理器的定义文件,作为参考。
{
"format_version": "1.21.20",
"minecraft:processor_list": {
    "description": {
      "identifier": "minecraft:trail_ruins_roads_archaeology"
    },
    "processors": [
      {
      "processor_type": "minecraft:rule",
      "rules": [
          {
            "input_predicate": {
            "predicate_type": "minecraft:random_block_match",
            "block": "minecraft:gravel",
            "probability": 0.2
            },
            "output_state": {
            "name": "minecraft:dirt"
            }
          },
          {
            "input_predicate": {
            "predicate_type": "minecraft:random_block_match",
            "block": "minecraft:gravel",
            "probability": 0.1
            },
            "output_state": {
            "name": "minecraft:gravel"
            }
          },
          {
            "input_predicate": {
            "predicate_type": "minecraft:random_block_match",
            "block": "minecraft:mud_bricks",
            "probability": 0.1
            },
            "output_state": {
            "name": "minecraft:packed_mud"
            }
          }
      ]
      },
      {
      "processor_type": "minecraft:capped",
      "limit": 2,
      "delegate": {
          "processor_type": "minecraft:rule",
          "rules": [
            {
            "input_predicate": {
                "predicate_type": "minecraft:block_match",
                "block": "minecraft:gravel"
            },
            "output_state": {
                "name": "minecraft:suspicious_gravel"
            },
            "block_entity_modifier": {
                "type": "minecraft:append_loot",
                "loot_table": "loot_tables/entities/trail_ruins_brushable_block_common.json"
            }
            }
          ]
      }
      }
    ]
}
}
这个文件定义了古迹废墟的 minecraft:trail_ruins_roads_archaeology 处理器。这个处理器会用泥土随机替换 20% 的沙砾,用沙砾替换 10% 的沙砾[原意如此],然后用泥坯随机替换 10% 的泥砖,最后将 2 块沙砾替换为可疑的沙砾,并且设置战利品表为普通战利品(路径:loot_tables/entities/trail_ruins_brushable_block_common.json)。

以下是原版古迹废墟的最简单的处理器(其实一共就三个,我全搬来了)的定义文件,作为参考。
{
"format_version": "1.21.20",
"minecraft:processor_list": {
    "description": {
      "identifier": "minecraft:trail_ruins_tower_top_archaeology"
    },
    "processors": [
      {
      "processor_type": "minecraft:capped",
      "limit": 2,
      "delegate": {
          "processor_type": "minecraft:rule",
          "rules": [
            {
            "input_predicate": {
                "predicate_type": "minecraft:block_match",
                "block": "minecraft:gravel"
            },
            "output_state": {
                "name": "minecraft:suspicious_gravel"
            },
            "block_entity_modifier": {
                "type": "minecraft:append_loot",
                "loot_table": "loot_tables/entities/trail_ruins_brushable_block_common.json"
            }
            }
          ]
      }
      }
    ]
}
}
这个文件定义了古迹废墟的 minecraft:trail_ruins_tower_top_archaeology 处理器。这个处理器会将 2 块沙砾替换为可疑的沙砾,并且设置战利品表为普通战利品(路径:loot_tables/entities/trail_ruins_brushable_block_common.json)。


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


后记

这一期,我们了解了处理器,可以生成拼图结构了。当然,仅凭这四期教程,成功做出拼图结构的难度还是比较大的,这需要慢慢摸索。


https://pic.imgdb.cn/item/6727523dd29ded1a8c82f5bb.jpg(这是我做的第二个拼图结构,树屋。完善之后,我会发布这个附加包,到时候可能会出教程讲解如何制作“树屋”这样的拼图结构。)




第五十二期 第五十三期 第五十四期

YanRan233 发表于 2024-11-3 23:54:07

感谢楼主教程[哔哩_打call]
页: [1]
查看完整版本: 附加包教程:53.拼图结构(五)