虚伪的悲催
本帖最后由 虚伪的悲催 于 2021-7-25 17:43 编辑

拼图方块是结构方块的延伸、扩展。
结构方块于1.9加入,1.10开放使用,1.13成为数据包的一部分,1.14以后,Mojang正式将拼图方块应用于生成掠夺者哨塔、新村庄、猪灵堡垒。
至此,掠夺者哨塔、新村庄、猪灵堡垒成为了模板池内仅可用于自定义结构的三种原版结构。
本章知识概要:
除了标题内包含的3个知识点会在本章详细介绍,其余你必须精通的知识点为:数据包的制作、结构方块的灵活运用、JSON、什么是结构。
›››› 拼图方块 ‹‹‹‹
——从入门到入土

1.如何理解拼图方块的作用:

高阶版:自从Mojang加入结构方块后,原版结构的生成过程变得更加方便。在此之前Mojang原版生成要塞、海底神殿、下界要塞等复杂结构需要一系列的硬编码完成,存在冗余且繁琐的过程。通过使用结构方块可以直接将建好的结构储存并在世界中直接加载调用,优化了硬编码过程带来的问题。​
然而,有限的大小(48x48x48)使结构方块生成更大的结构(如:林地府邸等)时仍然需要使用硬编码来解决生成大型结构的问题(这种通常无法自定义),并且往往会产生一些不可估计的BUG。例如:林地府邸是由结构方块生成的,用多个小结构拼出的大型结构(可理解为由小单元进一步组成大单元)。它需要硬编码来确定每个小结构的位置。一旦生成林地府邸时退出游戏,未生成的部分将不会生成,造成严重BUG。因而需要一种新的功能性方块代替硬编码。​
简化版:受结构方块(48x48x48)大小的限制,超过此大小的大结构的生成就陷入僵局,通过结构方块,将已制作好的大结构进行拆分成多个小结构,在小结构与大结构的衔接点处使用拼图方块进行衔接(可以理解为“螯合”),从而打破48x48x48的大小限制,生成所需要的大型结构。
2.拼图方块在1.14+的作用:
1.14以后,Mojang第一次调用了拼图方块用于生成哨塔和新村庄。利用拼图方块,新村庄生成极为简单甚至可以轻松自定义生成。拼图方块如同拼图一样,从一小块逐渐通过拼接,不断变大,最终形成一个完整的结构。这样的好处是灵活性、随机性强,并且通常不会出BUG。凭借这些优势,拼图方块被沿用至今,在1.16中又参与了猪灵堡垒的生成。例证:村庄的不同结构(铁匠铺,图书馆等)通过拼图方块决定门的朝向指向道路(原理在下部分),哨塔通过拼图方块释放已保存的铁傀儡结构来完成铁傀儡牢笼的建造,猪灵堡垒通过拼图方块决定了各个桥、疣猪兽棚等的随机生成。​
3.拼图方块:
可交互方块,拼图方块不会在创造模式物品栏中出现。它们可以通过选取方块获得,或者通过多种命令获得,例如/give @s jigsaw或/setblock ~ ~ ~ jigsaw。​
拼图方块是一个允许游戏使用较小模板生成结构的拼接方块。拼图方块的用户界面有如下输入字段(此处为大致介绍,后面做详细补充):​


A. 目标池:
目标池内填写的目标对应来自数据包下命名空间/worldgen/template_pool(模板池目录)下的json文件(模板池文件),例:​
在test/worldgen/template_pool下有一个名为test.json的模板池文件,那么目标池内填写内容为​
  1. test:test
复制代码

B. 模板池:
Json格式文件,包含以下键:​
  1. {
  2.   "name": "test:test", //名称,推荐与文件名对应
  3.   "fallback": "minecraft:empty", //回落池,本章不做介绍
  4.   "elements": [
  5.     {
  6.       "weight": 1, //权重
  7.       "element": {
  8.         "location": "test:test", //结构文件的目录根
  9.         "processors": { //处理器,本章不做介绍
  10.           "processors": []
  11.         },
  12.         "projection": "rigid或terrain_matching", //固定或嵌入地形
  13.         "element_type": "见下表"
  14.       }
  15.     }
  16.   ]
  17. }
复制代码
可选值​

