本篇教程由作者设定使用 CC BY-NC 协议。
懒得看字的请看B站视频教程。
本教程遵循 CC: BY-NC 创作共用许可:
您(用户)可以复制、发行、展览、表演、放映、广播或通过信息网络传播本作品;
您必须按照作者或者许可人指定的方式对作品进行署名。
介绍
众所周知,MC在1.13中加入了数据包功能。
数据包允许玩家添加及修改函数、战利品表、世界结构、进度、合成、标签、维度和谓词等Minecraft游戏内容。 ——摘自中文Minecraft Wiki。
简单来说,就是一种轻量化的模组。
开发数据包有什么禁止的事项?
在制作或发布数据包时,你不应该:
发布Minecraft版本或修改版,使得未从Mojang购买Minecraft的玩家可以获得它;
以任何方式发布反编译的Minecraft源代码(虽然自己用是没逝的)。
开发数据包要准备些什么?
一个Wiki;
一个文件编辑器(几乎所有编辑器都可以,甚至是记事本,推荐VSC);
一些非常友好的群友(我对此不付任何精神损伤);
一个可以压缩/解压的软件(虽然你可以使用自带的文件管理器,但不建议);
思路清晰,目标明确;
问问题态度诚恳,这可以解决95%的问题;
搜索引擎比大佬在么好用多了(除非你在做一个前无古人,也有可能后无来者的小玩意);
下面的JSON小知识:
{
"一个项": "一个东西里面的东西", //这是一个项
"一个列表": [ //这是一个列表
"一个列表里面的项", //项的前面一定要有空格(不过这只是规范,不影响它识别)。
"一个列表里面的另外一个项" //所有东西一定要用{}、[]、半角双/单引号包裹
], //←←← 如果不是最后一个列表/项,在}]后面一定要加半角逗号!
"另外一个列表": [
"另外一个列表里面的项”
]
} //记得删前面带“//”的注释!
对,没错,只需要这8点,傻子非专业人员都可以制作数据包!
相关链接
很明显,如果你只看本教程的话,只能学到本教程教的内容。而看Wiki自学也是有点难度的,所以我列出一些可能对你学习数据包有帮助的链接,希望能帮到你的学习。
其他教程
本教程你教学方式可能不符合你的胃口,所以我也推荐看看其他人的教程。
Datapack数据包教学笔记 我的世界教程 by 小泠君丶(停更好久了byd)(停更;
我的世界数据包入门教学系列 by 创小业(byd你也一样是吧);
Minecraft 原版模组入门教程 by ruhuasiyu(膜拜大佬!!!)。
Wiki页面
不用多说了吧。
正式开发
注:为了后续开发的顺利,建议你关闭“隐藏文件扩展名”(百度/必应一下,你就知道)。
pack.mcmeta
打开自己存档中的“datapacks”文件夹,创建一个文件夹(名字自定,这里叫Test Datapack),在里面创建pack.mcmeta文件并写入如下内容:
{
"pack": {
"pack_format": 6,
"description": "测试数据包"
}
}
pack.mcmeta,它是数据包的核心。
"pack_format" 代表数据包的版本编号(你给什么MC版本开发就填对应的版本编号!),目前主流的版本编号是:
版本编号 | 代表版本 | 版本编号 | 代表版本 | 版本编号 | 代表版本 |
---|---|---|---|---|---|
4 | 1.13–1.14.4 | 5 | 1.15-1.16.1 | 6 | 1.16.2-1.16.5 |
7 | 1.17-1.17.1 | 8 | 1.18-1.18.1 | 9 | 1.18.2 |
10 | 1.19-1.19.3 | 12 | 1.19.4 | 15 | 1.20-1.20.1 |
18 | 1.20.2 | 26 | 1.20.3–1.20.4 | 41 | 1.20.5-1.20.6 |
48 | 1.21-1.21.1 | 57 | 1.21.2-1.21.3 | 61 | 1.21.4 |
[未来の版本] | v=[ver] | i.(int) | [bydOJNG] | [偶遇…] | [拼尽全力…] |
supported_formats,辛亏有了它,你用不着为了改这个沟槽的版本编号而发一堆一模一样的数据包文件,只需填写一个兼容的列表即可(是加上这段不是换成这段)。
"supported_formats": [9,333] //最低兼容版本+最高兼容版本
"description" 是数据包的简介,可以自定义。
既然你创建了pack.mcmeta,试着在游戏中测试它。打开游戏,进入包含这个数据包的世界,输入/reload,然后输入/datapack list。此时应该出现两条信息:第一条是[vanilla](原版的数据包),第二条应该是[file/Test Datapack(你的数据包的名称)]。当你将鼠标悬停在数据包名称上时,你应该会看到数据包的描述,就是你在"description"中写的东西。
好吧,如果你懒得一条一条打的话可以自己复制粘贴下面这段(禁止白嫖(╯▔皿▔)╯):
{
"pack": {
"supported_formats": [9, 333],
"pack_format": 48,
"description": "测试数据包"
}
}
data文件夹
创建一个叫data的文件夹,用来放数据包的文件。
在data里面创建一个文件夹,名字是你数据包的命名空间(就是数据包的身份证,不能和其它数据包/模组使用一个命名空间,这里用驼峰命名法命名为test_datapack)。
在数据包中,合法字符只有:0到9的10个数字、a到z的26个小写字母、下划线(_)和减号(-)(简而言之,就是ASCII所包含的大部分字符)。
以下是数据包可以包含的内容(除了其他Mod/数据包添加的特殊内容):
pack.mcmeta;
pack.png (一个正方形的图片,是数据包的图标,建议使用16x16、32x32、64x64的格式,byd别用jpg/gif/其他的莫名其妙的玩意!);
data(数据包大部分的内容都在这里面):
test_datapack (当然,这里应该填你数据包的命名空间):
advancements;
functions;
loot_tables;
predicates;
item_modifiers;
structures;
recipes;
tags;
其他花里胡哨的东西。
其他Mod添加的数据包自定义功能,在其他教程有出现(也许我会教?)。
命名空间与id
如果你只是开发和使用原版数据包,那么这个部分你只需简单了解。
但是如果你想开发和Mod有关的就必须了解!
(虽然并没有多少内容XD)
命名空间
命名空间是一个用于区分原版与附加内容(数据包和Mod)的小东西。
原版的命名空间是“minecraft”,数据包/模组的命名空间(也叫modid/Modid)通常是全部小写的模组名字,空格换成下划线“_”。
比如“shu_ju_bao”“mo_zu_min_zi”(请不要使用拼音,这是一件极其重要的事!!!)。
id
如果你接触过指令,id应该是你经常接触的东西了。
它用于区分物品、方块、实体等各种各样的东西(和命名空间差不多)。比如“iron_ingot”
通常搭配命名空间使用,比如“minecraft:iron_ingot”
简单来说,就是“命名空间:id”
数据包的内容
看到了吧?上面这些都是数据包可以包含的内容,不过我们先一个一个来,从最简单的配方开始。
配方
每一个配方文件都得放在 data/[命名空间]/recipes/(分类) 里面。
文件的名称建议使用成品的id,简洁明了。
工作台配方
顾名思义,就是使用工作台(其他适配工作台配方的方块/机器应该也一样)的配方。
有序配方
{
"type": "minecraft:crafting_shaped",
"pattern": [
"111", //必须对应下面的“key”
" 2 ", //空格就是空白
" 2 "
],
"key": {
"1": {
"item": "minecraft:iron_ingot" //这明显是铁锭
},
"2": {
"item": "minecraft:stick" //这是木棍
//也可以用之后会教的“tag”
}
},
"result": { //合成的成品
"item": "minecraft:iron_pickaxe", //结合上面,这是一个铁镐的配方
"count": 1 //你可以用其他数字代替,当然,这不合理
}
}
无序配方
{
"type": "minecraft:crafting_shapeless",
"result": {
"item": "minecraft:slime_ball", //史莱姆球
"count": 3 //数量
},
"ingredients": [
[
{ "item": "minecraft:milk_bucket" } //一桶奶
],
[
{
"item": "minecraft:lime_dye" //黄绿色染料
}
],
[
{
"item": "minecraft:lime_dye" //同上
}
]
]
}
熔炼配方
使用包括熔炉、高炉、烟熏炉、其他Mod添加的熔炉(比如热力系列的通量熔炼炉)的配方。
注:所有熔炼配方都可以在"result"下方添加"experience"(经验值)和"cookingtime"(烧练时间)项,但"result"后一定要加个半角逗号“,”!
"experience": 10, //10点经验值
"cookingtime": 20 //20tick(刻)=1秒
熔炉配方
{
"type": "minecraft:smelting",
"ingredient": {
"item": "minecraft:stick" //输入木棍
},
"result": "minecraft:torch" //输出火把
}
高炉配方
{
"type": "minecraft:blasting",
"ingredient": {
"item": "minecraft:stick" //输入木棍
},
"result": "minecraft:torch" //输出火把
}
烟熏炉
{
"type": "minecraft:smoking",
"ingredient": {
"item": "minecraft:stick" //输入木棍
},
"result": "minecraft:torch" //输出火把
}
篝火
{
"type": "minecraft:campfire_cooking",
"ingredient": {
"item": "minecraft:stick" //输入木棍
},
"result": "minecraft:torch" //输出火把
}
其他配方
在1.14,Minecraft添加了大量的工作方块,1.16还给锻造台加上了功能,以下就是那些配方了。
锻造台配方
由于1.20添加了锻造模板,导致这种锻造台配方失效;
{
"type": "minecraft:smithing",
"base": {
"item": "minecraft:stick" //输入木棍为原料物品
},
"addition": {
"item": "minecraft:coal" //输入煤炭为附加物品
},
"result": {
"item": "minecraft:torch" //输出火把为成品
}
}
{
"type": "minecraft:smithing_transform",
"addition": {
"item": "ae2:fluix_block" //不知道为什么,福鲁伊克斯块的配方不是被删了吗?
},
"base": {
"tag": "ae2:quartz_pickaxe" //输入下界石英镐为原料物品
},
"result": {
"item": "ae2:fluix_pickaxe" //输出福鲁伊克斯镐为成品
},
"template": {
"item": "ae2:fluix_upgrade_smithing_template" //输入福鲁伊克斯升级为模板
}
}
切石机配方
实际上,它不仅仅是切“石”机,它可以切任何物品/方块,前提是你添加了这些配方。
{
"type": "minecraft:stonecutting",
"ingredient": {
"item": "minecraft:oak_planks" //输入橡木木板
},
"result": "minecraft:stick", //输出木棍
"count": 4 //(这个项必填)输出4个
}
进度
你已经稍微学会制作数据包了,那你应该会制作下面关于进度的内容!
{
"criteria": { //准则(就是放触发器的地方)
"stick": { //名字自定义,可以有多个条件
"trigger": "minecraft:inventory_changed", //一个触发器,具体用法在触发器条目
"conditions": {
"items": [
{
"item": "minecraft:torch"
}
]
}
}
},
"display": {
"icon": { //进度的图标,可以用“"icon": "图片在数据包内部的路径"”代替
"item": "minecraft:torch"
},
"title": {
"translate": "火把!"
},
"description": {
"translate": "好烧好烧"
},
"frame": "task", //进度的类型,"task"、"goal"、"challenge"分别为普通、目标、挑战
"announce_to_chat": true, //进度完成后会不会在聊天框显示
"background": "图片在数据包内部的路径", //可选,使用后该进度变为根进度,与parent冲突
"hidden": false, //是否为隐藏进度
"show_toast": true //进度完成后会不会在右上角的画面显示
},
"parent": "minecraft:story", //可选,使用后改进度变为子进度,与background冲突
"requirements": [ //准则列表,在一个内容内则只需完成一个准则,如果有多个内容,则需完成全部内容(人话:在一起就做一个,不在一起就得全做)
["stick"]
],
"rewards": { //进度完成后的奖励,具体内容在奖励条目
"experience": 10 //奖励经验
}
}
触发器
恭喜!你应该学会使用这个自定义进度了!你可能发现了,我们可以修改它的完成方式!这需要触发器,但是触发器的内容众多,这个教程可能塞不下,所以具体内容可以在这个资料查询!
奖励
这个进度的功能包括“奖励10点经验”,我们可以修改它的奖励内容!它包括经验、函数、战利品表(本教程暂时不涉及)、配方(见配方条目)。
函数
虽然它叫“函数”,但是和那些数学里面的“函数”不同,函数只是用来执行指令的,相当于外部命令方块。
虽然它的原理简单,但是它却能干很多事情。
函数文件有个“.mcfunction”的后缀,不过它其实就是普通的文本文档(也就是说,你仍然能使用记事本开发它)。
新建一个“test.mcfunction”在/data/[命名空间](我们使用前面使用到的“test_datapack”)/functions/(分类,可以不用)里,打开它,在里面写入以下内容:
say 这是一个用来测试的数据包的测试文档!
进入世界,输入/reload加载数据包,然后输入:
/function test_datapack(就是你的命名空间):(如果你放在分类里面,分类也要输入)/test
然后你就会在聊天框里面看到一句“这是一个用来测试的数据包的测试文档!”
函数就是这么简单。但是它和普通的指令不一样,类似命令方块,指令的前面要少一个“/”(比如著名模组创世神的大部分指令是两个“//”,要少一个变成“/”)。
本教程不持续更新中~