Minecraft Wiki

除另有声明,转载时均必须注明出处若簡繁轉換出錯,請以遊戲內為準请勇于扩充与修正内容有兴趣逛逛我们的微博沟通交流,欢迎到社区专页需要协助,请在告示板留言

了解更多

Minecraft Wiki
标签可视化编辑
标签可视化编辑
第67行: 第67行:
   
 
==== 故障排除 ====
 
==== 故障排除 ====
如果列表中没有您的包,请确保<code>pack.mcmeta</code>的语法正确且已保存。看看有没有缺少大括号<code>{}</code>、逗号<code>,</code>、冒号<code>:</code>,双引号<code>""</code>,方括号<code>[]</code>。请记住,对于每个左大括号、双引号或方括号,必须有一个右括号、双引号或方括号与之配对。
+
如果列表中没有您的包,请确保<code>pack.mcmeta</code>的语法正确且已保存。看看有没有缺少大括号<code>{}</code>、逗号<code>,</code>、冒号<code>:</code>,双引号<code>""</code>,方括号<code>[]</code>。请记住,对于每个左大括号、双引号或方括号,必须有一个右括号、双引号或方括号与之配对。
   
 
=== 命名 ===
 
=== 命名 ===

2021年1月21日 (四) 02:58的版本

Information icon
此特性为Java版独有。

本教程介绍如何制作数据包

入门

数据包允许玩家添加及修改函数战利品表、世界结构进度合成标签维度谓词

什么不该做

在制作数据包之前,有些事情是您不应该做的。这是“不应该做的事”的列表:

  • 发布允许玩家在没有从Mojang购买Minecraft的情况下游玩的Minecraft版本或修改版。
  • 以任何方式发布反编译的Minecraft源代码。

创建数据包

要创建数据包,请首先找到世界文件夹中的datapacks文件夹。

要查找世界文件夹,请在游戏目录中找到saves文件夹,默认情况下为.minecraft

  • 单人游戏中,您可以选择您的世界,点击“编辑”,然后点击“打开世界文件夹”。
  • 服务器上,您可以打开其根目录(server.properties所在的位置),然后打开world文件夹.。

打开datapacks 文件夹后,创建一个文件夹并打开。文件夹名即是数据包名,由您决定,但不能含有汉字!

打开新文件夹后要做的第一件事是创建pack.mcmeta文件。这样 Minecraft 才能识别该数据包

创建MCMETA文件

在您刚刚创建的文件夹里新建一个名为 pack.mcmeta 的纯文本文件。

注意

重命名时,请确保文件扩展名为.mcmeta而非.txt换句话说,删除旧的扩展名。您可能会收到警告:如果改变文件扩展名,可能会导致文件不可用。但是这实际上表明你已正确重命名pack.mcmeta文件。

如果您使用的是Microsoft Windows并且看不到文件扩展名,对于Windows 10,可以通过转到“文件资源管理器”的“查看”菜单并选中“文件扩展名”复选框来打开它们。对于Windows 10以下的Windows,可以取消选中文件夹设置中的“隐藏扩展名”。

FileExtensions

文本编辑器

理论上使用任何文本编辑器都可以。建议所选的文本编辑器支持JSON,JSON是mcmeta文件和数据包中大多数其他文件使用的格式。请注意,大多数文本编辑器不会将mcmeta扩展名识别为JSON文本。因此,您需要手动配置编辑器。

pack.mcmeta的内容

用文本编辑器打开pack.mcmeta,复制或键入以下内容:

{
  "pack": {
    "pack_format": 6,
    "description": "教程数据包"
  }
}

对于pack.mcmeta,可在数据包的描述和名称中使用“§”符号(Minecraft格式化代码)。

如果数据包用于1.17快照,则 pack_format应该为7。如果数据包用于1.16.2~1.16.4版本,则 pack_format应该设为6。如果数据包用于1.15~1.16.1,则 pack_format应该为5。如果数据包用于1.13~1.14,则 pack_format应该为4。 description可以使用字符串或原始JSON文本。当您将鼠标悬停在/datapack list输出的数据包名或进入创建世界的数据包界面时,这段内容将会显示出来。

注意

这个文件是用JSON编写的!本教程现在没有详细介绍格式,但要注意,不要忘记引号、冒号、圆括号和方括号。缺少任意一个都可能导致您的数据包无法正常工作!您可以使用JSON验证器检查您的文件,例如 JSONLint

测试您的数据包

如果你创建了pack.mcmeta,尝试在游戏中测试它!打开Minecraft,进入世界或输入/reload(如果你已经进入了世界),然后输入/datapack list。此时应该出现两条信息:第一条是[vanilla],第二条应该是[file/(您的数据包的名称)]。当你将鼠标悬停在数据包名称上时,你应该会看到数据包的描述,内容就像你在pack.mcmeta description中所写的那样。

当你的数据包出现时,你要准备好继续前进。

故障排除

如果列表中没有您的包,请确保pack.mcmeta的语法正确且已保存。看看有没有缺少大括号{}、逗号,、冒号:,双引号"",方括号[]。请记住,对于每个左大括号、双引号或方括号,必须有一个右大括号、双引号或方括号与之配对。

