附加包教程:52.拼图结构(四)
本帖最后由 Cat_Anchor 于 2024-11-3 18:59 编辑前言
上期,我们讲解了拼图结构集。这期,我将讲解模板池。模板池是一个列表,其中包含拼图结构的基本单位——结构模板。
https://klpbbs.com/static/image/hrline/line5.png
模板池
模板池用于将处理器与结构模板配对,并使用加权列表随机放置结构模板。
要生成(实际可交互的)拼图结构,我们必须定义至少一个模板池。
如果要定义一个模板池,要在行为包根目录的 worldgen 文件夹中新建一个 template_pools 文件夹,在其中新建文件并定义模板池。示例如下。{
"format_version": "1.21.20",
"minecraft:template_pool": {
"description": {
"identifier": "complementary:root_pool"
},
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "debug_hallway/rooms/start_room",
"processors": ""
},
"projection": "rigid",
"weight": 20
}
],
"fallback": ""
}
}以下是这些字段的描述。值的范围使用“区间”表示。
字段功能描述类型
identifier模板池的ID。被拼图结构使用,用于将处理器分配给结构模板。字符串
elements由若干对结构模板和处理器组成的列表。对象列表
element结构模板、放置结构时要使用的处理器以及决定元素被选中可能性的权重。对象
element_type元素的类型。目前只支持minecraft:single_pool_element。字符串
location结构文件的路径。此路径相对于行为包的structures文件夹,也就是“structures/填写的路径”。字符串
processors放置结构时要使用的处理器列表的标识符。字符串
projection可选,指定应如何相对于地形放置结构。支持以下值:["rigid","terrain_matching"]字符串
weight范围是1-200,可选,从模板池中选择元素的加权概率。例如,包含权重为1和3的两个结构的模板池将分别有25%和75%的机会被选中。整数
fallback可选,当池中没有元素可以成功放置时使用的后备模板池。字符串
https://klpbbs.com/static/image/hrline/line3.png
参数解释
| 元素
拼图结构集中有若干个元素,每个元素都代表着一个结构模板和它的附加数据。因此,elements 字段是一个列表,其中每个对象中都有如下字段。
| element
这是这个元素的具体描述,其中有三个必需字段,指定了元素类型、结构文件的路径和要使用的处理器。
| element_type
这是这个元素的类型。目前只能填写 minecraft:single_pool_element,即用于单个结构模板池的结构模板。
| location
这是结构文件的路径。这个路径的起始点在行为包的structures文件夹下,比如填写"location": "debug_hallway/rooms/start_room",会识别到“structures/debug_hallway/rooms/start_room.mcstructure”。
注意,不要填写命名空间。不像 /structure 命令或者地物结构,在这里填写命名空间不会自动转换为文件夹。比如在地物结构中,complementary:test 就代表了“structures/complementary/test.mcstructure”,complementary 作为一个命名空间,所有相关文件都放在以 complementary 为名的文件夹下。这里不是这样的,就算填写了命名空间也不会转化为相应文件夹。
这里的文件可以是 .nbt 文件,不过目前只有原版使用了这种文件。.nbt 文件是一种压缩包,解压之后里面的结构文件和 .mcstructure 文件差不多。.nbt 文件可能是由 Java 版的文件转换而来,因为其中包含了 Java 版独有的方块实体字段。
| processors
放置结构时要使用的处理器的 ID。实际上应该说“处理器列表”,因为那个文件就是很多个处理器组成的列表。一个处理器只能执行很少的功能,比如把部分沙砾换成泥土。必须用多个处理器才能实现部分沙砾换成泥土,部分沙砾换成沙子的功能。有时候还要封装处理器,这样才能实现更复杂的功能。下期会开始讲解处理器,我从未写过这样的教程——它太复杂了,让我头晕,不过我会尽量写清楚。
| projection
这个字段是可选的,可以填写,可以忽略。它指定了应该如何相对于地形放置结构。需要填写 rigid 和 terrain_matching 二者之一。
rigid 表示无视地形,直接放置结构。这时结构不会适应地形,遇到陡峭地形可能会产生悬空。
terrain_matching 表示根据地形决定放置的高度。这个选项很适合村庄这样的拼图结构,因为村庄道路是依地形而建的,大部分情况下不希望它悬空(除非特殊的设计,比如树上村庄)。
| weight
指定这个结构模板有多大可能被放置。值越高,概率越大,范围是 1 和 200 之间的整数(含)。概率计算公式是:此结构的 weight 值 / 全部结构的 weight 值之和。例如,包含权重为 1 和 3 的两个结构模板的模板池将分别有 25% 和 75% 的概率被放置。
https://klpbbs.com/static/image/hrline/line9.png
原版示例
以下是原版古迹废墟的一个模板池的定义文件,作为参考。我也会在下面附上解释。
{
"format_version": "1.21.20",
"minecraft:template_pool": {
"description": {
"identifier": "minecraft:trail_ruins/tower"
},
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "trail_ruins/tower/tower_1",
"processors": "minecraft:trail_ruins_houses_archaeology"
},
"weight": 1
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "trail_ruins/tower/tower_2",
"processors": "minecraft:trail_ruins_houses_archaeology"
},
"weight": 1
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "trail_ruins/tower/tower_3",
"processors": "minecraft:trail_ruins_houses_archaeology"
},
"weight": 1
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "trail_ruins/tower/tower_4",
"processors": "minecraft:trail_ruins_houses_archaeology"
},
"weight": 1
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "trail_ruins/tower/tower_5",
"processors": "minecraft:trail_ruins_houses_archaeology"
},
"weight": 1
}
]
}
}
这个文件定义了古迹废墟的 minecraft:trail_ruins/tower 模板池,模板池中有 5 个结构模板,它们分别有 20% 的概率被放置。每个结构模板对应的结构文件位置是不同的,但是它们都用了同一个处理器——minecraft:trail_ruins_houses_archaeology。这个处理器会用泥土随机替换 20% 的沙砾,用砂土替换 10% 的沙砾,然后用泥坯随机替换 10% 的泥砖,最后将 6 块沙砾替换为可疑的沙砾,并且设置战利品表为普通战利品;将 3 块沙砾替换为可疑的沙砾,并且设置战利品表为稀有战利品。
https://klpbbs.com/static/image/hrline/line8.png
后记
这一期,我们了解了模板池,距离成功生成拼图结构只有一步之遥——处理器。上面我也说了处理器可以动态处理方块,把一种方块换为另一种,添加战利品表等等,所以这临门一脚可能会略显艰难。不过别担心,最基本的处理器很好写。
第五十一期 第五十二期 第五十三期 感谢楼主教程[哔哩_打call]
页: [1]