创建自定义起源
本指南将带你为数据包创建一个全新的起源。
前置条件
你应当已经有一个可用的数据包。如果你刚接触数据包,请先阅读 Minecraft Wiki 教程。
第 1 步:定义起源文件
在 data/<namespace>/origins/origin/<id>.json 创建 JSON 文件。本教程使用 example:supermorph,因此文件位于:
data/example/origins/origin/supermorph.json
下面是一个复用原版能力的最小起源:
{
"powers": [
"#example:supermorph"
],
"icon": {
"id": "minecraft:slime_ball"
},
"order": 4,
"impact": 1
}
{
"replace": false,
"values": [
"origins:fire_immunity",
"origins:elytra",
"origins:throw_ender_pearl",
"origins:fresh_air"
]
}
powers 列表可以同时包含能力 ID 和标签。此例中,我们定义标签 example:supermorph,其中包含若干已有能力,从而创建一个能飞行、免疫火焰的起源。
推荐使用标签,以获得更好的兼容性和可扩展性。
如果你在起源文件中直接列出能力,其他数据包就无法在不替换整个文件的前提下为你的起源添加或移除能力。使用标签时,它们只需在标签中添加或移除能力,而无需替换你的起源文件。
起源 JSON 字段参考
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
name | 文本组件 | 可选 | 起源的显示名称。更推荐使用翻译键 origin.<namespace>.<path>.name |
description | 文本组件 | 可选 | 起源提示框中显示的描述。更推荐使用翻译键 origin.<namespace>.<path>.description |
powers | 引用或标签列表 | [] | 此起源授予的能力 ID 或标签。使用 "origins:xxx" 或 "#origins:tag_name" |
icon | 物品堆叠 | 可选 | 在选择界面中作为起源图标显示的物品 |
unchoosable | 布尔值 | false | 若为 true,此起源不会出现在选择界面中,但仍可通过命令或升级分配 |
order | 整数 | Integer.MAX_VALUE | 选择界面中的排序顺序;数值越小越靠前 |
impact | 整数 | 0 | 影响等级:0 = NONE,1 = LOW,2 = MEDIUM,3 = HIGH |
upgrades | Upgrade 对象列表 | [] | 起源升级配置列表 |
第 2 步:添加翻译
名称和描述定义在语言文件中。创建一个资源包(或在数据包支持的情况下把它们放进其 assets/ 目录):
// assets/origins/lang/en_us.json
{
"origin.origins.supermorph.name": "Supermorph",
"origin.origins.supermorph.description": "A flying, fire-immune creature that needs fresh air."
}
格式为 origin.<namespace>.<path>.name / .description。
如果你更愿意在起源文件本身设置名称,可以使用可选的 name 和 description 字段(作为文本组件),但推荐使用翻译键。
始终推荐使用默认翻译键。但语言文件总是放在资源包中,这意味着你必须同时提供一个使用相同命名空间的资源包。
默认情况下模组自带内置资源包和数据包,因此对模组来说使用翻译键没有问题。对于纯数据包,是否创建用于翻译的资源包由你决定。
如果你不想创建资源包,可以使用 name 和 description 字段直接指定文本,但这样它们就无法被本地化。
第 3 步:将起源添加到起源层
起源只有被列入起源层后才会在游戏内出现。默认起源层是 origins:origin。要将你的起源添加到该层,请创建:
{
"replace": false,
"values": [
"example:supermorph"
]
}
要创建一个让玩家选择第二个起源的独立起源层:
{
"order": 1,
"origins": [
"example:supermorph",
"origins:human"
],
"gui_title": {
"choose_origin": "Choose your Second Origin"
}
}
Fabric 版本中的旧 replace 字段已不存在。要覆盖已有起源层,只需在数据包中创建相同 ID 的文件:它会自动替换原有文件。
如果你不想替换整个文件,只需使用标签。这正是我们使用标签、而不是在起源层文件中直接列出所有起源的原因:它允许其他数据包添加自己的起源,而无需替换整个文件。
第 4 步:测试
将数据包加载到世界中并检查起源选择界面。如果起源没有出现:
- 运行
/datapack list确认数据包已加载。 - 检查游戏日志中的 JSON 解析错误。
- 确认你的起源文件位于
origins/origin/,而不是origins/。
修改后你不能使用 /reload 重新加载数据包,因为 Origins (NeoForge) 使用原版数据加载机制,而该机制不支持对数据文件热重载。你必须退出世界并重新进入才能看到改动。
如果你需要频繁重载来测试某些功能,并且懂一些 JavaScript,可以使用 起源JS 以 JavaScript 而非 JSON 定义起源。这样你就可以通过 /reload 重载数据包并立即看到改动。