命名

在数据包文件夹中创建一个名为 data的文件夹,和pack.mcmeta在一个文件夹里。在data文件夹中,您必须创建一个或多个文件夹作为命名空间。

数据包中的条目以命名空间:路径作为命名空间ID。相应的文件将位于data/命名空间/(数据类型)/路径.(后缀)。请注意,路径中的/字符将转换为目录分隔符。

例如:

  • ID为dummy:foo_proof/bar物品标签将定位到data/dummy/tags/item/foo_proof/bar.json
  • ID为foo:handler/bar_call函数将定位到data/foo/functions/handler/bar_call.mcfunction

合法字符

数据包中的命名空间、路径、文件夹名和文件名应仅包含以下符号:

  • 0123456789 数字
  • abcdefghijklmnopqrstuvwxyz 小写字母
  • _ 下划线
  • - 连字号(减号)
  • / 正斜杠(不能用于命名空间)
  • . 句号(不能用于命名空间)

首选命名格式为以下划线隔开的小写字母单词(lower_case_with_underscores),称为蛇形命名法(lower snake case)。

命名空间

游戏中的大多数对象都有一个命名空间(namespace),以防止潜在的内容冲突或无意的覆盖。

例如,如果有两个数据包为Minecraft分别添加了一个新的小游戏机制,并且两者都有名为start函数。如果没有命名空间,这两个函数就会冲突,小游戏也会被破坏。但如果它们分别有minigame_oneminigame_two两个不同的命名空间,则函数名分别为minigame_one:startminigame_two:start,就不发生冲突了。

大多数情况下Minecraft需要ID的存在,例如 /function 命令,路径和命名空间缺一不可。如果命名空间未指定,则默认其为minecraft

添加新内容时,请一定使用您自己的命名空间。仅当需要覆盖其他东西,或是追加标签的时候,才使用其他命名空间。

例如,Minecraft使用minecraft命名空间,这意味着只有当数据包需要覆盖现有的Minecraft数据或将内容添加到原版标签时才应使用此命名空间。

函数

函数是一系列顺次执行的命令

要创建新函数,应在命名空间文件夹中新建functions文件夹。然后,在functions(或其子文件夹)中新建函数文件函数名.mcfunction。这就是你的函数文件。你的函数会被游戏命名为(命名空间):(函数名称)或者当位于子文件夹时为(命名空间):(子文件夹1)/(子文件夹2)/…/(名称)

战利品表

主条目:战利品表

当一个生物死亡时,Minecraft根据战利品表决定其掉落物。当首次开启自然生成的容器(例如箱子)时,Minecraft也根据战利品表生成其中的战利品。可以通过/loot命令调用它们。

在命名空间文件夹中新建loot_tables文件夹以创建一个新的战利品表。然后,在loot_tables(或其子文件夹)中新建战利品表文件战利品表名.json。在游戏中,战利品表以命名空间ID的格式引用。

作为参考,这里给出的战利品表的一个样例:

{
  "type": "minecraft:entity",
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item",
          "functions": [
            {
              "function": "minecraft:set_count",
              "count": {
                "min": 0,
                "max": 2,
                "type": "minecraft:uniform"
              }
            },
            {
              "function": "minecraft:looting_enchant",
              "count": {
                "min": 0,
                "max": 1
              }
            }
          ],
          "name": "minecraft:leather"
        }
      ]
    },
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item",
          "functions": [
            {
              "function": "minecraft:set_count",
              "count": {
                "min": 1,
                "max": 3,
                "type": "minecraft:uniform"
              }
            },
            {
              "function": "minecraft:furnace_smelt",
              "conditions": [
                {
                  "condition": "minecraft:entity_properties",
                  "predicate": {
                    "flags": {
                      "is_on_fire": true
                    }
                  },
                  "entity": "this"
                }
              ]
            },
            {
              "function": "minecraft:looting_enchant",
              "count": {
                "min": 0,
                "max": 1
              }
            }
          ],
          "name": "minecraft:beef"
        }
      ]
    }
  ]
}

如果您想要查找原版战利品表,或是学习其中标签的具体含义,请参见战利品表

结构

结构可以用于结构方块拼图方块,也可以覆盖Minecraft中原版结构的外观。结构以NBT格式存储,您可以使用结构方块创建NBT文件。MCEdit之类的第三方软件也可以导出NBT文件。

在命名空间文件夹中建立structures文件夹以向数据包添加一个新的结构。然后,把你的NBT结构文件放在structures文件夹(或它的子文件夹)之下。在游戏中,结构以命名空间ID的格式引用。

进度

主条目:进度

玩家通过完成进度来获得奖励。

在命名空间文件夹中建立advancements文件夹以创建一个新的进度。然后,在这个文件夹(或它的子文件夹)之下新建进度文件 进度名.json。在游戏中,进度以命名空间ID的格式引用。

配方

主条目:配方

玩家根据配方合成烧炼物品。

在命名空间文件夹中建立recipes文件夹以创建一个新的配方。然后,在这个文件夹(或它的子文件夹)之下新建配方文件 配方名.json。在游戏中,配方以命名空间ID的格式引用。

