前言
本教程介绍了起源开发文档的第一部分——数据表指南为了使国内开发者能够更便捷地开发起源相关的附属内容,本教程翻译了起源开发文档的数据包手册部分,希望可以帮助到众多开发者。
本教程适用于1.17+。
本教程使用DeepSeek翻译并添加个人润色。
本教程中的所有JSON代码使用JavaScript格式插入。
本教程中部分链接和内容进行了本地化处理。
欢迎查阅起源模组文档!
本页面旨在提供制作自定义数据包所需的全部信息,适用于起源模组。
起源是一个基于Fabric的Minecraft模组。它允许玩家在游戏开始时选择一种起源,从而获得不同的能力加成与缺陷。
请访问CurseForge或Modrinth下载该模组!
基本信息
目前大多数能力可通过数据包配置。您还可以通过数据包添加新能力和新起源。本文档将作为重要内容的参考指南,未来可能包含实用教程。
欢迎加入 Origins Discord 服务器,讨论模组开发、数据包制作或附加内容,或寻找使用该模组的服务器(相关信息有时会在服务器内发布)。
若您被 Discord 服务器封禁且认为处理不公,可通过填写此表单申诉。
“肉类”的定义基于标签(origins/tags/items/meat.json),您可在此添加模组食物,羽人族可食用所有未被标记为肉类的食物。若模组在代码中正确定义了食物的肉类属性,则无需额外配置即可生效。
若需使某食物同时被素食与肉食起源食用,可将其添加至标签 origins/tags/items/ignore_diet.json。
幻影族无法穿透的方块包括基岩、黑曜石与哭泣的黑曜石。此设定可通过标签 origins/tags/blocks/unphasable.json 修改。
对于猫科和潜影族,“自然石块”的定义由标签 origins/tags/blocks/natural_stone.json 控制。默认包含:
石头、闪长岩、安山岩、花岗岩;
下界岩、黑石、玄武岩;
所有天然砂岩变种。
创造模式中存在起源之球,为可消耗物品,允许玩家更改起源。若需在生存模式中获取,请通过数据包添加合成配方。
实用链接
示例数据包
数据包 - 中文 Minecraft Wiki
教程:制作数据包 - 中文 Minecraft Wiki
CandyCaneCazoo 的定制起源数据包视频教程(国内无法正常访问)
数据包指南
通过JSON定义起源
起源是通过JSON文件定义的。让我们用这些文件为我们称为"OriginSuperPack"的数据包创建一个虚构的新起源——Supermorph。我们希望这个起源稍微有些强大:Supermorph能够免疫火焰,拥有鞘翅飞行能力,并且可以使用末影珍珠传送。它们唯一的缺点是需要像鸟类起源一样在高海拔处放置床。
{ "powers": [ "origins:fire_immunity", "origins:elytra", "origins:throw_ender_pearl", "origins:fresh_air" ], "icon": "minecraft:slime_ball", "order": 4, "impact": 1}这是定义我们新Supermorph起源的JSON文件。我们将其放置在data/originsuperpack/origins/supermorph.json路径下。
一般来说,文件位置应遵循此格式:data/<命名空间>/origins/<路径>.json
您也可以使用origins作为命名空间,并指定现有起源名称(例如avian)来覆盖模组默认定义的起源,路径如下:
data/origins/origins/avian.json
但请记住,需要在文件中添加一个loading_priority字段,其值必须高于原版起源的优先级(对于基础模组自带的所有起源,该优先级值为0)。
当您将文件按照数据包的正确目录结构放置,并将其放入世界(无论是创建世界时放入,还是在世界加载后拖入世界的datapacks文件夹),新起源仍然没有出现!原因在于:起源层。
新起源仍然需要被添加到起源层中。起源层是起源模组让玩家拥有多重起源的方式。默认情况下只有一个起源层,即origins:origin。如果您愿意,可以创建自己的起源层,让玩家选择第二个起源!以下是如何将我们的起源添加到默认起源层的方法:我们需要创建一个与要添加的起源层ID相同的层级文件。这意味着我们的文件应该位于data/origins/origin_layers/origin.json。文件内容如下:
{ "replace": false, "origins": [ "originsuperpack:supermorph" ]}replace字段仅告知起源模组我们希望添加到已存在的起源层中,而非完全替换它。而origins字段则指定了我们想要附加到该起源层的起源ID。如需创建自定义层级,请参阅完整的层级格式说明(包含所有相关参数)。
现在,我们新创建的Supermorph起源应该会显示在列表中,并带有一个漂亮的黏液球图标。
然而,该起源仍然没有显示正确的名称和描述。解决方法之一是同时添加资源包,并为您所使用的游戏语言(通常是 zh_cn.json)提供翻译内容:
{ "origin.originsuperpack.supermorph.name": "Supermorph", "origin.originsuperpack.supermorph.description": "The Supermorphs are crazy origins which I created for a tutorial!"}不过,除了通过需要客户端加载的资源包来实现外,起源模组也支持直接在数据包中设置名称和描述。要实现这一点,只需在定义起源的JSON文件中添加name字段和description字段即可。
{ "powers": [ "origins:fire_immunity", "origins:elytra", "origins:throw_ender_pearl", "origins:fresh_air" ], "icon": "minecraft:slime_ball", "order": 4, "impact": 1, "name": "Supermorph", "description": "The Supermorphs are crazy origins which I created for a tutorial!"}至此,关于如何使用现有能力定义自定义起源的教程就结束了。如果一切正常,下一步就是学习如何添加自定义能力。
相关页面
起源JSON格式
升级JSON格式(暂译)
起源层JSON格式
通过JSON定义能力
能力能是起源模组实现功能的核心单位。每个起源均由一组能力构成。从起源v0.4.0版本开始,能力改为数据驱动,支持通过数据包修改或新增能力。
游戏要正确加载能力,必须将其放置在数据包的特定路径下。能力文件的完整路径应为:data/<命名空间>/powers/<能力ID>.json。
通常来说,所有能力类型都支持本页面列出的通用字段:能力JSON格式。若要实现特定功能,您需要查阅对应能力类型的专属字段说明。完整的能力类型列表可在此处查看:能力类型列表。
具体教程
重要提示:本示例将指导您创建自定义能力。请确保您已阅读并理解“通过JSON定义起源”部分的内容!
假设我们要创建一个能力,使拥有该能力的起源在攻击亡灵生物时将其点燃。我们称这个能力为Holy Fire。首先,在data/<命名空间>/powers/holy_fire.json路径下创建一个文件。通常建议文件名与能力名称保持一致。请注意,<命名空间>部分需要替换为您数据包的命名空间(本质上是一个标识您数据包的ID)。由于这是教程,我们将使用命名空间"tutorial",因此完整路径为data/tutorial/powers/holy_fire.json。由于该能力位于此路径下,其ID为tutorial:holy_fire,这一点后续会很重要。
通常而言,若您希望实现攻击目标时触发的效果,目标受击动作这类能力类型会是最佳选择。因此,我们应以以下内容作为能力文件的起始部分:
{ "type": "origins:target_action_on_hit", "name": "Holy Fire", "description": "Your divine grace sets the undead ablaze when you hit them."}我们添加了name字段和description字段。这些字段将决定玩家查看该起源时显示的能力名称与描述内容。
现在来实现具体功能。根据目标受击动作页面的说明,必须包含两个字段:cooldown和entity_action。cooldown字段是一个数字,描述该能力在执行后需要重新冷却的时间。由于我们希望每次攻击都触发该能力,将其设置为1,这意味着冷却时间为1/20秒(最小值不能小于1,且您甚至无法在1个tick内攻击两次)。entity_action则更为复杂,它定义了我们对攻击目标实体应该执行的具体操作:
{ "type": "origins:target_action_on_hit", "name": "Holy Fire", "description": "Your divine grace sets the undead ablaze when you hit them.", "cooldown": 1, "entity_action": { }}从上述JSON中可以看到,我们已经开始添加entity_action,用另一对大括号({})表示。这是因为entity_action是一个对象,需要包含type字段,该字段决定了它支持的其他参数。本质上,这与我们定义能力时的做法类似(指定类型然后定义所需参数),只是这次是针对实体动作类型!查看列表后,点燃实体这个动作类型完全符合我们的需求,它只需要一个duration字段来指定实体燃烧的秒数。我们决定设置为4秒:
{ "type": "origins:target_action_on_hit", "name": "Holy Fire", "description": "Your divine grace sets the undead ablaze when you hit them.", "cooldown": 1, "entity_action": { "type": "origins:set_on_fire", "duration": 4 }}现在,所有列出的必填字段都已定义完毕,这个能力应该可以正常运行了!请将之前提到的命名空间ID(根据您能力文件的路径而定,在我们刚才的例子中是tutorial:holy_fire)添加到您起源的能力列表中,您就可以在游戏中看到并测试它了。
实际操作时,您可能会发现这个能力会点燃所有被攻击目标,而不仅限于亡灵生物!这很合理,因为我们的能力文件中并未限定仅对亡灵生物生效。要解决这个问题,我们需要使用目标受击动作页面中列出的可选字段target_condition,该字段允许我们精确指定生效目标。此字段需要填入一个实体条件类型,这意味着它和我们之前定义的entity_action一样是个对象。查阅条件类型列表后,我们发现实体组别条件可以检测目标是否为亡灵生物,这正是我们需要的!该条件通过字符串指定目标生物组别,本例中应填入"undead":
{ "type": "origins:target_action_on_hit", "name": "Holy Fire", "description": "Your divine grace sets the undead ablaze when you hit them.", "cooldown": 1, "entity_action": { "type": "origins:set_on_fire", "duration": 4 }, "target_condition": { "type": "origins:entity_group", "group": "undead" }}添加目标条件后,该能力现已完全符合预期效果:当拥有此能力的玩家攻击亡灵生物时,目标将燃烧4秒!
本部分希望能帮助您理解创建能力的过程,并实现自己的创意构想。建议您浏览各类动作、条件和能力类型的文档页面,以了解可实现的功能范围。掌握现有的功能类型也能极大帮助您将能力概念转化为实际效果。
相关页面
能力类型
能力JSON格式
起源JSON格式
起源层中的起源条件
通常来说,起源层JSON文件中的origins字段会采用如下格式:
"origins": [ "origins:avian", "origins:blazeborn", "origins:enderian", "origins:arachnid"]但0.4.0及以上版本的新特性允许您添加条件性起源。实现方式是将原本的字符串替换为包含实体条件类型的JSON对象:
"origins": [ "origins:avian", "origins:blazeborn", { "condition": { "type": "origins:daytime" }, "origins": [ "origins:enderian" ] }, { "condition": { "type": "origins:daytime", "inverted": true }, "origins": [ "origins:arachnid" ] }]从上述示例可以看出,所谓的"条件性起源对象"可以与常规的起源ID字符串在数组中混合使用。这些对象包含一个起源数组,其中的起源仅在条件满足时才会显示。这意味着如果多个起源需要相同条件,您无需为每个起源重复设置条件。
该功能主要用于以下场景:当数据包提供多个起源层时,可根据先前选择的起源(例如先选择元素类型,再在下一起源层选择匹配的起源)来限制可选起源。为此,专门存在起源条件和能力条件。假设您有一个用于选择元素的起源层elemental_origins:element,示例用法如下:
"origins": [ { "condition": { "type": "origins:origin", "origin": "elemental_origins:fire", "layer": "elemental_origins:element" }, "origins": [ "origins:blazeborn", "elemental_origins:flame_spirit" ] }, { "condition": { "type": "origins:origin", "origin": "elemental_origins:air", "layer": "elemental_origins:element" }, "origins": [ "origins:avian", "aerum:aerum" ] }]相关页面
层级(JSON格式)
实体条件类型
条件性起源JSON格式
后记
开发文档中的“数据包指南”部分已经翻译完毕。
FAQ
Q:文档中出现错误/与原文档描述不相符!
A:自行修改,若您没有编辑经验可在短评区指出问题。
Q:为什么不把其他部分进行翻译?
A:篇幅过大,将会分成多个教程进行翻译并提供链接。