Minecraft-1.16.2-数据包开发学习#1

学习方法

首先,数据包是JAVA版Minecraft且是1.13版本之后才有的,如果是基岩版或者版本过老,可能不会支持数据包。

主要通过Minecraft Wiki学习(文章内容很多地方都会引用Wiki的原文,我就不一一注明了),借助一些教学视频进行辅助。

当然,最重要的还是应该应用于游戏中,多实践才是关键。

大概看了一下,在开始学习之前应该学会JSON的相关知识,很简单,有面向对象编程基础的话一看就会。


先从框架来说

数据包下的根目录有一个文件夹data,两个文件pack.mcmetapack.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
        }
      ]
    }
  ]
}

至于更加详细的内容修改,比如物品掉落的概率什么的,之后慢慢细谈。现在就是直观的感受一下数据包对原版内容的修改。

当然,数据包的制作肯定要考虑游戏的平衡性,打僵尸掉钻石什么的太不合理了,这样很容易让游戏失去乐趣,在制作数据包的时候一定要注意这一点。

上一篇:网云穿搭建minecraft(我的世界)服务端 外网远程联机


下一篇:如何使用PCL2 联机Minecraft我的世界