作用​

条件​

minecraft:empty_pool_element​

不生成任何结构,即空池​

不提供任何模板即可​

minecraft:feature_pool_element​

生成一个地形​

该元素中需含有"elements"键,详见下一个键的介绍​

minecaft:list_pool_element​

使用元素列表​

该元素中需含有"elements"键,详见下一个键的介绍​

minecraft:legacy_single_pool_element​

只使用location中的结构,使这整个元素变为残骸元素池​

如果需要变成残骸,则还需要处理器键,元素中需含有"location"键​

*minecraft:single_pool_element​

只使用location中的结构,使这整个元素变为单元素池​

元素中需含有"location"键​

*element_type内最常用的值。
  从多个同种结构内随机选中一个结构进行生成方法:
  1. {
  2.   "name": "test:test",
  3.   "fallback": "minecraft:empty",
  4.   "elements": [
  5.     { //一个结构
  6.       "weight": 2,
  7.       "element": {
  8.         "location": "test:test1",
  9.         "processors": {
  10.           "processors": []
  11.         },
  12.         "projection": "rigid",
  13.         "element_type": "minecraft:single_pool_element"
  14.       }
  15.     },
  16.     { //另一个结构
  17.       "weight": 2,
  18.       "element": {
  19.         "location": "test:test2",
  20.         "processors": {
  21.           "processors": []
  22.         },
  23.         "projection": "rigid",
  24.         "element_type": "minecraft:single_pool_element"
  25.       }
  26.     }
  27.   ]
  28. }
  29. //这将会在test1与test2之间按权重配比随机选择一个进行生成
复制代码

C. 名称与目标名称:
目标名称填写在主拼图方块内,名称填写在被连接拼图方块内(名称可以理解为该拼图方块的名字),当且仅当目标名称与名称对应的两个拼图方块才能进行对接(螯合),例:​
这里有两个拼图方块
左侧,名称填写:minecraft:empty,目标名称填写:minecraft:ABC​
右侧,名称填写:minecreft:ABC,目标名称填写:minecraft:empty​
那么左侧将作为主拼图方块,右侧作为被连接拼图方块,当左被调用后会自动与结构内的右拼图方块进行拼接​
名称和目标名称是互相对应的。拼图方块可分为即将生成下一个结构的拼图(以下称为发送拼图)和被发送拼图生成的结构中所包含的,需要和发送拼图对接的拼图(以下称为接收拼图)。发送拼图会选定目标池中的一个结构,如果该结构内有一个接收拼图,满足接收拼图的名称和发送拼图的目标名称对应,那么接收拼图就会自动调整并与发送拼图对接,连带接收拼图所在的整个结构经过旋转平移与发送拼图对接。如果即将生成的结构中有多个可用的接收拼图,发送拼图会随机选择其中一个与其对接,增加随机性。发送拼图和接收拼图在满足上述条件以外,必须保证两个方块处在同一个轴线上。例如,水平放置的拼图方块只能和水平放置的拼图方块对接,不能和垂直放置的对接。水平放置的无视朝向,拼图方块可自动旋转结构以匹配。竖直朝上放置的拼图方块则必须和竖直朝下的对接,反之亦然。拼图方块不能竖直翻转结构,只能水平旋转,故两个同时朝下或同时朝上的拼图无法对接。进行垂直对接时,拼图方块可选择可旋转/固定。可旋转表示对接后的结构可绕拼图所在轴线水平随机旋转。如果选择固定,则接收拼图必须旋转到和发送拼图的“卡口”(拼图方块侧面的长条,不是箭头)对应,卡口连成线,进而旋转整个结构与其固定。​

D. 层数:
决定一个拼图方块连续拼接其他拼图方块的次数,如果你的结构被拆分成了许多个小结构,那么我推荐你选择7。​

E. 转变为:
拼图方块生效后讲会转变为你所填写的方块名称,支持使用方框状态标签,默认:minecraft:air。​
举例:minecraft:redstong_block或minecraft:dark_oak_log[axis=y]​

