开启辅助访问     
收藏本站

站内搜索

搜索

Minecraft(我的世界)苦力怕论坛

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

 发表于 2024-11-3 18:57:59 来自手机|显示全部楼层|阅读模式 IP:天津
本帖最后由 Cat_Anchor 于 2024-11-9 14:09 编辑

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

处理器Ⅰ
下面,我们来介绍第一种处理器。这种处理器基于一系列规则替换和修改方块。下面是它的示例。
  1. {
  2.   "processor_type": "minecraft:rule",
  3.   "rules": [
  4.     {
  5.       "block_entity_modifier": {...},
  6.       "input_predicate": {...},
  7.       "location_predicate": {...},
  8.       "position_predicate": {...},
  9.       "output_state": {...}
  10.     }
  11.   ]
  12. }
复制代码
以下是这些字段的描述。
字段功能描述类型
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 字段通用的谓词。

| 谓词Ⅰ
  1. "predicate_type": "minecraft:always_true"
复制代码

始终为true的谓词。如果没有指定其他谓词,这是默认谓词。

| 谓词Ⅱ
  1. "predicate_type": "minecraft:block_match",
  2. "block": ""
复制代码

如果指定位置的方块是指定的方块,则为true。
block:要匹配的方块。

| 谓词Ⅲ
  1. "predicate_type": "minecraft:random_block_match",
  2. "block": "",
  3. "probability": 0.5
复制代码

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

| 谓词Ⅳ
  1. "predicate_type": "minecraft:tag_match",
  2. "tag": ""
复制代码

如果指定位置的方块拥有指定标签,则为true。
tag:要匹配的标签。

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

| 谓词Ⅰ
  1. "predicate_type": "minecraft:always_true"
复制代码

始终为true的谓词。如果没有指定其他谓词,这是默认谓词。

| 谓词Ⅴ
  1. "predicate_type": "minecraft:axis_aligned_linear_pos",
  2. "axis": "y",
  3. "max_chance": 0.75,
  4. "min_chance": 0.25,
  5. "max_dist": 16,
  6. "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 字段使用的修饰符。

| 修饰符Ⅰ
  1. "type": "minecraft:passthrough"
复制代码

保持状态不变的修饰符。如果没有指定其他修饰符,这是默认的修饰符。

| 修饰符Ⅱ
  1. "type": "minecraft:append_loot",
  2. "loot_table": ""
复制代码

试图给一个方块实体增加战利品的修饰符。
loot_table:要添加的战利品表路径。

| 语法模式

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

| 模式Ⅰ
  1. ""
复制代码

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

| 模式Ⅱ
  1. {
  2.   "name": "",
  3.   "states": {
  4.     "state_name": true
  5.   }
  6. }
复制代码

此时 output_state 需要填写对象,对象内容是方块的名称和状态。
name:方块名称。
states:包含以方块状态为名称的键,具有布尔值、整数或字符串值。
state_name:方块状态的名称。它的值可以是布尔值、字符串或整数。
处理器Ⅱ和处理器Ⅲ
下面,我们来介绍第二和第三种处理器。第二种处理器保护方块不受此结构在世界中的放置影响,使用时需要确保它不会替换世界上的匹配方块。下面是它的示例。
  1. {
  2.   "processor_type": "minecraft:protected_blocks",
  3.   "value": ""
  4. }
复制代码
以下是这些字段的描述。
字段功能描述类型
processor_type定义处理器的类型,这里是 minecraft:protected_blocks(即处理器Ⅱ)。字符串
value受保护的方块拥有的方块标签。字符串


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

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


| 语法模式

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

| 模式Ⅰ
  1. 1
复制代码

此时 limit 需要填写整数。

| 模式Ⅱ
  1. {
  2.   "type": "constant",
  3.   "value": 1
  4. }
复制代码

此时 limit 需要填写对象,指定一个常量整数。
type:字段类型,这里是 constant。
value:常量值。

| 模式Ⅲ
  1. {
  2.   "type": "uniform",
  3.   "min_inclusive": 1,
  4.   "max_inclusive": 1
  5. }
复制代码

此时 limit 需要填写对象,指定均匀分布的随机整数。
type:字段类型,这里是 uniform。
min_inclusive:整数,最小值(含)。
max_inclusive:整数,最大值(含)。
原版示例
以下是原版古迹废墟的一个处理器的定义文件,作为参考。为了便于理解,我给这个文件加上了注释,实际上它没有注释。

这个文件定义了古迹废墟的 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)。

以下是原版古迹废墟的另一个处理器的定义文件,作为参考。

这个文件定义了古迹废墟的 minecraft:trail_ruins_roads_archaeology 处理器。这个处理器会用泥土随机替换 20% 的沙砾,用沙砾替换 10% 的沙砾[原意如此],然后用泥坯随机替换 10% 的泥砖,最后将 2 块沙砾替换为可疑的沙砾,并且设置战利品表为普通战利品(路径: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)。
后记
这一期,我们了解了处理器,可以生成拼图结构了。当然,仅凭这四期教程,成功做出拼图结构的难度还是比较大的,这需要慢慢摸索。



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


苦力怕论坛,感谢有您~
 发表于 2024-11-3 23:54:07 来自手机|显示全部楼层 IP:广东省
感谢楼主教程
2#2024-11-3 23:54:07回复收起回复
苦力怕论坛,感谢有您~
回复支持

使用道具举报

本版积分规则

本站
关于我们
联系我们
坛史纲要
官方
哔哩哔哩
技术博客
下载
网易版
安卓版
JAVA
反馈
意见建议
教程中心
更多
捐助本站
QQ群
QQ群

QQ群

访问手机版

访问手机版

手机版|小黑屋|系统状态|klpbbs.com

粤公网安备 44200002445329号 | 由 木韩网络 提供支持 | GMT+8, 2024-12-27 22:59

声明:本站与Mojang以及微软公司没有从属关系

Powered by Discuz! X3.4 粤ICP备2023071842号-3