自定义基础物品
开发者可以通过在 addon 中配置 JSON 来添加自定义物品。自定义物品支持 ModAPI 中与物品相关的所有事件及接口。本文将介绍自定义物品的完整注册流程、行为包与资源包的配置方式,以及各组件的详细用法。
前置条件
本功能基于 format_version: 1.10,不需要开启实验性玩法。在开始之前,请确保你已经阅读了 自定义游戏内容概述,并准备好行为包与资源包的基础目录结构。
概述
自定义物品是我的世界中国版 addon 系统中最基础的自定义内容之一。你可以通过编写 JSON 定义文件,向游戏中注册全新的物品,包括食物、材料、工具原料等。
自定义物品的核心思路是 数据驱动:你在 JSON 中通过 components(组件)声明物品的属性和行为,引擎会在运行时读取并应用这些配置。同时,自定义物品也完全兼容 Python Mod SDK 的事件与接口,可以实现更复杂的逻辑。
自定义物品支持以下能力:
- 自定义贴图、名称、堆叠数、耐久度
- 设置为食物、种子、燃料等功能性物品
- 作为自定义配方的材料或产出
- 在掉落表(loot_table)和村民交易中使用
- 通过
custom_item_type扩展为武器、盔甲、生物蛋等特殊类型
组件事件流程
当玩家与自定义物品交互时(如右键使用、攻击等),引擎会按照固定顺序触发一系列事件。下面是简化的事件流程:
玩家右键使用物品
│
├─ ClientItemTryUseEvent(客户端尝试使用)
│
├─ ServerItemTryUseEvent(服务端尝试使用)
│
├─ ActorUseItemClientEvent(客户端使用)
│
├─ ActorUseItemServerEvent(服务端使用)
│
└─ 使用完成 / 被打断事件顺序说明
ActorUseItemClientEvent(ActorUseItemServerEvent)与 ClientItemTryUseEvent(ServerItemTryUseEvent)的先后顺序与使用的物品类型有关。食物类物品的 TryUse 会在 UseItem 之前触发,而其他类型的物品可能顺序相反。建议在脚本中通过实际测试确认你所关心的事件顺序。
注册流程
注册一个自定义物品需要 6 个步骤,涉及行为包和资源包两侧的配置:
| 步骤 | 操作 | 所在目录 |
|---|---|---|
| 1 | 在行为包中创建 netease_items_beh/ 目录,编写物品定义 JSON | 行为包 |
| 2 | 将物品贴图放入 textures/items/ | 资源包 |
| 3 | 在 textures/item_texture.json 中配置资源名与贴图的映射 | 资源包 |
| 4 | 在资源包中创建 netease_items_res/ 目录,编写物品表现 JSON | 资源包 |
| 5 | 在 texts/zh_CN.lang 中配置物品的中文名称 | 资源包 |
| 6 | 进入游戏测试,通过创造模式或 /give 指令获取物品 | — |
下面按照这个流程,逐步详细说明每一步的配置内容。
行为包配置(netease_items_beh)
在行为包根目录下新建 netease_items_beh/ 文件夹,然后在其中创建物品定义 JSON 文件。文件名可以自由命名(建议与物品名一致),但扩展名必须是 .json。
JSON 中至少有一个 component
行为包中的物品 JSON 必须包含至少一个组件,否则引擎会报错。如果你的物品不需要任何特殊属性,可以只写一个 minecraft:max_stack_size。
下面是一个最小化的物品定义:
{
"format_version": "1.10",
"minecraft:item": {
"description": {
"identifier": "mymod:basic_gem",
"category": "items"
},
"components": {
"minecraft:max_stack_size": 64
}
}
}description 字段
description 是物品的元数据描述,包含标识符、分类等信息。
| 键 | 类型 | 默认值 | 说明 |
|---|---|---|---|
identifier | str | — | 物品的唯一标识符,格式为 命名空间:物品名。由小写字母和下划线组成,禁止使用大写字母。命名空间建议与 mod 名称一致,identifier 必须全局唯一 |
category | str | items | 注册分类,决定物品在创造模式物品栏的位置。可选值见下方说明 |
custom_item_type | str | — | 自定义物品类别,用于扩展特殊功能。不填则为普通物品 |
category 可选值:
| 值 | 说明 |
|---|---|
construction | 注册到"建筑"分页 |
equipment | 注册到"装备"分页 |
items | 注册到"物品"分页(默认) |
nature | 注册到"自然"分页 |
commands | 只能通过指令和 API 获取,不在创造物品栏显示 |
none | 只能通过 API 获取,指令也无法获取 |
| 自定义分页名称 | 注册到自定义物品分页中 |
custom_item_type 可选值:
| 值 | 说明 | 详细文档 |
|---|---|---|
weapon | 武器/工具,需搭配 netease:weapon 组件 | 自定义武器与工具 |
armor | 盔甲,需搭配 netease:armor 组件 | 自定义盔甲 |
egg | 生物蛋,需搭配 netease:egg 组件 | 其他特殊物品 |
ranged_weapon | 远程武器/蓄力物品 | 自定义远程武器 |
bucket | 桶,需搭配 netease:bucket 组件 | 其他特殊物品 |
projectile_item | 抛射物物品,需搭配 netease:projectile 组件 | 其他特殊物品 |
shield | 盾牌,需搭配 netease:shield 组件 | 其他特殊物品 |
identifier 命名规范
- 必须使用
命名空间:物品名的格式,如mymod:ruby - 只能包含小写字母(a-z)、数字(0-9)和下划线(_)
- 命名空间不要使用
minecraft,避免与原版冲突 - identifier 必须在整个游戏中全局唯一(不同 mod 之间也不能重复)
原版组件(minecraft: components)
原版组件是以 minecraft: 为前缀的组件,定义物品的基础属性。以下是中国版支持的原版物品组件。
minecraft:max_stack_size
设置物品的最大堆叠数量。该值不能超过 64。
"minecraft:max_stack_size": 16minecraft:max_damage
设置物品的耐久度上限,范围为 [0, 32767]。设置后物品会显示耐久条。
"minecraft:max_damage": 1561堆叠与耐久的关系
若物品的堆叠数量大于 1,耐久度变化对整一叠物品生效。耐久度为 0 后,每次消耗耐久的行为会使数量减 1。
minecraft:hand_equipped
设为 true 时,物品会以竖直方式握在手中(类似武器的持握方式),而非平放。
"minecraft:hand_equipped": trueminecraft:foil
设为 true 时,物品会显示附魔光效(类似附魔物品的紫色闪烁)。
"minecraft:foil": trueminecraft:use_duration
设置物品的最大使用时长(单位:tick,20 tick = 1 秒)。用于食物的食用时长、蓄力物品的最大蓄力时间等。该值也决定 MoLang 变量 query.item_remaining_use_duration 和 variable.item_use_normalized 的值。
"minecraft:use_duration": 32minecraft:food
将物品设为食物。详见下方完整示例部分。
| 字段 | 类型 | 说明 |
|---|---|---|
nutrition | int | 营养值(恢复的饥饿值) |
saturation_modifier | str | 饱和度等级:poor(0.1)、low(0.3)、normal(0.6)、good(0.8)、max(1.0)、supernatural(1.2) |
can_always_eat | bool | 是否可以在饥饿值满时食用 |
using_converts_to | str | 食用后转化为的物品(如 bowl) |
cooldown_type | str | 冷却类型,同类型食物共享冷却 |
cooldown_time | int | 冷却时间(秒) |
effects | array | 食用后附加的状态效果列表 |
"minecraft:food": {
"nutrition": 4,
"saturation_modifier": "low",
"can_always_eat": false,
"effects": [
{
"name": "regeneration",
"chance": 1.0,
"duration": 30,
"amplifier": 1
}
]
}饱和度计算公式
食物恢复的饱和度 = 营养值 x 饱和度系数 x 2。饱和度最大不超过当前饥饿值。饱和度是隐藏数值,玩家的行动会先消耗饱和度,耗尽后才开始消耗饥饿值。
minecraft:seed
设置物品的农作物属性,使其可以种植在特定方块上。
| 字段 | 类型 | 说明 |
|---|---|---|
crop_result | str | 种植后放置出的方块 |
plant_at | array(str) | 可被种植的方块列表 |
"minecraft:seed": {
"crop_result": "sweet_berry_bush",
"plant_at": ["grass", "dirt", "podzol"]
}plant_at 格式一致性
plant_at 列表中的方块名称需要保持格式一致,例如统一使用 ["minecraft:grass", "minecraft:dirt"] 或统一使用 ["grass", "dirt"],不要混用。否则在相邻自定义农作物旁种植新的农作物时,可能导致上一个农作物被破坏。
minecraft:stacked_by_data
设置不同 aux 值(数据值)的物品是否能堆叠在一起。设为 true 时,不同 aux 值的物品无法堆叠,且在合成配方中会被识别为不同的原料。
"minecraft:stacked_by_data": true与耐久度组件互斥
minecraft:stacked_by_data 无法与 minecraft:max_damage(耐久度)组件共存。
minecraft:tags
为物品设置标签,用于游戏的逻辑判断(如配方匹配等)。
"minecraft:tags": {
"tags": ["minecraft:is_food", "minecraft:transform_templates"]
}minecraft:use_animation
资源包组件
此组件需要写在资源包 netease_items_res/ 的物品 JSON 中,而非行为包。
定义右键或长按使用物品时播放的动画及声音。可选值:eat、drink、bow、block、camera、crossbow、brush。
"minecraft:use_animation": "eat"minecraft:icon
资源包组件
此组件需要写在资源包 netease_items_res/ 的物品 JSON 中。
设置物品的贴图,值为 item_texture.json 中定义的资源名。
"minecraft:icon": "mymod_magic_food"minecraft:hover_text_color
资源包组件
此组件需要写在资源包 netease_items_res/ 的物品 JSON 中。
设置物品名称的悬浮文本颜色,值为颜色名称(如 gold、red、aqua 等)。
"minecraft:hover_text_color": "gold"网易组件(netease: components)
网易组件是以 netease: 为前缀的中国版特有组件,提供了额外的功能扩展。
netease:allow_offhand
设置物品是否可以放在副手。
"netease:allow_offhand": {
"value": true
}副手限制
基岩版原版副手功能较弱,大多数时候无法直接使用副手物品,主要用于装饰和在脚本中判断副手是否持有某物品。副手不支持 minecraft:foil 和 netease:render_offsets 等组件。
netease:cooldown
定义物品的冷却时间。同 category 的物品共享冷却。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
category | str | "item" | 冷却类型,同种类型冷却会互相影响 |
duration | int | 0 | 再次使用前的冷却时间(tick) |
"netease:cooldown": {
"category": "item",
"duration": 10
}食物冷却
自定义食品(minecraft:food)的冷却时间应定义在 minecraft:food 的 cooldown_type 和 cooldown_time 中,而不是 netease:cooldown。
netease:customtips
定义物品的描述信息,显示在物品名称下方。
"netease:customtips": {
"value": "§8右键可发射"
}netease:enchant_material
设置物品是否可以作为附魔台的附魔材料。
"netease:enchant_material": {
"value": true
}netease:fire_resistant
设置物品是否防火。防火的物品与下界合金物品行为一致:不会被火焰烧毁,掉进岩浆时会弹走。
"netease:fire_resistant": {
"value": true
}netease:fuel
设置物品的燃料属性,允许其在熔炉中作为燃料燃烧。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
duration | float | 0.0 | 可提供的熔炉燃烧时长(秒) |
"netease:fuel": {
"duration": 3.0
}netease:compostable
设置物品是否可以堆肥(在堆肥桶中使用),值为堆肥成功概率(百分比)。
"netease:compostable": 48netease:show_in_hand
设置物品拿在手上时是否显示。
"netease:show_in_hand": {
"value": false
}netease:render_offsets
设置右手物品的渲染偏移(位置、旋转、缩放)。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
controller_position_adjust | array | [0.0, 0.0, 0.0] | 物品位置偏移 [x, y, z] |
controller_rotation_adjust | array | [0.0, 0.0, 0.0] | 物品旋转偏移 [x, y, z] |
controller_scale | float | 1.0 | 物品缩放大小 |
"netease:render_offsets": {
"controller_position_adjust": [0.0, 0.1, 0.0],
"controller_rotation_adjust": [0.0, -45.0, 0.0],
"controller_scale": 1.0
}netease:initial_user_data
定义物品的初始 userData,用于创建自带数据的物品(如初始附魔、死亡不掉落等)。
| 字段 | 类型 | 说明 |
|---|---|---|
display | object | 显示信息,包含 Name(str)、Lore(array)、ShowInHand(bool) |
ench | array(object) | 附魔信息,每个 object 包含 id(short) 和 lvl(short) |
minecraft:keep_on_death | bool | 死亡时是否保留 |
minecraft:item_lock | byte | 锁定模式。0:不锁定,1:无法移动,2:无法丢弃 |
"netease:initial_user_data": {
"display": {
"Name": "宝石剑",
"Lore": ["第一行描述", "第二行描述"]
},
"ench": [
{
"id": {
"__type__": 2,
"__value__": 12
},
"lvl": {
"__type__": 2,
"__value__": 10
}
}
],
"minecraft:keep_on_death": true
}type 说明
byte 和 short 类型的值需要使用 __type__ 指定类型:byte 的 __type__ 为 1,short 为 2。
特殊类型专属组件
以下组件需要搭配对应的 custom_item_type 使用,详见各专题页面:
| 组件 | 所需 custom_item_type | 说明 |
|---|---|---|
netease:weapon | weapon | 武器/工具属性(类型、攻击、挖掘等级) |
netease:armor | armor | 盔甲属性(防御值、韧性、槽位) |
netease:egg | egg | 生物蛋(指定生成的生物 identifier) |
netease:bucket | bucket | 桶(指定倒出的流体方块) |
netease:shield | shield | 盾牌(防御伤害类型列表) |
netease:projectile | projectile_item | 抛射物(右键发射的实体 identifier) |
资源包配置(netease_items_res 与 item_texture.json)
资源包侧需要配置两部分内容:贴图映射和物品表现 JSON。
第一步:放置贴图文件
将物品的贴图文件(PNG 格式)放入资源包的 textures/items/ 目录中。
resource_pack/
└── textures/
└── items/
└── magic_food.png ← 你的物品贴图贴图尺寸建议
推荐使用 16x16 像素的贴图(与原版物品一致)。也支持 32x32 或更大的尺寸,但过大的贴图会增加资源包体积,不建议超过 64x64。
第二步:配置 item_texture.json
在资源包的 textures/ 目录下创建或编辑 item_texture.json,建立资源名与贴图路径的映射关系。资源名必须全局唯一。
{
"resource_pack_name": "my_mod",
"texture_data": {
"mymod_magic_food": {
"textures": "textures/items/magic_food"
}
}
}路径不需要扩展名
textures 字段中的贴图路径不需要写 .png 后缀,引擎会自动查找对应的图片文件。
第三步:配置物品表现 JSON
在资源包根目录下新建 netease_items_res/ 文件夹,在其中创建与行为包对应的物品 JSON 文件。这个 JSON 定义物品的客户端表现属性(贴图、动画等)。
category 一致性
资源包 JSON 中的 category 字段需要与行为包中的设置一致或者不填,否则可能出现错误。
{
"format_version": "1.10",
"minecraft:item": {
"description": {
"identifier": "mymod:magic_food",
"category": "items"
},
"components": {
"minecraft:icon": "mymod_magic_food",
"minecraft:use_animation": "eat"
}
}
}关键点:
identifier必须与行为包中的一致minecraft:icon的值对应item_texture.json中的资源名minecraft:use_animation、minecraft:hover_text_color等资源包组件在这里配置
本地化(zh_CN.lang)
在资源包的 texts/zh_CN.lang 文件中配置物品的中文名称。键的格式为:
item.命名空间:物品名.name=显示名称例如:
item.mymod:magic_food.name=魔法食物
item.mymod:basic_gem.name=基础宝石多语言支持
如需支持英文,在 texts/en_US.lang 中添加对应的英文名称即可。格式相同。
常见组件速查表
下表汇总了基础物品中常用的组件及其简要说明,方便快速查阅:
行为包组件(写在 netease_items_beh)
| 组件 | 类型 | 说明 |
|---|---|---|
minecraft:max_stack_size | int | 最大堆叠数量,上限 64 |
minecraft:max_damage | int | 耐久度上限,范围 0~32767 |
minecraft:hand_equipped | bool | 是否竖直握持(武器持握方式) |
minecraft:foil | bool | 是否显示附魔光效 |
minecraft:use_duration | int | 最大使用时长(tick) |
minecraft:food | object | 食物组件(营养值、饱和度等) |
minecraft:seed | object | 农作物种植组件 |
minecraft:stacked_by_data | bool | 不同 aux 值是否分别堆叠 |
minecraft:tags | object | 物品标签 |
netease:allow_offhand | object | 是否可放入副手 |
netease:cooldown | object | 使用冷却时间 |
netease:customtips | object | 物品描述文本 |
netease:enchant_material | object | 是否可作为附魔材料 |
netease:fire_resistant | object | 是否防火(类似下界合金) |
netease:fuel | object | 燃料属性(熔炉燃烧时长) |
netease:compostable | int | 堆肥成功概率(百分比) |
netease:show_in_hand | object | 手持时是否显示 |
netease:render_offsets | object | 右手渲染偏移(位置/旋转/缩放) |
netease:initial_user_data | object | 初始 userData(附魔、锁定等) |
资源包组件(写在 netease_items_res)
| 组件 | 类型 | 说明 |
|---|---|---|
minecraft:icon | str | 物品贴图资源名 |
minecraft:use_animation | str | 使用动画(eat/drink/bow 等) |
minecraft:hover_text_color | str | 悬浮文本颜色 |
netease:frame_anim_in_scene | object | 手持/掉落贴图序列帧动画 |
netease:frame_animation | object | 蓄力物品序列帧动画 |
附属功能
自定义配方
自定义物品的 identifier 可以用在自定义配方中,作为合成材料或合成产出。
村民交易
可以将行为包中交易配置文件的 item 字段替换为自定义物品的 identifier,让村民出售你的自定义物品。
掉落表(loot_table)
自定义物品的 identifier 可用于 loot_table 配置掉落物,例如让僵尸掉落你的自定义物品。
Python 事件与接口
自定义物品支持 Mod SDK 中所有与物品相关的事件及接口,包括但不限于:
ServerItemUseOnEvent— 物品对方块使用ActorUseItemServerEvent— 实体使用物品OnItemPutInEvent/OnItemTakeOutEvent— 容器物品变化SpawnItemToPlayerInv— 生成物品到玩家背包
卸载行为
若使用了自定义物品的存档卸载了 mod 后再进入游戏:
玩家背包中的自定义物品:物品会消失。若重新加载 mod,卸载期间登录过的玩家物品不会恢复;没有登录过的玩家物品可以保留。
地图上容器内的自定义物品:物品会消失。若重新加载 mod,卸载期间被探索过的区域内的容器物品不会恢复;未探索区域的容器物品可以保留。
地图上未捡起的掉落物:掉落物会消失。若重新加载 mod,卸载期间被探索过的区域掉落物不会恢复(除非 subchunk 内没有其他任何实体);未探索区域的掉落物可以保留。
数据安全
在发布 mod 更新时,请谨慎处理物品 identifier 的变更。修改 identifier 等同于删除旧物品并添加新物品,玩家已有的旧物品将会丢失。
完整示例
下面展示一个完整的自定义食物——"魔法苹果",包括行为包和资源包的所有文件。
文件结构
behavior_pack/
└── netease_items_beh/
└── magic_food.json
resource_pack/
├── textures/
│ ├── items/
│ │ └── magic_food.png
│ └── item_texture.json
├── netease_items_res/
│ └── magic_food.json
└── texts/
└── zh_CN.lang行为包:netease_items_beh/magic_food.json
{
"format_version": "1.10",
"minecraft:item": {
"description": {
"identifier": "mymod:magic_food",
"category": "items"
},
"components": {
"minecraft:max_stack_size": 16,
"minecraft:tags": {
"tags": ["minecraft:is_food"]
},
"minecraft:use_duration": 32,
"minecraft:food": {
"nutrition": 6,
"saturation_modifier": "good",
"can_always_eat": false,
"effects": [
{
"name": "regeneration",
"chance": 1.0,
"duration": 10,
"amplifier": 1
},
{
"name": "absorption",
"chance": 1.0,
"duration": 60,
"amplifier": 0
}
]
},
"netease:fire_resistant": {
"value": true
},
"netease:customtips": {
"value": "§a食用后获得生命恢复和伤害吸收"
}
}
}
}资源包:textures/item_texture.json
{
"resource_pack_name": "my_mod",
"texture_data": {
"mymod_magic_food": {
"textures": "textures/items/magic_food"
}
}
}资源包:netease_items_res/magic_food.json
{
"format_version": "1.10",
"minecraft:item": {
"description": {
"identifier": "mymod:magic_food",
"category": "items"
},
"components": {
"minecraft:icon": "mymod_magic_food",
"minecraft:use_animation": "eat"
}
}
}资源包:texts/zh_CN.lang
item.mymod:magic_food.name=魔法苹果测试方法
进入游戏后,使用以下指令获取物品:
/give @s mymod:magic_food 16你应该能看到一个最大堆叠 16、带有描述文本、食用后恢复生命的自定义食物。
常见问题
JSON: xxx has an error
这是最常见的错误,通常是 JSON 格式有问题。请检查:
- 是否漏写或多写了逗号
- 括号
{}和[]是否正确配对 - 字符串是否都用双引号
""包裹 - 文件编码是否为 UTF-8
排查建议
推荐使用 VS Code 等带有 JSON 校验功能的编辑器。打开 JSON 文件后,编辑器会自动高亮语法错误。
物品贴图显示为紫黑方格
- 检查
item_texture.json中的资源名是否与netease_items_res中minecraft:icon的值一致 - 检查贴图文件路径是否正确(路径不需要
.png后缀) - 确认贴图文件确实存在于
textures/items/目录中
物品名称显示为 identifier
- 检查
zh_CN.lang中的键是否正确,格式为item.命名空间:物品名.name=显示名称 - 确认
zh_CN.lang文件位于资源包的texts/目录中 - 确认文件编码为 UTF-8
物品不出现在创造模式物品栏
- 检查
category是否设为commands或none,这两个值不会在物品栏中显示 - 确认行为包和资源包都已正确加载
- 尝试使用
/give指令直接获取测试
identifier 包含大写字母导致异常
identifier 必须全部使用小写字母和下划线,不支持大写字母。如果使用了大写字母,可能导致物品无法正常注册或在部分功能中匹配失败。
行为包和资源包的 identifier 不一致
两侧的 description.identifier 必须完全一致。如果不一致,物品的贴图、动画等表现效果将无法正确关联。
