【基岩版】基岩版附加包教程
-
该文章是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 数量”来调整这个限制。好了,这就是函数的全部。
-
附加包教程:4.功能域
注意:此页面所述功能和/volumearea命令在现版本已被弃用,此页面现仅作为旧版本参考。
此页面所述功能只能在1.21.0及以下的游戏中使用。
然而,出于学习并理解旧版附加包的必要性,我保留了这个页面。前言
上期,我们成功向附加包中添加了函数。这一期,我们将学习功能域相关内容。注意,功能域属于实验性内容中的实验性内容,从未正式发布,测试了四个大版本就移除了。需要1.18到1.21的版本。
准备
打开行为包根目录,打开volumes文件夹。不过,在你迫不及待地新建文件之前,你一定很疑惑:什么是功能域?我怎么从来没听说过??如果你想知道答案,打开折叠块。你也可以跳过,反正我一会儿还要放出使用方法。
这个问题,只有玩命令的玩家才可能会回答,而且回答的不一定对。如果你经常玩命令,你应该会注意到有个命令叫/volumearea。这个命令的解释大概是“列出、添加或删除卷”,这一定让你大惑不解。“卷”?卷是什么?你带着这个疑问,看到了它的语法大致与/tickingarea(常加载区域)相同,于是你猜测这个“卷”就像常加载区域一样,是一种区域。没错,所谓“卷”,就是功能域。 在你尝试输入/volumearea然后招惹来一堆错误提示时,你一定不会想到这东西居然需要附加包的支持。换句话说,还没有已知的原版的功能域。功能域,只能通过附加包添加,这就是我把它放在函数后面这一期的原因。 我说了这么多,只是因为我想让你在自然情况里了解功能域,你会有兴趣的。 现在我来回答到底什么是功能域。一个实体进入或离开特定区域后触发了事件,或者在区域内有迷雾效果,这个特定区域就是功能域。比如,走进房子,系统提示:“已进入房子”;走出房子,系统提示:“已离开房子”,房子在一个特定的区域里,这个区域就是功能域。 不过现在,连/volumearea命令都被移除了,功能域这个特性算是几乎没人知道的东西了,它本身也并不实用。
好了,在volumes文件夹里新建文件吧,文件名称见后面的解释。
第一个功能域
现在就可以开始了。在你新建的文件里写以下代码。
{ "format_version": "1.18.0", "minecraft:volume": { "description": { "identifier": "前面写一个附加包名称,加上英文冒号,后面写具体的这个文档的英文名(例如test_pack:test_volume),这个叫命名空间ID,要牢记" }, "components": { "minecraft:bounds": { "min": [ -512, -64, -512 ], "max": [ 512, 320, 512 ] //这两个数组可能是指定这个功能域的范围,又或者是限制放置的坐标,目前不清楚它的功能 }, "minecraft:fog": { //给功能域附加一个迷雾,进入后显示这个迷雾 "fog_identifier": "minecraft:fog_hell", //下界荒地的迷雾ID "priority": 0 //迷雾的优先级,多个功能域重叠时使用。数字越小,优先级越大。 }, "minecraft:on_actor_enter": { //指定当实体进入时触发的事件 "on_enter": [ { "condition": "1", //指定一个Molang表达式,返回true时才触发这个事件 "event": "enter", //触发的事件 "target": "other" //other意思是进入功能域的实体,self意思是功能域本身 } ] }, "minecraft:on_actor_leave": { //指定当实体离开时触发的事件 "on_leave": [ { "condition": "1", //指定一个Molang表达式,返回true时才触发这个事件 "event": "leave", //触发的事件 "target": "other" //other意思是离开功能域的实体,self意思是功能域本身 } ] } }, "events": { "enter": { //进入时触发的事件 "run_command": { "command": [ "title @s 进入测试功能域" //要运行的命令 ] } }, "leave": { //离开时触发的事件 "run_command": { "command": [ "title @s 离开测试功能域" ] } } } } }
总结
好了,现在,你应该会如何添加一个功能域了,也明白什么是功能域了。功能域的内容单一,热度较低,目前由于特性(见折叠块)实际用途不多,一期就可以说完。下期,我们就要学习如何添加迷雾了。
文件下载 test_volume.txt 自行更改后缀名为 json
-
附加包教程:5.迷雾
准备
第一个迷雾
现在就可以开始了。在你新建的文件里写以下数据。
{ "format_version": "1.16.100", //不像其他内容,迷雾的格式版本只能是1.16.100,不能变。 "minecraft:fog_settings": { "description": { "identifier": "前面写一个附加包名称,加上英文冒号,后面写具体的这个文档的英文名(例如test_pack:test_fog),这个要牢记" }, "distance": { //这里就是迷雾的各种属性 "water": { "fog_start": 10.0, //玩家和迷雾开始时的距离,此时迷雾是半透明的。 "fog_end": 40.0, //迷雾变得完全不透明时离玩家的距离。必须大于或等于“fog_start”。 "fog_color": "#0677ce", //迷雾的颜色,使用十六进制 "render_distance_type": "fixed" //决定迷雾渲染距离的方法。 fixed的意思是以方块为单位,render的意思是把距离当成因数,乘以当前的渲染距离。 }, //水下的远处 "air": { "fog_start": 20.0, //这些值的意思和上面说的一样。 "fog_end": 100.0, "fog_color": "#eedde1", "render_distance_type": "fixed" }, //空气中远处 "weather": { "fog_start": 20.0, "fog_end": 80.0, "fog_color": "#eedde1", "render_distance_type": "fixed" }, //下雨或下雪时远处 "lava": { "fog_start": 20.0, "fog_end": 80.0, "fog_color": "#eedde1", "render_distance_type": "fixed" }, //在熔岩里时远处 "lava_resistance": { "fog_start": 40.0, "fog_end": 80.0, "fog_color": "#eedde1", "render_distance_type": "fixed" }, //拥有抗火效果时熔岩里远处 "powder_snow": { "fog_start": 20.0, "fog_end": 80.0, "fog_color": "#eedde1", "render_distance_type": "fixed" } //细雪里远处 } } }
好了,一般来说制作附加包只需要上面那些数据。下面是高级内容,不怎么常用,如果要测试一下,那么新开一个迷雾文件,写上以下代码。
{ "format_version": "1.16.100", "minecraft:fog_settings": { "description": { "identifier": "前面写一个附加包名称,加上英文冒号,后面写具体的这个文档的英文名(例如test_pack:advanced_fog),这个要牢记" }, "distance": { //这里与上面的意思相同。 "water": { "fog_start": 10.0, "fog_end": 40.0, "fog_color": "#0677ce", "render_distance_type": "fixed", "transition_fog": { //当玩家的摄像机在水中时,水中的渐变迷雾。 "init_fog": { //初始时的迷雾 "fog_start": 0.0, "fog_end": 0.01, "fog_color": "#157cab", "render_distance_type": "fixed" //这四项与上面那四项的作用相同。 }, "min_percent": 0.25, //渐变的最小百分比(范围是0.0-1.0),迷雾从这个百分比开始渐变 "mid_seconds": 5, //迷雾达到下面百分比所需的时间(秒) "mid_percent": 0.6, //迷雾经过上面mid_seconds秒数的渐变后,到达的百分比 "max_seconds": 30 //迷雾渐变完成所需要的时间(秒,范围是0.0-1.0),以上四项共同定义了迷雾渐变的速度轨迹等。 } }, "air": { "fog_start": 20.0, "fog_end": 100.0, "fog_color": "#eedde1", "render_distance_type": "fixed" }, "weather": { "fog_start": 20.0, "fog_end": 80.0, "fog_color": "#eedde1", "render_distance_type": "fixed" }, "lava": { "fog_start": 20.0, "fog_end": 80.0, "fog_color": "#eedde1", "render_distance_type": "fixed" }, "lava_resistance": { "fog_start": 20.0, "fog_end": 80.0, "fog_color": "#eedde1", "render_distance_type": "fixed" }, "powder_snow": { "fog_start": 20.0, "fog_end": 80.0, "fog_color": "#eedde1", "render_distance_type": "fixed" } }, "volumetric": { //这里是高级内容,一般不会用到。这个是迷雾的体积设置。 "density": { //迷雾的密度。下面的air,water等等的对象,意义是光穿过air(空气)/water(水)等等,的迷雾密度值。 "air": { "max_density": 0.95, //迷雾的(最大)不透明度(密度),介于0和1之间,可以是小数。 "zero_density_height": 320, //迷雾完全透明并开始出现(渐渐变浓)的高度,以方块为单位。需要至少比“max_density_height”大1,介于0-320之间。 "max_density_height": 128, //迷雾将达到其最大密度(最浓)的高度,单位是方块,介于0-320之间。 "uniform": false //如果设置为true,密度在所有高度上都是一致的,因此不能也不需要使用max_density_height和zero_density_height。如果设置为false,则密度不一致,使用max_density_height和zero_density_height决定密度。 }, "water": { "max_density": 0, //这些结构都是重复的,意义和上面的相同。 "uniform": true }, "lava": { "max_density": 0, "uniform": true }, "lava_resistance": { "max_density": 0, "uniform": true } }, "media_coefficients": { //不同方块中迷雾体积的系数设置。 "air": { //光线穿过空气时的迷雾系数。 "scattering": "#000000", //每个方块被散射的光的比例。也可以填写含三个范围是0-255的整数的数组。 "absorption": "#000000" //每个方块被吸收的光的比例。 }, "water": { //光线穿过水时的迷雾系数。 "scattering": "#000000", //这些结构都是重复的,意义和上面的相同。 "absorption": "#000000" }, "cloud": { //光线穿过云时的迷雾系数。 "scattering": "#000000", "absorption": "#000000" } } } } }
-
附加包教程:6.物品(一)
准备
在行为包根目录下打开items文件夹,新建一个文件。命名就是你的物品的英文名,这样比较好管理。你也可以新建一个文件夹,把它命名英文名,把所有相关的文件都放进去,方便管理。这对于方块和实体也适用。
第一个物品
现在就可以开始了。在你新建的文件里写以下代码。
{ "format_version": "1.21.50", //这个是格式版本,写物品时只能用这个版本能用的语法。建议保持一个比较新的版本号,如1.21.50。 "minecraft:item": { "description": { "identifier": "以后这里我称为“命名空间ID”", //前面写一个附加包名称,加上英文冒号,后面写具体的这个物品的英文名(例如test_pack:test_item),这个要牢记。 "menu_category": { "category": "items", //定义物品位于创造模式物品栏下的哪个标签页。construction是建筑,equipment是装备,items是物品,nature是自然,none是不在创造模式物品栏中显示。 "group": "minecraft:itemGroup.name.bed", //创造模式物品栏标签页下的组,填写物品组的本地化键名,如果是 1.21.60+ 那么还要在前面加一个 minecraft: 作为命名空间。找不到对应物品组时,不会放进任何物品组中。 "is_hidden_in_commands": false //物品是否在命令列表中隐藏,例如是否可以通过命令获取。设为true后将不能用命令获得此物品。 } }, "components": { //这就是这个物品拥有的功能的列表,叫“组件”。 "minecraft:icon": "test_name" } } }
上面我给出的示例文档里描述的是一个命名空间是test_pack:test_item的物品,有一个组件,分别指定了图标和创造模式物品栏分类。如果想要创造功能更丰富的物品,就必须借助更多组件,甚至脚本的帮助。所以,下期我将列出所有可用的组件。使用时,直接重复并粘贴到与示例组件同级的位置就好了。 minecraft:icon:这个组件可以指定物品的纹理图标(就是这个物品长啥样)。要想指定纹理,首先确定纹理短名,短名可以随便起(英文名,建议与这个物品的命名空间ID保持一致)。每个短名都指代一个路径,而这个路径指向图片。简单地说,这个物品告诉基岩引擎,“我的纹理叫 test_name!”基岩引擎就跑去登记表那里,问“test_name 对应哪个路径?”登记表回答,“是 textures/items/test 路径!”基岩引擎就去这个路径指向的纹理,把纹理贴到物品上。
渲染
这一期我们不仅会列出如何创建一个最基础的物品,还要谈到如何让这个物品有纹理。
打开资源包根目录下的textures文件夹,创建item_texture.json,把下面的代码粘贴进去。{ "texture_data": { "test_name": { //这里写之前起的短名。 "textures": "textures/items/test" //这里就是你的纹理的路径。不需要后缀,只需要保证它指向了一张正方形的图片即可。 } } }
在textures文件夹下新建items文件夹,打开,随便一张正方形图片扔进去,改名成你刚才写的名字(刚才的示例里是test,那就改成test.png)。其实这里没那么严格,照片格式只要是.png、.jpg中的一种就好了。然而我建议你把图片转换格式成.png。是转换格式,不是单纯改后缀!
在基岩版1.19.51.01中,物品纹理过大会导致渲染错误,需要用附着物和模型改变渲染大小才能修复这个问题,例如64像素大小的物品需要0.01的scale值,所以建议避免过大的物品纹理。
在基岩版1.19.60.24中,物品纹理的大小可以大于16*16,而且不是正方形也没关系。这些物品在外观上会被缩放到一个适当的位置,然后像普通物品一样渲染。以后的版本中可能会再次出现此漏洞。
打开游戏,你应该能找到你新增的物品,用着你刚才添加的图片,不过它的名字看起来像是乱码。如果要让它显示成正常名字,那就退出游戏,打开资源包根目录下的texts文件夹,创建一个叫zh_CN.lang的文件。
打开它,输入以下这行内容。item.命名空间ID=物品名字
其中,命名空间ID就是上文提到的“test_pack:test_item”,物品名字随便写,可以用§改变格式,但是不能用\n换行,而且在末尾的用 Tab 打出来的制表符显示的时候会被自动删掉。
一行代表一个本地化键名和物品名字的对应关系。如果要写注释,注释要以##开头,而且只会持续到这一行结束。再次打开游戏,应该就能正常地看到一个物品了。
模板包,更改后缀为zip后解压