如何激活拼图方块
众所周知,拼图方块是无法使用红石来进行激活的。
拼图方块会在第一个主拼图方块被激活后且在层数的控制下持续被激活,直至结构生成完毕。
测试过程激活拼图方块步骤:检查各文件准确无误,正确填写拼图方块各字段,将层数调整为7,保留拼图方块选择关闭,点击生成
›››› 自定义大型结构地物 ‹‹‹‹
——从测试到放弃
1.基础知识:
保存结构方块可以将最大48x48x48的结构(建筑)保存下来,储存为nbt格式文件。游戏默认会储存在存档目录/generated/命名空间/structures内。generated内的结构优先级高于datapacks中数据包内的同名结构(意思就是生成结构时会选择generated内而不是数据包内的结构)。此外可以设置保存实体等。结构空位是一种特殊的方块,它在保存时不会被存储,加载时不会覆盖其他方块,在世界生成中同样如此。​
2.结构地物:
格式为Json文件,一律保存在“命名空间/worldgen/configured_structure_feature”目录下​
模板:
  1. {
  2.   "config": {
  3.     "start_pool": "test:test", //启动池,对应于「命名空间/worldgen/template_pool」下的有效Json文件
  4.     "size": 7 //层数(部分人翻译为尺寸)决定当前启动池结构的拼接次数,1-7整数
  5.   },
  6.   "type": "minecraft:village" //*替代的原版结构
  7. }
