HangBack_
本帖最后由 HangBack_ 于 2022-8-19 20:49 编辑

拼图方块 与 拼图池 教程
--HangBack--

前言:
本教程只在1.16.2进行了测试,其余版本适用性未知
        了解这些内容能让你更容易理解本篇教程JSON数据包结构方块
        当然你也可以选择参考
        【1.13-1.16】Minecraft 原版模组入门教程
        以获取更多所需要的知识

教程
① 拼图方块
        注释:有*号,代表此选项同时可存储在拼图方块的NBT中,若觉得内容繁杂,且更愿意看wiki的可参考:拼图方块/数据值
        首先,我们了解一下拼图方块的界面及其作用
        当然,为方便理解,我们可以先把一个结构的内容想象成一块拼图的图案样式,而一个结构的大小可以想象成一块拼图的尺寸
        *目标池:此填项可从你所写的拼图池中随机抽取结构(后面详细讲解拼图池)
                默认值:minecraft:empty
                对应NBT标签:pool
                举例:
  1. /setblock ~ ~ ~ jigsaw{pool:"minecraft:empty"}
复制代码

通俗化:

        *名称:指这个拼图方块的名称,类似于生物名字等,用于标记/识别出这是我们想要的拼图方块
                默认值:minecraft:empty
                对应NBT标签:name
                举例:
  1. /setblock ~ ~ ~ jigsaw{name:"minecraft:empty"}
复制代码



        *目标名称:指这个拼图方块期望连接的另一个拼图方块(下面会提到如何连接,和这个连接的意思)
                默认值:minecraft:empty
                对应NBT标签:target
                举例:
  1. /setblock ~ ~ ~ jigsaw{target:"minecraft:empty"}
复制代码



        *转变为:待当前拼图方块完成模板生成后将会被什么方块替换掉(但同时受到下文“拼图方块”选项影响)
                默认值:minecraft:air
                对应NBT标签:final_state
                举例:/setblock ~ ~ ~ jigsaw{final_state:"minecraft:air"}
通俗化:


        当你的拼图方块是在纵向表面放置时,拼图方块分别有八种对应状态(上+东南西北,下+东南西北,数学好的可以从计数原理角度理解(当然这本身就很好理解)),并且此时的拼图方块会多出一个选项
        *连接类型:
              当连接类型为“固定”时,这个拼图方块所期望连接的拼图模块会以结构文件中默认形式进行拼接
              当连接类型为“可旋转”时,这个拼图方块所期望连接的拼图模块会把即将放置出的拼图模块沿水平方向随机旋转(仅旋转)
              默认值:可旋转
              举例:
  1. /setblock ~ ~ ~ jigsaw{joint:"aligned"}
复制代码
连接类型为:固定

        当你的拼图方块是在横向表面放置时,拼图方块分别有四种对应状态(东南西北),此时的拼图方块没有“连接类型”选项
通俗化:


        生成层数:区间为[0,7]
                默认值:0
                介绍:用于生成完当前拼图方块的模板后继续生成模块中出现的新拼图方块的对应模板(若无模板了或无新的拼图方块,则停止)
通俗化:


        拼图方块:有开启和关闭两种模式
                默认值:开启
                介绍:开启后在拼图方块完成当前模板生成后会被“转变为”项中所对应的有效的方块替换掉。但值得注意的是,如果这块拼图没有生成出任何拼图,那么也不会让这块拼图变成“转变为”中的方块(经实践,若有误请指正,谢谢)

        生成:点击后即可按当前界面所配置的内容去生成目标池中的模板,但如果在生成的模板中未发现名称为此拼图方块的“目标名称”的拼图方块,则不会成功生成模板
        举例:
  1. /setblock ~ ~ ~ jigsaw[orientation=up_east]{pool:"minecraft:village/plains/streets",name:"test",target:"minecraft:street",final_state:"minecraft:air"}
复制代码

                完成后打开界面
                将生成层数调到7
                拼图方块设置为关闭并点击生成
                你将得到一个随机生成的平原村庄的道路
