附加包教程: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(这是我做的第二个拼图结构,树屋。完善之后,我会发布这个附加包,到时候可能会出教程讲解如何制作“树屋”这样的拼图结构。)
第五十二期 第五十三期 第五十四期 感谢楼主教程[哔哩_打call]
页: [1]