学习方法
首先,数据包是JAVA版Minecraft且是1.13版本之后才有的,如果是基岩版或者版本过老,可能不会支持数据包。
主要通过Minecraft Wiki学习(文章内容很多地方都会引用Wiki的原文,我就不一一注明了),借助一些教学视频进行辅助。
当然,最重要的还是应该应用于游戏中,多实践才是关键。
大概看了一下,在开始学习之前应该学会JSON的相关知识,很简单,有面向对象编程基础的话一看就会。
先从框架来说
数据包下的根目录有一个文件夹data
,两个文件pack.mcmeta
,pack.png
,这里详细说一下两个文件,data
文件夹将会作为重点单独介绍。
pack.mcmeta
这个文件相当于数据包的标识,有了这个文件,这个文件包才能被Minecraft识别为数据包。
其中的内容为JSON格式。
例如1.16.4原版的数据包中,pack.mcmeta文件的内容如下:
注意,根据JSON规范(http://www.json.org, RFC 4627, RFC 7159),JSON是不支持注释的,但是为了学习做笔记方便,仍然按照C/C++中的注释方法做一些注释。如果想要直接用我的代码,请将所有注释删除后再使用。
{
"pack"/*存放数据包信息*/:
{
"pack_format":6,
//数据包版本,可以是任何数字,但是其实有标准,后面会说明。
"description":"The default data for Minecraft"
//一段原始JSON文本。在数据包列表下,光标移动到对应的数据包时会显示此处填写的描述。
}
}
pack_format的标准
如果数据包用于1.17快照,则 pack_format应该为7。如果数据包用于1.16.2版本,则 pack_format应该设为6。如果数据包用于1.15~1.16.1,则 pack_format应该为5。如果数据包用于1.13~1.14,则 pack_format应该为4。
pack.png
是一个png格式的图片,尽量是正方形的图片,用于给你的数据包一个好看的图标。
数据包的测试
在存档的datapacks
文件夹下放入数据包,将修改之后的数据包保存后,在游戏中输入/reload
,即可重新加载数据包(有的数据包需要启动游戏才能重新加载完成)。
建议使用VScode,这样可以加载文件夹的文本编辑器,方便管理和修改各种文件。特别是安装“Datapack Helper Plus”,“datapack-helper”,“mcfunction”等等插件之后,编辑起来十分方便。
在游戏中输入/datapack list
查看游戏加载好的数据包。
data文件夹
以上内容都是很基本的东西,包括创建一个空的数据包,还有如何给数据包添加描述信息。
当然,仅仅依靠上面的东西是绝对不够的。重头戏就是data,这是才是数据包实现功能的核心。
data
文件夹下可以创建文件夹,在这里创建的文件夹的名称将会作为命名空间的名称。
原版Minecraft使用的命名空间为Minecraft
,这意味着只有当数据包需要覆盖现有的Minecraft数据或将内容添加到原版标签时才应使用此命名空间。
实现打僵尸掉钻石
小测试,我希望打僵尸掉落的钻石而不是腐肉。具体操作如下:
在data
文件夹下创建新的文件夹,并命名为Minecraft
,进入这个新创建的文件夹。
打怪掉落属于战利品表的内容,所以在Minecraft
文件夹下创建新的文件夹,并命名为loot_tables
,进入这个新创建的文件夹。
注意:中文Wiki上的内容需要更新,按照上面的说法,直接在
loot_tables
文件夹下创建json文件就可以了,但是在1.16.2版本上并不能实现。
使用解压软件打开minecraft客户端核心的jar包,进入\data\minecraft\loot_tables\
发现下面还有文件夹,分别为blocks
,chests
,entities
,gameplay
。先不管其他的内容,我们可以在entities
下找到僵尸的文件zombie.json
。
这说明我们数据包的loot_tables
文件夹下也应该创建命名相同的文件夹。
在loot_tables
文件夹下创建新的文件夹,并命名为entities
进入这个新创建的文件夹。
创建json文件,文件全称为zombie.json
,这样就可以覆盖原版的内容了。
稍微修改原版zombie.json的内容,并保存即可。
{
"type": "minecraft:entity",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"functions": [
{
"function": "minecraft:set_count",
"count": {
"min": 0.0,
"max": 2.0,
"type": "minecraft:uniform"
}
},
{
"function": "minecraft:looting_enchant",
"count": {
"min": 0.0,
"max": 1.0
}
}
],
"name": "minecraft:rotten_flesh"//将这一行修改为 "name": "minecraft:diamond" 就可以让僵尸掉钻石啦。
}
]
},
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "minecraft:iron_ingot"
},
{
"type": "minecraft:item",
"name": "minecraft:carrot"
},
{
"type": "minecraft:item",
"name": "minecraft:potato"
}
],
"conditions": [
{
"condition": "minecraft:killed_by_player"
},
{
"condition": "minecraft:random_chance_with_looting",
"chance": 0.025,
"looting_multiplier": 0.01
}
]
}
]
}
至于更加详细的内容修改,比如物品掉落的概率什么的,之后慢慢细谈。现在就是直观的感受一下数据包对原版内容的修改。
当然,数据包的制作肯定要考虑游戏的平衡性,打僵尸掉钻石什么的太不合理了,这样很容易让游戏失去乐趣,在制作数据包的时候一定要注意这一点。