有序配方

第一种常见的配方类型是有序配方。

    {
        "type": "minecraft:crafting_shaped",
        "pattern": [
            "123",
            "231",
            "312"
        ],
        "key": {
            "1": {
                "item": "(物品命名空间ID)"
            },
            "2": {
                "item": "(物品命名空间ID)"
            },
            "3": {
                "item": "(物品命名空间ID)"
            }
        },
        "result": {
            "item": "(物品命名空间ID)",
            "count": 5
        }
    }

"type": "crafting_shaped"可以看出,这是一个有序配方。

pattern 是一个列表,描述了配方的形状,最多包含3个字符串。一个字符串表示一横行,每个字符串最多含有3个字符,一个字符表示合成网格中的一个格子。字符串不必非得是3个,每个字符串也不一定要3个字符,但是每个字符串中的字符个数必须是相等的。空格表示空格子。

key 是一个对象,规定了pattern中的字符所代表的物品。可以用item 后接物品ID,也可以用tag后接数据包标签。

result 是一个对象,其中item规定了最终合成的是何种物品。count是一次合成成品的数量。

以下是活塞的原版合成配方,供参考:

    {
        "type": "crafting_shaped",
        "pattern": [
            "TTT",
            "#X#",
            "#R#"
        ],
        "key": {
            "R": {
                "item": "minecraft:redstone"
            },
            "#": {
                "item": "minecraft:cobblestone"
            },
            "T": {
                "tag": "minecraft:planks"
            },
            "X": {
                "item": "minecraft:iron_ingot"
            }
        },
        "result": {
            "item": "minecraft:piston"
        }
    }

无序配方

无序配方是另一种常见的配方类型。

    {
        "type": "crafting_shapeless",
        "ingredients": [
            {
                "item": "(物品命名空间ID)"
            },
            {
                "item": "(物品命名空间ID)"
            },
            [
                {
                    "item": "(物品命名空间ID)"
                },
                {
                    "item": "(物品命名空间ID)"
                }
            ]
        ],
        "result": {
            "item": "(物品命名空间ID)",
            "count": 5
        }
    }

"type": "crafting_shapeless"可以看出,这是一个无序配方。

无序配方没有patterningredients是一个列表,列出合成所需的原料。原料可以以任何形状排列在合成网格中。ingredients中如果出现列表,则表明该列表中的任何一种物品都可以使用,如下面火焰弹配方中,煤和木炭都可以使用。

以下是火焰弹的原版合成配方,供参考:

{
  "type": "minecraft:crafting_shapeless",
  "ingredients": [
    {
      "item": "minecraft:gunpowder"
    },
    {
      "item": "minecraft:blaze_powder"
    },
    [
      {
        "item": "minecraft:coal"
      },
      {
        "item": "minecraft:charcoal"
      }
    ]
  ],
  "result": {
    "item": "minecraft:fire_charge",
    "count": 3
  }
}

烧炼配方

也可自定义烧炼配方。

{
    "type": "smelting",
    "ingredient": {
        "item": "(物品命名空间ID)"
    },
    "result": "(物品命名空间ID)",
    "experience": 0.35,
    "cookingtime": 200
}

这是一个烧炼配方的大致示例。ingredient用于指定你要烧炼的物品。result将指定烧炼产品。在experience中,你可以选择烧炼所获得的经验值,在cookingtime中,你可以选择该物品熔炼所需的时间,在本例中为10秒(200刻=10秒)。

这是默认的钻石矿石烧炼配方:

{
    "type": "smelting",
    "ingredient": {
        "item": "minecraft:diamond_ore"
    },
    "result": "minecraft:diamond",
    "experience": 1,
    "cookingtime": 200
}

标签

主条目:标签

标签用来对方块物品实体函数分组。minecraft:tick函数标签用来表示函数每游戏刻都执行,minecraft:load 函数标签则用来表示函数在每次世界加载(或重新加载)的时候都运行。

在命名空间文件夹之下新建tags文件夹以创建新的标签。在这个文件夹之下,新建文件夹blocksitemsfunctions。然后,在任意一个文件夹(或它们的子文件夹)之下新建标签文件标签名.json。在游戏中,标签以命名空间ID的格式引用。

谓词

主条目:谓词

谓词(Predicate)是技术性JSON文件, 相当于战利品表/execute if predicate命令或谓词目标选择器参数

在命名空间文件夹之下新建predicates文件夹以创建新的谓词。然后,在这个文件夹(或它的子文件夹)之下新建标签文件谓词名.json。在游戏中,标签以命名空间ID的格式引用。

维度

主条目:维度

维度(Dimension)是JSON文件,用于指定一个世界包含的所有维度。

维度的特殊之处在于它们只在minecraft命名空间中工作。在minecraft命名空间文件夹中创建一个维度文件夹以创建新的维度,然后创建一个名为维度名.json的文件。建议将维度文件放在与你的命名空间同名的单独文件夹中:

minecraft:(命名空间)/维度名.json

自定义维度在游戏中可使用/execute in minecraft:维度名访问。

参见