【基岩版】基岩版附加包教程
-
该文章是Cat_Anchor大佬制作的教程,已取得授权
- 附加包教程:1.初步准备
- 附加包教程:2.配方
- 附加包教程:3.函数
- 附加包教程:4.功能域
- 附加包教程:5.迷雾
- 附加包教程:6.物品(一)
- 附加包教程:7.物品(二)
- 附加包教程:8.物品(三)
- 附加包教程:9.物品(四)
- 附加包教程:10.方块(一)
- 附加包教程:11.方块(二)
- 附加包教程:12.模型
- 附加包教程:13.战利品表
- 附加包教程:14.方块(三)
- 附加包教程:15.方块(四)
- 附加包教程:16.子包
- 附加包教程:17.附着物
- 附加包教程:18.动画
- 附加包教程:19.渲染控制器
- 附加包教程:20.声音
- 附加包教程:21.字体
- 附加包教程:22.行为树
- 附加包教程:23.生物群系
- 附加包教程:24.对话
- 附加包教程:25.生成规则
- 附加包教程:26.结构
- 附加包教程:27.地物
- 附加包教程:28.交易
- 附加包教程:29.实体
- 附加包教程:30.粒子
- 附加包教程:31.附加包根目录
- 附加包教程:32.动态纹理
- 附加包教程:33.方块(五)
- 附加包教程:34.方块(六)
- 附加包教程:35.方块(七)
- 附加包教程:36.实体(一)
- 附加包教程:37.实体(三)
- 附加包教程:38.实体(四)
- 附加包教程:39.NBT
- 附加包教程:40.版本兼容性
- 附加包教程:41.附加包兼容性
- 附加包教程:42.方块(八)
- 附加包教程:43.方块(九)
- 附加包教程:44.方块(十)
- 附加包教程:45.战利品表(二)
- 附加包教程:46.自定义组件(一)
- 附加包教程:47.自定义组件(二)
- 附加包教程:48.自定义组件(三)
- 附加包教程:49.拼图结构(一)
- 附加包教程:50.拼图结构(二)
- 附加包教程:51.拼图结构(三)
- 附加包教程:52.拼图结构(四)
- 附加包教程:53.拼图结构(五)
- 附加包教程:54.拼图结构(六)
今天是3月30日,先发个目录,明天继续更新
-
由于作者对附加包了解不深,本教程存在一些不足之处,欢迎批评指正。物品教程在第6期,方块教程在第10期,实体教程在第29期。
前言
各位在玩各种附加包时,一定会萌生出一种想法,“我能不能做一个自己的附加包?”如果你看过MinecraftLive,就可能会产生“我上我也行”的念头。这篇教程的作用就是把想象照进现实。
准备
首先,需要准备一个用于制作附加包的工具。在Android平台上,我推荐MT管理器。(因为我只有一个手机)我要重点强调,还要准备一个用起来顺手的、支持像素画布的绘画软件。 准备好这两个软件之后,还要初步认识JSON数据格式和能看懂内容日志。在这里,我将简单叙述json格式。 {} 这个东西叫根对象。大部分json文档里都是以这个括号(或者以这个[])开头和结尾的。 "键":"值" 这个东西叫键值对,键是名称,值是名称对应的内容。 "对象":{"键1":"值1","键2":"值2","键3":"值3",...} 这就是一个对象,它是无序的。 "对象":["值1","值2","值3",...] 这就是一个数组,它是有序的。 true false 这两个,true代表真,false代表假。 如果在双引号""里面要用双引号时,里面的双引号前面要加上转义符\。由于在这里转义符会被解析,故难以举例。 转义符不仅能这么用,还有其他用途。\n代表换行,这是最重要的一个。如果你在json文档里的""里需要换行了,用\n表示它。 \t代表一个制表符,与空格的作用大致相同,但是制表符会自动缩进自身的大小以匹配代码。如果代码使用空格进行缩进,不妨改成制表符,这样会在一定程度上压缩文件大小。 // 这是行注释,会以它开始注释一行。 /* */ 这是块注释,会把它们之间的东西全注释掉。
(注:欢迎大佬指正错误,谢谢。)
至于错误日志,只要会英文就好,实在不行就用翻译器翻译一下。错误日志的开头一般是[xxx][error],或者[xxx][warning]。前者就是错误,后者就是警告。一个最容易触发的内容日志错误就是故意往你的json文档里造点语法错误,比如不加英文逗号啊,括号不匹配什么的。(所以在实际编写里要避免这些语法错误。)
一个最容易触发的警告就是把你的纹理(尤其是物品纹理)的分辨率搞得很大(大于512*512),一般就会弹出来警告,说这样可能会卡。建立项目
现在就可以开始了。直接在游戏的com.mojang目录下开发,会省很多时间。打开这个网址(https://minecraft.fandom.com/zh/wiki/Com.mojang),它能帮你定位到com.mojang文件夹。以后的所有操作都在这里进行。找到com.mojang文件夹后,打开。找到development_behavior_packs(行为包文件夹)。进去,随便用英文字母为名字建个文件夹。进入这个文件夹,下文我叫它“行为包根目录”。找到development_resource_packs(资源包文件夹)。进去,随便用英文字母为名字建个文件夹。进入这个文件夹,下文我叫它“资源包根目录”。
建立清单
在行为包根目录下创建一个叫manifest.json的文件,打开,在里面写这些内容:
{
"format_version": 2,
"header": {
"description": "这里写附加包描述",
"name": "这里写附加包名称",
"uuid": "这里写uuid,要和其他任何uuid不一样,下文有获取uuid的方法",
"version": [1, 0, 0], //版本号
"min_engine_version": [1, 19, 50] //这里决定了附加包内各种东西运作的版本,比如这里写1.19.50意味着要在附加包里用新的execute语法。同时,游戏版本低于这个就无法启动这个附加包。}, "modules": [ { "type": "data", //这里决定了这个附加包到底是什么包,data代表行为包,resources代表资源包 "uuid": "这里写uuid,要和其他任何uuid不一样,下文有获取uuid的方法", "version": [1, 0, 0] } ] }
在资源包根目录下创建一个叫manifest.json的文件,打开,在里面写这些内容:
{ "format_version": 2, "header": { "description": "这里写附加包描述", "name": "这里写附加包名称", "uuid": "这里写uuid,要和其他任何uuid不一样,下文有获取uuid的方法", "version": [1, 0, 0], //版本号 "min_engine_version": [1, 19, 50] //同上 }, "modules": [ { "type": "resources", //这里决定了这个附加包到底是什么包,resources代表资源包 "uuid": "这里写uuid,要和其他任何uuid不一样,下文有获取uuid的方法", "version": [1, 0, 0] } ] }
好了,现在你就做好一个最基本的附加包了!打开游戏,你的附加包已经可以被装到存档上了。
这时,你会发现,你的附加包图标是丢失纹理的紫黑方块。把两张png格式的图片重命名为pack_icon.png,扔进行为包根目录和资源包根目录里,这图片就是你的附加包的图标。你还会发现,即使给存档装了附加包,也没有什么新方块、新物品、新实体啥的。那很正常,你又没有定义任何东西,只是定义了附加包名字、描述和uuid。下期,我们就要向附加包内填充东西了
。
假设你还是不懂如何写一个manifest.json,我会放出一个模板,改就完了。
manifest.txt 请自行更改后缀名 -
附加包教程:2.配方
前言
上期,我们成功创建了一个没有任何效果的附加包。这一期,我们将学习自定义配方相关内容。
准备
在行为包根目录下创建recipes文件夹,打开。
(注:以后提到“打开xxx文件夹”时,如果你没有这个文件夹,那就创建xxx文件夹。)第一个配方
现在就可以开始了,新建一个文件,打开。注意,以后如果不特别说明,新建的文件后缀就都是.json。(关于这个文件的命名以后如果不说,那就都是你的内容的名字。例如你想要沙子合成石头,那就sand_to_stone,差不多就这样。不过这个没什么限制,但只能用英文,而且别太长就行。总之,怎么开心怎么来。)
配方有8种:有序配方、无序配方、烧炼配方、酿造配方、酿造混合配方、材料分解配方、锻造升级配方和锻造纹饰配方。其中,第一和第二种配方是工作台配方;第三种是熔炉(或高炉、烟熏炉、营火、灵魂营火)配方;第四和第五种是酿造台配方;第六种比较特殊,属于教育版独有的内容,创建世界时开启教育版选项即可使用;第七和第八种配方在锻造台上进行,负责盔甲纹饰和升级下界合金装备。
接下来,我会分别讲解这些配方的格式。有序配方就是有图案、有顺序的配方,例如木板横着放是压力板,竖着放是木棍,这都是有序配方,原料的摆放顺序不能改。代码如下。
{ "format_version": "1.20.10", //代码的格式版本,不同版本可使用的功能不同,见下文unlock部分 "minecraft:recipe_shaped": { "description": { "identifier": "这里直接写配方英文名,要和文件名匹配" }, "tags": [ "crafting_table" //定义合成的标签,以后自定义方块时会用到 ], "group": "stained_glass", //定义合成属于的组,目前尚不清楚有什么用途 "priority": 1, //定义合成的优先级 "pattern": [ " A ", "ABA", " A " ], //这里就是模拟工作台的地方,相当于3*3网格。放进去的物品要用代号,只能是一个符号或者字母。空格表示不放东西。可以改变形状,例如2*2,2*3等等。 //注意格式,可以用MT管理器的“格式化代码”功能检查格式,如果没报错就是正确格式,报错就根据错误提示修改。 "key": { "A": { "item": "minecraft:leather", //物品ID "data": 0 //这里是物品数据值。 }, //这里就是说,上面的代号表示什么。这个例子中说的是“A代表皮革”。 "B": { "item": "minecraft:ender_pearl" //也是物品ID,这里是末影珍珠 } }, "unlock": [ //基岩版1.20.10新增了unlock字段,用于定义配方解锁功能。玩家获得下面列出的物品会解锁配方。此字段仅可在代码格式版本1.20.10及以上时存在,1.20.10以下时不需要此字段。 { "item": "minecraft:slime" } ], "result": { "item": "supplementary:primary_stronghold", //这里是输出的物品。 "count": 1, //这里是输出的数量,写正整数。 "data": 0 //这里是物品数据值,关于“数据值”,查wiki。 } //当然,也可以在result后接一个数组,把这个对象放进数组里就可以实现多个输出物品了。 } }
无序配方与有序配方相反,就是无顺序的配方,例如钻石块分解成钻石,无论放哪个格子,分解出的都是9个钻石,原料的摆放顺序可以改。代码如下。
{ "format_version": "1.20.10", "minecraft:recipe_shapeless": { "description": { "identifier": "这里直接写配方英文名,要和文件名匹配" }, "tags": [ "crafting_table" //合成的标签,以后自定义方块时会用到 ], "ingredients": [ { "item": "minecraft:stone" //物品ID,这里是原料,可以有很多个原料,每个原料的物品ID允许一样,例如合成混凝土粉末时的配方。 } ], "unlock": { //有序配方和无序配方都可以拥有unlock字段。除了使用列表表示物品以外,还可以使我对象指定上下文触发。 "context": "PlayerInWater" //玩家在水里时解锁配方。还可以填写“None”,即永远不会触发配方。还可以填写“AlwaysUnlocked”,即配方本来就不用解锁。 }, "result": { "item": "minecraft:sand", //这里是输出的物品。 "count": 1, //这里是输出的数量,写正整数。 "data": 0 //这里是物品数据值,关于“数据值”,查wiki。 } //注意,这里目前不支持有很多个输出。 } }
还可以添加切石机配方,其格式与无序配方相同。
{ "format_version": "1.12", "minecraft:recipe_shapeless": { "description": { "identifier": "minecraft:stonecutter_brick_slab" //命名空间ID }, "tags": [ "stonecutter" ], //切石机 "ingredients": [ { "item": "minecraft:brick_block", //输入的物品,只能有一个 "data": 0 //数据值 } ], "result": { "item": "minecraft:double_stone_slab", //输出的物品,只能有一种 "data": 4, //数据值 "count": 2 //数量 } } }
烧炼配方很简单,只需要定义输入的原料和输出的成品,如粗铁烧铁锭。代码如下。
{ "format_version": "1.12", "minecraft:recipe_furnace": { "description": { "identifier": "这里直接写配方英文名,要和文件名匹配" }, "tags": [ "furnace", //熔炉 "blast_furnace" //高炉 ], //这里决定什么炉可以烧,"smoker"是烟熏炉,"campfire"是篝火,"soul_campfire"是灵魂篝火。 "input": "supplementary:calcite_ore", //输入物品 "output": "minecraft:calcite" //输出物品 } }
酿造台配方比熔炉配方复杂一些,需要定义输入的原料、催化剂(指酿造台上面放的东西)和输出的成品,如药水加红石酿造加长时间的药水
酿造配方的输入、催化剂和输出忽略指定的数量值。如果酿造配方的输入可以堆叠,那么整个堆叠将被消耗。目前有一个问题,输出的物品不会与完全相同的物品堆叠在一起,不管是否指定了数据值。 酿造混合配方不将输入物品的数据值传递给输出物品。除了指定水瓶、药水、喷溅药水和滞留药水的,指定输入物品的数据值会使配方无效。 酿造容器配方将输入物品的数据值传递给输出物品,指定输入和输出的数据值会被忽略。仅允许输入水瓶、药水、喷溅药水和滞留药水。
以下是酿造混合配方的代码。
{ "format_version": "1.12", "minecraft:recipe_brewing_mix": { "description": { "identifier": "这里直接写配方英文名,要和文件名匹配" }, "tags": [ "brewing_stand" //酿造台可以酿造,目前没开放接口,只能写这个 ], "input": "minecraft:potion_type:water", //输入的物品ID,这里是水瓶 "reagent": "supplementary:ender_blaze_powder", //催化剂,例如红石 "output": "supplementary:haste_potion" //输出的物品ID,一般是药水(当然其他的也可以) } }
材料分解配方主要用于教育版里的材料分解器,代码如下。
{ "format_version": "1.14", "minecraft:recipe_material_reduction": { "description": { "identifier": "这里直接写配方英文名,要和文件名匹配" }, "input": "minecraft:diamond", //要分解的物品 "output": [ { "count": 64, //数量 "item": "minecraft:element_6" //一项输出,写物品ID }, { "count": 36, //数量 "item": "minecraft:element_6" //又一项输出,写物品ID } ], //这里是输出的物品,总共输出的物品貌似不能超过9项 "tags": "material_reducer" //材料分解器 } }
锻造升级配方用于升级下界合金装备。
{ "format_version": "1.12", "minecraft:recipe_smithing_transform": { "description": { "identifier": "这里直接写配方英文名,要和文件名匹配" }, "tags": [ "smithing_table" //锻造台 ], "base": "minecraft:diamond_axe", //要锻造的装备,这里是钻石斧,只能是标记为可升级物品的装备 "template": "minecraft:netherite_upgrade_smithing_template", //锻造模板,只能是下界合金升级模板 "addition": "minecraft:netherite_ingot", //锻造材料,只能是下界合金锭 "result": "minecraft:netherite_axe" //输出的成品,这里是下界合金斧 } }
锻造纹饰配方用于盔甲纹饰系统。这个配方无需填写输出物品,输出物品被自动指定为有纹饰的盔甲。
{ "format_version": "1.20.10", "minecraft:recipe_smithing_trim": { "description": { "identifier": "minecraft:smithing_armor_trim" //命名空间ID }, "tags": [ "smithing_table" //锻造台 ], "template": { "tag": "minecraft:trim_templates" //锻造模板,使用了tag指定所有锻造模板,这里只能是标记为锻造模板的物品 }, "base": { "tag": "minecraft:trimmable_armors" //可锻造的盔甲,这里只能是标记为可锻造盔甲的物品 }, "addition": { "tag": "minecraft:trim_materials" //可锻造的矿石锭、水晶等(如金锭、紫水晶碎片等),这里只能是标记为可纹饰的材料的物品 } } }
自从1.19.50以来,就可以使用tag标签作为配方的输入。只需要把原料中的 "item": ... 替换为 "tag": ... 后填写一个标签,那么所有拥有这个标签的方块和物品都可以参与合成。可以在这里(https://learn.microsoft.com/en-us/minecraft/creator/reference/content/recipereference/examples/recipetaglist)找到所有原版标签。
配方模板,自行更改后缀为zip -
前言
上期,我们成功向附加包中添加了配方。这一期,我们将学习函数相关内容。
准备
第一个函数
现在就可以开始了。不要以为函数是一个很高深莫测的东西,它实际上就是一堆按顺序执行的命令。新建一个文件,给它命一个好记的英文名,后缀改成.mcfunction,用文本文档打开。
在里面开始写命令吧。这里的命令开头不能有斜杠,每一行代表一个命令。写好的函数文件可以在游戏里用/function 文件名(不带后缀)运行,游戏会在一个游戏刻里按顺序运行全部命令,从第一行运行到最后一行,包括一个函数里的命令调用的另一个函数里的命令。
如果函数数量太多,可以用“/gamerule functioncommandlimit <正整数>”这个命令来修改函数一次最多能执行多少命令。还有,如果你需要重复执行一个或很多函数,那就在functions文件夹下新建tick.json,打开。里面写的数据如下。
{ "values": [ "warden_armor", //一个函数的名称,注意没有后缀。 "table/craft" //又一个函数的名称,这个函数放在一个文件夹里。 ] }
当然了,正在运行的函数越多,游戏就越卡,和命令一样。所以控制一下要在这个文件列出的函数的数量,尽量用其他的方法代替这种循环执行的函数。有时迫不得已需要上百条循环执行的命令,那只好用这种方法。
如果要在函数文档里写注释,注释要以#开头,而且注释只能持续到这一行结束。
一次执行的函数(包括这个函数里调用的函数)中,命令数量有限制。可以使用命令“/gamerule functioncommandlimit 数量”来调整这个限制。好了,这就是函数的全部。