复制代码
*目前仅有“村庄”、“堡垒遗迹”、“掠夺者哨塔”支持自定义结构地物的调用,其他结构即使调用依旧保持原样(已经过测试证实)。
3.在生物群系内调用自定义结构:
一律在“命名空间/worldgen/biome”下的有效Json文件内进行调用,例如:​
  1. {
  2.   "scale": 0.05,
  3.   "effects": {
  4.     "mood_sound": {
  5.       "sound": "minecraft:ambient.cave",
  6.       "tick_delay": 6000,
  7.       "block_search_extent": 8,
  8.       "offset": 2.0
  9.     },
  10.     "sky_color": 7907327,
  11.     "fog_color": 12638463,
  12.     "water_color": 4159204,
  13.     "water_fog_color": 329011
  14.   },
  15.   "surface_builder": "minecraft:grass",
  16.   "carvers": {
  17.     "air": [
  18.       "minecraft:cave",
  19.       "minecraft:canyon"
  20.     ]
  21.   },
  22.   "features": [
  23.     [],
  24.     [
  25.       "minecraft:lake_water",
  26.       "minecraft:lake_lava"
  27.     ],
  28.     [
  29.       "minecraft:amethyst_geode"
  30.     ],
  31.     [
  32.       "minecraft:monster_room"
  33.     ],
  34.     [],
  35.     [],
  36.     [
  37.       "minecraft:ore_dirt",
  38.       "minecraft:ore_gravel",
  39.       "minecraft:ore_granite",
  40.       "minecraft:ore_diorite",
  41.       "minecraft:ore_andesite",
  42.       "minecraft:ore_tuff",
  43.       "minecraft:ore_deepslate",
  44.       "minecraft:ore_coal",
  45.       "minecraft:ore_iron",
  46.       "minecraft:ore_gold",
  47.       "minecraft:ore_redstone",
  48.       "minecraft:ore_diamond",
  49.       "minecraft:ore_lapis",
  50.       "minecraft:ore_copper",
  51.       "minecraft:disk_sand",
  52.       "minecraft:disk_clay",
  53.       "minecraft:disk_gravel"
  54.     ],
  55.     [
  56.       "minecraft:rare_dripstone_cluster",
  57.       "minecraft:rare_small_dripstone"
  58.     ],
  59.     [
  60.       "minecraft:patch_tall_grass_2",
  61.       "minecraft:glow_lichen",
  62.       "minecraft:plain_vegetation",
  63.       "minecraft:flower_plain_decorated",
  64.       "minecraft:patch_grass_plain",
  65.       "minecraft:brown_mushroom_normal",
  66.       "minecraft:red_mushroom_normal",
  67.       "minecraft:patch_sugar_cane",
  68.       "minecraft:patch_pumpkin",
  69.       "minecraft:spring_water",
  70.       "minecraft:spring_lava"
  71.     ],
  72.     [
  73.       "minecraft:freeze_top_layer"
  74.     ]
  75.   ],
  76.   "starts": [
  77.     "minecraft:village_plains",
  78.     "minecraft:pillager_outpost",
  79.     "minecraft:mineshaft",
  80.     "minecraft:stronghold",
  81.     "minecraft:ruined_portal",
  82.     "test:test" //格式:命名空间:结构地物文件名
  83.   ],
  84.   "spawners": {
  85.     "monster": [
  86.       {
  87.         "type": "minecraft:spider",
  88.         "weight": 100,
  89.         "minCount": 4,
  90.         "maxCount": 4
  91.       },
  92.       {
  93.         "type": "minecraft:zombie",
  94.         "weight": 95,
  95.         "minCount": 4,
  96.         "maxCount": 4
  97.       },
  98.       {
  99.         "type": "minecraft:zombie_villager",
  100.         "weight": 5,
  101.         "minCount": 1,
  102.         "maxCount": 1
  103.       },
  104.       {
  105.         "type": "minecraft:skeleton",
  106.         "weight": 100,
  107.         "minCount": 4,
  108.         "maxCount": 4
  109.       },
  110.       {
  111.         "type": "minecraft:creeper",
  112.         "weight": 100,
  113.         "minCount": 4,
  114.         "maxCount": 4
  115.       },
  116.       {
  117.         "type": "minecraft:slime",
  118.         "weight": 100,
  119.         "minCount": 4,
  120.         "maxCount": 4
  121.       },
  122.       {
  123.         "type": "minecraft:enderman",
  124.         "weight": 10,
  125.         "minCount": 1,
  126.         "maxCount": 4
  127.       },
  128.       {
  129.         "type": "minecraft:witch",
  130.         "weight": 5,
  131.         "minCount": 1,
  132.         "maxCount": 1
  133.       }
  134.     ],
  135.     "creature": [
  136.       {
  137.         "type": "minecraft:sheep",
  138.         "weight": 12,
  139.         "minCount": 4,
  140.         "maxCount": 4
  141.       },
  142.       {
  143.         "type": "minecraft:pig",
  144.         "weight": 10,
  145.         "minCount": 4,
  146.         "maxCount": 4
  147.       },
  148.       {
  149.         "type": "minecraft:chicken",
  150.         "weight": 10,
  151.         "minCount": 4,
  152.         "maxCount": 4
  153.       },
  154.       {
  155.         "type": "minecraft:cow",
  156.         "weight": 8,
  157.         "minCount": 4,
  158.         "maxCount": 4
  159.       },
  160.       {
  161.         "type": "minecraft:horse",
  162.         "weight": 5,
  163.         "minCount": 2,
  164.         "maxCount": 6
  165.       },
  166.       {
  167.         "type": "minecraft:donkey",
  168.         "weight": 1,
  169.         "minCount": 1,
  170.         "maxCount": 3
  171.       }
  172.     ],
  173.     "ambient": [
  174.       {
  175.         "type": "minecraft:bat",
  176.         "weight": 10,
  177.         "minCount": 8,
  178.         "maxCount": 8
  179.       }
  180.     ],
  181.     "underground_water_creature": [
  182.       {
  183.         "type": "minecraft:glow_squid",
  184.         "weight": 10,
  185.         "minCount": 4,
  186.         "maxCount": 6
  187.       },
  188.       {
  189.         "type": "minecraft:axolotl",
  190.         "weight": 10,
  191.         "minCount": 4,
  192.         "maxCount": 6
  193.       }
  194.     ],
  195.     "water_creature": [],
  196.     "water_ambient": [],
  197.     "misc": []
  198.   },
  199.   "spawn_costs": {},
  200.   "player_spawn_friendly": true,
  201.   "precipitation": "rain",
  202.   "temperature": 0.8,
  203.   "downfall": 0.4,
  204.   "category": "plains",
  205.   "depth": 0.125
  206. }
复制代码
本章不做对自定义更多生物群系以及更多生物群系启用等的说明,如有需要请自行研究。

