UID82897性别保密经验 EP铁粒 粒回帖0主题精华在线时间 小时注册时间2021-7-23最后登录1970-1-1
| 本帖最后由 Cat_Anchor 于 2024-11-9 14:09 编辑
前言 | 上期,我们讲解了模板池。这期,我要尝试讲解一个很复杂的东西——处理器列表。 | | 基本架构 | 处理器列表是拼图结构使用的规则,用于确定在世界中放置结构模板时要修改或替换哪些方块。
如果要建一面石砖、圆石、苔石砖和裂纹石砖混合材料的墙,那么使用处理器会让这个过程变得简单许多。如果要给箱子、陶罐和可疑的沙砾添加战利品表,也可以用处理器。
如果要定义一个处理器列表,要在行为包根目录的 worldgen 文件夹中新建一个 processors 文件夹,在其中新建文件并定义处理器列表。示例如下。- {
- "format_version": "1.21.20",
- "minecraft:processor_list": {
- "description": {
- "identifier": "complementary:debug_hallway_processor"
- },
- "processors": [...]
- }
- }
复制代码 以下是这些字段的描述。
字段 | 功能描述 | 类型 | identifier | 处理器列表的ID。在将处理器与结构模板配对时,模板池会引用这个ID。 | 字符串 | processors | 要在结构模板上运行的处理器的列表。其中对象可以是四种处理器之一。 | 对象列表 |
| | 处理器Ⅰ | 下面,我们来介绍第一种处理器。这种处理器基于一系列规则替换和修改方块。下面是它的示例。
- {
- "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:方块状态的名称。它的值可以是布尔值、字符串或整数。
| | 处理器Ⅱ和处理器Ⅲ | 下面,我们来介绍第二和第三种处理器。第二种处理器保护方块不受此结构在世界中的放置影响,使用时需要确保它不会替换世界上的匹配方块。下面是它的示例。
- {
- "processor_type": "minecraft:protected_blocks",
- "value": ""
- }
复制代码 以下是这些字段的描述。
字段 | 功能描述 | 类型 | processor_type | 定义处理器的类型,这里是 minecraft:protected_blocks(即处理器Ⅱ)。 | 字符串 | value | 受保护的方块拥有的方块标签。 | 字符串 |
第三种处理器指定模板中其他处理器应该忽略的方块类型。下面是它的示例。
- {
- "processor_type": "minecraft:block_ignore",
- "blocks": [
- ""
- ]
- }
复制代码 以下是这些字段的描述。
字段 | 功能描述 | 类型 | processor_type | 定义处理器的类型,这里是 minecraft:block_ignore(即处理器Ⅲ)。 | 字符串 | value | 处理结构模板时,忽略此列表中的方块。 | 字符串列表 |
| | 处理器Ⅳ | 下面,我们来介绍第四种处理器。这种处理器可以封装其他处理器并执行指定次数。下面是它的示例。
- {
- "processor_type": "minecraft:capped",
- "delegate": {...},
- "limit": {...}
- }
复制代码 以下是这些字段的描述。
字段 | 功能描述 | 类型 | processor_type | 定义处理器的类型,这里是 minecraft:capped(即处理器Ⅳ)。 | 字符串 | delegate | 将被执行的处理器。可以是处理器Ⅰ或处理器Ⅱ或处理器Ⅲ。 | 对象 | limit | 处理器执行的次数。 | 整数或对象 |
| 语法模式
下面介绍 limit 字段的语法模式。
| 模式Ⅰ
此时 limit 需要填写整数。
| 模式Ⅱ
- {
- "type": "constant",
- "value": 1
- }
复制代码
此时 limit 需要填写对象,指定一个常量整数。
type:字段类型,这里是 constant。
value:常量值。
| 模式Ⅲ
- {
- "type": "uniform",
- "min_inclusive": 1,
- "max_inclusive": 1
- }
复制代码
此时 limit 需要填写对象,指定均匀分布的随机整数。
type:字段类型,这里是 uniform。
min_inclusive:整数,最小值(含)。
max_inclusive:整数,最大值(含)。
| | 原版示例 | 以下是原版古迹废墟的一个处理器的定义文件,作为参考。为了便于理解,我给这个文件加上了注释,实际上它没有注释。
- {
- "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)。 | | 后记 | 这一期,我们了解了处理器,可以生成拼图结构了。当然,仅凭这四期教程,成功做出拼图结构的难度还是比较大的,这需要慢慢摸索。
(这是我做的第二个拼图结构,树屋。完善之后,我会发布这个附加包,到时候可能会出教程讲解如何制作“树屋”这样的拼图结构。) |
|
|