【指令小课堂】P2-自定义合成配方(文字版,近期会出视频)
!!WARNING!!
该专栏有大量图片,网络不佳的读者请酌情参考
前言
指令小课堂是一个总结指令经验或自制算法的系列,为新人提供尽量详细的技术介绍。
第一期:

观前提示:本教程一般针对的是Java版最新版,基岩版(或Win10)玩家酌情参考。

在制作数据包或者地图的时候,经常需要运用自定义合成配方。如果查找数据包功能,确实可以找到一个"recipes"的功能。但该功能存在一个很严重的缺陷:不能给产物加上nbt数据。
在自定的物品上,nbt数据是一个很重要的角色,通常会涉及到各种检测和显示。
但我们现在还可以尝试数据包中的另一个重要功能:进度。参看Minecraft wiki上对进度结构介绍,我们可以发现一个叫做"minecraft:recipe_unlocked"的触发器,该触发器在玩家解锁在某一配方时触发,该触发器就是我们制作自定义合成的基础。
(wiki上的数据参考价值很大,会在结尾处附上完整进度JSON结构及该篇地址)

从JSON结构可以看出,我们需要一个先写一个自定义的配方文件。由于是解锁配方,我们需要用循环移除玩家的解锁的该配方,同时移除掉该进度(移除进度可以在完成后移除),以达到多次生效的效果。
在这里给出配方的JSON结构(工作台):

参照该图,我们可以写出一个试验用的配方:

注:无序合成的type应修改为crafting_shapeless,语法请在wiki上查看

将该文件命名为sword.json(注意:文件名可以随意但不能重复,文件格式要是json)放到 数据包/data/命名空间/recipes/sword.json即可运作
在这里暂时不介绍进度的全部标签,但下面几个标签必须了解:

下一步,我们还要编写一份进度文件。参照上面给出过的文件结构,写出一份测试用的进度文件:

同配方,命名为sword.json,放到 数据包/data/命名空间/achievements/sword.json,注意,这里的main:sword是我自己的命名空间,自己做的时候要把这个换成自己的(可以放在minecraft命名空间以省略命名空间的声明)main:debug/sayhi函数也是我自己写的函数,,这里给出内容:

将函数放进 数据包/data/命名空间/functions/debug/sayhi.mcfunction即可使用(这里的命名空间是main,直接放在functions就行,debug为自建文件夹)
进入游戏,测试合成配方:

结尾提示:实际使用时建议将配方产物设为知识之书之类无法获得的物品,并准备一个循环函数或命令方块来清除该物品(不能在触发的函数里写,因为获得产物滞后于函数运行),如果需要对玩家展示合成配方,需要重新写一份内容一样但名称不同的配方,因为不移除触发用配方的话就无法进行下次触发。

进度完整JSON格式:(display可选,这样会对玩家隐藏该进度)