备注(如果你遇到了一些问题,欢迎您在帖子下方进行评论与我交流):
1.即便是你自己新建的一个test结构,但他依旧隶属于原版village,因而其生成密度、盐值、相邻间隔区块等与原版village(或自定义的数据)共享配置​
2.带有拼图方块的结构内会出现以下问题:​
小于48x48x48的结构会偶尔出现结构损坏:此时我建议使用二分法调整结构大小来确定最终可调用的有效大小​
若结构内涵盖有效结构方块(不论调用结构大小)会使服务端、客户端崩溃(区块加载损坏问题)(经测试于1.17-1.18ES2)​
3.若你的结构被拆分成了许多个小块,且在生成的时候出现了部分结构不刷出的现象,那么你可以这么做:​
增加结构内的拼图方块的层数​
增加“命名空间/worldgen/configured_structure_feature”下有效Json文件中的“size”的值​
4.若你的结构出现了旋转,而你期望的是固定不动,那么你可以这么做:​
将结构内的拼图方块调整为“固定”​
5.在正式调用进生存世界之前,我个人推荐先在超平坦内进行一次测试生成完整后再放入生存世界进行实测​
6.当你的模板池文件重构后需要重新进入世界才能生效(/reload无效,已经过测试证实)​
7.拼图方块拼接的最终高度不得超过世界高度(取决于你设置的世界高度)​
8.拼图方块调用的是来自已储存的结构。部分红石机械方块的方块状态会被清除(即:高频红石无法被调用)。​
9.若您想通过拼图方块转变为红石块进一步激活附近的命令方块来调用functions,那么此举是无效的(已于1.17-1.18ES2进行过测试)。​
基于此,我推荐您使用生物激活,例如:保存实体“僵尸”,调整拼图方块转变为木质压力板,这样您就可以通过僵尸踩踏压力板来激活命令方块进而调用functions文件​
›››› 一些后话 ‹‹‹‹
——期待国内有更多优秀的数据包制作者

以上全部内容来自参考文献以及多达200次的结构测试得出的结论,如有不足的地方还望各位巨佬斧正。
如果你遇到了一些问题,欢迎您在帖子下方进行评论与我交流。
文章部分内容参考来自:期待国内有更多优秀的数据包制作者​
1.16.2拼图方块的详细说明和使用(详见简介和评论区)_哔哩哔哩_bilibili

拼图方块 - Minecraft Wiki,最详细的官方我的世界百科 (fandom.com)

[VCS] 拼图方块与拼图池教程(1.16.2+) - 游戏技巧 - Minecraft(我的世界)中文论坛 - (mcbbs.net)




点击跳转原帖

鱼宝放心飞
拼图方块,理论上应该是和自定义世界一起讲,但是目前论坛上讲自定义世界的教程很少。

Dioxide_CN
鱼宝放心飞 发表于 2021-7-25 13:19
拼图方块,理论上应该是和自定义世界一起讲,但是目前论坛上讲自定义世界的教程很少。 ...

你需要的话我可以单独出一期,但是我懒

鱼宝放心飞
BR★S 发表于 2021-7-25 13:23
你需要的话我可以单独出一期,但是我懒

主要的难点是如何讲深讲透彻,有些内容连 wiki 上都没有详细的记载。
反编译后的源代码,1.16.5 大概是 1.15.2 的 1.5 倍。

Dioxide_CN
鱼宝放心飞 发表于 2021-7-25 13:29
主要的难点是如何讲深讲透彻,有些内容连 wiki 上都没有详细的记载。
反编译后的源代码,1.16.5 大概是 1 ...

讲透彻确实很难,而且国内研究的人少,高版本愿意花心思的人也很少,现在基本都是快餐服,能让worldgen发挥真正的魅力的,到目前为止我认为的只有国外的威廉。但是这个玩意儿你说难,确实有点难,说简单,悟性好的自己研究研究就能摸索出来,然而这些自己摸索出来的确实是很难让一些小白明白的。现在的数据包制作门槛很低,大部分数据包制作都停留在表层,就像python,上了难度,就真的很难。

ruhuasiyu
请在标题注明转载。

一般不建议在结构中使用CB,因为多人游戏一般不开启CB。需要额外的操作完全可以用marker标记,然后高频或者用玩家进入结构进度检测下来使其执行额外的函数。

结合
有点难哦···

cai64346434
感谢大佬的分享

傻子狗子lt
有点难哦···

jiuanya
感谢楼主,太有用了

woshinidie1314
服务器怎么用 1.12.2的服务器 会被ban和清理掉