Files
netease-bedrock-wiki/mcguide/20-玩法开发/15-自定义游戏内容/7-自定义状态效果.md
2025-08-25 18:36:29 +08:00

123 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
front:
hard: 入门
time: 分钟
---
# 自定义状态效果
### 概述
该功能不需要开启实验性玩法。
开发者可以在addon的behavior_pack目录下新增netease_effects文件夹 然后配置json文件来添加自定义状态效果。详情可以参考示例[CustomEffectsMod](../13-模组SDK编程/60-Demo示例.md#CustomEffectsMod)
### 自定义状态效果Json
首先在行为包behavior_pack目录下新增netease_effects文件夹并在其中添加自定义状态的Json配置文件文件名不做要求其Json文件格式如下所示
```json
{
"format_version": "1.10",
"minecraft:effect": {
"description": {
"identifier": "custom_effect:weightless"
},
"components": {
"minecraft:particle_color": [255, 255, 255],
"minecraft:icon": "weightless"
}
}
}
```
下面对部分节点进行说明:
- `"minecraft:effect"`:该节点为自定义状态配置表最外层节点
- `"description"`:该节点为自定义状态描述信息
- `"identifier"`该节点为自定义状态的名称分为命名空间及状态名命名空间推荐与mod名称一致identifier必须全局唯一。mod中其他地方都是用这个identifier与这个自定义状态对应上。注identifier必须**全小写**,如果有大写字母,在添加到自定义食物中时会失效
- `"components"`:该节点为自定义状态相关组件
- `"minecraft:particle_color"`该节点为添加状态后玩家身上粒子效果的颜色采用RGB颜色模式数据类型为[int, int, int]每个int型取值范围为0-255
- `"minecraft:icon"`该节点为自定义状态图标名称数据类型为string
接下来在资源包resource_pack/textures/ui下添加自定义状态的图标。以该Json配置文件为例,其`"minecraft:icon"`字段的值为`"weightless"`,因此其图标应该命名为`weightless_effect.png`。注意,此处**图标路径**及**命名**必须严格遵守,否则将不会生效。
最后在本地化文件texts/zh_CN.lang中添加如下设置可以对自定义状态名称进行汉化
```
minecraft:custom_effect=自定义状态
```
### 自定义食物中添加自定义状态
自定义状态可以通过接口详情见ModSDK文档中effect组件添加也可以通过配置自定义食物的Json文件食用该自定义食物的时候获取到对应的自定义状态一个自定义食物的Json文件格式如下
```Json
{
"format_version": "1.10",
"minecraft:item": {
"description": {
"identifier": "itemMod:testFood",
"category":"Nature"
},
"components": {
"minecraft:use_duration": 32,
"minecraft:max_stack_size": 64,
"minecraft:food": {
"nutrition": 100,
"saturation_modifier": "supernatural",
"can_always_eat":true,
"effects": [
{
"name": "custom_effect:weightless",
"chance": 1.0,
"duration": 30,
"amplifier": 4
}
]
}
}
}
}
```
其中只需要在`"effects"`字段下添加对应的状态信息即可,每个字段含义如下:
- `"name"`:状态名称,如果是自定义状态的话,此处与自定义状态的`"identifier"`相对应
- `"chance"`获得该状态的概率取值0-1之间
- `"duration"`:状态效果持续时间,单位秒
- `"amplifier"`状态放大倍数该值加1即为状态效果等级
自定义食物的其他相关定义参见3-9自定义物品文档
### Demo解释
在6-1DemoMod中我们提供了一个自定义状态效果的DemoMod [CustomEffectsMod](../13-模组SDK编程/60-Demo示例.md#CustomEffectsMod)。该mod主要实现了以下功能
- 定义了一个自定义状态——失重:
- custom_effect:weightless
- 自定义了该状态的图标weightless_effect.png及例子效果颜色白色
- 定义了一个自定义食物:
- itemMod:testFood
- 自定义了该食物的图标
- 食用该食物可以获得自定义的失重状态
- 在customEffectServer.py中监听了添加状态和状态移除时的事件
- 如果添加的状态为失重,设置玩家重力为-0.03
- 如果移除的状态为失重,重新设置玩家重力为默认值
除了自定义食物可以添加自定义状态外我们还提供了AddEffectToEntity接口给指定实体添加指定状态以及RemoveEffectFromEntity接口移除指定实体的指定状态详细接口用法可以参考<a href="../../../mcdocs/1-ModAPI/接口/实体/状态效果.html" rel="noopenner"> 状态效果接口 </a>
在实体获得状态以及状态被移除无论是调用RemoveEffectFromEntity接口主动还是持续时间结束被移除均会触发对应的事件开发者需要监听对应事件来为对应的自定义状态添加或移除效果逻辑。详情可参考
- <a href="../../../mcdocs/1-ModAPI/事件/实体.html#addeffectserverevent" rel="noopenner"> 添加状态事件-AddEffectServerEvent </a>
- <a href="../../../mcdocs/1-ModAPI/事件/实体.html#removeeffectserverevent" rel="noopenner"> 删除状态事件-RemoveEffectServerEvent </a>
- <a href="../../../mcdocs/1-ModAPI/事件/实体.html#refresheffectserverevent" rel="noopenner"> 更新状态事件-RefreshEffectServerEvent </a>
注:自定义状态无法通过/effect指令获取