② 拼图池
        路径datapacks/data/命名空间/worldgen/template_pool/xxx.json,你也可以参考:自定义世界生成/拼图池/JSON格式
        模板及键的介绍

                "name": ""//该池你所定义的命名空间,对应拼图方块中的目标池,目标池使用的ID就来自此段
                "fallback": ""//如果你的结构生成完了,并且无法再尝试生成,即可使用此段连接另一个拼图池继续生成(也可作为该拼图分支末端)
                "elements": [//元素列表,可以存{}此样形式的元素
                        {
                                "weight": 整数//决定该元素在整个表中的权重,或抽中的频数
                                "location": ""//结构ID,即结构方块加载结构时填写的结构名称
                                "projection": ""//可为rigid或terrain_matching,前者可让该结构直接调用结构文件中的结构来生成结构(地形可能被结构破坏),后者会与地形匹配,可能会使地形/结构自然变形
                                "element_type": "见下表"//
可选值
作用
条件
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"键
——部分摘自中文wiki

                                "elements": []//包含其根标签包含的所有标签(其根标签为[]外的elements)

工作原理
        例子:若一个拼图方块{pool:"xiaodou",name:"a",target:"b"},并朝向北方

        假设在游戏中有这样两个结构,一个结构"xiaodou"
        我们看到的样子是(暂时用命令方块图标代替拼图方块)
               
        且该结构大小仅为这1*1*3
        其中这个结构里的
                "←"方向拼图方块的NBT{pool:"minecraft:empty",name:"b",target:"minecraft:empty",final_state:"minecraft:redstone_block"}
                "→"方向的拼图方块的NBT{pool:"rainbow",name:"c",target:"d",final_state:"minecraft:redstone_block"}

        另一个结构"rainbow"是
               
        且该结构大小仅为1*1*2
        其中这个结构里的
                拼图方块的NBT{pool:"minecraft:empty",name:"d",target:"minecraft:empty",final_state:"minecraft:redstone_block"}
        则当我们在游戏中将前面第一个提到的拼图方块打开(文本已用紫色标注)
[szie=4]        生成层数调整为2
        拼图方块设置为开启
        点击生成后,我们将得到
                这样1*1*6的结构

更新不知道多久记:

一张测试图

2021.12 数据,可能有更多内容

拼图方块 与 拼图池 教程--HangBack--
前言:
本教程只在1.16.2进行了测试,其余版本适用性未知
  了解这些内容能让你更容易理解本篇教程JSON数据包结构方块
  当然你也可以选择参考
  【1.13-1.16】Minecraft 原版模组入门教程
  以获取更多所需要的知识


教程
① 拼图方块
  注释:有*号,代表此选项同时可存储在拼图方块的NBT中,若觉得内容繁杂,且更愿意看wiki的可参考:拼图方块/数据值
  首先,我们了解一下拼图方块的界面及其作用
  当然,为方便理解,我们可以先把一个结构的内容想象成一块拼图的图案样式,而一个结构的大小可以想象成一块拼图的尺寸
  *目标池:此填项可从你所写的拼图池中随机抽取结构(后面详细讲解拼图池)
    默认值:minecraft:empty
    对应NBT标签:pool
    举例:

代码:

  1. /setblock ~ ~ ~ jigsaw{pool:"minecraft:empty"}

通俗化:


  *目标池:我们可以理解为在一片浑浊的池子里面随便捞上一块拼图
    默认值:minecraft:empty(如果本身这个池子不存在,也就意味着我们无处可捞,自然什么也捞不出来,所以在你的文件夹中首先得存在这个池子。而这里得默认值我们可以理解为一片浑浊的“空”池子,因为除了池子里浑浊的水以外就没有东西了,所以我们不能从里面捞出拼图来)
    对应NBT标签:pool(在NBT中的键名是pool,很好理解,有“池子”的意思)
    例如:
我们可以使用

代码:

  1. /setblock ~ ~ ~ jigsaw{pool:"minecraft:empty"}

将这段文本所描述的默认拼图方块放置出来


  *名称:指这个拼图方块的名称,类似于生物名字等,用于标记/识别出这是我们想要的拼图方块
    默认值:minecraft:empty
    对应NBT标签:name
    举例:

代码:

  1. /setblock ~ ~ ~ jigsaw{name:"minecraft:empty"}



  *名称:有许多拼图游戏中会在拼图后面标上序号或其它标志性的东西,这样能让游玩者根据提示去拼接这些拼图,而这里的名称可以理解为这样的标志,如果想要知道它能被什么拼图连接就来看看这个“提示”
    默认值:minecraft:empty(有些拼图游戏中专门会给你一些具有迷惑性质的拼图,当你拼完整张拼图后你会发现甚至有几块都用不到,这意味着任意一块拼图的存在不需要有意义,也就是说你可以给这个拼图随便定义“提示”,即使没有拼图会连接它)
    对应NBT标签:name(在NBT中的键名是name,很好理解,有“名字”的意思)
    例如:
我们可以使用

代码:

  1. /setblock ~ ~ ~ jigsaw{name:"minecraft:empty"}

将这段文本所描述的默认拼图方块放置出来


通俗化:


  *目标名称:指这个拼图方块期望连接的另一个拼图方块(下面会提到如何连接,和这个连接的意思)
    默认值:minecraft:empty
    对应NBT标签:target
    举例:

代码:

  1. /setblock ~ ~ ~ jigsaw{target:"minecraft:empty"}



  *目标名称: 根据上一文段,这里的目标名称可以理解为,拼图游戏中某块拼图背面提示你“我能与xxx拼图连接”
    默认值:minecraft:empty(如果你在一次拼图游戏中,找遍了所有拼图,都没有找到这张拼图对你提示的那张拼图,这可能意味着出题者在迷惑你,让你以为你还没拼完,但是实际上你拼完了,我们可以把这不可能完成的提示理解为拼图边缘,也就是拼完了)
    对应NBT标签:target(在NBT中的键名是target,很好理解,有“目标”的意思)
我们可以使用

代码:

  1. /setblock ~ ~ ~ jigsaw{target:"minecraft:empty"}

将这段文本所描述的默认拼图方块放置出来


  *转变为:待当前拼图方块完成模板生成后将会被什么方块替换掉(但同时受到下文“拼图方块”选项影响)
    默认值:minecraft:air
    对应NBT标签:final_state
    举例:/setblock ~ ~ ~ jigsaw{final_state:"minecraft:air"}
通俗化:


  *转变为:“拼图”是我在最开始的时候,为了读者理解起来方便而定义的,但别忘了这块“拼图”可是被一个特殊的“机器”“制造”出来的,但是我们是很追求完美的,如果机器把这块“拼图”制造完之后却仍然停留在整个拼图里面,会影响拼图原本的样貌,另外,也许在这放机器的地方,我们本来是想让它成为拼图图案中的一部分,可是不得不因为这个机器而失去了这样一个空位,于是,这个机器很人性化的为我们提供了一个方法,在它完成它的任务后,它自己可以变成我们想要的方块
    默认值:minecraft:air(这里我们可以填任意一个存在的方块id,且可以被正常调用,这里就不详细解释了,毕竟接触拼图方块的玩家一般也能理解什么是方块id,默认值中的"minecraft:air"就是让这个机器最后变成“空气”方块)
    对应NBT标签:final_state(final_state我们可以理解为最终状态)
我们可以使用

代码:

  1. /setblock ~ ~ ~ jigsaw{final_state:"minecraft:air"}

将这段文本所描述的默认拼图方块放置出来


  当你的拼图方块是在纵向表面放置时,拼图方块分别有八种对应状态(上+东南西北,下+东南西北,数学好的可以从计数原理角度理解(当然这本身就很好理解)),并且此时的拼图方块会多出一个选项
  *连接类型:
  当连接类型为“固定”时,这个拼图方块所期望连接的拼图模块会以结构文件中默认形式进行拼接
  当连接类型为“可旋转”时,这个拼图方块所期望连接的拼图模块会把即将放置出的拼图模块沿水平方向随机旋转(仅旋转)
  默认值:可旋转
  举例:

代码:

  1. /setblock ~ ~ ~ jigsaw{joint:"aligned"}
连接类型为:固定
  当你的拼图方块是在横向表面放置时,拼图方块分别有四种对应状态(东南西北),此时的拼图方块没有“连接类型”选项
通俗化:


  *连接类型:
  有两个可选值,一个是固定,一个是可旋转。“固定”可以理解为,在拼图游戏中,某一块拼图是被粘在背景板上了的;“可旋转”可以理解为,这块拼图的方向取决于你的手怎么去摆弄它
  默认值:可旋转
我们可以使用

代码:

  1. /setblock ~ ~ ~ jigsaw{final_state:"minecraft:air"}
/setblock ~ ~ ~ jigsaw{joint:"aligned"}→ 连接类型为:固定
将这段文本所描述的默认拼图方块放置出来
  我觉得应该没有人见过原版我的世界里面斜着而没有锯齿的建筑吧


  生成层数:区间为[0,7]
    默认值:0
    介绍:用于生成完当前拼图方块的模板后继续生成模块中出现的新拼图方块的对应模板(若无模板了或无新的拼图方块,则停止)
通俗化:


  生成层数:封闭于0~7之间的整数
    默认值:0
    介绍:一个拼图的连接极限,7意味着,当一块拼图被连接到第七块后就不能再连接了,可以理解为某些奇怪的拼图游戏,为了增加挑战难度而特意加入的玩法限制


  拼图方块:有开启和关闭两种模式
    默认值:开启
    介绍:开启后在拼图方块完成当前模板生成后会被“转变为”项中所对应的有效的方块替换掉。但值得注意的是,如果这块拼图没有生成出任何拼图,那么也不会让这块拼图变成“转变为”中的方块(经实践,若有误请指正,谢谢)


  生成:点击后即可按当前界面所配置的内容去生成目标池中的模板,但如果在生成的模板中未发现名称为此拼图方块的“目标名称”的拼图方块,则不会成功生成模板
  举例:

代码:

  1. /setblock ~ ~ ~ jigsaw[orientation=up_east]{pool:"minecraft:village/plains/streets",name:"test",target:"minecraft:street",final_state:"minecraft:air"}

    完成后打开界面
    将生成层数调到7
    拼图方块设置为关闭并点击生成
    你将得到一个随机生成的平原村庄的道路
② 拼图池
  路径datapacks/data/命名空间/worldgen/template_pool/xxx.json,你也可以参考:自定义世界生成/拼图池/JSON格式
  模板及键的介绍


    "name": ""//该池你所定义的命名空间,对应拼图方块中的目标池,目标池使用的ID就来自此段
    "fallback": ""//如果你的结构生成完了,并且无法再尝试生成,即可使用此段连接另一个拼图池继续生成(也可作为该拼图分支末端)
    "elements": [//元素列表,可以存{}此样形式的元素
   {
  "weight": 整数//决定该元素在整个表中的权重,或抽中的频数
  "location": ""//结构ID,即结构方块加载结构时填写的结构名称
  "projection": ""//可为rigid或terrain_matching,前者可让该结构直接调用结构文件中的结构来生成结构(地形可能被结构破坏),后者会与地形匹配,可能会使地形/结构自然变形
  "element_type": "见下表"//
可选值
作用
条件
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"键
——部分摘自中文wiki

  "elements": []//包含其根标签包含的所有标签(其根标签为[]外的elements)


工作原理
  例子:若一个拼图方块{pool:"xiaodou",name:"a",target:"b"},并朝向北方


  假设在游戏中有这样两个结构,一个结构"xiaodou"
  我们看到的样子是(暂时用命令方块图标代替拼图方块)
   
  且该结构大小仅为这1*1*3
  其中这个结构里的
    "←"方向拼图方块的NBT{pool:"minecraft:empty",name:"b",target:"minecraft:empty",final_state:"minecraft:redstone_block"}
    "→"方向的拼图方块的NBT{pool:"rainbow",name:"c",target:"d",final_state:"minecraft:redstone_block"}


  另一个结构"rainbow"是
   
  且该结构大小仅为1*1*2
  其中这个结构里的
    拼图方块的NBT{pool:"minecraft:empty",name:"d",target:"minecraft:empty",final_state:"minecraft:redstone_block"}
  则当我们在游戏中将前面第一个提到的拼图方块打开(文本已用紫色标注)
[szie=4]  生成层数调整为2
  拼图方块设置为开启
  点击生成后,我们将得到
    这样1*1*6的结构


更新不知道多久记:
2021.8.19:
1.更改了排版,应该好看一些了
2.修改了一些错别字
2021.7.8:
1.更正了错误的无法使用的命令;
2.为方便理解,增加了形象的解释



Lakejason0
啊啊文章截取的Wiki片段好像就是我翻译的……
翻译的可能有错误,若有错误请提出。

PDP
MCbbs有你更精彩

Spectre丶
MCBBS有你更精彩~

(=°ω°)丿
玩家能用拼图方块了?怎么激活的,红石块吗?

狸旻
翻来翻去看了几遍,边试边看硬是没看懂
也就是说这玩意有随机抽取结构的功能,然后还能够一个接一个连下去?
但是这要是只能手动激活的话,那用来做图也是挺鸡肋的...

lucyffer
刷分、、、、、、、、、、、、、、、、、、、、、、、、、、、、

Fhblaze
那在基岩版它怎么用呢?

worid.
新人好祝新人2021年快乐 新人好祝新人2021年快乐

我才是Joy
请问1.16.5的JIGSAW_POOL_KEY是什么,开发包中好像没有找到。

HangBack_
我才是Joy 发表于 2021-10-4 14:48
请问1.16.5的JIGSAW_POOL_KEY是什么,开发包中好像没有找到。

1.16.2以上的版本我还没有测试过,你可以看看维基上面有没有写相关介绍(看名字我猜也许跟拼图池的相关生成有关)

41509443
这个可以用来干嘛呀

发是的个的发
大佬我想问一下,我想用拼图方块自定义一个村庄,结果老是崩溃怎么办。我以前遇到过崩溃,大概原因是在一个结构里放置了太多的拼图方块,这些拼图方块都会在他们所在的同一个结构内生成各自的结构,就会导致互相挤占。我的解决办法是减少一些拼图方块。事实证明这可行。但我又想放一些生成结构在拼图方块所在的结构之外的拼图方块,例如村庄道路旁生成房屋的拼图方块就会把房屋生成在道路结构之外。但就一直崩溃。希望大佬能指点

HangBack_
发是的个的发 发表于 2022-7-31 23:05
大佬我想问一下,我想用拼图方块自定义一个村庄,结果老是崩溃怎么办。我以前遇到过崩溃,大概原因是在一个 ...

崩溃原因可以在启动器内打开报告日志,查看拼图方块的相关报错信息(猜测,信息中会含有template_pool)找到原因后,去修改自己的文件,循环往复,直到不出现报错(此时可能游戏仍然崩溃也有可能正常运行但达不到预期效果,这种情况如果自己实在找不到问题,就可以寻求别人帮助了((躲避

发是的个的发
HangBack_ 发表于 2022-8-1 03:34
崩溃原因可以在启动器内打开报告日志,查看拼图方块的相关报错信息(猜测,信息中会含有template_pool) ...

好吧,我看了一下崩溃报告,是未知方块,具体原因就是我在拼图方块里的转换成别的方块打错方块名了,现在可以了

鹏鹏同志
有点没看懂0.0太高级了

南瓜只是懒
支持一下作者

kesiming
加油!做下去

NiuMaDDZ
学不会眼瞎我不配

Lookset
谢谢大佬的资源,很方便

小君啊
Mcbbs有我更精彩