完整版BedrockWiki镜像!
This commit is contained in:
170
docs/wiki/entities/boat-entities.md
Normal file
170
docs/wiki/entities/boat-entities.md
Normal file
@@ -0,0 +1,170 @@
|
||||
---
|
||||
title: 创建船只
|
||||
category: 巧思案例
|
||||
tags:
|
||||
- 配方
|
||||
- 进阶
|
||||
mentions:
|
||||
- SirLich
|
||||
- Joelant05
|
||||
- MedicalJewel105
|
||||
- StealthyExpertX
|
||||
- TheItsNameless
|
||||
---
|
||||
|
||||
# 创建船只
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
:::warning 需要格式版本1.16.100或更低
|
||||
|
||||
当前行为格式版本要求1.16.100或更低版本才能使`minecraft:behavior.rise_to_liquid_level`和`minecraft:buoyant`功能生效。
|
||||
如果您发现新格式版本中的替代实现方法,欢迎协助更新本Wiki内容。
|
||||
:::
|
||||
|
||||
## 使用运行时标识符
|
||||
|
||||
详细内容请参阅[运行时标识符指南](/wiki/entities/runtime-identifier)。使用运行时标识符可以实现船只的大部分硬编码行为,但会导致船只无法随玩家转向且始终面向北方。
|
||||
|
||||
## 利用组件系统实现
|
||||
|
||||
目前最佳的船只创建方案是通过组件系统实现。1.16版本新增的两个组件可资利用:`minecraft:behavior.rise_to_liquid_level`与`minecraft:buoyant`。官方设计中前者用于岩浆怪的岩浆漂浮特性,我们可以将其移植到水面上使用。
|
||||
|
||||
## 第一种方法:minecraft:behavior.rise_to_liquid_level
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/bar]
|
||||
{
|
||||
"minecraft:entity": {
|
||||
"format_version": "1.14.0",
|
||||
"description": {
|
||||
"identifier": "foo:bar",
|
||||
"is_summonable": true,
|
||||
"is_spawnable": true,
|
||||
"is_experimental": false
|
||||
},
|
||||
"components": {
|
||||
// 这是实现效果的核心组件
|
||||
"minecraft:behavior.rise_to_liquid_level": {
|
||||
"priority": 0,
|
||||
// 控制船体相对于水面的基准高度
|
||||
"liquid_y_offset": 0.5,
|
||||
// 正垂直位移量,决定船体抬升幅度
|
||||
"rise_delta": 0.05,
|
||||
// 负垂直位移量,决定船体下沉幅度
|
||||
"sink_delta": 0.05
|
||||
// 通过升降参数可模拟波浪浮动效果
|
||||
},
|
||||
|
||||
// 设置水上移动速率
|
||||
"minecraft:underwater_movement": {
|
||||
"value": 5
|
||||
},
|
||||
// 关键组件,移除会导致船体沉没
|
||||
"minecraft:navigation.walk": {
|
||||
"can_sink": false
|
||||
},
|
||||
"minecraft:rideable": {
|
||||
"seat_count": 1,
|
||||
"family_types": ["player"],
|
||||
"interact_text": "action.interact.enter_boat",
|
||||
"seats": {
|
||||
"position": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
// 添加此组件实现WASD方向控制
|
||||
"minecraft:input_ground_controlled": {},
|
||||
"minecraft:health": {
|
||||
"value": 10,
|
||||
"max": 10
|
||||
},
|
||||
// 设置地面移动速度(设置为0可禁用地表移动)
|
||||
"minecraft:movement": {
|
||||
"value": 3
|
||||
},
|
||||
// 防止玩家下船后无法停止移动
|
||||
"minecraft:movement.basic": {},
|
||||
"minecraft:collision_box": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
},
|
||||
"minecraft:physics": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
## 第二种方法:minecraft:buoyant
|
||||
|
||||
::: code-group
|
||||
```json []
|
||||
{
|
||||
"minecraft:entity": {
|
||||
"format_version": "1.14.0",
|
||||
"description": {
|
||||
"identifier": "foo:bar",
|
||||
"is_summonable": true,
|
||||
"is_spawnable": true,
|
||||
"is_experimental": false
|
||||
},
|
||||
"components": {
|
||||
"minecraft:buoyant": {
|
||||
// 是否受重力影响(处理瀑布场景很有用)
|
||||
"apply_gravity": true,
|
||||
// 范围0-1,控制船体默认高度
|
||||
"base_buoyancy": 1.0,
|
||||
// 「浪涌」模拟船体上下波动效果(false也不会完全消除效果)
|
||||
"simulate_waves": true,
|
||||
// 产生「大浪」的概率
|
||||
"big_wave_probability": 0.03,
|
||||
// 「大浪」强度系数
|
||||
"big_wave_speed": 10.0,
|
||||
// 移除浮力后的下沉阻力
|
||||
"drag_down_on_buoyancy_removed": 0,
|
||||
// 支持浮力的液态方块(仅限水和岩浆)
|
||||
"liquid_blocks": ["water"]
|
||||
},
|
||||
|
||||
// 设置水上移动速率
|
||||
"minecraft:underwater_movement": {
|
||||
"value": 5
|
||||
},
|
||||
// 关键组件,移除会导致船体沉没
|
||||
"minecraft:navigation.walk": {
|
||||
"can_sink": false
|
||||
},
|
||||
"minecraft:rideable": {
|
||||
"seat_count": 1,
|
||||
"family_types": ["player"],
|
||||
"interact_text": "action.interact.enter_boat",
|
||||
"seats": {
|
||||
"position": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
// 添加此组件实现WASD方向控制
|
||||
"minecraft:input_ground_controlled": {},
|
||||
"minecraft:health": {
|
||||
"value": 10,
|
||||
"max": 10
|
||||
},
|
||||
// 设置地面移动速度(设置为0可禁用地表移动)
|
||||
"minecraft:movement": {
|
||||
"value": 3
|
||||
},
|
||||
// 防止玩家下船后无法停止移动
|
||||
"minecraft:movement.basic": {},
|
||||
"minecraft:collision_box": {
|
||||
"width": 1,
|
||||
"height": 1
|
||||
},
|
||||
"minecraft:physics": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
## 方法选择建议
|
||||
|
||||
两种方式各有优劣。若需禁用波动效果建议采用第一种方式;若需要进行精细调控可选择第二种方法。开发实践中,第二种常用于浮标等静态物体,第一种则更适合船只等运动实体,能更好地还原原版特性。
|
||||
200
docs/wiki/entities/detecting-other-entities.md
Normal file
200
docs/wiki/entities/detecting-other-entities.md
Normal file
@@ -0,0 +1,200 @@
|
||||
---
|
||||
title: 侦测其他实体
|
||||
category: 巧思案例
|
||||
tags:
|
||||
- 中级
|
||||
mentions:
|
||||
- ANightDazingZoroark
|
||||
- SmokeyStack
|
||||
- MedicalJewel105
|
||||
- SirLich
|
||||
- Luthorius
|
||||
- TheItsNameless
|
||||
---
|
||||
|
||||
# 侦测其他实体
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
当需要让实体在附近存在其他实体时触发事件,本文将详细介绍多种已知实现方式。
|
||||
|
||||
## minecraft:entity_sensor
|
||||
|
||||
这是最基础的侦测方式。主要限制是只能接收单一条目,且检测实体退出范围较困难。作为实体组件,可直接植入实体行为文件并配置Minecraft过滤器:
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/my_entity.json#components]
|
||||
"minecraft:entity_sensor": {
|
||||
"sensor_range": 2.5, //检测半径(格子数)
|
||||
"relative_range": false, //若为true,检测范围会叠加实体碰撞箱
|
||||
"require_all": true, //若为true,所有邻近实体需通过过滤条件才会触发事件
|
||||
"minimum_count": 1, //触发事件的最小实体数量(默认1)
|
||||
"maximum_count": 4, //触发事件的最大实体数量(默认-1表示无限)
|
||||
"event_filters": { //自定义过滤器(本例检测玩家)
|
||||
"test": "is_family",
|
||||
"subject": "other",
|
||||
"value": "player"
|
||||
},
|
||||
"event": "event:on_player_detected" //条件满足时触发的事件
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
## `/execute` 命令
|
||||
|
||||
使用1.19.50版本新增的`/execute`命令,可在附近存在实体时执行指令。以下示例使猪在检测到玩家时发出"oink oink"声(可自定义事件):
|
||||
|
||||
::: code-group
|
||||
```json [BP/animations/detection_animation.json]
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"animations": {
|
||||
"animation.pig.find_player": {
|
||||
"animation_length": 0.05,
|
||||
"loop": true,
|
||||
"timeline": {
|
||||
"0": [
|
||||
"/execute as @s if entity @e[type=player, r=4] run event entity @s wiki:player_detected"
|
||||
]
|
||||
}
|
||||
},
|
||||
"animation.pig.find_no_player": {
|
||||
"animation_length": 0.05,
|
||||
"loop": true,
|
||||
"timeline": {
|
||||
"0": [
|
||||
"/execute as @s unless entity @e[type=player, r=4] run event entity @s wiki:no_player_detected"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
首个动画用于检测实体存在,第二个检测实体离开。可通过`/event`命令添加[虚拟组件](/wiki/entities/dummy-components)或更新[实体属性](https://learn.microsoft.com/zh-cn/minecraft/creator/documents/introductiontoentityproperties)。
|
||||
|
||||
::: code-group
|
||||
```json [BP/animation_controllers/pig_animation_controllers.json]
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"animation_controllers": {
|
||||
"controller.animation.pig_find_player": {
|
||||
"initial_state": "default",
|
||||
"states": {
|
||||
"default": {
|
||||
"animations": ["find_player"],
|
||||
"transitions": [{
|
||||
"detected": "q.is_sheared"
|
||||
}]
|
||||
},
|
||||
"detected": {
|
||||
"animations": ["find_no_player"],
|
||||
"transitions": [{
|
||||
"default": "!q.is_sheared"
|
||||
}],
|
||||
"on_entry": ["/say oink oink"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/my_entity.json#description]
|
||||
"animations": {
|
||||
"manage_find_player": "controller.animation.pig_find_player",
|
||||
"find_player": "animation.pig.find_player",
|
||||
"find_no_player": "animation.pig.find_no_player"
|
||||
},
|
||||
"scripts": {
|
||||
"animate": ["manage_find_player"]
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
## Molang、动画与动画控制器
|
||||
|
||||
使用`for_each`函数配合`q.get_nearby_entities`或`q.get_nearby_entities_except_self`可更高效检测实体(实验性功能),能更好处理实体离开的情况。
|
||||
|
||||
::: code-group
|
||||
```json [BP/animations/detection_animation.json]
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"animations": {
|
||||
"animation.pig.find_player": {
|
||||
"animation_length": 0.05,
|
||||
"loop": true,
|
||||
"timeline": {
|
||||
"0": [
|
||||
"v.x = 0.0; for_each(t.player, q.get_nearby_entities_except_self(16, 'minecraft:player'), { v.x = v.x + 1; }); return v.x > 0.0;"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
若要检测具备特定Molang属性的实体:
|
||||
|
||||
::: code-group
|
||||
```json [BP/animations/detection_animation.json]
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"animations": {
|
||||
"animation.pig.find_player": {
|
||||
"animation_length": 0.05,
|
||||
"loop": true,
|
||||
"timeline": {
|
||||
"0": [
|
||||
"v.x = 0.0; for_each(t.player, q.get_nearby_entities_except_self(2, 'minecraft:player'), { v.x = v.x + (t.player -> q.is_sheared); }); return v.x > 0.0;"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
::: code-group
|
||||
```json [BP/animation_controllers/pig_animation_controllers.json]
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"animation_controllers": {
|
||||
"controller.animation.pig_find_player": {
|
||||
"initial_state": "default",
|
||||
"states": {
|
||||
"default": {
|
||||
"animations": ["find_player"],
|
||||
"transitions": [{
|
||||
"detected": "v.x > 0"
|
||||
}]
|
||||
},
|
||||
"detected": {
|
||||
"animations": ["find_player"],
|
||||
"transitions": [{
|
||||
"default": "v.x <= 0"
|
||||
}],
|
||||
"on_entry": ["/say oink oink"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/my_entity.json#description]
|
||||
"animations": {
|
||||
"manage_find_player": "controller.animation.pig_find_player",
|
||||
"find_player": "animation.pig.find_player"
|
||||
},
|
||||
"scripts": {
|
||||
"animate": ["manage_find_player"]
|
||||
}
|
||||
```
|
||||
:::
|
||||
184
docs/wiki/entities/disabling-team-damage.md
Normal file
184
docs/wiki/entities/disabling-team-damage.md
Normal file
@@ -0,0 +1,184 @@
|
||||
---
|
||||
title: 禁用团队伤害
|
||||
category: 巧思案例
|
||||
tags:
|
||||
- 中级
|
||||
mentions:
|
||||
- SirLich
|
||||
- solvedDev
|
||||
- Joelant05
|
||||
- MedicalJewel105
|
||||
- Luthorius
|
||||
- TCLynx
|
||||
---
|
||||
|
||||
# 禁用团队伤害
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
若需禁用团队伤害(使玩家无法攻击队友),请为每位玩家分配带有队伍名称的标签(本教程将使用`team1`、`team2`、`team3`和`team4`作为示例)。
|
||||
警告:该方法在领域服(Realms)中**不可用**,原因是领域服存在一个漏洞会导致行为包中修改后的player.json文件失效,游戏会直接忽略这些修改(该问题可能在后续版本中修复,但在1.20.15版本中尚未解决。此问题也影响更早的Minecraft版本)。
|
||||
|
||||
现在将以下伤害感应器组件添加至你的`player.json`文件的`"components": {}`部分。查看注释以获取详细说明。
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/player.json#components]
|
||||
"minecraft:damage_sensor":{
|
||||
"triggers":[
|
||||
{ //若已有伤害感应器组件,只需将此对象复制到"triggers"数组中
|
||||
"on_damage":{
|
||||
"filters":{
|
||||
"any_of":[
|
||||
{
|
||||
"all_of":[
|
||||
{ "test":"has_tag", "value":"team1" }, //该玩家是否拥有此标签?
|
||||
{ "test":"has_tag", "subject":"other", "value":"team1" } //被攻击实体是否拥有此标签?
|
||||
]
|
||||
},
|
||||
{
|
||||
"all_of":[ //以下为重复结构,为每个队伍添加相同配置
|
||||
{ "test":"has_tag", "value":"team2" },
|
||||
{ "test":"has_tag", "subject":"other", "value":"team2" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"all_of":[
|
||||
{ "test":"has_tag", "value":"team3" },
|
||||
{ "test":"has_tag", "subject":"other", "value":"team3" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"all_of":[
|
||||
{ "test":"has_tag", "value":"team4" },
|
||||
{ "test":"has_tag", "subject":"other", "value":"team4" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"all_of":[
|
||||
{ "test":"has_tag", "value":"team5" },
|
||||
{ "test":"has_tag", "subject":"other", "value":"team5" }
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"deals_damage":false //若任意过滤器条件满足,本次攻击将不会造成伤害
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 抛射物处理
|
||||
|
||||
由于抛射物实体使用的原始滤镜系统,实现此功能需要完全不同的方法。该方案需要以下组件:
|
||||
- 标签(Tags)
|
||||
- 周期性检测(Ticking)
|
||||
- 条件伤害(Hurt on Condition)
|
||||
- 函数(Functions)
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/player.json#components]
|
||||
//"components"部分
|
||||
"minecraft:timer": { //用于通过事件给附近未标记的抛射物添加队伍标签
|
||||
"time": [
|
||||
0.0,
|
||||
0.1
|
||||
],
|
||||
"looping": true,
|
||||
"time_down_event": {
|
||||
"event": "wiki:projectile_team",
|
||||
"target": "self"
|
||||
}
|
||||
},
|
||||
"minecraft:hurt_on_condition": { //使抛射物无法直接造成伤害
|
||||
"damage_conditions": [ //改为通过标签系统触发伤害
|
||||
{
|
||||
"filters": {
|
||||
"test": "has_tag",
|
||||
"value": "damage"
|
||||
},
|
||||
"cause": "projectile",
|
||||
"damage_per_tick": 4
|
||||
}
|
||||
]
|
||||
},
|
||||
"minecraft:damage_sensor": { //触发事件来移除damage标签
|
||||
"triggers": { //确保伤害只生效一次
|
||||
"cause": "projectile",
|
||||
"deals_damage": true,
|
||||
"on_damage": {
|
||||
"filters": {
|
||||
"test": "has_tag",
|
||||
"value": "damage"
|
||||
},
|
||||
"event": "wiki:stop_damage"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//"events"部分
|
||||
"wiki:projectile_team": { //根据玩家队伍标签应用对应的抛射物标签
|
||||
"run_command": {
|
||||
"command": [
|
||||
"function wiki-apply_team"
|
||||
]
|
||||
}
|
||||
},
|
||||
"wiki:stop_damage": { //移除damage标签的事件
|
||||
"run_command": {
|
||||
"command": [
|
||||
"tag @s remove damage"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
::: code-group
|
||||
|
||||
```json [BP/entities/arrow.json]
|
||||
//"components"部分
|
||||
"on_hit": { //击中时触发事件...
|
||||
"definition_event": {
|
||||
"affect_projectile": true,
|
||||
"event_trigger": {
|
||||
"event": "wiki:hit",
|
||||
"target": "self"
|
||||
}
|
||||
},
|
||||
"remove_on_hit": {}
|
||||
}
|
||||
|
||||
//"events"部分
|
||||
"wiki:hit": { //...执行函数,为不同队伍玩家添加damage标签
|
||||
"run_command": {
|
||||
"command": [
|
||||
"function wiki-apply_damage"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
::: code-group
|
||||
|
||||
```mcfunction [BP/functions/wiki-apply_team.mcfunction]
|
||||
execute @s[tag=team1] ~ ~ ~ tag @e[rm=0,r=1,c=1,type=arrow,tag=] add team1
|
||||
execute @s[tag=team2] ~ ~ ~ tag @e[rm=0,r=1,c=1,type=arrow,tag=] add team2
|
||||
execute @s[tag=team3] ~ ~ ~ tag @e[rm=0,r=1,c=1,type=arrow,tag=] add team3
|
||||
execute @s[tag=team4] ~ ~ ~ tag @e[rm=0,r=1,c=1,type=arrow,tag=] add team4
|
||||
```
|
||||
:::
|
||||
|
||||
::: code-group
|
||||
|
||||
```mcfunction [BP/functions/wiki-apply_damage.mcfunction]
|
||||
execute @s[tag=team1] ~ ~ ~ tag @p[rm=0,r=1,tag=!team1] add damage
|
||||
execute @s[tag=team2] ~ ~ ~ tag @p[rm=0,r=1,tag=!team2] add damage
|
||||
execute @s[tag=team3] ~ ~ ~ tag @p[rm=0,r=1,tag=!team3] add damage
|
||||
execute @s[tag=team4] ~ ~ ~ tag @p[rm=0,r=1,tag=!team4] add damage
|
||||
```
|
||||
:::
|
||||
|
||||
> 注意:若修改`arrow.json`文件,请仔细考虑组件分组(component groups)的影响。
|
||||
80
docs/wiki/entities/dummy-components.md
Normal file
80
docs/wiki/entities/dummy-components.md
Normal file
@@ -0,0 +1,80 @@
|
||||
---
|
||||
title: 虚拟组件
|
||||
category: 文档
|
||||
mentions:
|
||||
- SirLich
|
||||
- jigarbov
|
||||
- MedicalJewel105
|
||||
- StealthyExpertX
|
||||
- TheItsNameless
|
||||
---
|
||||
|
||||
# 虚拟组件
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
:::warning 弃用警告
|
||||
|
||||
'虚拟组件'是一个旧版概念,现已被[实体属性](https://learn.microsoft.com/en-us/minecraft/creator/documents/introductiontoentityproperties)取代。建议尽可能使用实体属性代替。
|
||||
:::
|
||||
|
||||
虚拟组件是仅用于数据存储的"无功能"组件。它们本身**不会**产生任何实际效果,需要配合其他机制才能发挥作用。这类组件的主要价值在于可将数据存储在实体上,并通过Molang查询来驱动图形/游戏机制。
|
||||
|
||||
典型案例包括 `variant`(变种)和 `mark_variant`(标记变种)。这些组件接受整数值设置,在原版资源包中用于定义猫和马匹的贴图选择。另一个典型案例是 `is_tamed`(驯服状态),用于控制马匹能否被骑乘。
|
||||
|
||||
虚拟组件的优势在于能够将数据与实体绑定,并通过Molang查询调用这些信息。
|
||||
|
||||
## 整型虚拟组件
|
||||
|
||||
整型组件存储整数值(例如1、10、1423),可使用Molang查询进行读取,是最常用的虚拟组件类型。
|
||||
|
||||
## 布尔型虚拟组件
|
||||
|
||||
布尔型组件存储单一状态信息,包括 `True`(真)和 `False`(假)。以 `is_tamed` 为例,组件存在表示为 `True`(已驯服),不存在则为 `False`(未驯服)。
|
||||
|
||||
## 组件列表
|
||||
|
||||
| 类型 | 查询语句 | 组件名称 | 备注 |
|
||||
| --------- | ------------------------------------------------------------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **整型** | q.variant | minecraft:variant | |
|
||||
| **整型** | q.mark_variant | minecraft:mark_variant | |
|
||||
| **整型** | q.skin_id | minecraft:skin_id | |
|
||||
| **整型\*** | 使用类似 `"test": "is_color"` 的过滤器,下方提供颜色列表 | minecraft:color | 同时在材质系统中设置颜色 |
|
||||
| **整型\*** | 无对应过滤器语法,可使用 `"has_component"` | minecraft:color2 | 同时在材质系统中设置颜色 |
|
||||
| 布尔型 | q.is_illager_captain | minecraft:is_illager_captain | |
|
||||
| 布尔型 | q.is_baby | minecraft:is_baby | 禁用`minecraft:breedable`组件功能 |
|
||||
| 布尔型 | q.is_sheared | minecraft:is_sheared | |
|
||||
| 布尔型 | q.is_saddled | minecraft:is_saddled | |
|
||||
| 布尔型 | q.is_tamed | minecraft:is_tamed | |
|
||||
| 布尔型 | q.is_chested | minecraft:is_chested | 死亡时会掉落储存箱 |
|
||||
| 布尔型 | q.is_powered | minecraft:is_charged | |
|
||||
| 布尔型 | q.is_stunned | minecraft:is_stunned | |
|
||||
| 布尔型 | q.can_climb | minecraft:can_climb | 允许实体攀爬梯子 |
|
||||
| 布尔型 | q.can_fly | minecraft:can_fly | 标记实体具有飞行能力,路径查找器将不限于下方有固体方块的位置 |
|
||||
| 布尔型 | q.can_power_jump | minecraft:can_power_jump | 允许实体执行强力跳跃(如原版马匹动作) |
|
||||
| 布尔型 | q.is_ignited | minecraft:is_ignited | |
|
||||
| 布尔型 | q.out_of_control | minecraft:out_of_control | 新版功能,用于处理船体硬编码运动/粒子效果,Molang q查询可安全 |
|
||||
| 布尔型 | q.has_any_family('monster') | minecraft:type_family | 可检测指定Family类型(如'monster')返回布尔值
|
||||
|
||||
### color与color2组件颜色对照表
|
||||
|
||||
::: code-group
|
||||
```json [颜色代码]
|
||||
- black
|
||||
- blue
|
||||
- brown
|
||||
- cyan
|
||||
- gray
|
||||
- green
|
||||
- light_blue
|
||||
- light_green
|
||||
- magenta
|
||||
- orange
|
||||
- pink
|
||||
- purple
|
||||
- red
|
||||
- silver
|
||||
- white
|
||||
- yellow
|
||||
```
|
||||
:::
|
||||
149
docs/wiki/entities/dummy-entities.md
Normal file
149
docs/wiki/entities/dummy-entities.md
Normal file
@@ -0,0 +1,149 @@
|
||||
---
|
||||
title: 虚拟实体
|
||||
category: 巧思案例
|
||||
tags:
|
||||
- 初学者
|
||||
mentions:
|
||||
- SirLich
|
||||
- Joelant05
|
||||
- MedicalJewel105
|
||||
- aexer0e
|
||||
---
|
||||
|
||||
# 虚拟实体
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
虚拟实体是游戏场景中不可见的幕后实用实体。本文将介绍这种多功能工具的使用场景,并展示如何配置资源文件。
|
||||
|
||||
## 核心用途
|
||||
|
||||
以下是虚拟实体的部分应用场景:
|
||||
|
||||
- **数据存储**:通过给实体添加标签,我们可以将其作为"游戏管理器"使用(类似过去盔甲架的用法)。
|
||||
- **命名实体**:通过命名标签标识虚拟实体,配合`execute`指令选中目标,可以用命令块实现带精美显示名称的`/say`命令。
|
||||
- **坐标标记**:通过`execute`指令跟踪虚拟实体位置,获取相对坐标系的基准点。
|
||||
- **路径向导**:使敌对生物将虚拟实体设为目标,即可将实体路径引导至虚拟实体所在位置。
|
||||
|
||||
## 创建教程
|
||||
|
||||
### 行为配置
|
||||
|
||||
这里提供一个标准模板(关键特性:免疫伤害且不可推动)。
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/dummy.json]
|
||||
{
|
||||
"format_version": "1.16.0",
|
||||
"minecraft:entity": {
|
||||
"description": {
|
||||
"identifier": "wiki:dummy",
|
||||
"is_summonable": true,
|
||||
"is_spawnable": false,
|
||||
"is_experimental": false
|
||||
},
|
||||
"components": {
|
||||
"minecraft:breathable": { // 可选,使实体能够在水中呼吸
|
||||
"breathes_water": true
|
||||
},
|
||||
"minecraft:physics": {
|
||||
"has_gravity": false, // 可选,使实体不受重力和水流影响
|
||||
"has_collision": false
|
||||
},
|
||||
"minecraft:custom_hit_test": {
|
||||
"hitboxes": [
|
||||
{
|
||||
"pivot": [0, 100, 0],
|
||||
"width": 0,
|
||||
"height": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
"minecraft:damage_sensor": {
|
||||
"triggers": {
|
||||
"deals_damage": false
|
||||
}
|
||||
},
|
||||
"minecraft:pushable": {
|
||||
"is_pushable": false,
|
||||
"is_pushable_by_piston": false
|
||||
},
|
||||
"minecraft:collision_box": {
|
||||
"width": 0.0001,
|
||||
"height": 0.0001
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
若要完全禁用碰撞(允许在其位置放置方块),可以使用弓箭runtime ID,但可能存在副作用。
|
||||
|
||||
### 资源配置
|
||||
|
||||
::: code-group
|
||||
```json [RP/entity/dummy.json]
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"minecraft:client_entity": {
|
||||
"description": {
|
||||
"identifier": "wiki:dummy",
|
||||
"materials": {
|
||||
"default": "entity_alphatest"
|
||||
},
|
||||
"geometry": {
|
||||
"default": "geometry.dummy"
|
||||
},
|
||||
"render_controllers": ["controller.render.dummy"],
|
||||
"textures": {
|
||||
"default": "textures/entity/dummy"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 模型配置
|
||||
|
||||
::: code-group
|
||||
```json [RP/models/entity/dummy.json]
|
||||
{
|
||||
"format_version": "1.12.0",
|
||||
"minecraft:geometry": [
|
||||
{
|
||||
"description": {
|
||||
"identifier": "geometry.dummy",
|
||||
"texture_width": 16,
|
||||
"texture_height": 16
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 渲染控制器(可选)
|
||||
|
||||
::: code-group
|
||||
```json [RP/render_controllers/dummy.json]
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"render_controllers": {
|
||||
"controller.render.dummy": {
|
||||
"geometry": "Geometry.default",
|
||||
"textures": ["Texture.default"],
|
||||
"materials": [
|
||||
{
|
||||
"*": "Material.default"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 材质贴图(可选)
|
||||
|
||||
可以选择留空材质路径,或者使用Blockbench创建空白材质文件。
|
||||
525
docs/wiki/entities/entity-attack.md
Normal file
525
docs/wiki/entities/entity-attack.md
Normal file
@@ -0,0 +1,525 @@
|
||||
---
|
||||
title: 实体攻击机制
|
||||
category: 巧思案例
|
||||
mentions:
|
||||
- Luthorius
|
||||
- TheDoctor15
|
||||
- SirLich
|
||||
- MedicalJewel105
|
||||
- epxzzy
|
||||
- ThomasOrs
|
||||
tags:
|
||||
- 中级
|
||||
---
|
||||
|
||||
# 实体攻击机制
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
实体攻击需要多种系统协同工作才能正确运行:
|
||||
|
||||
- 导航及移动能力以接近目标
|
||||
- 目标选择能力以确定攻击对象
|
||||
- 攻击类型(如近战或远程)
|
||||
- 伤害数值及附加效果
|
||||
|
||||
## 目标选择
|
||||
|
||||
### 移动机制
|
||||
|
||||
生物发起攻击前需要搭载多种[移动组件](/wiki/entities/entity-movement)。
|
||||
|
||||
在开始配置攻击行为前,请确保实体具备基础移动和路径规划能力。
|
||||
|
||||
:::warning
|
||||
即使要创建固定式防御单位(如炮塔),仍需要添加导航组件以便自动寻找射击目标。
|
||||
:::
|
||||
|
||||
### 激活敌对行为
|
||||
|
||||
触发敌对状态有多种方式。以下为最常用的`nearest_attackable_target`组件示例,主要用于定义实体的主要攻击目标类型:
|
||||
|
||||
::: code-group
|
||||
```json [原始CodeHeader的值]
|
||||
"minecraft:behavior.nearest_attackable_target": {
|
||||
"must_see": true, //如果为true,目标必须处于实体视线内
|
||||
"reselect_targets": true, //允许切换更近的目标
|
||||
"within_radius": 25.0, //有效搜索半径
|
||||
"must_see_forget_duration": 17.0, //目标消失视野后的记忆时间
|
||||
"entity_types": [
|
||||
{
|
||||
"filters": { //有效攻击目标筛选
|
||||
"test": "is_family",
|
||||
"subject": "other",
|
||||
"value": "player"
|
||||
},
|
||||
"max_dist": 48.0
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
如需更精细控制,可选用以下组件:
|
||||
|
||||
| 组件 | 说明 |
|
||||
| ---------------------------------------------------- | ------------------------------------------------------------ |
|
||||
| minecraft:behavior.nearest_attackable_target | 定位符合筛选条件的实体 |
|
||||
| minecraft:behavior.nearest_prioritized_attackable_target | 可通过filter后设置"priority": [整数]定义优先级 |
|
||||
| minecraft:behavior.defend_trusted_target | 防御指定类型的友方单位 |
|
||||
|
||||
另有特殊组件`minecraft:lookat`:
|
||||
|
||||
该组件与其他三种不同,用于检测与实体发生视线交互的目标。配置示例:
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/enderman.json]
|
||||
"minecraft:lookat": {
|
||||
"search_radius": 64.0,
|
||||
"set_target": true, //标记为有效目标
|
||||
"look_cooldown": 5.0,
|
||||
"filters": {
|
||||
"all_of": [
|
||||
{
|
||||
"subject": "other",
|
||||
"test": "is_family",
|
||||
"value": "player"
|
||||
},
|
||||
{
|
||||
"test": "has_equipment",
|
||||
"domain": "head",
|
||||
"subject": "other",
|
||||
"operator": "not",
|
||||
"value": "carved_pumpkin" //未装备雕刻南瓜的玩家
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 目标筛选机制
|
||||
|
||||
:::tip
|
||||
本节说明如何配置上述「目标定位」组件。
|
||||
:::
|
||||
|
||||
实体通过[筛选器](https://bedrock.dev/docs/stable/Entities#Filters)判定有效目标,使用`test`、`subject`、`operator`和`value`参数进行组合判断。
|
||||
|
||||
::: code-group
|
||||
```json [原始CodeHeader的值]
|
||||
"entity_types":[
|
||||
{
|
||||
"filters":{
|
||||
"any_of":[
|
||||
{
|
||||
"test":"is_family",
|
||||
"subject":"other",
|
||||
"operator":"==",
|
||||
"value":"snow_golem"
|
||||
},
|
||||
{
|
||||
"test":"is_family",
|
||||
"subject":"other",
|
||||
"operator":"==",
|
||||
"value":"iron_golem"
|
||||
}
|
||||
//雪傀儡或铁傀儡
|
||||
]
|
||||
},
|
||||
"max_dist":24
|
||||
},
|
||||
{
|
||||
"filters":{
|
||||
"all_of":[
|
||||
{
|
||||
"test":"is_family",
|
||||
"subject":"other",
|
||||
"operator":"==",
|
||||
"value":"player"
|
||||
},
|
||||
{
|
||||
"test":"has_equipment",
|
||||
"subject":"other",
|
||||
"domain":"head",
|
||||
"operator":"=!",
|
||||
"value":"turtle_helmet"
|
||||
}
|
||||
//未装备海龟盔甲的玩家
|
||||
]
|
||||
},
|
||||
"max_dist":24
|
||||
}
|
||||
]
|
||||
```
|
||||
:::
|
||||
|
||||
该配置将锁定雪傀儡、铁傀儡及未佩戴海龟头盔的玩家。
|
||||
|
||||
## 攻击类型
|
||||
|
||||
可用攻击方式列表:
|
||||
|
||||
| 组件 | 说明 |
|
||||
| ---------------------------------------------------- | -------------------------------------------------------- |
|
||||
| [minecraft:behavior.melee_attack](#近战攻击) | 单体近战攻击 |
|
||||
| [minecraft:behavior.ranged_attack](#远程攻击) | 发射弹射物 |
|
||||
| [minecraft:area_attack](#范围攻击) | 范围内全体打击 |
|
||||
| [minecraft:behavior.knockback_roar](#击退怒吼) | 高自定义度的冲击波攻击 |
|
||||
|
||||
### 近战攻击
|
||||
|
||||
最常见的攻击类型,带有击退效果且必定命中。
|
||||
|
||||
::: code-group
|
||||
```json [原始CodeHeader的值]
|
||||
"wiki:melee_attack": {
|
||||
"minecraft:attack": {
|
||||
"damage": 3,
|
||||
"effect_name": "slowness",
|
||||
"effect_duration": 20
|
||||
},
|
||||
"minecraft:behavior.melee_attack": {
|
||||
"priority": 3,
|
||||
"melee_fov": 90.0, //实体发动近战攻击时的有效视野角度
|
||||
"speed_multiplier": 1,
|
||||
"track_target": false,
|
||||
"require_complete_path": true
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
可配置伤害数值、状态效果及攻击参数。
|
||||
|
||||
伤害数值支持固定值或区间范围:
|
||||
|
||||
- `"damage": 3`:固定造成3点伤害
|
||||
- `"damage": [2, 6]`:随机造成2-6点伤害
|
||||
|
||||
状态效果支持列表:
|
||||
|
||||
| 效果列表 |
|
||||
| --------------- |
|
||||
| 速度 |
|
||||
| 缓慢 |
|
||||
| 急迫 |
|
||||
| 挖掘疲劳 |
|
||||
| 力量 |
|
||||
| 瞬间治疗 |
|
||||
| 瞬间伤害 |
|
||||
| 跳跃提升 |
|
||||
| 反胃 |
|
||||
| 生命恢复 |
|
||||
| 抗性提升 |
|
||||
| 防火 |
|
||||
| 水下呼吸 |
|
||||
| 隐身 |
|
||||
| 失明 |
|
||||
| 夜视 |
|
||||
| 饥饿 |
|
||||
| 虚弱 |
|
||||
| 中毒 |
|
||||
| 凋零 |
|
||||
| 生命提升 |
|
||||
| 伤害吸收 |
|
||||
| 饱和 |
|
||||
| 飘浮 |
|
||||
| 剧毒 |
|
||||
| 缓降 |
|
||||
| 潮涌能量 |
|
||||
| 不祥之兆 |
|
||||
| 村庄英雄 |
|
||||
| 黑暗 |
|
||||
|
||||
### 远程攻击
|
||||
|
||||
按设定间隔发射指定[弹射物](/wiki/documentation/projectiles)。
|
||||
|
||||
::: code-group
|
||||
```json [原始CodeHeader的值]
|
||||
"wiki:ranged_attack": {
|
||||
"minecraft:behavior.ranged_attack": {
|
||||
"priority": 2,
|
||||
"ranged_fov": 90.0, //实体发动远程攻击时的有效视野角度
|
||||
"attack_interval_min": 1.0, //最小攻击间隔
|
||||
"attack_interval_max": 3.0, //最大攻击间隔
|
||||
"attack_radius": 15.0 //攻击范围
|
||||
},
|
||||
"minecraft:shooter": {
|
||||
"def": "wiki:projectile" //自定义弹射物定义
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
原版弹射物类型:
|
||||
|
||||
| 原版弹射物 |
|
||||
| -------------------------------- |
|
||||
| minecraft:arrow |
|
||||
| minecraft:dragon_fireball |
|
||||
| minecraft:egg |
|
||||
| minecraft:ender_pearl |
|
||||
| minecraft:fireball |
|
||||
| minecraft:fishing_hook |
|
||||
| minecraft:lingering_potion |
|
||||
| minecraft:llama_spit |
|
||||
| minecraft:skulker_bullet |
|
||||
| minecraft:small_fireball |
|
||||
| minecraft:snowball |
|
||||
| minecraft:splash_potion |
|
||||
| minecraft:thrown_trident |
|
||||
| minecraft:wither_skull |
|
||||
| minecraft:wither_skull_dangerous |
|
||||
| minecraft:xp_bottle |
|
||||
|
||||
弩类武器需先装填后发射:
|
||||
|
||||
::: code-group
|
||||
```json [原始CodeHeader的值]
|
||||
"minecraft:behavior.charge_held_item": {
|
||||
"priority": 2,
|
||||
"items": [
|
||||
"minecraft:arrow" //弩的弹药类型固定为箭
|
||||
]
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
完成装填后方可触发`minecraft:behavior.ranged_attack`。
|
||||
|
||||
### 范围攻击
|
||||
|
||||
对范围内的所有实体造成伤害。与常规攻击不同,无需特定目标即可触发。
|
||||
|
||||
::: code-group
|
||||
```json [原始CodeHeader的值]
|
||||
"minecraft:area_attack" : {
|
||||
"damage_range": 1, //伤害作用范围(方块)
|
||||
"damage_per_tick": 2, //每tick伤害量
|
||||
"cause": "contact", //伤害来源类型
|
||||
"entity_filter": { //有效目标筛选
|
||||
"any_of": [
|
||||
{
|
||||
"test": "is_family",
|
||||
"subject": "other",
|
||||
"value": "player"
|
||||
},
|
||||
{
|
||||
"test": "is_family",
|
||||
"subject": "other",
|
||||
"value": "monster"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
需参考[实体伤害源类型](https://bedrock.dev/docs/stable/Addons#Entity%20Damage%20Source)进行配置,注意部分原版装备可减免特定类型伤害。
|
||||
|
||||
### 击退怒吼
|
||||
|
||||
高灵活性范围攻击,可产生冲击波效果。
|
||||
|
||||
::: code-group
|
||||
```json [原始CodeHeader的值]
|
||||
"wiki:roar_attack": {
|
||||
"minecraft:behavior.knockback_roar":{
|
||||
"priority":2,
|
||||
"duration":0.7, //技能总时长
|
||||
"attack_time":0.2, //实际造成伤害时间点
|
||||
"knockback_damage":1, //击退伤害
|
||||
"knockback_horizontal_strength":1, //水平击退力度
|
||||
"knockback_vertical_strength":1, //垂直击退力度
|
||||
"knockback_range":5, //作用范围
|
||||
"knockback_filters":{ //击退目标筛选
|
||||
"test":"is_family",
|
||||
"subject":"other",
|
||||
"operator":"==",
|
||||
"value":"player"
|
||||
},
|
||||
"damage_filters":{ //伤害目标筛选
|
||||
"test":"is_family",
|
||||
"subject":"other",
|
||||
"operator":"==",
|
||||
"value":"player"
|
||||
},
|
||||
"on_roar_end":{ //技能结束触发事件
|
||||
"event":"wiki:other_event"
|
||||
},
|
||||
"cooldown_time":10 //冷却时间
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
若需要隐藏默认粒子效果,可在资源包中覆盖相关粒子文件。
|
||||
|
||||
## 进阶攻击配置
|
||||
|
||||
攻击行为可通过事件系统进行更高级的交互设计。
|
||||
|
||||
### 难度分级攻击
|
||||
|
||||
不同游戏难度配置不同攻击参数:
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/bee.json]
|
||||
"easy_attack": {
|
||||
"minecraft:attack": {
|
||||
"damage": 2
|
||||
}
|
||||
},
|
||||
"normal_attack": {
|
||||
"minecraft:attack": {
|
||||
"damage": 2,
|
||||
"effect_name": "poison",
|
||||
"effect_duration": 10
|
||||
}
|
||||
},
|
||||
"hard_attack": {
|
||||
"minecraft:attack": {
|
||||
"damage": 2,
|
||||
"effect_name": "poison",
|
||||
"effect_duration": 18
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 模式切换系统
|
||||
|
||||
通过[事件系统](/wiki/entities/entity-events)和组件组实现攻击模式切换。常用传感器组件:
|
||||
|
||||
| 传感器类型 | 说明 |
|
||||
| ---------------------- | ----------------------- |
|
||||
| minecraft:environment_sensor | 环境条件监测 |
|
||||
| minecraft:target_nearby_sensor | 目标距离监测 |
|
||||
|
||||
#### 组件组示例
|
||||
|
||||
远程攻击配置组:
|
||||
|
||||
::: code-group
|
||||
```json [原始CodeHeader的值]
|
||||
"wiki:ranged_components": {
|
||||
"minecraft:shooter": {
|
||||
"def": "wiki:projectile"
|
||||
},
|
||||
"minecraft:behavior.ranged_attack": {
|
||||
"priority": 3,
|
||||
"ranged_fov": 90.0,
|
||||
"attack_interval_min": 1.0,
|
||||
"attack_interval_max": 3.0,
|
||||
"attack_radius": 15.0
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
近战攻击配置组:
|
||||
|
||||
::: code-group
|
||||
```json [原始CodeHeader的值]
|
||||
"wiki:melee_components": {
|
||||
"minecraft:attack": {
|
||||
"damage": 6
|
||||
},
|
||||
"minecraft:behavior.melee_attack": {
|
||||
"priority": 3
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
#### 事件触发器
|
||||
|
||||
距离传感器示例:
|
||||
|
||||
::: code-group
|
||||
```json [原始CodeHeader的值]
|
||||
"wiki:switcher_range": {
|
||||
"minecraft:target_nearby_sensor": {
|
||||
"inside_range": 4.0,
|
||||
"outside_range": 5.0,
|
||||
"must_see": true,
|
||||
"on_inside_range": { //4格内切换近战
|
||||
"event": "wiki:melee_swap",
|
||||
"target": "self"
|
||||
},
|
||||
"on_outside_range": { //5格外切换远程
|
||||
"event": "wiki:ranged_swap",
|
||||
"target": "self"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
环境传感器示例:
|
||||
|
||||
::: code-group
|
||||
```json [原始CodeHeader的值]
|
||||
"wiki:switcher_environment": {
|
||||
"minecraft:environment_sensor": {
|
||||
"triggers": [
|
||||
{ //水下转为近战
|
||||
"filters": {
|
||||
"test": "is_underwater",
|
||||
"subject": "self",
|
||||
"operator": "==",
|
||||
"value": true
|
||||
},
|
||||
"event": "wiki:melee_swap"
|
||||
},
|
||||
{ //陆地转为远程
|
||||
"filters": {
|
||||
"test": "is_underwater",
|
||||
"subject": "self",
|
||||
"operator": "==",
|
||||
"value": false
|
||||
},
|
||||
"event": "wiki:ranged_swap"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
:::tip
|
||||
攻击类型切换不限于两种模式,可根据需求扩展更多。
|
||||
:::
|
||||
|
||||
## 动作表现配置
|
||||
|
||||
攻击需配合动画系统实现完整表现。
|
||||
|
||||
### 动画资源
|
||||
|
||||
建议使用[Blockbench](/wiki/guide/blockbench)制作动画,需在资源包中包含:
|
||||
|
||||
- animations文件夹(实体动画定义)
|
||||
- animation_controllers文件夹(动画控制器)
|
||||
- entity文件夹(实体定义)
|
||||
|
||||
| 原版攻击动画 |
|
||||
| -------------------------------------------- |
|
||||
| "animation.zombie.attack_bare_hand" |
|
||||
| "animation.skeleton.attack.v1.0" |
|
||||
| "animation.humanoid.bow_and_arrow.v1.0" |
|
||||
| "animation.humanoid.damage_nearby_mobs.v1.0" |
|
||||
|
||||
### 动画控制器
|
||||
|
||||
控制动画的触发逻辑:
|
||||
|
||||
| 原版动画控制器 |
|
||||
| ---------------------------------------------- |
|
||||
| "controller.animation.zombie.attack_bare_hand" |
|
||||
| "controller.animation.skeleton.attack" |
|
||||
| "controller.animation.humanoid.bow_and_arrow" |
|
||||
|
||||
更多动画系统细节请参考[官方文档](https://bedrock.dev/docs/stable/Animations)。
|
||||
273
docs/wiki/entities/entity-events.md
Normal file
273
docs/wiki/entities/entity-events.md
Normal file
@@ -0,0 +1,273 @@
|
||||
---
|
||||
title: 实体事件
|
||||
category: 基础
|
||||
mentions:
|
||||
- ChibiMango
|
||||
- SirLich
|
||||
- Joelant05
|
||||
- MedicalJewel105
|
||||
- aexer0e
|
||||
- SmokeyStack
|
||||
- ThomasOrs
|
||||
tags:
|
||||
- 新手
|
||||
---
|
||||
|
||||
# 实体事件
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
实体事件是行为系统中与组件(Component)和组件组(Component Group)并列的基础构建模块之一。它们作为组件组的控制中枢,可以通过组件、动画(Animation)、动画控制器(Animation Controller)及其他事件进行调用。本文旨在详解实体内部及跨实体事件调用的方法,以及事件的基本格式结构。
|
||||
|
||||
## 事件结构
|
||||
|
||||
事件允许我们在特定条件满足时,通过添加或移除组件组来改变实体的行为模式。我们称之为"事件(Event)",因为它们可以被战斗倒计时结束、玩家交互、环境变化等情景所触发。当事件激活时,会根据预定义指令处理组件组的增删操作。
|
||||
|
||||
每个事件可包含七个核心指令键,分别用于执行组件组增删、条件判断、事件触发及属性设置:
|
||||
- add(添加)
|
||||
- remove(移除)
|
||||
- randomize(随机化)
|
||||
- sequence(序列)
|
||||
- filters(过滤器)
|
||||
- trigger(触发器)
|
||||
- set_property(属性设置)
|
||||
|
||||
### 添加/移除
|
||||
|
||||
事件最基础的功能是通过add/remove键直接增删组件组。如下示例中的`wiki:ranged_attacker`事件:
|
||||
|
||||
::: code-group
|
||||
```json [示例]
|
||||
"wiki:ranged_attacker":{
|
||||
"add":{
|
||||
"component_groups":[
|
||||
"attacker",
|
||||
"ranged"
|
||||
]
|
||||
},
|
||||
"remove":{
|
||||
"component_groups":[
|
||||
"standby",
|
||||
"melee"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
:::tip 组件覆盖规则
|
||||
当添加组件组时,若现有活跃组件组中已包含同名组件,后添加的组件组会覆盖原有组件。
|
||||
:::
|
||||
|
||||
### 随机化
|
||||
|
||||
randomize参数允许根据权重概率随机执行组件组操作。原版牛的生成事件即使用该机制,实现95%概率生成成年牛,5%概率生成幼崽:
|
||||
|
||||
::: code-group
|
||||
```json [牛生成逻辑]
|
||||
"minecraft:entity_spawned":{
|
||||
"randomize":[
|
||||
{
|
||||
"weight":95,
|
||||
"add":{
|
||||
"component_groups":[
|
||||
"minecraft:cow_adult"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"weight":5,
|
||||
"add":{
|
||||
"component_groups":[
|
||||
"minecraft:cow_baby"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
:::warning 注意
|
||||
随机化配置中对每组权重进行归一化处理,最终不同选项的选择概率与其权重值占总权重的比例相关。
|
||||
:::
|
||||
|
||||
### 序列/过滤器
|
||||
|
||||
通过sequence参数可实现条件分支逻辑。原版僵尸的溺水转换事件根据是否是幼体执行不同操作:
|
||||
|
||||
::: code-group
|
||||
```json [僵尸溺水转换]
|
||||
"minecraft:convert_to_drowned":{
|
||||
"sequence":[
|
||||
{
|
||||
"filters":{
|
||||
"test":"has_component",
|
||||
"operator":"!=",
|
||||
"value":"minecraft:is_baby"
|
||||
},
|
||||
"add":["minecraft:convert_to_drowned"],
|
||||
"remove":["minecraft:start_drowned_transformation"]
|
||||
},
|
||||
{
|
||||
"filters":{
|
||||
"test":"has_component",
|
||||
"value":"minecraft:is_baby"
|
||||
},
|
||||
"add":["minecraft:convert_to_baby_drowned"],
|
||||
"remove":["minecraft:start_drowned_transformation"]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
:::tip 序列执行机制
|
||||
序列中的每个分支会依次检查执行,通过过滤器的分支都会被执行而无互斥性。若无过滤器则默认执行,但不影响后续分支的判断。
|
||||
:::
|
||||
|
||||
下面这个整合多条件的攻击序列示例展示了复杂逻辑的实现:
|
||||
|
||||
::: spoiler title="复杂攻击序列示例"
|
||||
|
||||
::: code-group
|
||||
```json [攻击逻辑]
|
||||
"wiki:on_hit":{
|
||||
"randomize":[
|
||||
{
|
||||
"weight":60 //60%概率无操作
|
||||
},
|
||||
{
|
||||
"weight":40,
|
||||
"sequence":[
|
||||
{"trigger":"attack_event"},
|
||||
{
|
||||
"filters":["!minecraft:is_sheared"],
|
||||
"sequence":[...]
|
||||
},
|
||||
{
|
||||
"filters":["minecraft:is_sheared"],
|
||||
"sequence":[...]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
:::
|
||||
:::
|
||||
|
||||
### 事件触发
|
||||
|
||||
通过trigger参数可以在事件中调用其他事件,结合target参数可实现跨实体交互。以玩家与猪互动事件为例:
|
||||
|
||||
::: code-group
|
||||
```json [互动事件]
|
||||
"wiki:on_interact": {
|
||||
"trigger": {
|
||||
"filters":{
|
||||
"test":"is_family",
|
||||
"subject":"self",
|
||||
"value":"pig"
|
||||
},
|
||||
"event":"wiki:interacted",
|
||||
"target":"other"
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
:::tip 目标上下文
|
||||
事件的执行需要明确的实体上下文。例如互动事件中,"other"指代互动发起者。若无对应上下文时,"target"指令将失效。
|
||||
:::
|
||||
|
||||
## 事件调用方式
|
||||
|
||||
事件可通过以下五种途径触发:
|
||||
1. 组件系统调用(如环境传感器)
|
||||
2. 动画时间轴调用
|
||||
3. 动画控制器状态切换
|
||||
4. 其他事件链式调用
|
||||
5. 控制台命令 `/event`
|
||||
|
||||
以下示例展示不同调用方式:
|
||||
|
||||
### 组件系统调用
|
||||
|
||||
僵尸的水下转换事件通过环境传感器触发:
|
||||
|
||||
::: code-group
|
||||
```json [僵尸转换]
|
||||
"minecraft:environment_sensor": {
|
||||
"triggers": {
|
||||
"filters":["is_underwater"],
|
||||
"event":"minecraft:start_transforming"
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 动画调用
|
||||
|
||||
在动画时间轴中按时间节点触发扑击事件:
|
||||
|
||||
::: code-group
|
||||
```json [动画事件]
|
||||
"animation.entity.pounce_timer": {
|
||||
"timeline": {
|
||||
"10.0": "@s wiki:start_pouncing"
|
||||
},
|
||||
"animation_length":10.1
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 跨实体事件调用
|
||||
|
||||
唤魔者的特殊技能通过发送事件到特定实体:
|
||||
|
||||
::: code-group
|
||||
```json [唤魔者技能]
|
||||
"minecraft:behavior.send_event":{
|
||||
"event_choices":[{
|
||||
"filters":["is_family:sheep"],
|
||||
"sequence":[{
|
||||
"event":"wololo",
|
||||
"target":"other"
|
||||
}]
|
||||
}]
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 内置事件
|
||||
|
||||
系统级自动触发事件需特别注意:
|
||||
|
||||
| 事件名称 | 触发条件 |
|
||||
|------------------------------|--------------------------|
|
||||
| minecraft:entity_spawned | 实体生成时 |
|
||||
| minecraft:entity_born | 繁殖产生新实体时 |
|
||||
| minecraft:entity_transformed | 实体形态转换完成时 |
|
||||
| minecraft:on_prime | 爆炸物引信燃尽准备爆炸时 |
|
||||
|
||||
::: code-group
|
||||
```json [牛实体配置示例]
|
||||
"events": {
|
||||
"minecraft:entity_spawned": {
|
||||
"randomize":[
|
||||
{"weight":95, "add":["minecraft:cow_adult"]},
|
||||
{"weight":5, "add":["minecraft:cow_baby"]}
|
||||
]
|
||||
},
|
||||
"minecraft:entity_born":{
|
||||
"add":["minecraft:cow_baby"]
|
||||
},
|
||||
"minecraft:entity_transformed":{
|
||||
"add":["minecraft:cow_adult"]
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
通过合理组合这些功能模块,开发者可以创建出丰富复杂的实体行为逻辑。建议配合动画控制器文档以构建更高级的行为系统。
|
||||
80
docs/wiki/entities/entity-holds-item.md
Normal file
80
docs/wiki/entities/entity-holds-item.md
Normal file
@@ -0,0 +1,80 @@
|
||||
---
|
||||
title: 实体手持物品
|
||||
category: 巧思案例
|
||||
tags:
|
||||
- 中等难度
|
||||
mentions:
|
||||
- pieterdefour
|
||||
- SirLich
|
||||
- solvedDev
|
||||
- stirante
|
||||
- Joelant05
|
||||
- destruc7ion
|
||||
- Dreamedc2015
|
||||
- sermah
|
||||
- 7dev7urandom
|
||||
---
|
||||
|
||||
# 实体手持物品
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
::: tip
|
||||
本教程假设您已对实体、战利品表和Blockbench有基本了解。
|
||||
:::
|
||||
|
||||
在本教程中,您将学习如何让实体生成时手持物品。示例中将使用自定义实体 `mandalorian_armorer` 和自定义物品 `hammer`。
|
||||
|
||||
## 模型
|
||||
|
||||
首先需要在Blockbench中创建包含名为 `rightArm` 骨架的模型。该骨架内必须包含名为 `rightItem` 的子骨架。
|
||||
将该子骨架的枢轴点定位至您期望实体手持物品的位置。
|
||||
|
||||

|
||||
|
||||
## 行为包配置
|
||||
|
||||
接下来需在实体的组件列表中添加 `minecraft:equipment` 组件,并配置包含目标物品的战利品表。
|
||||
|
||||
示例配置如下:
|
||||
|
||||
::: code-group
|
||||
```json [BP/entity/mandolorian.json#components]
|
||||
"minecraft:equipment": {
|
||||
"table": "loot_tables/entities/gear/mandolorian.json"
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
## 战利品表配置
|
||||
|
||||
最后在行为包的 `loot_tables/entities/<你的战利品表名称>.json` 路径下添加对应战利品表。本示例中文件名为 `mandolorian.json`。
|
||||
|
||||
:::warning
|
||||
此战利品表与生物死亡掉落表不同,请确保使用不同命名。
|
||||
:::
|
||||
|
||||
要让实体始终持握特定物品,按照以下格式配置战利品表:
|
||||
|
||||
::: code-group
|
||||
```json [BP/loot_tables/entities/gear/mandolorian.json]
|
||||
{
|
||||
"pools": [
|
||||
{
|
||||
"rolls": 1,
|
||||
"entries": [
|
||||
{
|
||||
"type": "item",
|
||||
"name": "dd:hammer",
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
成功配置后,效果应如下图所示:
|
||||
|
||||

|
||||
178
docs/wiki/entities/entity-intro-bp.md
Normal file
178
docs/wiki/entities/entity-intro-bp.md
Normal file
@@ -0,0 +1,178 @@
|
||||
---
|
||||
title: 实体行为包入门指南
|
||||
category: 基础
|
||||
nav_order: 1
|
||||
tags:
|
||||
- 指南
|
||||
- 新手入门
|
||||
mentions:
|
||||
- SirLich
|
||||
- solvedDev
|
||||
- stirante
|
||||
- Joelant05
|
||||
- destruc7ion
|
||||
- MedicalJewel105
|
||||
- ChibiMango
|
||||
- SmokeyStack
|
||||
- ThomasOrs
|
||||
---
|
||||
|
||||
# 实体行为包入门指南
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
构成行为包实体文件基础的三个主要结构如下:本文将解释它们的含义及使用方法。
|
||||
|
||||
组件组(component group)与组件(components)的混淆是常见的错误来源,请特别注意区分两者的区别。
|
||||
|
||||
## 组件(Components)
|
||||
|
||||
组件是构成Minecraft实体的逻辑构建模块。所有组件均由Mojang开发并提供给开发者使用。组件可实现多种功能,例如设置实体尺寸或赋予游泳能力等。完整组件列表可参考[官方文档](https://bedrock.dev/docs/stable/Entities)。
|
||||
|
||||
_无法_创建自定义组件。所有组件列表由微软硬编码实现并对外提供。
|
||||
|
||||
需要为实体添加行为时,可通过在`minecraft:entity`对象的`components`属性中插入组件。例如要给实体添加攀爬能力,可插入组件:`"minecraft:can_climb": {}`。
|
||||
|
||||
组件统一采用`"minecraft:<组件名称>": { <参数设置> }`格式。不同类型组件需要设置不同参数。
|
||||
|
||||
以下是实体内的组件应用范例:
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/example.json#minecraft:entity]
|
||||
"components": {
|
||||
"minecraft:type_family": {
|
||||
"family": [
|
||||
"player"
|
||||
]
|
||||
},
|
||||
"minecraft:collision_box": {
|
||||
"width": 0.6,
|
||||
"height": 1.8
|
||||
},
|
||||
"minecraft:can_climb": {},
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
(注意`components`列表_仅_包含组件)
|
||||
|
||||
## 组件组(Component Groups)
|
||||
|
||||
组件组用于整理归类多个组件。通过`事件(events)`可动态添加或移除组件组,从而实现定制化游戏玩法。
|
||||
|
||||
应用示例:
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/example.json#minecraft:entity]
|
||||
"component_groups": {
|
||||
|
||||
//组件组名称
|
||||
"minecraft:cat_persian": {
|
||||
|
||||
//合法的组件列表(可添加多项)
|
||||
"minecraft:variant": {
|
||||
"value": 6
|
||||
},
|
||||
"minecraft:physics": {}
|
||||
},
|
||||
|
||||
//第二个组件组名称
|
||||
"wiki:example_group": {
|
||||
"minecraft:type_family": {
|
||||
"family": [
|
||||
"wiki_is_awesome!"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
所有组件组均为自定义创建,不可直接引用其他实体的组件组。
|
||||
|
||||
在原版Minecraft实体中,组件组使用`minecraft:`前缀命名(如示例中的`minecraft:cat_persian`)。但需特别注意这些_并非_组件。开发者可自由使用任意命名规则,例如上文中的`wiki:example_group`。更多命名空间信息请参阅[此文档](/wiki/concepts/namespaces)。
|
||||
|
||||
放在组件组中的组件不会自动生效,必须通过事件激活才能影响实体行为。多个组件组可同时生效。
|
||||
|
||||
## 事件(Events)
|
||||
|
||||
事件是一种特殊语法,用于在满足条件时通过组件触发添加/移除组件组的操作,从而实现实体的动态行为。
|
||||
|
||||
示例结构:
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/example.json#minecraft:entity#events]
|
||||
"minecraft:ageable_grow_up": { //事件名称
|
||||
"remove": { //需要移除的组件组列表
|
||||
"component_groups": [
|
||||
"minecraft:cat_baby"
|
||||
]
|
||||
},
|
||||
"add": {
|
||||
"component_groups": [
|
||||
"minecraft:cat_adult" //需要添加的组件组列表
|
||||
]
|
||||
}
|
||||
},
|
||||
```
|
||||
:::
|
||||
|
||||
事件与组件组相同,均为完全自定义内容。不可直接照搬其他实体的事件名称(例如`"minecraft:ageable_grow_up"`)。若需类似功能,应自主设计组件组和事件。
|
||||
|
||||
_仅能对组件组进行添加/移除操作_,无法直接操作单个组件。
|
||||
|
||||
当满足某些条件时,特定组件会触发事件。下方示例演示交互功能实现:
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/example.json#minecraft:entity]
|
||||
"components": {
|
||||
"minecraft:interact": {
|
||||
"interactions": [
|
||||
{
|
||||
"on_interact": {
|
||||
"filters": [ //触发条件筛选器
|
||||
{
|
||||
"test":"is_family",
|
||||
"subject": "other",
|
||||
"value": "player" //被交互对象属于玩家
|
||||
}
|
||||
],
|
||||
"target": "self", //作用目标为实体自身
|
||||
"event": "wiki:on_interact" //触发指定事件
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"component_groups": {
|
||||
"wiki:interacted": {
|
||||
"minecraft:scale": { //缩放组件
|
||||
"value": 2
|
||||
}
|
||||
}
|
||||
},
|
||||
"events":{
|
||||
"wiki:on_interact":{ //事件定义
|
||||
"add": {
|
||||
"component_groups": [ "wiki:interacted" ] //添加组件组
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
当玩家与该实体交互时,将触发`"wiki:on_interact"`事件,添加`"wiki:interacted"`组件组,从而激活缩放效果。
|
||||
|
||||
想深入了解事件的更多用法,请参阅[实体事件](/wiki/entities/entity-events)页面。
|
||||
|
||||
<BButton link="/entities/entity-events">实体事件详解</BButton>
|
||||
|
||||
## 原版应用案例
|
||||
|
||||
组件组与事件是原版实体实现自定义行为的核心工具。以下列举部分原版特性应用:
|
||||
|
||||
- 僵尸在水下停留过久后会通过事件转变为溺尸(drowned)
|
||||
|
||||
- 狐狸根据生成环境的不同,采用`minecraft:fox_red`与`minecraft:fox_active`组件组实现毛色变化
|
||||
|
||||
- 末影人使用事件机制实现被注视时进行攻击
|
||||
273
docs/wiki/entities/entity-intro-rp.md
Normal file
273
docs/wiki/entities/entity-intro-rp.md
Normal file
@@ -0,0 +1,273 @@
|
||||
---
|
||||
title: 实体资源包入门指南
|
||||
category: 基础
|
||||
nav_order: 2
|
||||
tags:
|
||||
- 新手教程
|
||||
- 入门指南
|
||||
mentions:
|
||||
- SirLich
|
||||
- MedicalJewel105
|
||||
- Overload1252
|
||||
- ChibiMango
|
||||
- Luthorius
|
||||
- TheItsNameless
|
||||
- SmokeyStack
|
||||
- ThomasOrs
|
||||
---
|
||||
|
||||
# 实体资源包入门指南
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
资源包中的实体文件定义了构成实体视觉效果的各种资源引用,同时包含了如何渲染这些视觉元素的详细逻辑。
|
||||
|
||||
本文将分解实体文件的每个组成部分并进行详细说明。如需创建自定义实体的完整指引,请参考我们的[新手教程](/wiki/guide/custom-entity)。
|
||||
|
||||
## 文件大纲
|
||||
|
||||
::: code-group
|
||||
```json [RP/entity/example.json]
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"minecraft:client_entity": {
|
||||
"description": {
|
||||
"identifier": "wiki:example",
|
||||
"materials": {...},
|
||||
"textures": {...},
|
||||
"geometry": {...},
|
||||
"render_controllers": [...],
|
||||
|
||||
"animations": {...},
|
||||
"scripts": {...},
|
||||
|
||||
"sound_effects": {...},
|
||||
"particle_effects": {...},
|
||||
|
||||
"spawn_egg": {...},
|
||||
"enable_attachables": false,
|
||||
"hide_armor": false
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
尽管看起来复杂,文件中大部分内容都采用**简称定义**模式。简称定义允许我们将资源路径(如材质纹理)或几何体ID等元素映射为简短名称以便后续引用。这种设计既方便后续资源路径变更时集中修改,也使代码保持简洁。
|
||||
|
||||
## 材质系统
|
||||
材质(Materials)决定了纹理的渲染方式。例如骷髅使用透明材质,而末影人的眼睛材质具有自发光特性。大部分情况下可以直接使用预设材质而无需自定义。
|
||||
|
||||
::: code-group
|
||||
```json [RP/entity/spider.entity.json#minecraft:client_entity/description]
|
||||
"materials": {
|
||||
"default": "spider",
|
||||
"invisible": "spider_invisible"
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
这里的`default`和`invisible`是简称,分别指向`spider`和`spider_invisible`材质。需要注意的是单纯的简称定义并不会告知实体何时使用不同材质。
|
||||
|
||||
[预置材质列表](/wiki/documentation/materials)可供参考。[自定义材质教程](/wiki/visuals/materials)适合进阶开发者。
|
||||
|
||||
## 纹理配置
|
||||
纹理(Textures)是映射到模型表面的图像文件。此部分同样使用简称定义系统:
|
||||
|
||||
::: code-group
|
||||
```json [RP/entity/bee.entity.json#minecraft:client_entity/description]
|
||||
"textures": {
|
||||
"default": "textures/entity/bee/bee",
|
||||
"angry": "textures/entity/bee/bee_angry",
|
||||
"nectar": "textures/entity/bee/bee_nectar",
|
||||
"angry_nectar": "textures/entity/bee/bee_angry_nectar"
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
支持定义多状态纹理(如蜜蜂的不同状态),也可叠加纹理层(参考村民的生物群系基底+职业层组合)。详细应用技巧参见[渲染控制器章节](/wiki/entities/render-controllers)。
|
||||
|
||||
## 几何体格式
|
||||
几何体(Geometry)由Blockbench等建模工具生成的骨骼模型文件构成:
|
||||
|
||||
::: code-group
|
||||
```json [RP/entity/creeper.entity.json#minecraft:client_entity/description]
|
||||
"geometry": {
|
||||
"default": "geometry.creeper",
|
||||
"charged": "geometry.creeper.charged"
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
这里的简称指向几何体文件的唯一标识符(JSON文件中的`identifier`字段)。以苦力怕为例,充电与普通状态使用不同模型:
|
||||
|
||||
::: tip
|
||||
模型显示异常时,首要检查简称定义是否存在拼写错误。
|
||||
:::
|
||||
|
||||
## 渲染控制器
|
||||
渲染控制器(Render Controllers)是控制实体渲染方式的核心组件,负责协调材质、纹理和模型的搭配使用:
|
||||
|
||||
::: code-group
|
||||
```json [RP/render_controllers/example.rc.json]
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"render_controllers": {
|
||||
"controller.render.example": {
|
||||
"geometry": "geometry.default",
|
||||
"materials": [{ "*": "material.default" }],
|
||||
"textures": ["texture.default"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
该示例始终使用"default"标识的各类资源。进阶用法可支持动态切换纹理与隐藏模型部件,详情参阅[渲染控制器指南](/wiki/entities/render-controllers)。
|
||||
|
||||
在实体文件中通过标识符指定渲染控制器:
|
||||
|
||||
::: code-group
|
||||
```json [RP/entity/example.json#minecraft:client_entity/description]
|
||||
"render_controllers": ["controller.render.example"]
|
||||
```
|
||||
:::
|
||||
|
||||
最低限度的实体文件须包含材质、纹理、几何体、渲染控制器四个基础模块。
|
||||
|
||||
## 动画系统
|
||||
动画(Animations)定义模型骨骼的运动逻辑,涵盖行走、攻击、视线追踪等交互行为:
|
||||
|
||||
::: code-group
|
||||
```json [RP/animations/example.a.json]
|
||||
{
|
||||
"format_version": "1.8.0",
|
||||
"animations": {
|
||||
"animation.example.walk": {...},
|
||||
"animation.example.attack": {...}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
实体文件中需配置动画简称以便调用:
|
||||
|
||||
::: code-group
|
||||
```json [RP/entity/example.json#minecraft:client_entity/description]
|
||||
"animations": {
|
||||
"walk": "animation.example.walk",
|
||||
"attack": "animation.example.attack",
|
||||
"attack_controller": "controller.animation.example"
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
::: warning 重要提示
|
||||
单单定义动画简称并不能启动动画,需通过脚本系统主动调用。
|
||||
:::
|
||||
|
||||
## 脚本逻辑
|
||||
脚本(Scripts)通过Molang表达式协调动画播放、变量设置、模型缩放等动态行为:
|
||||
|
||||
::: code-group
|
||||
```json [RP/entity/example.json#minecraft:client_entity/description]
|
||||
"scripts": {
|
||||
"initialize": [...],
|
||||
"pre_animation": [...],
|
||||
"animate": [...],
|
||||
"scale": "1"
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 初始化脚本
|
||||
实体生成或加载时执行,适合设置初始变量。
|
||||
|
||||
### 预动画脚本
|
||||
每帧渲染前运行,用于计算动画参数。
|
||||
|
||||
### 动画脚本
|
||||
每帧执行动画控制器和播放逻辑:
|
||||
|
||||
::: code-group
|
||||
```json [RP/entity/example.json#minecraft:client_entity/description]
|
||||
"animate": [
|
||||
"attack_controller",
|
||||
{ "walk": "q.modified_move_speed" }
|
||||
]
|
||||
```
|
||||
:::
|
||||
|
||||
`q.modified_move_speed`将行走速度映射为动画播放速率。数值`2`表示双倍播放,动态公式使动画与实体速度保持同步。
|
||||
|
||||
### 模型缩放
|
||||
`scale`参数支持通过Molang表达式调整模型尺寸:
|
||||
|
||||
::: code-group
|
||||
```json [RP/entity/example.json#minecraft:client_entity/description]
|
||||
"scripts": {
|
||||
"scale": "q.variant",
|
||||
"scaleX": 2,
|
||||
"scaleY": 0.5
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
该示例:
|
||||
- Y轴方向缩放0.5倍
|
||||
- X轴放大2倍
|
||||
- 整体尺寸由变体值决定(`minecraft:variant`组件)
|
||||
|
||||
::: tip 随机尺寸案例
|
||||
`math.random_integer(1,5)`可在初始化时生成1-5的随机缩放系数。
|
||||
:::
|
||||
|
||||
## 音效配置
|
||||
音效简称便于在动画事件中调用:
|
||||
|
||||
::: code-group
|
||||
```json [RP/entity/example.json#minecraft:client_entity/description]
|
||||
"sound_effects": {
|
||||
"attack_1": "mob.entity.attack_1",
|
||||
"attack_2": "mob.entity.attack_2",
|
||||
"attack_3": "mob.entity.attack_3"
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
## 粒子系统
|
||||
粒子简称用于动画事件触发:
|
||||
|
||||
::: code-group
|
||||
```json [RP/entity/example.json#minecraft:client_entity/description]
|
||||
"particle_effects": {
|
||||
"smoke": "wiki:smoke_particle"
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
[自定义粒子教程](/wiki/particles/particles) | [动画效果应用](/wiki/visuals/animation-effects)
|
||||
|
||||
## 生成蛋设置
|
||||
生成蛋(Spawn Egg)支持纯色或自定义纹理两种风格:
|
||||
|
||||
::: code-group 纯色风格
|
||||
```json [RP/entity/example.json#minecraft:client_entity/description]
|
||||
"spawn_egg": {
|
||||
"base_color": "#db7500",
|
||||
"overlay_color": "#242222"
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
::: code-group 定制纹理
|
||||
```json [RP/entity/example.json#minecraft:client_entity/description]
|
||||
"spawn_egg": {
|
||||
"texture": "wiki.example"
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
## 特殊参数
|
||||
- `enable_attachables`(启用配件):控制实体能否持握工具
|
||||
- `hide_armor`(隐藏护甲):允许穿装备但不显示外观
|
||||
191
docs/wiki/entities/entity-movement.md
Normal file
191
docs/wiki/entities/entity-movement.md
Normal file
@@ -0,0 +1,191 @@
|
||||
---
|
||||
title: 实体移动
|
||||
category: 巧思案例
|
||||
mentions:
|
||||
- SirLich
|
||||
- sermah
|
||||
- MedicalJewel105
|
||||
- TheDoctor15
|
||||
---
|
||||
|
||||
# 实体移动
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
在Minecraft中,实体可以通过行走、游泳或飞行的方式在世界中移动。要为实体赋予这些行为能力,通常需要配置多种不同类型的组件。
|
||||
|
||||
阅读本教程时请注意,您的实体至少需要以下组件:
|
||||
|
||||
- [设置移动速度的基础组件](#移动速度)
|
||||
- [定义移动方式的组件(行走/飞行等)](#移动方式)
|
||||
- [设定导航能力的组件,用于生成移动路径](#导航能力)
|
||||
- [控制实体移动时机和方向的AI组件](#人工智能)
|
||||
|
||||
:::tip
|
||||
创建移动实体的最佳方式是从原版行为包中找到类似实体,将其组件配置复制到您的实体中。
|
||||
|
||||
例如像夜魅(Phantom)、恶魂(Ghast)或鹦鹉这类飞行实体,虽然具有完全不同的游戏行为,但它们都是通过基本相似的组件实现移动功能的。建议选择与目标实体最接近的原版生物作为模板。
|
||||
:::
|
||||
|
||||
## 移动速度
|
||||
|
||||
首先需要为实体配置移动速度组件,这些参数决定了实体在世界中的移动快慢。
|
||||
|
||||
| 组件 | 说明 |
|
||||
| ---------------------------------------------------------------------------------------------------- | ----------------------------- |
|
||||
| [minecraft:movement](/wiki/entities/vanilla-usage-components#movement) | 设置基础移动速度(必需组件) |
|
||||
| [minecraft:underwater_movement](/wiki/entities/vanilla-usage-components#underwater-movement) | 设置水下移动速度 |
|
||||
| [minecraft:flying_speed](/wiki/entities/vanilla-usage-components#flying-speed) | 设置空中飞行速度 |
|
||||
|
||||
所有实体必须包含`minecraft:movement`组件。其他两个组件按需添加。
|
||||
|
||||
原版水中生物(如海豚)都包含`underwater_movement`组件。部分飞行生物具有`flying_speed`组件(具体配置因生物而异)。
|
||||
|
||||
## 移动方式
|
||||
|
||||
实体需要配置移动类型组件来定义其基础运动模式。注意每个实体只能选择一种移动类型,请根据实际需求选择最匹配的类型。
|
||||
|
||||
| 组件 | 说明 |
|
||||
| ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
|
||||
| [minecraft:movement.amphibious](https://bedrock.dev/docs/stable/Entities#minecraft%3Amovement.amphibious) | 两栖移动模式,允许同时在水中游泳和陆地行走 |
|
||||
| [minecraft:movement.basic](https://bedrock.dev/docs/stable/Entities#minecraft%3Amovement.basic) | 基础移动模式 |
|
||||
| [minecraft:movement.fly](https://bedrock.dev/docs/stable/Entities#minecraft%3Amovement.fly) | 飞行移动模式 |
|
||||
| [minecraft:movement.generic](https://bedrock.dev/docs/stable/Entities#minecraft%3Amovement.generic) | 通用移动模式,支持多种移动能力 |
|
||||
| [minecraft:movement.hover](https://bedrock.dev/docs/stable/Entities#minecraft%3Amovement.hover) | 悬停移动模式 |
|
||||
| [minecraft:movement.jump](https://bedrock.dev/docs/stable/Entities#minecraft%3Amovement.jump) | 跳跃移动模式,可配置跳跃间隔时间 |
|
||||
| [minecraft:movement.skip](https://bedrock.dev/docs/stable/Entities#minecraft%3Amovement.skip) | 蹦跳移动模式 |
|
||||
| [minecraft:movement.sway](https://bedrock.dev/docs/stable/Entities#minecraft%3Amovement.sway) | 摆动移动模式,模拟水生生物游动姿态 |
|
||||
|
||||
## 移动修正
|
||||
|
||||
下列组件可为实体移动提供额外的物理效果调整,常规情况下不是必须组件,但需要了解其功能。
|
||||
|
||||
| 组件 | 说明 |
|
||||
| ---------------------------------------------------------------------------------------------------- | ------------------------------------------ |
|
||||
| [minecraft:water_movement](https://bedrock.dev/docs/stable/Entities#minecraft%3Awater_movement) | 设置实体在水中的摩擦力 |
|
||||
| [minecraft:rail_movement](https://bedrock.dev/docs/stable/Entities#minecraft%3Arail_movement) | 使实体能够沿轨道移动(限轨道移动) |
|
||||
| [minecraft:friction_modifier](https://bedrock.dev/docs/stable/Entities#minecraft%3Afriction_modifier) | 设置实体陆地移动摩擦力 |
|
||||
|
||||
## 导航能力
|
||||
|
||||
导航组件定义了路径生成规则。每个导航组件都有独特的硬编码逻辑,需要根据实体的具体需求选择最匹配的类型。
|
||||
|
||||
:::tip
|
||||
此组件对实体行为影响重大,建议参考原版生物的配置获取启发
|
||||
:::
|
||||
|
||||
| 组件 | 说明 |
|
||||
| -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
|
||||
| [minecraft:navigation.climb](https://bedrock.dev/docs/stable/Entities#minecraft%3Anavigation.climb) | 允许生成墙面路径(类似蜘蛛的爬墙能力) |
|
||||
| [minecraft:navigation.float](https://bedrock.dev/docs/stable/Entities#minecraft%3Anavigation.float) | 允许空中漂浮移动(类似恶魂的移动方式) |
|
||||
| [minecraft:navigation.generic](https://bedrock.dev/docs/stable/Entities#minecraft%3Anavigation.generic) | 通用导航模式,支持行走、游泳、飞行和攀爬等多种路径生成 |
|
||||
| [minecraft:navigation.fly](https://bedrock.dev/docs/stable/Entities#minecraft%3Anavigation.fly) | 空中飞行导航(类似鹦鹉的飞行路径计算) |
|
||||
| [minecraft:navigation.swim](https://bedrock.dev/docs/stable/Entities#minecraft%3Anavigation.swim) | 水体环境导航 |
|
||||
| [minecraft:navigation.walk](https://bedrock.dev/docs/stable/Entities#minecraft%3Anavigation.walk) | 标准行走导航(类似普通生物的移动逻辑) |
|
||||
|
||||
## 增强组件
|
||||
|
||||
以下是增强实体移动能力的可选组件:
|
||||
|
||||
| 组件 | 说明 |
|
||||
| -------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
|
||||
| [minecraft:annotation.break_door](https://bedrock.dev/docs/stable/Entities#minecraft%3Aannotation.break_door) | 允许实体破坏门(需同时在导航组件中启用) |
|
||||
| [minecraft:annotation.open_door](https://bedrock.dev/docs/stable/Entities#minecraft%3Aannotation.open_door) | 允许实体开门(需同时在导航组件中启用) |
|
||||
| [minecraft:buoyant](https://bedrock.dev/docs/stable/Entities#minecraft%3Abuoyant) | 指定实体可以漂浮的液体类型 |
|
||||
| [minecraft:can_climb](https://bedrock.dev/docs/stable/Entities#minecraft%3Acan_climb) | 允许实体攀爬梯子 |
|
||||
| [minecraft:can_fly](https://bedrock.dev/docs/stable/Entities#minecraft%3Acan_fly) | 标记实体飞行能力(导航系统不会强制要求踏板支撑) |
|
||||
| [minecraft:can_power_jump](https://bedrock.dev/docs/stable/Entities#minecraft%3Acan_power_jump) | 允许进行强力跳跃(类似马匹的跳跃机制) |
|
||||
| [minecraft:floats_in_liquid](https://bedrock.dev/docs/stable/Entities#minecraft%3Afloats_in_liquid) | 使实体能够在液体中漂浮 |
|
||||
| [minecraft:jump.dynamic](https://bedrock.dev/docs/stable/Entities#minecraft%3Ajump.dynamic) | 根据移动速度自动调整跳跃属性 |
|
||||
| [minecraft:jump.static](https://bedrock.dev/docs/stable/Entities#minecraft%3Ajump.static) | 赋予实体基本的跳跃能力 |
|
||||
|
||||
## 人工智能
|
||||
|
||||
导航组件定义了移动方式,而AI目标组件决定移动的时机和目的地。AI目标通过优先级系统(数值越低优先级越高)控制行为选择。
|
||||
|
||||
通常需要叠加多个不同优先级的AI组件来形成自然的行为模式。以下为部分常用AI组件示例:
|
||||
|
||||
| 组件 |
|
||||
| ---------------------------------------------------------------------------------------------------------------------------- |
|
||||
| [minecraft:behavior.random_stroll](https://bedrock.dev/docs/stable/Entities#minecraft%3Abehavior.random_stroll) |
|
||||
| [minecraft:behavior.follow_owner](https://bedrock.dev/docs/stable/Entities#minecraft%3Abehavior.follow_owner) |
|
||||
| [minecraft:behavior.move_to_water](https://bedrock.dev/docs/stable/Entities#minecraft%3Abehavior.move_to_water) |
|
||||
| [minecraft:behavior.stroll_towards_village](https://bedrock.dev/docs/stable/Entities#minecraft%3Abehavior.stroll_towards_village) |
|
||||
|
||||
完整列表请访问[基岩开发文档](https://bedrock.dev/docs/stable/Entities#AI%20Goals)。
|
||||
|
||||
### 路径规划
|
||||
|
||||
实现实体自动寻路是常用需求。推荐使用通过"诱饵实体"(Marker)进行引导的方案。若需要创建诱饵实体,请参考[虚拟实体教程](/wiki/entities/dummy-entities)。
|
||||
|
||||
#### 实现思路
|
||||
|
||||
基本原理是使主实体对诱饵实体产生敌对行为,通过放置诱饵实体引导主实体移动。关键点在于配置正确的组件参数以实现长距离寻路。
|
||||
|
||||
#### 组件配置
|
||||
|
||||
以下配置中需要将`nearest_attackable_target`指向虚体诱饵(需要为诱饵实体设置family_type属性)。同时不要忘记添加常规的移动和导航组件。
|
||||
|
||||
::: code-group
|
||||
```json [标记目标锁定]
|
||||
"minecraft:behavior.nearest_attackable_target": {
|
||||
"priority": 0,
|
||||
"reselect_targets": true,
|
||||
"target_search_height": 1000,
|
||||
"within_radius": 1000,
|
||||
"must_see": false,
|
||||
"entity_types": [
|
||||
{
|
||||
"filters": [
|
||||
{
|
||||
"test": "is_family",
|
||||
"subject": "other",
|
||||
"value": "waypoint_1"
|
||||
}
|
||||
],
|
||||
"max_dist": 1000
|
||||
}
|
||||
]
|
||||
},
|
||||
"minecraft:attack": {
|
||||
"damage": 0
|
||||
},
|
||||
"minecraft:behavior.melee_attack": {
|
||||
"priority": 0,
|
||||
"require_complete_path": true,
|
||||
"track_target": true
|
||||
},
|
||||
"minecraft:follow_range": {
|
||||
"value": 1000,
|
||||
"max": 1000
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
#### 航点到达检测
|
||||
|
||||
使用目标临近传感器检测是否到达标记位置:
|
||||
|
||||
::: code-group
|
||||
```json [临近传感器]
|
||||
"minecraft:target_nearby_sensor": {
|
||||
"inside_range": 2.0,
|
||||
"outside_range": 4.0,
|
||||
"must_see": true,
|
||||
"on_inside_range": {
|
||||
"event": "reached_waypoint"
|
||||
},
|
||||
"on_outside_range": {
|
||||
"event": "not_reached_waypoint"
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
## 其他技巧
|
||||
|
||||
:::tip
|
||||
可通过命令强制触发实体行走动画:
|
||||
`/execute as @e[type=...] at @s run tp @s ^^^0.1`
|
||||
使用这种方式可以实现对实体移动路径的精确控制,并保持自然的动画效果。
|
||||
:::
|
||||
236
docs/wiki/entities/entity-properties.md
Normal file
236
docs/wiki/entities/entity-properties.md
Normal file
@@ -0,0 +1,236 @@
|
||||
---
|
||||
title: 实体属性
|
||||
category: 基础
|
||||
tags:
|
||||
- 实验性
|
||||
mentions:
|
||||
- SirLich
|
||||
- sermah
|
||||
- MedicalJewel105
|
||||
- Luthorius
|
||||
- stirante
|
||||
- TheItsNameless
|
||||
---
|
||||
|
||||
# 实体属性
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
:::warning
|
||||
本文档包含过时信息及实验性内容。如需最新稳定版信息,请查阅[微软官方文档](https://learn.microsoft.com/en-us/minecraft/creator/documents/introductiontoentityproperties)。
|
||||
:::
|
||||
|
||||
本文档介绍在Minecraft基岩版1.16.230.52测试版中加入的新实体属性系统(又称Actor Properties)。实体属性的实现目的是在实体服务端(行为包)高效保存数据或存储数值,无需使用组件或属性(例如"minecraft:variant"),其运作原理类似方块属性。
|
||||
|
||||
## 实体属性定义
|
||||
|
||||
### 定义实体属性
|
||||
|
||||
实体属性定义示例:
|
||||
|
||||
::: code-group
|
||||
```json [实体定义]
|
||||
{
|
||||
"minecraft:entity":{
|
||||
"description":{
|
||||
"identifier":"entity:properties_example",
|
||||
"properties":{
|
||||
"property:number_range_example":{
|
||||
"values":{
|
||||
"min":0,
|
||||
"max":100
|
||||
}
|
||||
},
|
||||
"property:number_enum_example":{
|
||||
"values":[
|
||||
1,
|
||||
2
|
||||
]
|
||||
},
|
||||
"property:string_enum_example":{
|
||||
"values":[
|
||||
"first",
|
||||
"second",
|
||||
"third"
|
||||
]
|
||||
},
|
||||
"property:boolean_enum_example":{
|
||||
"values":[
|
||||
true,
|
||||
false
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 实体属性字段说明
|
||||
|
||||
#### `values`
|
||||
|
||||
:::warning
|
||||
`values`字段为必填项,缺失此字段可能导致属性注册失败。
|
||||
:::
|
||||
|
||||
`values`字段可接受枚举值数组或数值区间(注意当前版本中整数、浮点和布尔枚举最多支持两个值):
|
||||
|
||||
::: code-group
|
||||
```json [数值范围模式]
|
||||
"property:range_example": {
|
||||
"values": {
|
||||
"min": 0,
|
||||
"max": 5
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```json [枚举模式]
|
||||
"property:enum_example":{
|
||||
"values":[
|
||||
1,
|
||||
2
|
||||
]
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
#### `default`
|
||||
|
||||
可通过属性对象内的`default`字段设置属性默认值(默认使用枚举数组的第一个元素):
|
||||
|
||||
::: code-group
|
||||
```json [默认值设置]
|
||||
"property:default_value_example":{
|
||||
"values":[
|
||||
true,
|
||||
false
|
||||
],
|
||||
"default":false
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
如示例所示,当实体生成时该属性会默认为`false`而非`true`。
|
||||
|
||||
#### `client_sync`
|
||||
|
||||
通过设置`client_sync`字段为`true`,可将属性同步到客户端资源包(Resource Pack)使用。默认值为`false`。
|
||||
|
||||
::: code-group
|
||||
```json [客户端同步示例]
|
||||
"property:client_sync_example": {
|
||||
"values": {
|
||||
"min": 0,
|
||||
"max": 20
|
||||
},
|
||||
"client_sync": true
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 操作与访问实体属性
|
||||
|
||||
可通过以下Molang查询访问实体属性:
|
||||
- `q.actor_property`
|
||||
- `q.has_actor_property`
|
||||
|
||||
:::warning
|
||||
这些Molang查询属于实验性功能
|
||||
:::
|
||||
|
||||
可通过`set_actor_property`事件响应设置实体属性值:
|
||||
|
||||
::: code-group
|
||||
```json [事件响应示例]
|
||||
"events":{
|
||||
"event:set_entity_property":{
|
||||
"set_actor_property":{
|
||||
"property:number_enum_example":2,
|
||||
"property:string_enum_example":"'second'",
|
||||
"property:boolean_enum_example":"!q.actor_property('property:boolean_enum_example')"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
## 实体别名系统
|
||||
|
||||
可通过定义实体别名(aliases),在`summon`指令中调用自定义标识符生成带预置属性的实体:
|
||||
|
||||
::: code-group
|
||||
```json [别名定义]
|
||||
{
|
||||
"format_version": "1.16.0",
|
||||
"minecraft:entity": {
|
||||
"description": {
|
||||
"identifier": "entity:properties_example",
|
||||
"is_spawnable": true,
|
||||
"is_summonable": true,
|
||||
"is_experimental": false,
|
||||
"properties": {
|
||||
"property:property_index": {
|
||||
"client_sync": true,
|
||||
"values": {
|
||||
"min": 0,
|
||||
"max": 2
|
||||
},
|
||||
"default": 0
|
||||
}
|
||||
},
|
||||
"aliases": {
|
||||
"entity:default_alias": {},
|
||||
"entity:first_alias": {
|
||||
"property:property_index": 1
|
||||
},
|
||||
"entity:second_alias": {
|
||||
"property:property_index": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
现在通过`/summon entity:first_alias`指令可生成带有`property:property_index=1`属性的实体。
|
||||
|
||||
## 实体动态组件
|
||||
|
||||
实体动态组件(Entity Permutations)可根据属性条件在每个Tick动态应用组件集合。需在`minecraft:entity`对象内与`components`同级添加`permutations`数组:
|
||||
|
||||
::: code-group
|
||||
```json [动态组件示例]
|
||||
"permutations":[
|
||||
{
|
||||
"condition":"q.actor_property('property:string_enum_example') == 'first'",
|
||||
"components":{
|
||||
"minecraft:scale":{
|
||||
"value":1.0
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"condition":"q.actor_property('property:string_enum_example') == 'second'",
|
||||
"components":{
|
||||
"minecraft:scale":{
|
||||
"value":2.0
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"condition":"q.actor_property('property:string_enum_example') == 'third'",
|
||||
"components":{
|
||||
"minecraft:scale":{
|
||||
"value":3.0
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
```
|
||||
:::
|
||||
|
||||
当`property:string_enum_example`属性为"first"时,实体会应用1倍缩放,为"second"时应用2倍缩放,为"third"时则应用3倍缩放。
|
||||
356
docs/wiki/entities/flying-entities.md
Normal file
356
docs/wiki/entities/flying-entities.md
Normal file
@@ -0,0 +1,356 @@
|
||||
---
|
||||
title: 飞行实体的控制方法
|
||||
category: 巧思案例
|
||||
tags:
|
||||
- 配方
|
||||
- 中级
|
||||
mentions:
|
||||
- SirLich
|
||||
- Joelant05
|
||||
- Dreamedc2015
|
||||
- MedicalJewel105
|
||||
- aexer0e
|
||||
- imsolucid
|
||||
- nebulacrab
|
||||
- Luthorius
|
||||
- TheItsNameless
|
||||
---
|
||||
|
||||
# 飞行实体的控制方法
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
无论是制作飞机还是飞龙,为飞行实体添加可控性对于未接触过此类概念的开发者来说都具有挑战性。由于没有"标准"方法来实现飞行操控,本文将展示三种主要的替代方案。
|
||||
|
||||
## 高跳缓降法
|
||||
|
||||
虽然不算严格意义上的"飞行",但通过设置实体高跳跃能力并附加缓降和加速效果是最直接的方式。
|
||||
|
||||
需要给实体添加 `"minecraft:horse.jump_strength"` 组件,该组件可控制跳跃高度并禁用跳跃键下马功能。
|
||||
|
||||
::: code-group
|
||||
```json [组件配置]
|
||||
"minecraft:horse.jump_strength": {
|
||||
"value": 7
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
使用范围值对象可显示蓄力进度条:
|
||||
|
||||
::: code-group
|
||||
```json [蓄力进度条配置]
|
||||
"minecraft:horse.jump_strength": {
|
||||
"value": { "range_min": 0.6, "range_max": 1.2 }
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
通过动画控制器在空中时附加缓降和加速效果:
|
||||
|
||||
(可参考[实体命令动画控制器教程](/animation-controllers/entity-commands))
|
||||
|
||||
::: code-group
|
||||
```json [动画控制器]
|
||||
"controller.animation.dragon.flying":{
|
||||
"states":{
|
||||
"default":{
|
||||
"transitions":[
|
||||
{
|
||||
"jumping":"!q.is_on_ground"
|
||||
}
|
||||
]
|
||||
},
|
||||
"jumping":{
|
||||
"transitions":[
|
||||
{
|
||||
"default":"q.is_on_ground"
|
||||
}
|
||||
],
|
||||
"on_entry":[
|
||||
"/effect @s slow_falling 20000 0 true",
|
||||
"/effect @s speed 20000 10 true"
|
||||
],
|
||||
"on_exit":[
|
||||
"/effect @s clear"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
实体描述符需关联控制器:
|
||||
|
||||
::: code-group
|
||||
```json [实体配置]
|
||||
"description":{
|
||||
"identifier":"wiki:dragon",
|
||||
"is_spawnable":true,
|
||||
"is_summonable":true,
|
||||
"is_experimental":false,
|
||||
"scripts":{
|
||||
"animate":[
|
||||
"flying"
|
||||
]
|
||||
},
|
||||
"animations":{
|
||||
"flying":"controller.animation.dragon.flying"
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
通过调整跳跃力度和速度参数可改变飞行体验,但实体最终仍会下落。
|
||||
|
||||
## 视角控制法
|
||||
|
||||
这是最流行的飞行控制方式,通过检测玩家俯仰角来控制垂直运动。优点是可主动控制升降,缺点是视角转动会影响飞行轨迹。
|
||||
|
||||
使用命令方块检测玩家垂直视角并应用飘浮/缓降效果:
|
||||
|
||||
::: code-group
|
||||
```mcfunction
|
||||
execute @a[rxm=-90,rx=-25] ~~~ effect @e[type=wiki:dragon,r=1] levitation 1 6 true
|
||||
execute @a[rxm=-25,rx=-15] ~~~ effect @e[type=wiki:dragon,r=1] levitation 1 3 true
|
||||
execute @a[rxm=-15,rx=-5] ~~~ effect @e[type=wiki:dragon,r=1] levitation 1 2 true
|
||||
execute @a[rxm=-5,rx=20] ~~~ effect @e[type=wiki:dragon,r=1] levitation 1 1 true
|
||||
execute @a[rxm=20,rx=35] ~~~ effect @e[type=wiki:dragon,r=1] slow_falling 1 1 true
|
||||
execute @a[rxm=35,rx=90] ~~~ effect @e[type=wiki:dragon,r=1] clear
|
||||
```
|
||||
:::
|
||||
|
||||
**注意:根据实体尺寸和坐骑点位置可能需要调整选择器半径 `r` 的数值**
|
||||
|
||||
建议通过动画控制器关联玩家实现持续效果:
|
||||
|
||||
::: code-group
|
||||
```json [玩家动画控制器]
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"animation_controllers": {
|
||||
"controller.animation.base": {
|
||||
"initial_state": "default",
|
||||
"states": {
|
||||
"default": {
|
||||
"transitions": [
|
||||
{
|
||||
"base": "(1.0)"
|
||||
}
|
||||
],
|
||||
"on_entry": [
|
||||
"/function dragon_control"
|
||||
]
|
||||
},
|
||||
"base": {
|
||||
"transitions": [
|
||||
{
|
||||
"default": "(1.0)"
|
||||
}
|
||||
],
|
||||
"on_entry": [
|
||||
"/function dragon_control"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
通过改良版动画控制器维持飞行速度:
|
||||
|
||||
::: code-group
|
||||
```json [改良版速度控制器]
|
||||
"controller.animation.dragon.flying":{
|
||||
"states":{
|
||||
"default":{
|
||||
"transitions":[
|
||||
{
|
||||
"jumping_1":"!q.is_on_ground"
|
||||
}
|
||||
]
|
||||
},
|
||||
"jumping_1":{
|
||||
"transitions":[
|
||||
{
|
||||
"transition_to_default":"q.is_on_ground"
|
||||
},
|
||||
{
|
||||
"jumping_2":"true"
|
||||
}
|
||||
],
|
||||
"on_entry":[
|
||||
"/effect @s speed 15 10 true"
|
||||
]
|
||||
},
|
||||
"jumping_2":{
|
||||
"transitions":[
|
||||
{
|
||||
"transition_to_default":"q.is_on_ground"
|
||||
},
|
||||
{
|
||||
"jumping_1":"true"
|
||||
}
|
||||
],
|
||||
"on_entry":[
|
||||
"/effect @s speed 15 10 true"
|
||||
]
|
||||
},
|
||||
"transition_to_default":{
|
||||
"transitions":[
|
||||
{
|
||||
"transition_to_default":"true"
|
||||
}
|
||||
],
|
||||
"on_entry":[
|
||||
"/effect @s clear"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
添加骑乘检测标签来优化误触发问题:
|
||||
|
||||
::: code-group
|
||||
```json [骑乘检测控制器]
|
||||
"controller.animation.dragon.test_rider":{
|
||||
"states":{
|
||||
"default":{
|
||||
"transitions":[
|
||||
{
|
||||
"has_rider":"q.has_rider"
|
||||
}
|
||||
]
|
||||
},
|
||||
"has_rider":{
|
||||
"transitions":[
|
||||
{
|
||||
"default":"!q.has_rider"
|
||||
}
|
||||
],
|
||||
"on_entry":[
|
||||
"/tag @s add has_rider"
|
||||
],
|
||||
"on_exit":[
|
||||
"/tag @s remove has_rider"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
对应调整命令选择器:
|
||||
|
||||
::: code-group
|
||||
```mcfunction
|
||||
execute @a[rxm=-90,rx=-25] ~~~ effect @e[type=wiki:dragon,r=1,tag=has_rider] levitation 1 6 true
|
||||
execute @a[rxm=-25,rx=-15] ~~~ effect @e[type=wiki:dragon,r=1,tag=has_rider] levitation 1 3 true
|
||||
execute @a[rxm=-15,rx=-5] ~~~ effect @e[type=wiki:dragon,r=1,tag=has_rider] levitation 1 2 true
|
||||
execute @a[rxm=-5,rx=20] ~~~ effect @e[type=wiki:dragon,r=1,tag=has_rider] levitation 1 1 true
|
||||
execute @a[rxm=20,rx=35] ~~~ effect @e[type=wiki:dragon,r=1,tag=has_rider] slow_falling 1 1 true
|
||||
execute @a[rxm=35,rx=90] ~~~ effect @e[type=wiki:dragon,r=1,tag=has_rider] clear
|
||||
```
|
||||
:::
|
||||
|
||||
## 跳跃键控制法
|
||||
|
||||
通过跳跃键实现升降控制:按住跳跃上升,松开自动下降。
|
||||
|
||||
首先禁用默认跳跃功能:
|
||||
|
||||
::: code-group
|
||||
```json [实体组件配置]
|
||||
"minecraft:horse.jump_strength": {
|
||||
"value": 0
|
||||
},
|
||||
"minecraft:can_power_jump": {}
|
||||
```
|
||||
:::
|
||||
|
||||
创建响应跳跃输入的动画控制器:
|
||||
|
||||
::: code-group
|
||||
```json [跳跃键控制器]
|
||||
"controller.animation.fly_dragon":{
|
||||
"initial_state":"falling",
|
||||
"states":{
|
||||
"falling":{
|
||||
"on_entry":[
|
||||
"/effect @e[type=wiki:dragon,r=1,c=1] levitation 0"
|
||||
],
|
||||
"transitions":[
|
||||
{
|
||||
"rising":"q.is_jumping"
|
||||
}
|
||||
]
|
||||
},
|
||||
"rising":{
|
||||
"on_entry":[
|
||||
"/effect @e[type=wiki:dragon,r=1,c=1] levitation 100000 6 true"
|
||||
],
|
||||
"transitions":[
|
||||
{
|
||||
"falling":"!q.is_jumping"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
需修改玩家行为文件(需从[官方模板包](https://aka.ms/behaviorpacktemplate)获取)并添加控制器:
|
||||
|
||||
::: code-group
|
||||
```json [玩家配置文件]
|
||||
"description":{
|
||||
"identifier":"minecraft:player",
|
||||
"is_spawnable":false,
|
||||
"is_summonable":false,
|
||||
"animations":{
|
||||
"fly_dragon":"controller.animation.fly_dragon"
|
||||
},
|
||||
"scripts":{
|
||||
"animate":[
|
||||
{
|
||||
"fly_dragon":"q.is_riding"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
添加离鞍状态复位控制器:
|
||||
|
||||
::: code-group
|
||||
```json [离鞍复位控制器]
|
||||
"controller.animation.reset_levitation":{
|
||||
"initial_state":"no_rider",
|
||||
"states":{
|
||||
"no_rider":{
|
||||
"transitions":[
|
||||
{
|
||||
"has_rider":"q.has_rider"
|
||||
}
|
||||
]
|
||||
},
|
||||
"has_rider":{
|
||||
"on_exit":[
|
||||
"/effect @s levitation 0"
|
||||
],
|
||||
"transitions":[
|
||||
{
|
||||
"no_rider":"!q.has_rider"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
10
docs/wiki/entities/index.md
Normal file
10
docs/wiki/entities/index.md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: 实体 Entities
|
||||
categories:
|
||||
- title: 基础
|
||||
color: blue
|
||||
- title: 巧思案例
|
||||
color: green
|
||||
- title: 文档
|
||||
color: red
|
||||
---
|
||||
82
docs/wiki/entities/introduction-to-aec.md
Normal file
82
docs/wiki/entities/introduction-to-aec.md
Normal file
@@ -0,0 +1,82 @@
|
||||
---
|
||||
title: AOE云区域效果介绍
|
||||
category: 巧思案例
|
||||
tags:
|
||||
- 中阶
|
||||
mentions:
|
||||
- Sprunkles137
|
||||
- MedicalJewel105
|
||||
---
|
||||
|
||||
# AOE云区域效果介绍
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
**区域效果云**(Area-of-effect clouds),在内部也被称为AOE云或`minecraft:area_effect_cloud`,是一种具有独特属性的特殊实体。这些实体通常通过投掷滞留药水生成,但借助结构文件和NBT编辑魔法,我们可以在地图制作中以极其强大的方式操控它们。
|
||||
|
||||
## 概述
|
||||
|
||||
区域效果云具备以下可被利用的特性:
|
||||
|
||||
- 作为[虚拟实体](/wiki/entities/dummy-entities),它们在性能表现优异,几乎不影响帧率,且完全静态且不与世界发生碰撞。这使其非常适用于需要围绕玩家或精确定位的场景。
|
||||
- 不会向客户端发送更新。生成后视觉上会定格在初始位置直至消失,但仍可通过指令自由移动。
|
||||
- 能以高度可配置的方式施加任何药水效果(精准到游戏刻的持续时间设定,调节环境效果、屏幕提示显示、粒子发射等属性)。
|
||||
- 具有运行时标识符`minecraft:area_effect_cloud`的实体将继承相同属性。
|
||||
|
||||
## 方法一:投射物组件
|
||||
|
||||
投射物组件支持在命中时生成区域效果云。Minecraft正是通过此机制实现投掷滞留药水生成AOE云。
|
||||
|
||||
[投射物组件文档](/wiki/documentation/projectiles#spawn-aoe-cloud)
|
||||
|
||||
## 方法二:NBT编辑
|
||||
|
||||
另一种方式是通过结构文件生成区域效果云。这使我们可以更精细控制云效果属性。首先需要准备合适的NBT编辑工具。
|
||||
|
||||
### NBT编辑器
|
||||
|
||||
推荐使用以下任一NBT编辑器:
|
||||
|
||||
- [NBT Studio](https://github.com/tryashtar/nbt-studio)(由tryashtar开发的独立程序)
|
||||
- [NBT Viewer](https://marketplace.visualstudio.com/items?itemName=Misodee.vscode-nbt)(由Misode开发的VSCode扩展)
|
||||
|
||||
### 结构文件
|
||||
|
||||
本文包含预制的结构文件可供下载使用。文件内设置了一个存在时间最大化的AOE云效果。
|
||||
|
||||
::: code-group
|
||||
```json [点击下载MCSTRUCTURE文件]
|
||||
```
|
||||
:::
|
||||
|
||||
结构文件编辑指南请参考:[.mcstructure文件解析](/wiki/nbt/mcstructure)
|
||||
|
||||
### NBT数据格式
|
||||
|
||||
| 字段 | 类型 | 说明
|
||||
| --------------------- | ------- | -------------
|
||||
| Duration | 整型 | 效果云存在总时长(单位:刻)
|
||||
| DurationOnUse | 整型 | 应用效果后持续时间的增量
|
||||
| InitialRadius | 浮点型 | 初始生成时的半径
|
||||
| ParticleColor | 整型 | 粒子颜色(十进制数值)
|
||||
| ParticleId | 整型 | 发射的粒子类型ID(0表示无粒子)
|
||||
| PotionId | 短整型 | 药水效果ID(创建时使用,无实质效果)
|
||||
| RadiusChangeOnPickup | 浮点型 | (未知用途)
|
||||
| RadiusOnUse | 浮点型 | 应用效果后的半径变化量
|
||||
| RadiusPerTick | 浮点型 | 每刻半径的变化量
|
||||
| ReapplicationDelay | 整型 | 两次效果应用的最小间隔(刻)
|
||||
| mobEffects | 列表 | 实体携带的药水效果配置
|
||||
|
||||
以下是`mobEffects`标签的参数说明:
|
||||
|
||||
| 字段 | 类型 | 说明
|
||||
| ------------------------------- | ------- | -------------
|
||||
| Ambient | 字节 | 效果粒子是否为半透明形态
|
||||
| Amplifier | 字节 | 效果强度等级(0表示I级)
|
||||
| DisplayOnScreenTextureAnimation | 字节 | (未知用途)
|
||||
| Duration | 整型 | 效果持续时间(刻)
|
||||
| DurationEasy | 整型 | (未知用途,疑似未使用)
|
||||
| DurationNormal | 整型 | (未知用途,疑似未使用)
|
||||
| DurationHard | 整型 | (未知用途,疑似未使用)
|
||||
| Id | 字节 | 药水效果类型ID
|
||||
| ShowParticles | 字节 | 是否显示效果粒子
|
||||
71
docs/wiki/entities/invulnerable-entities.md
Normal file
71
docs/wiki/entities/invulnerable-entities.md
Normal file
@@ -0,0 +1,71 @@
|
||||
---
|
||||
title: 无敌实体
|
||||
category: 巧思案例
|
||||
tags:
|
||||
- beginner
|
||||
mentions:
|
||||
- SirLich
|
||||
- Joelant05
|
||||
- solvedDev
|
||||
- MedicalJewel105
|
||||
---
|
||||
|
||||
# 无敌实体
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
## 使用伤害传感器组件
|
||||
|
||||
禁用实体伤害的最佳且最灵活的方式是使用 `minecraft:damage_sensor` 组件。该组件允许我们通过 `filters` 过滤器来指定哪些伤害源可以作用于实体。
|
||||
|
||||
了解这个组件的最好方法是查阅原版伤害传感器示例或阅读[官方文档](https://bedrock.dev/docs/stable/Entities#minecraft:damage_sensor)
|
||||
|
||||
### 完全无敌的实体
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/entity.json#minecraft:entity/components]
|
||||
"minecraft:damage_sensor": {
|
||||
"triggers": {
|
||||
"cause": "all", // 捕捉全部伤害类型
|
||||
"deals_damage": false // 取消实际伤害效果
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 禁止玩家伤害
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/entity.json#minecraft:entity/components]
|
||||
"minecraft:damage_sensor": {
|
||||
"triggers": {
|
||||
"on_damage": { // 当受到伤害时触发
|
||||
"filters": { // 过滤器配置
|
||||
"test": "is_family", // 检测对象类型
|
||||
"subject": "other", // 检测施加伤害的主体
|
||||
"value": "player" // 当伤害来源为玩家时生效
|
||||
}
|
||||
},
|
||||
"deals_damage": false // 取消实际伤害效果
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
## 最低生命值限制
|
||||
|
||||
通过 `minecraft:health` 组件中的 `min`(最小值)属性,我们可以创建无法自然死亡的无敌实体(即使使用 `/kill @e` 命令也无法清除)。需要注意的是该方案可能引发后续问题——这类实体会永久驻留世界。
|
||||
|
||||
如果使用此方案,**请务必配置备用清除机制**。例如通过环境传感器组件、计时器组件或互动组件触发的 `minecraft:instant_despawn` 事件实现清除,也可以通过执行 `/event` 命令手动触发。
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/entity.json#minecraft:entity/components]
|
||||
"minecraft:health": {
|
||||
"value": 1, // 当前生命值
|
||||
"max": 1, // 最大生命值
|
||||
"min": 1 // 生命值下限(设置为与max相等将保持血量恒定)
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
> **技术提示**:将该值设置为0可能会导致部分死亡和重生动画/粒子效果无法正常显示。
|
||||
51
docs/wiki/entities/look-at-entity.md
Normal file
51
docs/wiki/entities/look-at-entity.md
Normal file
@@ -0,0 +1,51 @@
|
||||
---
|
||||
title: 看向实体
|
||||
category: 巧思案例
|
||||
tags:
|
||||
- 中级
|
||||
mentions:
|
||||
- shanewolf38
|
||||
- MedicalJewel105
|
||||
- TheItsNameless
|
||||
- SmokeyStack
|
||||
---
|
||||
|
||||
# 看向实体
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
以下教程提供了一种资源包方法,用于检测玩家何时看向实体。下方代码必须放置在会被玩家注视的实体文件中,并通过变量`v.look_at_entity`返回true值来指示实体当前是否被注视。
|
||||
|
||||
## 变量
|
||||
|
||||
::: code-group
|
||||
```json [RP/entity/mob.entity.json]
|
||||
"pre_animation": [
|
||||
"v.look_at_entity = Math.abs(Math.abs(q.rotation_to_camera(1) - q.camera_rotation(1)) - 180) < (20 / q.distance_from_camera) && Math.abs(q.rotation_to_camera(0) + q.camera_rotation(0)) < (10 / q.distance_from_camera);"
|
||||
],
|
||||
```
|
||||
|
||||
:::tip 补充说明
|
||||
由于查询参数`q.rotation_to_camera`基于实体的原点(脚部位置),垂直检测范围将围绕实体底部进行计算。下方代码通过创建经过位置偏移修正的垂直角度变量,使垂直检测范围能够基于实体中心进行计算。
|
||||
:::
|
||||
|
||||
::: code-group
|
||||
```json [RP/entity/mob.entity.json]
|
||||
"pre_animation": [
|
||||
"v.rotation_to_camera_0 = -Math.atan2(-q.distance_from_camera * Math.sin(q.rotation_to_camera(0)) - 1, q.distance_from_camera * Math.cos(q.rotation_to_camera(0)));",
|
||||
"v.look_at_entity = Math.abs(Math.abs(q.rotation_to_camera(1) - q.camera_rotation(1)) - 180) < (20 / q.distance_from_camera) && Math.abs(v.rotation_to_camera_0 + q.camera_rotation(0)) < (60 / q.distance_from_camera);"
|
||||
],
|
||||
```
|
||||
|
||||
## 参数调整
|
||||
当前代码主要适配标准Minecraft生物规格(1×2方块)。如需适配不同尺寸的实体,需要调整以下参数:
|
||||
- 数值 `-1` 控制生物中心位置偏移量(负值向上,正值向下)
|
||||
- 数值 `20` 控制水平角度敏感度
|
||||
- 数值 `60` 控制垂直角度敏感度
|
||||
|
||||
## 实现原理
|
||||
该变量的工作原理是检测两种旋转角度是否相反:
|
||||
1. 实体需要转向玩家的旋转角度
|
||||
2. 玩家需要转向实体的旋转角度
|
||||
|
||||
通过对比水平和垂直方向的角度差值(数值大小通过相机与实体的距离进行动态缩放),即可精确判定注视状态。
|
||||
140
docs/wiki/entities/non-mob-runtime-identifiers.md
Normal file
140
docs/wiki/entities/non-mob-runtime-identifiers.md
Normal file
@@ -0,0 +1,140 @@
|
||||
---
|
||||
title: 非生物运行时标识符
|
||||
category: 文档
|
||||
mentions:
|
||||
- Ciosciaa
|
||||
- SmokeyStack
|
||||
- ThomasOrs
|
||||
---
|
||||
|
||||
# 非生物运行时标识符
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
_最后更新于1.19.10 版本_
|
||||
|
||||
非生物实体是用于游戏机制或实用功能的不常规实体。典型示例包括抛射物、运输类实体以及模拟方块的实体。这些运行时标识符的属性与普通生物实体有根本性不同,其特殊属性在某些场景下可能具有实用价值。
|
||||
|
||||
## 总览
|
||||
### 服务端属性
|
||||
| 属性 | 已注册 | 可配置行为 | 可配置碰撞箱 | 可配置方块碰撞 | 可配置重力 | 可配置实体推动性 | 可配置活塞推动性 | 支持传送门 | 生命值类型 | 可受伤害 | 可燃性 | 可击退 | 受效果影响 | 可选择 | 可挂钩 | 可锁定 | 可作为抛射体 | 可沿轨道移动 | 自动骑乘 | 可配置战利品 | 生成行为 |
|
||||
|------------------------------------------------------------|--------|------------|--------------|----------------|------------|------------------|------------------|------------|-------------------|----------|--------|--------|------------|--------|--------|--------|--------------|--------------|----------|--------------|----------------|
|
||||
| `minecraft:arrow` | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | 无 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ⚠️ | ✅ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:thrown_trident` | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | 无 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ⚠️ | ✅ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:snowball` | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ⚠️ | ✅ | ❌ | ✅ | 抛射物 |
|
||||
| `minecraft:egg` | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ⚠️ | ✅ | ❌ | ✅ | 抛射物 |
|
||||
| `minecraft:splash_potion` & `minecraft:lingering_potion` | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ⚠️ | ✅ | ❌ | ✅ | 抛射物 |
|
||||
| `minecraft:ice_bomb` | ⚠️ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ⚠️ | ✅ | ❌ | ✅ | 抛射物 |
|
||||
| `minecraft:llama_spit` | ✅ | ❌ | ⚠️ | ✅ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ✅ | ❌ | ❌ | ⚠️ | ⚠️ | ❌ | ⚠️ | ✅ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:fireball` | ✅ | ❌ | ⚠️ | ✅ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ✅ | ❌ | ❌ | ⚠️ | ⚠️ | ❌ | ⚠️ | ✅ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:small_fireball` | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ⚠️ | ✅ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:shulker_bullet` | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ❌ | ❌ | ❌ | ⚠️ | ⚠️ | ❌ | ⚠️ | ✅ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:dragon_fireball` | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ⚠️ | ✅ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:wither_skull` & `minecraft:wither_skull_dangerous` | ✅ | ❌ | ⚠️ | ✅ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ❌ | ❌ | ❌ | ⚠️ | ⚠️ | ❌ | ⚠️ | ✅ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:ender_pearl` | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ⚠️ | ✅ | ❌ | ✅ | 抛射物 |
|
||||
| `minecraft:fishing_hook` | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ | ❌ | 🐛 | 无 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ⚠️ | ✅ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:xp_bottle` | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ⚠️ | ✅ | ❌ | ✅ | 抛射物 |
|
||||
| `minecraft:boat` & `minecraft:chest_boat` | ✅ | ❌ | ✅ | ✅ | ⚠️ | ✅ | ❌ | ✅ | 结构完整性 | ✅ | ✅ | ❌ | ❌ | ✅ | ⚠️ | ❌ | ✅ | ⚠️ | ❌ | ⚠️ | 目标表面 |
|
||||
| `minecraft:minecart` & 变种 | ✅ | ❌ | ✅ | ❌ | ⚠️ | ❌ | ✅ | ✅ | 结构完整性 | ✅ | ✅ | ❌ | ❌ | ✅ | ⚠️ | ❌ | ⚠️ | ✅ | ❌ | ⚠️ | 轨道 |
|
||||
| `minecraft:balloon` | ⚠️ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ⚠️ | ✅ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:tnt` | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | 无 | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ✅ | ⚠️ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:armor_stand` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 结构完整性 | ⚠️ | ✅ | ❌ | ✅ | ✅ | ✅ | ⚠️ | ✅ | ⚠️ | ✅ | ⚠️ | 目标表面 |
|
||||
| `minecraft:painting` | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ⚠️ | 无 | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ⚠️ | 目标表面 |
|
||||
| `minecraft:falling_block` | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | 无 | ⚠️ | ✅ | ❌ | ❌ | ⚠️ | ⚠️ | ❌ | 🐛 | ❌ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:ender_crystal` | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ✅ | ❌ | ❌ | ⚠️ | ⚠️ | ❌ | ⚠️ | ❌ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:leash_knot` | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ⚠️ | 无 | ✅ | ❌ | ❌ | ❌ | ⚠️ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | 轨道 |
|
||||
| `minecraft:chalkboard` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 生命值 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⚠️ | ✅ | ✅ | 目标表面 |
|
||||
| `minecraft:tripod_camera` | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 生命值 | ❌ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ⚠️ | ✅ | ✅ | 目标表面 |
|
||||
| `minecraft:area_effect_cloud` | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❓ | ❌ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:lightning_bolt` | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ⚠️ | ❌ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:evocation_fang` | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ⚠️ | ❌ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:item` | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | 物品 | ❌ | ⚠️ | ❌ | ❌ | ❌ | ❌ | ❌ | ❓ | ⚠️ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:xp_orb` | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ⚠️ | ❌ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:fireworks_rocket` | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | 无 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ⚠️ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:eye_of_ender_signal` | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | 无 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ⚠️ | ✅ | ❌ | ✅ | 目标表面 |
|
||||
| `minecraft:elder_guardian_ghost` | ✅ | ⚠️ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 生命值 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 目标表面 |
|
||||
| `minecraft:npc` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 生命值 | ❌ | ✅ | ⚠️ | ❌ | ✅ | ❌ | ✅ | ✅ | ⚠️ | ❌ | ❌ | 目标表面 |
|
||||
| `minecraft:agent` | ❌ | ❌ | ⚠️ | ❌ | ❌ | ❌ | ✅ | ✅ | 生命值 | ✅ | ✅ | ❌ | ❌ | ⚠️ | ⚠️ | ✅ | ❌ | ✅ | ❌ | ⚠️ | 目标表面 |
|
||||
| `minecraft:shield` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 生命值 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⚠️ | ✅ | ✅ | 目标表面 |
|
||||
|
||||
### 客户端属性
|
||||
| 属性 | 客户端实体 | 位置更新 | 插值移动 | 面向方向 | 阴影 | 死亡效果 | 踏步音效 |
|
||||
|------------------------------------------------------------|------------|----------|----------|----------|------|----------|----------|
|
||||
| `minecraft:arrow` | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:thrown_trident` | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ |
|
||||
| `minecraft:snowball` | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:egg` | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:splash_potion` & `minecraft:lingering_potion` | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:ice_bomb` | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:llama_spit` | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ |
|
||||
| `minecraft:fireball` | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:small_fireball` | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:shulker_bullet` | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ |
|
||||
| `minecraft:dragon_fireball` | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:wither_skull` & `minecraft:wither_skull_dangerous` | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:ender_pearl` | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:fishing_hook` | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ |
|
||||
| `minecraft:xp_bottle` | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:boat` & `minecraft:chest_boat` | ✅ | ✅ | ❌ | ❌ | ⚠️ | ❌ | ❌ |
|
||||
| `minecraft:minecart` & 变种 | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:balloon` | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ |
|
||||
| `minecraft:tnt` | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:armor_stand` | ✅ | ✅ | ✅ | ✅ | ❌ | ⚠️ | ✅ |
|
||||
| `minecraft:painting` | ❌ | ✅ | ❓ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:falling_block` | ⚠️ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:ender_crystal` | ✅ | ❌ | ❌ | ❌ | ⚠️ | ❌ | ❌ |
|
||||
| `minecraft:leash_knot` | ✅ | ✅ | ❓ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:chalkboard` | ✅ | ✅ | ✅ | ⚠️ | ✅ | ✅ | ✅ |
|
||||
| `minecraft:tripod_camera` | ✅ | ✅ | ✅ | ✅ | ⚠️ | ✅ | ✅ |
|
||||
| `minecraft:area_effect_cloud` | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:lightning_bolt` | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:evocation_fang` | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:item` | ❌ | ✅ | ✅ | ❌ | ⚠️ | ❌ | ❌ |
|
||||
| `minecraft:xp_orb` | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:fireworks_rocket` | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
|
||||
| `minecraft:eye_of_ender_signal` | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ |
|
||||
| `minecraft:elder_guardian_ghost` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
|
||||
| `minecraft:npc` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| `minecraft:agent` | ⚠️ | ✅ | ❓ | ⚠️ | ⚠️ | ✅ | ✅ |
|
||||
| `minecraft:shield` | ✅ | ✅ | ✅ | ⚠️ | ✅ | ✅ | ✅ |
|
||||
|
||||
## 属性定义与章节说明
|
||||
本文档中使用的属性定义用于描述特定运行时标识符实体的行为特征。每个属性配有一个值及可能的附加说明,用以强调关联定义的异常情况。
|
||||
|
||||
大多数属性使用表情符号简短表达:
|
||||
| 值 | 说明 |
|
||||
|:---:|-------------------------------------------------------------------------|
|
||||
| ✅ | **激活/可用**<br>该属性在当前运行时标识符实体上通常处于活跃或可用状态。附加说明为特殊情况提供说明。 |
|
||||
| ⚠️ | **需警告**<br>该属性在特定条件下可用。标有此符号的属性可能需要特别处理。附加说明会细化具体例外情况。 |
|
||||
| ❌ | **未激活/不可用**<br>该属性在当前运行时标识符实体上不可用。附加说明会阐述实体如何处理该属性。 |
|
||||
| ❓ | **未知**<br>该属性的具体行为在当前上下文中尚未明确。 |
|
||||
| 🐛 | **存在漏洞**<br>该属性激活时会导致崩溃或其他错误。附加说明会具体描述漏洞触发条件。 |
|
||||
|
||||
### NBT扩展字段
|
||||
此部分列出该运行时标识符实体专用的NBT字段(其他实体不使用),字段用途通常在本体注释中说明。
|
||||
|
||||
### 特殊查询
|
||||
若Molang查询在当前运行时标识符上有特殊行为,则会在此说明。所有查询在服务端和客户端均可使用。
|
||||
|
||||
### 硬编码变量
|
||||
本节列出该运行时标识符绑定的硬编码Molang变量(若无声明则为未定义)。所有这些变量服务端和客户端均可使用。
|
||||
|
||||
### 特效
|
||||
本节描述与实体绑定的硬编码粒子或音效。除`minecraft:fireworks_rocket`外,其他效果可通过修改粒子/音效定义进行配置。
|
||||
|
||||
### 服务端属性
|
||||
服务端属性描述实体核心行为机制,包含位置、状态和交互等正规信息。
|
||||
|
||||
**已注册**
|
||||
当实体可通过`/summon`生成且`type`选择器能选中时视为已注册。只要`is_spawnable`为`true`,生成蛋始终可用。
|
||||
|
||||
**可配置行为**
|
||||
若为是,则该实体可使用通用行为组件(如`minecraft:behavior.panic`)。
|
||||
|
||||
**可配置碰撞箱**
|
||||
此属性激活时,`minecraft:collision_box`生效。某些运行时标识符会强制应用固定碰撞箱或修改碰撞箱计算方式。
|
||||
|
||||
**可配置方块碰撞**
|
||||
当激活时,`minecraft:physics`的`has_collision`生效。若实体声明了`minecraft:projectile`组件,此属性仍标记为活跃。
|
||||
|
||||
(由于长度限制,完整翻译内容超过单次响应限制,将分次响应。)
|
||||
337
docs/wiki/entities/npc-dialogs.md
Normal file
337
docs/wiki/entities/npc-dialogs.md
Normal file
@@ -0,0 +1,337 @@
|
||||
---
|
||||
title: NPC 对话框
|
||||
category: 基础
|
||||
tags:
|
||||
- 中级
|
||||
参与贡献:
|
||||
- kyleplo
|
||||
- StuartDA
|
||||
- MedicalJewel105
|
||||
- SirLich
|
||||
- solvedDev
|
||||
- omuhu
|
||||
- Sprunkles137
|
||||
- ThomasOrs
|
||||
---
|
||||
|
||||
# NPC 对话框
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
非玩家角色(NPC)是类似村民的实体,可通过对话框显示消息并提供多个交互按钮。最初设计用于冒险地图,随着 `/dialogue` 命令的引入,现在也能在常规附加包中使用。
|
||||
|
||||
## 对话框文件
|
||||
|
||||
NPC 对话数据存储于行为包根目录下 `dialogue` 文件夹内的 `.diag.json` 文件中。基础模板示例如下:
|
||||
|
||||
::: code-group
|
||||
```json [dialogue/example.diag.json]
|
||||
{
|
||||
"format_version": "1.17",
|
||||
"minecraft:npc_dialogue": {
|
||||
"scenes": [
|
||||
{
|
||||
"scene_tag": "example",
|
||||
"npc_name": "Steve",
|
||||
"text": "你好"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
每个场景包含以下可配置参数:
|
||||
|
||||
#### scene_tag
|
||||
|
||||
场景唯一标识符,用于指定具体场景。
|
||||
|
||||
#### npc_name
|
||||
|
||||
NPC 显示名称。若省略,则使用 NPC 实体名称(默认为`§eNPC`)。
|
||||
|
||||
#### text
|
||||
|
||||
显示在对话框中的文本(可选)。
|
||||
|
||||
#### on_open_commands
|
||||
|
||||
打开对话框时执行的命令列表(可选)。
|
||||
|
||||
::: code-group
|
||||
```json
|
||||
"on_open_commands": [
|
||||
"/say 你好"
|
||||
]
|
||||
```
|
||||
:::
|
||||
|
||||
#### on_close_commands
|
||||
|
||||
关闭对话框时执行的命令列表(可选)。
|
||||
|
||||
::: code-group
|
||||
```json
|
||||
"on_close_commands": [
|
||||
"/say 再见"
|
||||
]
|
||||
```
|
||||
:::
|
||||
|
||||
#### buttons
|
||||
|
||||
对话框中显示的按钮配置(可选)。
|
||||
|
||||
::: code-group
|
||||
```json
|
||||
"buttons": [
|
||||
{
|
||||
"name": "按钮一",
|
||||
"commands": [
|
||||
"/say 按钮一被点击了!"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "按钮二",
|
||||
"commands": [
|
||||
"/say 按钮二被点击了!",
|
||||
"/say 第二段命令示例"
|
||||
]
|
||||
}
|
||||
]
|
||||
```
|
||||
:::
|
||||
|
||||
## 玩家选择器
|
||||
|
||||
在 `on_open_commands`、`on_close_commands` 和各按钮的 `commands` 中可使用本地选择器 `@p`,但会以 NPC 实体为中心选择。特殊选择器 `@initiator` 可始终指向触发对话框的玩家。
|
||||
|
||||
::: code-group
|
||||
```json
|
||||
"buttons": [
|
||||
{
|
||||
"name": "获得漂浮效果",
|
||||
"commands": [
|
||||
"/effect @initiator levitation"
|
||||
]
|
||||
}
|
||||
]
|
||||
```
|
||||
:::
|
||||
|
||||
注意:`@initiator` 专用于 NPC 对话框,不可在其他场景使用。
|
||||
|
||||
## 文本本地化
|
||||
|
||||
可通过翻译键实现多语言支持:
|
||||
|
||||
::: code-group
|
||||
```json
|
||||
"npc_name": {
|
||||
"rawtext": [
|
||||
{
|
||||
"translate": "entity.endermite.name"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
:::
|
||||
需在资源包语言文件中定义对应翻译键,例如 `entity.endermite.name` 对应中文为"末影螨"。
|
||||
|
||||
## 打开对话框
|
||||
|
||||
使用 `/dialogue` 命令开启对话框:
|
||||
```
|
||||
/dialogue open <npc: 目标> <player: 目标> [场景名称:string]
|
||||
```
|
||||
- `<npc: 目标>`:需携带 `minecraft:npc` 组件的实体(如原版 NPC)
|
||||
- `<player: 目标>`:目标玩家
|
||||
- `[场景名称:string]`:指定 `scene_tag`(若省略则显示上一个场景)
|
||||
|
||||
示例命令:
|
||||
```
|
||||
/dialogue open @e[type=npc,c=1] @p example
|
||||
```
|
||||
|
||||
## 切换对话框
|
||||
|
||||
使用以下语法变更 NPC 默认对话框:
|
||||
```
|
||||
/dialogue change <npc: 目标> <场景名称:string> [player: 目标]
|
||||
```
|
||||
- `<场景名称:string>`:指定新场景的 `scene_tag`
|
||||
- `[player: 目标]`:指定生效玩家(若省略则影响所有人)
|
||||
|
||||
示例命令:
|
||||
```
|
||||
/dialogue change @e[type=npc,c=1] example @r
|
||||
```
|
||||
|
||||
## 完整范例
|
||||
|
||||
本节演示创建具有传送功能的道具和对话系统(完整源码可参见[GitHub](https://github.com/Llama-Studios/dialog-demo))。
|
||||
|
||||
### 创建 NPC 实体
|
||||
|
||||
即使隐藏 NPC,也需要通过常加载区域保持存在:
|
||||
|
||||
::: code-group
|
||||
```mcfunction [functions/setup.mcfunction]
|
||||
tickingarea add 0 1 0 0 2 0
|
||||
summon npc "§r" 0 1 0
|
||||
```
|
||||
:::
|
||||
|
||||
:::tip
|
||||
可通过玩家实体触发对话框:
|
||||
1. 为玩家添加 `minecraft:npc` 组件
|
||||
2. 映射行为包对话框场景
|
||||
3. 执行以下命令:
|
||||
```
|
||||
/dialogue open @s @s <scene_tag>
|
||||
```
|
||||
#### 优劣分析
|
||||
`+` 无需维护隐藏 NPC<br/>
|
||||
`+` 无需管理常加载区域<br/>
|
||||
`-` 非正常使用可能导致稳定性问题<br/>
|
||||
`-` 其他玩家点击该玩家时会显示对话框<br/>
|
||||
|
||||
可通过添加交互组件避免问题:
|
||||
::: code-group
|
||||
```json
|
||||
"minecraft:interact": {
|
||||
"interactions": [
|
||||
{
|
||||
"on_interact": {
|
||||
"filters": {
|
||||
"all_of": [
|
||||
{
|
||||
"test": "is_family",
|
||||
"subject": "other",
|
||||
"value": "player"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
:::
|
||||
:::
|
||||
|
||||
### 对话文件配置
|
||||
|
||||
::: code-group
|
||||
```json [dialogue/example.diag.json]
|
||||
{
|
||||
"format_version":"1.17",
|
||||
"minecraft:npc_dialogue":{
|
||||
"scenes":[
|
||||
{
|
||||
"scene_tag":"main_teleport_menu",
|
||||
"npc_name":"传送菜单",
|
||||
"text":"选择传送目的地",
|
||||
"buttons":[
|
||||
{
|
||||
"name":"区域传送",
|
||||
"commands":[
|
||||
"/dialogue open @e[type=npc,c=1] @initiator districts_teleport_menu"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name":"个人基地",
|
||||
"commands":[
|
||||
"/tp @initiator -20 4 -20"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name":"世界出生点",
|
||||
"commands":[
|
||||
"/tp @initiator 0 4 0"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"scene_tag":"districts_teleport_menu",
|
||||
"npc_name":"区域传送",
|
||||
"text":"请选择目标区域",
|
||||
"buttons":[
|
||||
{
|
||||
"name":"< 返回",
|
||||
"commands":[
|
||||
"/dialogue open @e[type=npc,c=1] @initiator main_teleport_menu"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name":"商业区",
|
||||
"commands":[
|
||||
"/tp @initiator 20 4 20"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name":"娱乐区",
|
||||
"commands":[
|
||||
"/tp @initiator 20 4 -20"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 创建传送物品
|
||||
|
||||
::: code-group
|
||||
```json [items/teleport_menu.json]
|
||||
{
|
||||
"format_version": "1.16.100",
|
||||
"minecraft:item": {
|
||||
"description": {
|
||||
"identifier": "dialog:teleport_menu",
|
||||
"category": "物品"
|
||||
},
|
||||
"components": {
|
||||
"minecraft:on_use": {
|
||||
"on_use": {
|
||||
"event": "open_menu",
|
||||
"target": "self"
|
||||
}
|
||||
},
|
||||
"minecraft:foil": true,
|
||||
"minecraft:icon": {
|
||||
"texture": "ender_pearl"
|
||||
},
|
||||
"minecraft:display_name": {
|
||||
"value": "传送菜单"
|
||||
}
|
||||
},
|
||||
"events": {
|
||||
"open_menu": {
|
||||
"run_command": {
|
||||
"command": [
|
||||
"dialogue open @e[type=npc,c=1] @s main_teleport_menu"
|
||||
],
|
||||
"target": "player"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 测试步骤
|
||||
1. 在超平坦世界启用实验性玩法
|
||||
2. 执行 `/function setup` 创建 NPC
|
||||
3. 获取道具:`/give @s dialog:teleport_menu`
|
||||
4. 切换生存模式使用道具
|
||||
|
||||
## 版权声明
|
||||
|
||||
本教程改编自 [Minecraft 创作者文档](https://docs.microsoft.com/en-us/minecraft/creator/documents/npcdialogue)。
|
||||
310
docs/wiki/entities/render-controllers.md
Normal file
310
docs/wiki/entities/render-controllers.md
Normal file
@@ -0,0 +1,310 @@
|
||||
---
|
||||
title: 渲染控制器
|
||||
category: 基础
|
||||
tags:
|
||||
- beginner
|
||||
mentions:
|
||||
- SirLich
|
||||
- MedicalJewel105
|
||||
- Overload252
|
||||
- ChibiMango
|
||||
---
|
||||
|
||||
# 渲染控制器
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
渲染控制器是资源包中常被误解的部分。但您无需畏惧!您可以将渲染控制器视为逻辑包,它们接收来自资源包实体文件中的短名称定义,并决定这些资源在游戏中如何组合/分层/渲染。
|
||||
|
||||
## 定义短名称
|
||||
|
||||
渲染控制器基于资源包实体文件中的短名称定义运作。短名称是我们在资源包实体文件中定义的本地标识符,可供渲染控制器(及其他地方)调用。我们可以在实体中定义`geometry`(几何体)、`materials`(材质)和`textures`(纹理)等变量。
|
||||
|
||||
让我们看看蜘蛛资源包实体文件的简化版本:
|
||||
|
||||
::: code-group
|
||||
```json [RP/entity/spider.json]
|
||||
{
|
||||
"format_version": "1.8.0",
|
||||
"minecraft:client_entity": {
|
||||
"description": {
|
||||
"identifier": "minecraft:cave_spider",
|
||||
"materials": {
|
||||
"default": "spider",
|
||||
"invisible": "spider_invisible"
|
||||
},
|
||||
"textures": {
|
||||
"default": "textures/entity/spider/cave_spider"
|
||||
},
|
||||
"geometry": {
|
||||
"default": "geometry.spider.v1.8"
|
||||
},
|
||||
"render_controllers": ["controller.render.spider"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
此示例中创建了四个短名称定义:
|
||||
- `default`(材质数组)
|
||||
- `invisible`(材质数组)
|
||||
- `default`(纹理数组)
|
||||
- `default`(几何体数组)
|
||||
|
||||
您可以在每个数组中定义多个短名称(如上方的材质示例)。将短名称定义视为_导入_所需资源的操作。在此阶段,您在定义实体要使用的纹理、几何体和材质。在渲染控制器阶段不会导入新内容,而是使用已导入的资源来构建最终渲染的实体。
|
||||
|
||||
## 简单渲染控制器
|
||||
|
||||
一个基础渲染控制器示例如下:
|
||||
|
||||
::: code-group
|
||||
```json [RP/render_controllers/cow.render.json]
|
||||
{
|
||||
"format_version": "1.8.0",
|
||||
"render_controllers": {
|
||||
"controller.render.cow": {
|
||||
"geometry": "Geometry.default",
|
||||
"materials": [
|
||||
{
|
||||
"*": "Material.default"
|
||||
}
|
||||
],
|
||||
"textures": ["Texture.default"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
该控制器从实体文件获取短名称定义并进行_渲染_。例如`"textures": [ "Texture.default"]`表达:"采用default纹理并应用于实体"。渲染控制器本身并不知晓default纹理的具体内容,只是执行应用指令。
|
||||
|
||||
## 复用渲染控制器
|
||||
|
||||
由于渲染控制器基于短名称工作,您可以在所有实体中复用同一个渲染控制器。对于只含单一材质、单一纹理和单一几何体的简单实体,无需创建自定义渲染控制器。
|
||||
|
||||
例如上方示例的控制器用于`minecraft:cow`实体。若要在自定义包中使用此控制器,只需在实体文件中声明:`"render_controllers": [ "controller.render.cow" ]`。
|
||||
|
||||
:::warning 注意!
|
||||
渲染控制器基于短名称工作。若使用牛的渲染控制器,必须提供其所需的短名称:
|
||||
- `default`几何体
|
||||
- `default`纹理
|
||||
- `default`材质
|
||||
:::
|
||||
|
||||
## 创建自定义渲染控制器
|
||||
|
||||
当我们需要更精细控制实体渲染时(如分层纹理、多重几何体、不同骨骼应用不同材质),可通过复制原版渲染控制器到`render_controllers`文件夹进行定制化修改。
|
||||
|
||||
## 纹理分层
|
||||
|
||||
通过纹理分层技术可为自定实体创建叠加纹理。基础思路是通过多个纹理的透明像素区域实现叠加显示。
|
||||
|
||||
假设一个**画框**实体:框架固定但画面可变。虽然可以复制10个框架纹理并制作10幅画作,但修改框架时需要改动所有文件。采用分层纹理方案时,首先放置框架纹理,再叠加画作纹理,即可实现框架的集中管理。
|
||||
|
||||
### 通过渲染控制器实现
|
||||
|
||||
若对渲染控制器不熟悉,建议参考原版案例。例如含有多个纹理的`horse`实体具有典型参考价值。
|
||||
|
||||
#### 渲染控制器
|
||||
|
||||
::: code-group
|
||||
```json [RP/render_controllers/controller.render.texture_layering.json]
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"render_controllers": {
|
||||
"controller.render.texture_layering": {
|
||||
"geometry": "Geometry.default",
|
||||
"materials": [
|
||||
{
|
||||
"*": "Material.default"
|
||||
}
|
||||
],
|
||||
"textures": [
|
||||
// 你可以添加任意数量的图层,按从上到下的顺序叠加
|
||||
"Texture.bottom_layer",
|
||||
"Texture.top_layer"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
#### 实体配置
|
||||
|
||||
需要定义所有纹理并使用`villager_v2_masked`材质:
|
||||
|
||||
::: code-group
|
||||
```json [RP/entity/my_entity.json]
|
||||
"materials": {
|
||||
"default": "villager_v2_masked"
|
||||
},
|
||||
"textures": {
|
||||
"top_layer": "textures/top",
|
||||
"bottom_layer": "textures/bottom"
|
||||
// 在此添加更多纹理短名称定义
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 动态变体分层
|
||||
|
||||
通过动态索引实现纹理切换能创造更灵活的效果:
|
||||
|
||||
#### 实体配置
|
||||
|
||||
定义多个顶部纹理以供索引:
|
||||
|
||||
::: code-group
|
||||
```json [RP/entity/my_entity.json#description]
|
||||
"textures": {
|
||||
"top_1": "textures/top_1",
|
||||
"top_2": "textures/top_2",
|
||||
"top_3": "textures/top_3",
|
||||
"bottom_layer": "textures/bottom"
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
#### 渲染控制器
|
||||
|
||||
::: code-group
|
||||
```json [RP/render_controllers/controller.render.wool_only]
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"render_controllers": {
|
||||
"controller.render.wool_only": {
|
||||
"arrays": {
|
||||
"textures": {
|
||||
"Array.top": [
|
||||
"Texture.top_1",
|
||||
"Texture.top_2",
|
||||
"Texture.top_3"
|
||||
]
|
||||
}
|
||||
},
|
||||
"geometry": "Geometry.default",
|
||||
"materials": [
|
||||
{
|
||||
"*": "Material.default"
|
||||
}
|
||||
],
|
||||
"textures": [
|
||||
"Texture.bottom", // 静态底层纹理
|
||||
"Array.top[q.variant]" // 根据实体变体选择顶部纹理
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
通过数组和`q.variant`查询,可根据实体variant值动态选择顶部纹理。
|
||||
|
||||
#### 设置变体值
|
||||
|
||||
要使分层显示生效,需在实体中设置variant组件:
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/my_entity.json#components]
|
||||
"minecraft:variant": {
|
||||
"value": 0
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
注意组件参数采用零索引制,`0`对应第一个纹理,`1`和`2`对应后续纹理。
|
||||
|
||||
#### 动态更换纹理
|
||||
|
||||
如需在游戏中动态更换纹理,只需修改`variant`值。可通过组件组和事件系统实现此功能。
|
||||
|
||||
#### 动态分层进阶
|
||||
|
||||
通过添加更多纹理数组和使用虚拟组件(dummy components)作为索引,可实现更复杂的动态分层效果。关于虚拟组件的详细信息请参阅[此文档](/wiki/entities/dummy-components)。
|
||||
|
||||
### 动态几何体切换
|
||||
|
||||
动态切换几何体的原理与纹理类似:
|
||||
|
||||
以下示例展示如何根据variant值切换不同几何体。注意几何体不可分层叠加,因此不需要基础层定义,但仍需使用`villager_v2_masked`材质。
|
||||
|
||||
::: code-group
|
||||
```json [RP/render_controllers/controller.render.player.third_person.json]
|
||||
{
|
||||
"format_version": "1.8.0",
|
||||
"render_controllers": {
|
||||
"controller.render.player.third_person": {
|
||||
"materials": [
|
||||
{
|
||||
"*": "Material.default"
|
||||
}
|
||||
],
|
||||
"textures": [
|
||||
"Texture.bottom",
|
||||
"Array.top[q.variant]"
|
||||
],
|
||||
"arrays": {
|
||||
"geometries": {
|
||||
"Array.geo": [
|
||||
"Geometry.default",
|
||||
"Geometry.custom_1",
|
||||
"Geometry.custom_2"
|
||||
]
|
||||
},
|
||||
"textures": {
|
||||
"Array.top": [
|
||||
"Texture.bottom",
|
||||
"Texture.top_1",
|
||||
"Texture.top_2"
|
||||
]
|
||||
}
|
||||
},
|
||||
"geometry": "Array.geo[q.variant]"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
#### 实体配置
|
||||
|
||||
确保在实体文件中包含对应几何体变体:
|
||||
|
||||
::: code-group
|
||||
```json
|
||||
"geometry": {
|
||||
"default": "geometry.entity.default",
|
||||
"custom_1": "geometry.entity.custom_1",
|
||||
"custom_2": "geometry.entity.custom_2"
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
## 常见错误
|
||||
|
||||
在渲染控制器中:
|
||||
- 可引用多个纹理但只能引用一个几何体(数组形式亦适用)
|
||||
|
||||
::: code-group
|
||||
```json
|
||||
"arrays": {
|
||||
"textures": {
|
||||
"array.skin": [],
|
||||
"array.dress": []
|
||||
},
|
||||
"geometries": {
|
||||
"array.geo": []
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```json
|
||||
"textures": [
|
||||
"array.skin[q.variant]",
|
||||
"array.dress[q.skin_id]"
|
||||
],
|
||||
"geometry": "array.geo[q.mark_variant]"
|
||||
```
|
||||
:::
|
||||
422
docs/wiki/entities/runtime-identifier.md
Normal file
422
docs/wiki/entities/runtime-identifier.md
Normal file
@@ -0,0 +1,422 @@
|
||||
---
|
||||
title: 运行时标识符
|
||||
category: 文档
|
||||
mentions:
|
||||
- MedicalJewel105
|
||||
- aexer0e
|
||||
- Luthorius
|
||||
- SirLich
|
||||
- TheDoctor15
|
||||
- ChibiMango
|
||||
- stirante
|
||||
- epxzzy
|
||||
- IlkinQafarov
|
||||
- TheItsNameless
|
||||
- SmokeyStack
|
||||
- ThomasOrs
|
||||
- Goatfu
|
||||
---
|
||||
|
||||
# 运行时标识符
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
`runtime_identifier` 是位于实体行为文件描述部分的可选参数,用于模拟原版实体的硬编码特性。
|
||||
它接受原版 Minecraft 标识符,例如 `minecraft:shulker`。
|
||||
|
||||
::: code-group
|
||||
```json [行为实体描述]
|
||||
"description": {
|
||||
"identifier": "wiki:my_box",
|
||||
"runtime_identifier": "minecraft:shulker", // 此运行时标识符会将潜影贝的硬编码行为附加到当前实体
|
||||
"is_spawnable": true,
|
||||
"is_summonable": true,
|
||||
"is_experimental": false
|
||||
}
|
||||
```
|
||||
|
||||
:::tip 注意
|
||||
需要注意 `runtime_identifier` **仅解析实体的硬编码特性**。这意味着使用100%数据驱动的生物作为运行时标识符不会给实体添加新特性。此外,某些实体运行时可能会覆盖组件部分定义的属性,例如潜影贝实体的碰撞箱尺寸。
|
||||
:::
|
||||
|
||||
:::warning 警告
|
||||
此处未列出所有运行时标识符效果。建议通过实验自行探索新效果,也欢迎在此补充发现。
|
||||
:::
|
||||
|
||||
## 已知的运行时标识符效果:
|
||||
|
||||
- 所有运行时ID都会将实体名称更改为对应原版实体的名称
|
||||
|
||||
### minecraft:area_effect_cloud
|
||||
|
||||
- 导致实体崩溃
|
||||
|
||||
---
|
||||
|
||||
### minecraft:armor_stand
|
||||
|
||||
- 禁用实体阴影
|
||||
- 击打时立即消失
|
||||
- 允许装备穿戴/卸除
|
||||
- 死亡时掉落盔甲架物品
|
||||
|
||||
---
|
||||
|
||||
### minecraft:arrow
|
||||
|
||||
- 为抛射物添加朝向玩家的动画
|
||||
- 禁用死亡动画/声音/粒子
|
||||
- 缩小实体阴影(但不会消失)
|
||||
- 不可交互
|
||||
- 通过生成蛋或/summon生成时,玩家接触后获得箭矢同时实体消失
|
||||
- 飞行物理特性和击退效果与箭矢一致
|
||||
|
||||
---
|
||||
|
||||
### minecraft:axolotl
|
||||
- 不影响游泳/移动/重力行为
|
||||
- 类似热带鱼,不同变种值影响水桶名称(如"亮蓝色美西螈桶"或"幼年黄色美西螈桶")
|
||||
年龄变种: 成年/幼年
|
||||
颜色变种: 亮色/野生/黄色/青色/蓝色
|
||||
|
||||
---
|
||||
|
||||
### minecraft:bee
|
||||
|
||||
- 添加蜜蜂音效
|
||||
|
||||
---
|
||||
|
||||
### minecraft:blaze
|
||||
|
||||
- 添加烈焰人燃烧音效和粒子
|
||||
- 实体将具有烈焰人飞行特性(即使未添加飞行行为)
|
||||
|
||||
---
|
||||
|
||||
### minecraft:boat
|
||||
|
||||
- 骑乘时显示船型UI界面
|
||||
- 禁止实体旋转
|
||||
- 具有船形固体碰撞箱
|
||||
|
||||
---
|
||||
|
||||
### minecraft:chest_minecart
|
||||
|
||||
- 导致实体崩溃
|
||||
- 击打后立即消失
|
||||
- 生成状态异常
|
||||
- 掉落箱子和矿车
|
||||
|
||||
---
|
||||
|
||||
### minecraft:chicken
|
||||
|
||||
- 部分动画失效
|
||||
- 更新移动速度
|
||||
- 实体下落减缓但仍受掉落伤害
|
||||
- 生成时不携带装备(若原有)
|
||||
|
||||
---
|
||||
|
||||
### minecraft:cod
|
||||
|
||||
- 脱离水体时扑腾
|
||||
- 使用水桶交互获得鳕鱼桶(放置时生成当前实体而非鳕鱼)
|
||||
- 赋予特殊游泳和重力特性
|
||||
|
||||
---
|
||||
|
||||
### minecraft:command_block_minecart
|
||||
|
||||
- 导致实体崩溃
|
||||
- 击打后立即消失
|
||||
- 生成状态异常
|
||||
- 掉落矿车
|
||||
|
||||
---
|
||||
|
||||
### minecraft:cow
|
||||
|
||||
- 部分动画失效
|
||||
- 更新移动速度
|
||||
- 生成时不携带装备(若原有)
|
||||
|
||||
---
|
||||
|
||||
### minecraft:dolphin
|
||||
|
||||
- 添加 `minecraft:movement.dolphin` 组件
|
||||
|
||||
---
|
||||
|
||||
### minecraft:donkey
|
||||
|
||||
- 将纹理/模型/动画更换为驴子
|
||||
|
||||
---
|
||||
|
||||
### minecraft:dragon_fireball
|
||||
|
||||
- 完全破坏实体
|
||||
- 生成龙息火球尾迹粒子
|
||||
|
||||
---
|
||||
|
||||
### minecraft:egg
|
||||
|
||||
- 为抛射物添加朝向玩家的动画
|
||||
- 导致实体崩溃
|
||||
- 使用生成蛋生成时会出现在玩家位置而非指定位置,且面朝天空
|
||||
|
||||
---
|
||||
|
||||
### minecraft:elder_guardian
|
||||
|
||||
- 将纹理/模型/动画更换为远古守卫者
|
||||
- 改变部分行为特性
|
||||
|
||||
---
|
||||
|
||||
### minecraft:ender_crystal
|
||||
|
||||
- 实体将固定在生成方块的中央
|
||||
- 除传送外始终保持位置不变
|
||||
- 可放置于任何表面
|
||||
- 其他实体可穿透
|
||||
- 无法配置承受伤害
|
||||
- 无法改变朝向
|
||||
- 可复活末影龙
|
||||
- 生成时带火焰效果
|
||||
|
||||
---
|
||||
|
||||
### minecraft:ender_dragon
|
||||
|
||||
- 添加末影龙死亡特效
|
||||
- 继承末影龙碰撞箱
|
||||
- 破坏碰撞箱内所有方块(包括底部方块),建议在下方放置不可破坏方块/移除重力/禁用`mobGriefing`规则
|
||||
- 对碰撞箱2格范围内的玩家造成伤害
|
||||
- 增加渲染距离
|
||||
- 只能通过/kill指令消除
|
||||
|
||||
---
|
||||
|
||||
### minecraft:ender_pearl
|
||||
|
||||
- 破坏实体行为
|
||||
- 受伤时生成粒子
|
||||
|
||||
---
|
||||
|
||||
### minecraft:endermite
|
||||
|
||||
- 受伤时生成粒子
|
||||
- 导致旋转异常
|
||||
- 部分动画失效
|
||||
|
||||
---
|
||||
|
||||
### minecraft:evocation_fang
|
||||
|
||||
- 对接触实体造成伤害
|
||||
- 完全禁用碰撞
|
||||
|
||||
---
|
||||
|
||||
### minecraft:falling_block
|
||||
|
||||
- 导致实体崩溃并下落
|
||||
- 接触地面后无动画消失,掉落金合欢按钮
|
||||
- 移除效果附着能力
|
||||
|
||||
### minecraft:horse
|
||||
|
||||
- 将纹理/模型/动画更换为马匹
|
||||
|
||||
---
|
||||
|
||||
### minecraft:iron_golem
|
||||
|
||||
- 允许发动攻击(击退效果垂直增强)
|
||||
- 加速四肢动画(可手动修复为约1/4速度)
|
||||
- 可能与村庄/村民逻辑冲突
|
||||
|
||||
---
|
||||
|
||||
### minecraft:llama_spit
|
||||
|
||||
- 添加羊驼唾沫粒子
|
||||
|
||||
---
|
||||
|
||||
### minecraft:minecart
|
||||
|
||||
- 禁用实体阴影
|
||||
- 死亡时掉落矿车
|
||||
- 禁止实体旋转
|
||||
|
||||
---
|
||||
|
||||
### minecraft:panda
|
||||
|
||||
- 使`q.is_grazing`和`q.sit_mount`能与`minecraft:behavior.random_sitting`组件协同工作
|
||||
|
||||
---
|
||||
|
||||
### minecraft:parrot
|
||||
|
||||
- 启用翅膀扇动动画
|
||||
- 缓慢降落
|
||||
- 跟随音乐唱片跳舞
|
||||
|
||||
---
|
||||
|
||||
### minecraft:piglin
|
||||
|
||||
- 启用`minecraft:celebrate_hunt`功能(激活 q.is_celebrating)
|
||||
|
||||
---
|
||||
|
||||
### minecraft:player
|
||||
|
||||
- 激活`q.movement_direction`
|
||||
|
||||
---
|
||||
|
||||
### minecraft:pufferfish
|
||||
|
||||
- 脱离水体时扑腾
|
||||
- 使用水桶交互获得河豚桶(放置时生成当前实体而非河豚)
|
||||
- 赋予特殊游泳和重力特性
|
||||
|
||||
---
|
||||
|
||||
### minecraft:salmon
|
||||
|
||||
- 脱离水体时扑腾
|
||||
- 使用水桶交互获得鲑鱼桶(放置时生成当前实体而非鲑鱼)
|
||||
- 赋予特殊游泳和重力特性
|
||||
|
||||
---
|
||||
|
||||
### minecraft:sheep
|
||||
|
||||
- 使`q.is_grazing`能与`behavior.eat_block`组件协同工作
|
||||
|
||||
---
|
||||
|
||||
### minecraft:shulker
|
||||
|
||||
冒险模式玩家的方块拟态神器
|
||||
|
||||
- 1x1x1固体碰撞箱
|
||||
- 固定于生成方块的中央
|
||||
- 附着方块被破坏后传送至附近可用位置
|
||||
- 在非完整方块(床/台阶等)上生成时自动传送
|
||||
- 无法修改碰撞箱尺寸
|
||||
|
||||
---
|
||||
|
||||
### minecraft:shulker_bullet
|
||||
|
||||
- 生成潜影贝导弹尾迹粒子
|
||||
|
||||
---
|
||||
|
||||
### minecraft:slime
|
||||
|
||||
- 下落时生成黏液粒子
|
||||
- 根据变体值分裂(1-5为史莱姆常规尺寸,5以上视为中型)
|
||||
- 允许攻击同时保持史莱姆跳跃机制(无此标识符时攻击状态无法转向)
|
||||
|
||||
---
|
||||
|
||||
### minecraft:snowball
|
||||
|
||||
- 移除碰撞箱
|
||||
- 不可交互
|
||||
- 生成于玩家头部位置
|
||||
- 无视重力
|
||||
- 移除实体阴影
|
||||
- 恒定面朝南方
|
||||
- 无法发出踏步音效
|
||||
|
||||
---
|
||||
|
||||
### minecraft:spider
|
||||
|
||||
- 蛛网减速失效
|
||||
|
||||
---
|
||||
|
||||
### minecraft:skeleton
|
||||
|
||||
- 治疗效果造成伤害/瞬间伤害效果恢复生命
|
||||
- 亡灵杀手附魔增伤
|
||||
- 变体≥1时近战与远程攻击附加凋零效果
|
||||
|
||||
---
|
||||
|
||||
### minecraft:stray
|
||||
|
||||
- 治疗效果造成伤害/瞬间伤害效果恢复生命
|
||||
- 亡灵杀手附魔增伤
|
||||
- 免疫冰冻伤害
|
||||
|
||||
---
|
||||
|
||||
### minecraft:squid
|
||||
|
||||
- 支持特殊行为组件(参考squid.json)
|
||||
- 受伤时生成墨汁粒子
|
||||
|
||||
---
|
||||
|
||||
### minecraft:thrown_trident
|
||||
|
||||
- 为抛射物添加朝向玩家的动画
|
||||
- 禁用死亡动画/声音/粒子
|
||||
- 缩小实体阴影(但不会消失)
|
||||
- 不可交互
|
||||
- 飞行物理特性和击退效果与三叉戟一致
|
||||
|
||||
---
|
||||
|
||||
### minecraft:tropicalfish
|
||||
|
||||
- 脱离水体时扑腾
|
||||
- 赋予特殊游泳和重力特性
|
||||
- 使用水桶获得热带鱼桶(若无variant/mark_variant/color定义则为白色考伯鱼规格,含相关组件时桶名与实体规格对应)
|
||||
|
||||
---
|
||||
|
||||
### minecraft:wither_skull_dangerous
|
||||
|
||||
- 死亡时掉落凋零玫瑰
|
||||
- 被击杀实体会在原地生成凋零玫瑰(僵尸类异常掉落)
|
||||
- 持续生成基础烟雾粒子
|
||||
- 无视重力(使projectile组件实体直线运动)
|
||||
- 免疫所有伤害
|
||||
- 仅对无AI目标的实体生效(适用于假人实体和弹射物)
|
||||
|
||||
---
|
||||
|
||||
### minecraft:xp_orb
|
||||
|
||||
- 完全禁用碰撞
|
||||
- 接触玩家增加经验值
|
||||
|
||||
### minecraft:zombie
|
||||
|
||||
- 治疗效果造成伤害/瞬间伤害效果恢复生命
|
||||
- 亡灵杀手附魔增伤
|
||||
|
||||
---
|
||||
|
||||
### minecraft:wither
|
||||
|
||||
- 死亡时爆炸
|
||||
|
||||
---
|
||||
391
docs/wiki/entities/sleeping-entities.md
Normal file
391
docs/wiki/entities/sleeping-entities.md
Normal file
@@ -0,0 +1,391 @@
|
||||
---
|
||||
title: 睡眠实体
|
||||
category: 巧思案例
|
||||
tags:
|
||||
- 中级
|
||||
mentions:
|
||||
- MedicalJewel105
|
||||
- SirLich
|
||||
---
|
||||
|
||||
# 睡眠实体
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
本文将指导如何为实体添加睡眠功能。
|
||||
|
||||
## 在床上睡眠
|
||||
|
||||
该行为的灵感来源于村民设计。
|
||||
|
||||
### 特性
|
||||
|
||||
- 实体在夜晚自动入睡,天亮时苏醒
|
||||
- 与实体互动可唤醒它,并在一段时间后重新入睡
|
||||
- 实体受到伤害时会立即清醒
|
||||
|
||||
### 行为包配置
|
||||
|
||||
本节将解析行为包所需组件。
|
||||
|
||||
#### 组件
|
||||
|
||||
首先在实体组件中添加基础元素:
|
||||
|
||||
::: code-group
|
||||
```json [行为包]
|
||||
"minecraft:dweller": {
|
||||
"dwelling_type": "village",
|
||||
"dweller_role": "inhabitant",
|
||||
"can_find_poi": true
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
此组件未经官方文档记载,但实体需要它以实现睡眠功能。
|
||||
|
||||
::: code-group
|
||||
```json [行为包]
|
||||
"minecraft:environment_sensor": {
|
||||
"triggers": [
|
||||
{
|
||||
"filters": {
|
||||
"test": "is_daytime",
|
||||
"value": false
|
||||
},
|
||||
"event": "sleep"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
用于识别何时进入睡眠状态,会在非白天时段触发`sleep`事件。
|
||||
|
||||
:::warning
|
||||
注意:实体需具备基础导航组件才能移动到床上。
|
||||
:::
|
||||
|
||||
#### 组件组
|
||||
|
||||
接下来为实体配置复合组件组:
|
||||
|
||||
::: code-group
|
||||
```json [行为包]
|
||||
"sleeping": {
|
||||
"minecraft:behavior.sleep": {
|
||||
"priority": 0,
|
||||
"goal_radius": 1.5,
|
||||
"speed_multiplier": 1.25,
|
||||
"sleep_collider_height": 0.3,
|
||||
"sleep_collider_width": 1,
|
||||
"sleep_y_offset": 0.6,
|
||||
"timeout_cooldown": 10
|
||||
},
|
||||
"minecraft:damage_sensor": {
|
||||
"triggers": {
|
||||
"on_damage": {
|
||||
"event": "wake_up"
|
||||
}
|
||||
}
|
||||
},
|
||||
"minecraft:environment_sensor": {
|
||||
"triggers": [
|
||||
{
|
||||
"filters": {
|
||||
"test": "is_daytime",
|
||||
"value": true
|
||||
},
|
||||
"event": "wake_up"
|
||||
}
|
||||
]
|
||||
},
|
||||
"minecraft:interact": {
|
||||
"interactions": [
|
||||
{
|
||||
"on_interact": {
|
||||
"filters": {
|
||||
"all_of": [
|
||||
{
|
||||
"test": "is_family",
|
||||
"subject": "other",
|
||||
"value": "player"
|
||||
}
|
||||
]
|
||||
},
|
||||
"event": "woken_up"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
参数解析:
|
||||
- `minecraft:behavior.sleep`
|
||||
定义睡眠行为核心参数,优先级须设为`0`(最高级别)
|
||||
|
||||
- `minecraft:damage_sensor`
|
||||
实现受击苏醒功能
|
||||
|
||||
- `minecraft:environment_sensor`
|
||||
白昼时触发`wake_up`事件
|
||||
|
||||
- `minecraft:interact`
|
||||
允许玩家无伤害唤醒实体
|
||||
|
||||
::: code-group
|
||||
```json [行为包]
|
||||
"sleep_timer": {
|
||||
"minecraft:timer": {
|
||||
"time": 15,
|
||||
"time_down_event": {
|
||||
"event": "sleep_again"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
此组件组用于设置唤醒后的重新入睡延时。
|
||||
|
||||
#### 事件配置
|
||||
|
||||
以下事件系统逻辑相对直观:
|
||||
|
||||
::: code-group
|
||||
```json [行为包]
|
||||
"sleep": {
|
||||
"add": {
|
||||
"component_groups": [
|
||||
"sleeping"
|
||||
]
|
||||
}
|
||||
},
|
||||
"wake_up": {
|
||||
"remove": {
|
||||
"component_groups": [
|
||||
"sleeping"
|
||||
]
|
||||
}
|
||||
},
|
||||
"woken_up": {
|
||||
"remove": {
|
||||
"component_groups": [
|
||||
"sleeping"
|
||||
]
|
||||
},
|
||||
"add": {
|
||||
"component_groups": [
|
||||
"sleep_timer"
|
||||
]
|
||||
}
|
||||
},
|
||||
"sleep_again": {
|
||||
"add": {
|
||||
"component_groups": [
|
||||
"sleeping"
|
||||
]
|
||||
},
|
||||
"remove": {
|
||||
"component_groups": [
|
||||
"sleep_timer"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 资源包配置
|
||||
|
||||
请确保为实体添加睡眠动画和动画控制器!
|
||||
|
||||
#### 动画配置
|
||||
|
||||
直接复制以下配置:
|
||||
|
||||
::: code-group
|
||||
```json [资源包]
|
||||
{
|
||||
"format_version": "1.8.0",
|
||||
"animations": {
|
||||
"animation.sleeping_entity.sleep": {
|
||||
"loop": "hold_on_last_frame",
|
||||
"animation_length": 0.5,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.5": [-90, 0, 0]
|
||||
},
|
||||
"position": [0, 2, -15]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
#### 动画控制器
|
||||
|
||||
推荐直接套用此模板:
|
||||
|
||||
::: code-group
|
||||
```json [资源包]
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"animation_controllers": {
|
||||
"controller.animation.sleeping_entity.sleep": {
|
||||
"initial_state": "default",
|
||||
"states": {
|
||||
"default": {
|
||||
"transitions": [
|
||||
{
|
||||
"sleep": "q.is_sleeping"
|
||||
}
|
||||
]
|
||||
},
|
||||
"sleep": {
|
||||
"animations": ["sleeping"],
|
||||
"transitions": [
|
||||
{
|
||||
"default": "!q.is_sleeping"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
注意:需在客户端实体定义中关联动画:`"sleeping": "animation.sleeping_entity.sleep"`
|
||||
|
||||
### 效果演示
|
||||
|
||||

|
||||
|
||||
## 小憩系统
|
||||
|
||||
此行为灵感来源于狐狸设计。
|
||||
|
||||
### 特色功能
|
||||
|
||||
- 实体在安全环境(远离敌对生物且无雷暴天气)下进入小憩状态
|
||||
- 仅允许信任的潜行玩家或同族`sleeping_entity`实体靠近时不惊醒
|
||||
- 受击后自动苏醒
|
||||
|
||||
### 行为包配置
|
||||
|
||||
#### 核心组件
|
||||
|
||||
仅需一个核心组件:
|
||||
|
||||
::: code-group
|
||||
```json [行为包]
|
||||
"minecraft:behavior.nap": {
|
||||
"priority": 8,
|
||||
"cooldown_min": 2.0,
|
||||
"cooldown_max": 7.0,
|
||||
"mob_detect_dist": 12.0,
|
||||
"mob_detect_height": 6.0,
|
||||
"can_nap_filters": {
|
||||
"all_of": [
|
||||
{
|
||||
"test": "in_water",
|
||||
"subject": "self",
|
||||
"operator": "==",
|
||||
"value": false
|
||||
},
|
||||
{
|
||||
"test": "on_ground",
|
||||
"subject": "self",
|
||||
"operator": "==",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"test": "is_underground",
|
||||
"subject": "self",
|
||||
"operator": "==",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"test": "weather_at_position",
|
||||
"subject": "self",
|
||||
"operator": "!=",
|
||||
"value": "thunderstorm"
|
||||
}
|
||||
]
|
||||
},
|
||||
"wake_mob_exceptions": {
|
||||
"any_of": [
|
||||
{
|
||||
"test": "trusts",
|
||||
"subject": "other",
|
||||
"operator": "==",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"test": "is_family",
|
||||
"subject": "other",
|
||||
"operator": "==",
|
||||
"value": "sleeping_entity"
|
||||
},
|
||||
{
|
||||
"test": "is_sneaking",
|
||||
"subject": "other",
|
||||
"operator": "==",
|
||||
"value": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
如需实现信任机制,可附加:
|
||||
|
||||
::: code-group
|
||||
```json [行为包]
|
||||
"minecraft:trust": {}
|
||||
```
|
||||
:::
|
||||
|
||||
### 资源包配置
|
||||
|
||||
可通过动画控制器实现睡眠动画:
|
||||
|
||||
::: code-group
|
||||
```json [资源包]
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"animation_controllers": {
|
||||
"controller.animation.sleeping_entity.sleep": {
|
||||
"initial_state": "default",
|
||||
"states": {
|
||||
"default": {
|
||||
"transitions": [
|
||||
{
|
||||
"sleep": "q.is_sleeping"
|
||||
}
|
||||
]
|
||||
},
|
||||
"sleep": {
|
||||
"animations": ["sleeping"],
|
||||
"transitions": [
|
||||
{
|
||||
"default": "!q.is_sleeping"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
::>
|
||||
|
||||
最后需要为实体创建并注册睡眠动画,若存在制作难题可参考[BlockBench动画教程](/wiki/guide/blockbench.html#animating)。
|
||||
94
docs/wiki/entities/solid-entities.md
Normal file
94
docs/wiki/entities/solid-entities.md
Normal file
@@ -0,0 +1,94 @@
|
||||
---
|
||||
title: 实体碰撞体
|
||||
category: 巧思案例
|
||||
tags:
|
||||
- 配方指南
|
||||
- 中级
|
||||
mentions:
|
||||
- SirLich
|
||||
- Joelant05
|
||||
- Chikorita-Lover
|
||||
- Luthorius
|
||||
- MedicalJewel105
|
||||
- ThomasOrs
|
||||
---
|
||||
|
||||
# 实体碰撞体
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
实体碰撞体是指玩家能够碰撞、踩踏或与之发生物理互动,而不会穿透的实体。这类实体有多种用途,例如模拟方块效果。
|
||||
|
||||
本页将探讨几种创建实体碰撞体的方法。
|
||||
|
||||
并非所有技术都适用于所有场景。建议多加实验,找到最适合您需求的方案。
|
||||
|
||||
## 运行时标识符
|
||||
|
||||
通过[运行时标识符](/wiki/entities/runtime-identifier)可以实现实体碰撞效果。但目前仅支持两种预设形态,每种形态具有特定的碰撞箱及副作用。且两种模型的碰撞形状均不可调节或缩放。
|
||||
|
||||
### 船型实体
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/entity_name.json]
|
||||
{
|
||||
"format_version": "1.16.0",
|
||||
"minecraft:entity": {
|
||||
"description": {
|
||||
"identifier": "wiki:solid_entity",
|
||||
"runtime_identifier": "minecraft:boat"
|
||||
// 此处省略其他配置...
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
- 采用船形的实体碰撞箱
|
||||
- 具备部分船只特有交互特性
|
||||
|
||||
### 潜影贝型实体
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/entity_name.json]
|
||||
{
|
||||
"format_version": "1.16.0",
|
||||
"minecraft:entity": {
|
||||
"description": {
|
||||
"identifier": "wiki:solid_entity",
|
||||
"runtime_identifier": "minecraft:shulker"
|
||||
// 此处省略其他配置...
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
- 1×1方块尺寸的实体碰撞箱
|
||||
- 固定于方块网格
|
||||
- 当支撑方块被移除时会随机瞬移
|
||||
|
||||
## minecraft:is_stackable 组件
|
||||
|
||||
通过给实体添加`minecraft:is_stackable`组件可使其具有实体碰撞属性。
|
||||
**注意:** 如果希望实体对玩家而言具有碰撞,需要修改`player.json`文件。
|
||||
|
||||
`"minecraft:is_stackable": {}`
|
||||
|
||||
同时还需添加`minecraft:push_through`组件,并将其`value`参数设为1:
|
||||
|
||||
`"minecraft:push_through": 1`
|
||||
|
||||
(这两个组件都应置于`components`项下)
|
||||
|
||||
## 模拟方块效果
|
||||
|
||||
某些情况下更适合使用`/setblock`或`/fill`命令静态或动态放置屏障方块。需配套提供屏障的放置与清除机制:
|
||||
|
||||
`/fill ~ ~ ~ ~ ~1 ~ barrier 0 replace air`
|
||||
在1×1×2区域生成屏障方块。
|
||||
|
||||
`/fill ~1 ~1 ~1 ~-1 ~-1 ~-1 air 0 replace barrier`
|
||||
清除3×3×3范围内的屏障方块。
|
||||
|
||||
为保证效果连贯性,这些[动画控制器实体指令](/animation-controllers/entity-commands)需要保持持续激活状态。可通过实体组件或动画控制器实现持续触发。
|
||||
159
docs/wiki/entities/spawn-rules.md
Normal file
159
docs/wiki/entities/spawn-rules.md
Normal file
@@ -0,0 +1,159 @@
|
||||
---
|
||||
title: 实体生成规则
|
||||
category: 基础
|
||||
mentions:
|
||||
- SirLich
|
||||
- solvedDev
|
||||
- MedicalJewel105
|
||||
- aexer0e
|
||||
- Ciosciaa
|
||||
- FrankyRay
|
||||
- Luthorius
|
||||
- TheItsNameless
|
||||
- SmokeyStack
|
||||
---
|
||||
|
||||
# 实体生成规则
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
生成规则定义了实体如何自然生成到世界中。当您希望自定义实体像原版实体一样自然生成时,应该使用生成规则。通过不同的组件可以定义实体生成的时间、地点和方式。
|
||||
|
||||
通常情况下,可以让您的自定义实体采用与原版实体类似的生成方式。例如:像牛一样群生成、像原版僵尸一样仅在夜间生成,或是像鱼类只在水下生成。
|
||||
|
||||
## 生成规则示例
|
||||
|
||||
以下是一个包含字段说明的生成规则示例:
|
||||
|
||||
::: code-group
|
||||
```json [BP/spawn_rules/zombie.json]
|
||||
{
|
||||
"format_version": "1.8.0",
|
||||
"minecraft:spawn_rules": {
|
||||
"description": {
|
||||
"identifier": "minecraft:zombie",
|
||||
"population_control": "monster"
|
||||
},
|
||||
"conditions": [
|
||||
{
|
||||
"minecraft:spawns_on_surface": {},
|
||||
"minecraft:spawns_underground": {},
|
||||
"minecraft:brightness_filter": {
|
||||
"min": 0,
|
||||
"max": 7,
|
||||
"adjust_for_weather": true
|
||||
},
|
||||
"minecraft:difficulty_filter": {
|
||||
"min": "easy",
|
||||
"max": "hard"
|
||||
},
|
||||
"minecraft:weight": {
|
||||
"default": 100
|
||||
},
|
||||
"minecraft:herd": {
|
||||
"min_size": 2,
|
||||
"max_size": 4
|
||||
},
|
||||
"minecraft:permute_type": [
|
||||
{
|
||||
"weight": 95
|
||||
},
|
||||
{
|
||||
"weight": 5,
|
||||
"entity_type": "minecraft:zombie_villager"
|
||||
}
|
||||
],
|
||||
"minecraft:biome_filter": {
|
||||
"test": "has_biome_tag",
|
||||
"operator": "==",
|
||||
"value": "monster"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
- `description`→`identifier`: 要生成的实体
|
||||
- `population_control`: 控制生成与消失的数量。可选值:`animal`(动物)、`underwater_animal`(水生动物)、`monster`(怪物)、`ambient`(环境生物)
|
||||
- `conditions`: 必须满足的条件列表,生成尝试才会成功
|
||||
- `minecraft:spawns_on_surface`(地表生成)、`minecraft:spawns_underground`(地下生成)和`minecraft:spawns_underwater`(水下生成)控制实体生成的高度范围
|
||||
- `minecraft:brightness_filter`(亮度过滤)取值范围 0-15,控制生成所需光照条件。`adjust_for_weather`选项用于雨天/雷暴天气下是否自动降低有效光照值
|
||||
- `minecraft:difficulty_filter`(难度过滤)设置启用生成的游戏难度范围
|
||||
- `minecraft:herd`(群体生成)设置基于同个生成规则一起生成的实体数量
|
||||
- `minecraft:permute_type`(类型置换)通过`weight`权重和`entity_type`实体类型设置生成实体变异的概率
|
||||
- `minecraft:biome_filter`(生物群系过滤)测试特定生物群系标签。具体过滤器语法和生物群系标签列表请参考官方文档,或查看原版示例资源包
|
||||
|
||||
## 全部已知组件
|
||||
|
||||
以下是所有已知组件列表(随着我们对使用方法的理解加深,将持续补充说明文档):
|
||||
|
||||
```
|
||||
minecraft:weight
|
||||
minecraft:density_limit
|
||||
minecraft:spawns_on_block_filter
|
||||
minecraft:spawns_on_block_prevented_filter
|
||||
minecraft:spawns_above_block_filter
|
||||
minecraft:herd
|
||||
minecraft:permute_type
|
||||
minecraft:brightness_filter
|
||||
minecraft:height_filter
|
||||
minecraft:spawns_on_surface
|
||||
minecraft:spawns_underground
|
||||
minecraft:spawns_underwater
|
||||
minecraft:disallow_spawns_in_bubble
|
||||
minecraft:spawns_lava
|
||||
minecraft:biome_filter
|
||||
minecraft:difficulty_filter
|
||||
minecraft:distance_filter
|
||||
minecraft:is_experimental
|
||||
minecraft:world_age_filter
|
||||
minecraft:delay_filter
|
||||
minecraft:mob_event_filter
|
||||
minecraft:is_persistent
|
||||
minecraft:player_in_village_filter
|
||||
```
|
||||
|
||||
## 组件文档
|
||||
|
||||
### minecraft:herd
|
||||
|
||||
::: code-group
|
||||
```json
|
||||
"minecraft:herd": {
|
||||
"min_size": 1,
|
||||
"max_size": 2,
|
||||
"event":"minecraft:entity_born",
|
||||
"event_skip_count": 1
|
||||
},
|
||||
```
|
||||
:::
|
||||
|
||||
- `minecraft:herd`可通过此配置使第二个生成的实体(在此场景中)携带`minecraft:entity_born`事件(表现为幼体)。`event_skip_count`: 2`表示前两个生成的实体不会触发事件,之后生成的都会携带该事件。该功能适用于任意事件类型
|
||||
|
||||
### minecraft:spawns_above_block_filter
|
||||
|
||||
::: code-group
|
||||
```json
|
||||
"minecraft:spawns_above_block_filter": {
|
||||
"blocks": "minecraft:stone",
|
||||
"distance": 10
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
- `minecraft:spawns_above_block_filter`(上方方块过滤)会检测垂直方向设定距离内的方块,当条件满足时允许实体生成
|
||||
|
||||
### minecraft:spawns_on_block_prevented_filter
|
||||
|
||||
::: code-group
|
||||
```json
|
||||
"minecraft:spawns_on_block_prevented_filter": [
|
||||
"minecraft:nether_wart_block",
|
||||
"minecraft:shroomlight"
|
||||
]
|
||||
```
|
||||
:::
|
||||
|
||||
- `minecraft:spawns_on_block_prevented_filter`(禁止生成方块过滤)与上方组件功能相反。该数组包含实体永远无法生成于其上的方块标识符
|
||||
194
docs/wiki/entities/spawning-tamed-entities.md
Normal file
194
docs/wiki/entities/spawning-tamed-entities.md
Normal file
@@ -0,0 +1,194 @@
|
||||
---
|
||||
title: 生成已驯服的实体
|
||||
category: 巧思案例
|
||||
tags:
|
||||
- 中级
|
||||
mentions:
|
||||
- Axelpvz2030
|
||||
- aexer0e
|
||||
- SirLich
|
||||
- MedicalJewel105
|
||||
- SmokeyStack
|
||||
- ThomasOrs
|
||||
---
|
||||
|
||||
# 生成已驯服的实体
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
在本教程中,您将学习如何通过向特定玩家触发事件来生成预驯服的实体,以及如何投掷在撞击时变形为已驯服实体的物品。
|
||||
|
||||
## 概述
|
||||
|
||||
传统方式中,若要让玩家驯服实体,必须通过 `minecraft:tameable` 强制玩家与实体互动。但我们也可以利用原版弹射物会记录生成者*\*的特性来实现预驯服实体的生成。
|
||||
|
||||
具体实现步骤:
|
||||
1. 通过 `minecraft:spawn_entity` 生成一个中间态弹射物实体
|
||||
2. 该实体将立即转换为预驯服的目标实体(本教程以原版狼为例)
|
||||
3. 在 `minecraft:transformation` 组件中将 `keep_owner` 设置为 `true`
|
||||
|
||||
\*: 需要区分 _Spawn(生成)_ 和 _Summon(召唤)_ 的区别。只有通过生成蛋或 `minecraft:spawn_entity` 组件生成的弹射物才会记录玩家信息,使用 `/summon` 命令生成的则不会。
|
||||
|
||||
## player.json
|
||||
|
||||
我们需要对玩家行为文件进行微调,添加一个事件来激活组件组用于生成中间态实体。
|
||||
|
||||
您可以在 Mojang 提供的[原版行为包模板](https://aka.ms/behaviorpacktemplate)中找到玩家实体的行为文件。
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/player.json]
|
||||
{
|
||||
"format_version":"1.16.0",
|
||||
"minecraft:entity":{
|
||||
"description":{
|
||||
"identifier":"minecraft:player",
|
||||
"is_spawnable":false,
|
||||
"is_summonable":false,
|
||||
"is_experimental":false
|
||||
},
|
||||
"component_groups":{ // 组件组定义
|
||||
"wiki:spawn_tamed_wolf":{
|
||||
"minecraft:spawn_entity":{
|
||||
"entities":{
|
||||
"min_wait_time":0,
|
||||
"max_wait_time":0,
|
||||
"spawn_entity":"wiki:pretamed_wolf",
|
||||
"single_use":true,
|
||||
"num_to_spawn":1
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
...
|
||||
"events":{ // 事件定义
|
||||
"wiki:spawn_tamed_wolf":{
|
||||
"add":{
|
||||
"component_groups":[
|
||||
"wiki:spawn_tamed_wolf"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
## pretamed_wolf.json
|
||||
|
||||
创建一个使用 `minecraft:arrow` 作为运行时标识符(也可选用其他弹射物标识符)的自定义实体,包含空白弹射物组件和用于转换为驯服狼的变形组件。
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/pretamed_wolf.json]
|
||||
{
|
||||
"format_version": "1.16.0",
|
||||
"minecraft:entity": {
|
||||
"description": {
|
||||
"identifier": "wiki:pretamed_wolf",
|
||||
"runtime_identifier": "minecraft:arrow",
|
||||
"is_spawnable": false,
|
||||
"is_summonable": true,
|
||||
"is_experimental": false
|
||||
},
|
||||
"components": { // 组件配置
|
||||
"minecraft:projectile": {}, // 弹射物组件
|
||||
"minecraft:transformation": { // 变形组件
|
||||
"into": "minecraft:wolf<minecraft:on_tame>",
|
||||
"keep_owner": true // 保持归属关系
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
现在即可通过命令 `/event entity @p wiki:spawn_tamed_wolf` 在玩家身边生成驯服的狼。若将 `is_spawnable` 设为 `true` 还可通过生成蛋调用!
|
||||
|
||||
:::warning 重要提示
|
||||
如需生成自定义实体而非原版狼:
|
||||
1. 必须为实体添加 `minecraft:is_tamed` 组件
|
||||
2. 未被驯服的实体可能出现预期外的行为
|
||||
:::
|
||||
|
||||
## 集成物品抛射物(替代方法)
|
||||
|
||||
利用 [1.16 实验性物品特性](/wiki/items/item-components) 中的 `shoot` 事件属性,可制作碰撞时转换为已驯服实体的弹射物。
|
||||
|
||||
::: code-group
|
||||
```json [BP/items/throwable_pretamed_wolf.json]
|
||||
{
|
||||
"format_version":"1.16.100",
|
||||
"minecraft:item":{
|
||||
"description":{
|
||||
"identifier":"wiki:throwable_pretamed_wolf"
|
||||
},
|
||||
"components":{ // 物品组件
|
||||
"minecraft:on_use":{
|
||||
"on_use":{
|
||||
"event":"wiki:on_use" // 使用事件触发
|
||||
}
|
||||
}
|
||||
},
|
||||
"events":{ // 事件配置
|
||||
"wiki:on_use":{
|
||||
"shoot":{
|
||||
"projectile":"wiki:pretamed_wolf" // 发射自定义弹射物
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
同时需修改弹射物实体的转化逻辑以避免即时变形:
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/pretamed_wolf.json]
|
||||
{
|
||||
"minecraft:entity":{
|
||||
"description":{
|
||||
"identifier":"wiki:pretamed_wolf",
|
||||
"runtime_identifier":"minecraft:arrow",
|
||||
"is_spawnable":false,
|
||||
"is_summonable":true,
|
||||
"is_experimental":false
|
||||
},
|
||||
"component_groups":{ // 组件组定义
|
||||
"wiki:transform_to_entity":{
|
||||
"minecraft:transformation":{
|
||||
"into":"minecraft:wolf<minecraft:on_tame>",
|
||||
"keep_owner":true
|
||||
}
|
||||
}
|
||||
},
|
||||
"components":{ // 组件配置
|
||||
"minecraft:projectile":{
|
||||
"on_hit":{ // 碰撞触发配置
|
||||
"impact_damage":{
|
||||
"damage":0 // 禁用伤害
|
||||
},
|
||||
"stick_in_ground":{}, // 插入地面
|
||||
"definition_event":{
|
||||
"event_trigger":{
|
||||
"event":"wiki:on_hit" // 碰撞事件触发
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"events":{ // 事件响应
|
||||
"wiki:on_hit":{
|
||||
"add":{
|
||||
"component_groups":[
|
||||
"wiki:transform_to_entity" // 添加变形组件组
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
特别感谢 [Zarkmend ZAN](https://twitter.com/Zarkmend_ZAN) 发现这一方法 :)
|
||||
269
docs/wiki/entities/timers.md
Normal file
269
docs/wiki/entities/timers.md
Normal file
@@ -0,0 +1,269 @@
|
||||
---
|
||||
title: 实体计时器
|
||||
category: 巧思案例
|
||||
tags:
|
||||
- 中级
|
||||
mentions:
|
||||
- SirLich
|
||||
- Joelant05
|
||||
- MedicalJewel105
|
||||
- aexer0e
|
||||
- Justash01
|
||||
- TheItsNameless
|
||||
- zheaEvyline
|
||||
---
|
||||
|
||||
# 实体计时器
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
基于时间的交互是地图制作的超实用工具。本文旨在提供一份详尽的指南,详解多种创建计时器的方法。为方便阅读,本页将分为两大部分:组件计时器和动画计时器。每种方式都有其独特优劣,我们将在对应章节详细探讨。
|
||||
|
||||
你可能也会对[计分板计时器](/wiki/commands/scoreboard-timers)感兴趣。
|
||||
|
||||
## 基于组件的计时器
|
||||
|
||||
组件计时器通过行为包的`entity.json`文件实现。其最大优点是实体重载时仍能保持计时状态,但受限于可用的计时组件数量(重复组件会互相覆盖,意味着无法通过`minecraft:timer`组件创建多个独立计时器)。
|
||||
|
||||
### minecraft:timer组件
|
||||
|
||||
这是最简单却最高效的延时触发事件组件。[minecraft:timer](https://bedrock.dev/docs/1.14.0.0/1.14.30.2/Entities#minecraft:timer)提供三种主要时间设定方式:
|
||||
|
||||
- **精确计时**:固定时间后触发事件(例如3.4秒)
|
||||
- **随机区间**:在指定时间区间内随机触发(例如3到5秒之间)
|
||||
- **权重随机选择**:定义多组时间选项配比权重,随机选择其中一个时间触发(例如20%概率5秒触发,80%概率20秒触发)
|
||||
|
||||
在官方行为包中,该组件被广泛应用。例如:
|
||||
|
||||
- 海豚在陆地超过20秒后会脱水
|
||||
- 蜜蜂在蜇人后10-60秒随机死亡
|
||||
- 流浪商人停留时间为2400秒或3600秒
|
||||
|
||||
基础示例(5.6秒后触发事件):
|
||||
|
||||
::: code-group
|
||||
```json [实体组件]
|
||||
"minecraft:timer": {
|
||||
"time": 5.6,
|
||||
"time_down_event": {
|
||||
"event": "wiki:my_event"
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
进阶示例(使用权重系统随机延时触发):
|
||||
|
||||
::: code-group
|
||||
```json [实体组件]
|
||||
"minecraft:timer": {
|
||||
"looping": false, //true表示循环执行,false表示仅执行一次
|
||||
"random_time_choices": [
|
||||
{"weight":25, "value":0.5}, //0.5秒延时
|
||||
{"weight":25, "value":10}, //10秒延时
|
||||
{"weight":25, "value":30}, //30秒延时
|
||||
{"weight":25, "value":120} //2分钟延时
|
||||
],
|
||||
"time_down_event": {
|
||||
"event": "wiki:event",
|
||||
"target": "self"
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
高效利用技巧:通过循环触发`minecraft:timer`,配合事件中的`randomize`参数实现多样效果。这里通过权重控制事件触发频率:
|
||||
|
||||
::: code-group
|
||||
```json [事件配置]
|
||||
"wiki:do_event": {
|
||||
"randomize": [
|
||||
{
|
||||
"weight": 1, //1/56概率触发稀有事件
|
||||
"add": {"component_groups":["wiki:my_event"]}
|
||||
},
|
||||
{
|
||||
"weight": 5, //5/56概率触发常见事件
|
||||
"add": {"component_groups":["wiki:my_more_frequent_event"]}
|
||||
},
|
||||
{
|
||||
"weight": 50 //50/56概率无事件触发
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### minecraft:environment_sensor组件
|
||||
|
||||
当结合`hourly_clock_time`或`clock_time`筛选器时,[minecraft:environment_sensor](https://bedrock.dev/docs/stable/Entities#minecraft:environment_sensor)可用于游戏内时间触发事件。
|
||||
|
||||
示例(每日开始800tick后触发事件):
|
||||
|
||||
::: code-group
|
||||
```json [实体组件]
|
||||
"minecraft:environment_sensor": {
|
||||
"triggers": [{
|
||||
"filters": {
|
||||
"test": "hourly_clock_time",
|
||||
"operator": "=",
|
||||
"value": 800
|
||||
},
|
||||
"event": "wiki:my_daily_event"
|
||||
}]
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### minecraft:ageable组件
|
||||
|
||||
当行为包未占用[miinecraft:ageable](https://bedrock.dev/docs/stable/Entities#minecraft:ageable)时,可配合`minecraft:is_baby`组件实现计时功能。
|
||||
|
||||
示例(4秒后触发事件):
|
||||
|
||||
::: code-group
|
||||
```json [实体组件]
|
||||
"minecraft:is_baby": {},
|
||||
"minecraft:ageable": {
|
||||
"duration": 4,
|
||||
"grow_up": {
|
||||
"event": "wiki:my_other_event",
|
||||
"target": "self"
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 其他计时组件思路
|
||||
|
||||
查阅文档可发现更多具有"time_down_event"或"duration"参数的潜在组件,例如:
|
||||
|
||||
- `minecraft:angry`(需要攻击目标,时间限定整数)
|
||||
- `minecraft.behavior.hide`
|
||||
- `minecraft:behavior.celebrate`
|
||||
|
||||
## 基于动画的计时器
|
||||
|
||||
行为包动画是实现定时事件的强力工具。其优势在于理论上可创造无限计时器,但存在重载实体时重置的局限(玩家退出世界或区块卸载后重新加载会重置计时器)。
|
||||
|
||||
动画在行为包中的运作方式与资源包不同,建议通过官方文档或wiki其他页面了解基本机制。
|
||||
|
||||
### 基础动画计时
|
||||
|
||||
通过动画控制器或直接执行时间线指令,可以实现精确时序触发:
|
||||
|
||||
::: code-group
|
||||
```json [动画定义]
|
||||
{
|
||||
"format_version": "1.8.0",
|
||||
"animations": {
|
||||
"animation.command.example_timeline": {
|
||||
"timeline": {
|
||||
"0.0": "/say 立即触发",
|
||||
"3.0": "/say 3秒后触发"
|
||||
},
|
||||
"animation_length": 3.1
|
||||
},
|
||||
"animation.command.example_timeline_2": {
|
||||
"timeline": {
|
||||
"100": "/say 100秒后触发",
|
||||
"0.0": [
|
||||
"/say 同时触发多个指令",
|
||||
"/say 通过时间线组实现"
|
||||
],
|
||||
"55.55": "/say 55.55秒后触发"
|
||||
},
|
||||
"animation_length": 100.1
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 随机间隔实现
|
||||
|
||||
通过动画控制器模拟`minecraft:timer`的随机区间功能。示例:实体被剪毛后2-7秒随机触发事件。
|
||||
|
||||
::: code-group
|
||||
```json [动画控制器]
|
||||
"controller.animation.shanewolf.random_interval": {
|
||||
"initial_state": "inactive",
|
||||
"states": {
|
||||
"inactive": {
|
||||
"transitions": [{"active": "q.is_sheared"}]
|
||||
},
|
||||
"active": {
|
||||
"on_entry": [
|
||||
"v.random_interval = math.random(2, 7);",
|
||||
"/say 随机计时开始"
|
||||
],
|
||||
"animations": ["wiki:animate_interval"],
|
||||
"transitions": [{
|
||||
"inactive": "q.anim_time >= v.random_interval"
|
||||
}],
|
||||
"on_exit": [
|
||||
"@s wiki:stop_random_interval",
|
||||
"/say 随机计时结束"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
::: code-group
|
||||
```json [动画定义]
|
||||
"animation.shanewolf.random_interval": {
|
||||
"animation_length": 100
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
实现逻辑:进入激活状态时生成2-7秒随机数变量,动画播放时间超过变量值时退出状态。
|
||||
|
||||
注意事项:
|
||||
- 动画总时长需大于最大可能值
|
||||
- 使用`math.floor(math.random(a, b.99))`可生成整数结果
|
||||
- 收尾指令写入on_exit事件
|
||||
|
||||
### 权重选择实现
|
||||
|
||||
通过动画控制器模拟权重时间选择功能。示例:带电实体30%概率2秒、60%概率5秒、10%概率9秒触发事件。
|
||||
|
||||
::: code-group
|
||||
```json [动画控制器]
|
||||
"controller.animation.shanewolf.random_choices": {
|
||||
"initial_state": "inactive",
|
||||
"states": {
|
||||
"inactive": {
|
||||
"transitions": [{"active": "q.is_powered"}]
|
||||
},
|
||||
"active": {
|
||||
"on_entry": [
|
||||
"v.random_choices = math.random(0, 100);",
|
||||
"/say 随机选择开始"
|
||||
],
|
||||
"animations": ["wiki:animate_choices"],
|
||||
"transitions": [
|
||||
{"inactive": "q.anim_time >= 2.0 && v.random_choices < 30"},
|
||||
{"inactive": "q.anim_time >= 5.0 && v.random_choices < 90"},
|
||||
{"inactive": "q.anim_time >= 9.0 && v.random_choices <= 100"}
|
||||
],
|
||||
"on_exit": [
|
||||
"@s wiki:stop_random_choices",
|
||||
"/say 随机选择结束"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
实现逻辑:生成0-100随机数变量,通过多个状态切换条件实现权重分段检查。
|
||||
|
||||
注意事项:
|
||||
- 时间段需从小到大排列
|
||||
- 通过权重累加值划分概率区间
|
||||
- 按规范处理收尾事件
|
||||
|
||||
希望本指南能帮助你更好地掌握基岩版的时间管理技巧!如果你有其他巧妙的时间事件实现方法,欢迎[参与wiki编辑](/contribute)!
|
||||
158
docs/wiki/entities/troubleshooting-entities.md
Normal file
158
docs/wiki/entities/troubleshooting-entities.md
Normal file
@@ -0,0 +1,158 @@
|
||||
---
|
||||
title: 实体问题排查指南
|
||||
category: 基础
|
||||
nav_order: 3
|
||||
tags:
|
||||
- help
|
||||
mentions:
|
||||
- SirLich
|
||||
- BlueFrog130
|
||||
- SmokeyStack
|
||||
- MedicalJewel105
|
||||
- aexer0e
|
||||
- ChibiMango
|
||||
- RonarsCorruption
|
||||
---
|
||||
|
||||
# 实体问题排查指南
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
:::tip
|
||||
本页面包含关于_实体_的疑难解答信息。在继续阅读前,请务必先查阅[全局问题排查指南](/wiki/guide/troubleshooting)。
|
||||
:::
|
||||
|
||||
:::warning
|
||||
请始终记得检查内容日志!
|
||||
:::
|
||||
|
||||
## 0.0.0 - 确认问题存在
|
||||
|
||||
承认吧,某个地方肯定出错了。_任何_水平的开发者在_任何_阶段都可能出现这些疏漏,所以不要觉得被冒犯而想着"我当然会注意这些!",然后跳过必要的检查步骤!
|
||||
|
||||
<BButton color="blue" link="#_1-0-0-are-both-packs-active">继续</BButton>
|
||||
|
||||
|
||||
## 1.0.0 - 确保两个包都已启用
|
||||
|
||||
确认资源包和行为包在世界中都已激活(一个绝佳的防错方法是在两个包的manifest.json文件中互相设置依赖,这样添加或移除其中一个包时会自动同步处理)
|
||||
|
||||
<BButton color="blue" link="#_2-0-0-determine-whether-the-issue-is-in-the-rp-or-the-bp">继续</BButton>
|
||||
|
||||
## 2.0.0 - 确定问题出现在资源包还是行为包
|
||||
|
||||
通过观察实体生成蛋在创造模式物品栏中的显示状态,可以有效定位问题范围。即使您不打算为实体添加生成蛋,请暂时按照以下步骤添加以便定位问题:
|
||||
|
||||
### 在资源包中
|
||||
|
||||
确保.entity文件包含自定义spawn_egg配置:
|
||||
|
||||
::: code-group
|
||||
```json [RP]
|
||||
"spawn_egg":{
|
||||
"base_color": "#FF0000",
|
||||
"overlay_color": "#FFFF00"
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
(建议选择除"#000000"以外的配色以方便排查)
|
||||
|
||||
### 在行为包中
|
||||
|
||||
确保description对象中开启`is_spawnable`和`is_summonable`,并将`is_experimental`设为false:
|
||||
|
||||
::: code-group
|
||||
```json [BP]
|
||||
"description":{
|
||||
"identifier": "wiki:example_entity",
|
||||
"is_spawnable": true,
|
||||
"is_summonable": true,
|
||||
"is_experimental": false
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 现象分析
|
||||
|
||||
完全看不到生成蛋:<BButton color="blue" link="#_3-1-0-bp">前往排查</BButton>
|
||||
|
||||
能看到生成蛋但颜色全黑且无法生成实体:<BButton color="blue" link="#step-3-2-0-rp-entity">前往排查</BButton>
|
||||
|
||||
生成蛋显示正常颜色但仍旧无法生成实体:<BButton color="blue" link="#step-3-3-0-rp-resources-still-writing-because-this-is-going-to-be-extensive">前往排查</BButton>
|
||||
|
||||
## 3.0.0 - 定位具体问题
|
||||
|
||||
## 3.1.0 - 行为包问题
|
||||
|
||||
_即使已在行为文件中设置"is_spawnable": true,在创造模式物品栏中依然无法找到生成蛋_
|
||||
|
||||
这通常表示游戏未能正确识别实体行为文件。常见原因包括:
|
||||
|
||||
- Json语法错误
|
||||
- 文件夹命名错误
|
||||
|
||||
### 3.1.1 - 语法错误
|
||||
|
||||
单个语法错误会导致整个json文件失效。建议使用[JSON验证工具](https://jsonlint.com/)检查文件的语法完整性(注:虽然该网站会将//注释视为错误,但在Minecraft中实际允许使用注释)
|
||||
|
||||
### 3.1.2 - 文件夹误命名
|
||||
|
||||
请确认行为包中的实体文件夹命名为"entities"(资源包对应的是"entity",这个不一致设定确实容易引起困惑)
|
||||
|
||||
## 步骤3.2.0 - 资源包.entity文件问题
|
||||
|
||||
_能在创造模式物品栏中看到生成蛋,但显示为黑色且实体名异常(如"item.spawn_egg.entity.wiki:your_mob.name"),且无法正常生成实体_
|
||||
|
||||
此现象说明行为文件已生效,但资源包未能正确关联对应.entity文件。常见原因包括:
|
||||
|
||||
- .entity文件语法错误
|
||||
- 实体identifier不匹配
|
||||
- 资源引用路径错误
|
||||
- 资源包文件夹应命名为"entity",行为包文件夹应命名为"entities"
|
||||
|
||||
### 步骤3.2.1 - 语法错误
|
||||
|
||||
再次推荐使用[JSON验证工具](https://jsonlint.com/)进行深度校验(注意注释标识的兼容性问题)
|
||||
|
||||
### 步骤3.2.2 - 标识符不匹配
|
||||
|
||||
需确保资源包.entity文件与行为包的identifier字段完全一致,包括命名空间(冒号前的部分,例如`minecraft:bat`中的`minecraft`)。特别注意:
|
||||
|
||||
- 除了冒号外不要使用特殊字符
|
||||
- 命名空间和ID避免以数字或大写字母开头(虽然现行版本允许,但历史版本曾存在兼容性问题)
|
||||
- 非官方实体切勿使用`minecraft`作为命名空间
|
||||
|
||||
### 步骤3.2.3 - 无效资源引用
|
||||
|
||||
检查.entity文件中各项资源引用路径是否正确指向有效文件
|
||||
|
||||
## 步骤3.3.0 - 资源包资源排查(进行中)
|
||||
|
||||
_生成蛋显示正常颜色但在生成/召唤时实体不可见或仅显示阴影_
|
||||
|
||||
这说明基本功能文件已正常加载,但存在次级资源配置问题。根据现象选择排查方向:
|
||||
|
||||
- 完全隐形无阴影 → 资源引用错误:<BButton link="#_3-3-1-invisible-no-shadow" color=blue >前往</BButton>
|
||||
- 隐形但显示阴影 → 几何体问题:<BButton link="#_3-3-2-invisible-shadow-exists" color=blue >前往</BButton>
|
||||
- 可见但贴图异常 → 材质问题:<BButton link="#_3-3-3-visible-weird-texture" color=blue >前往</BButton>
|
||||
- 可见但渲染异常 → 材质类型错误:<BButton link="#_3-3-4-visible-weird-visibility-stuff" color=blue >前往</BButton>
|
||||
|
||||
### 3.3.1 - 完全隐形无阴影
|
||||
|
||||
确认实体未设置立即消失逻辑(如instant_despawn),优先检查实体基础配置。
|
||||
|
||||
### 3.3.2 - 隐形但显示阴影
|
||||
|
||||
此类问题通常涉及模型或材质配置,排查重点:
|
||||
|
||||
1. 几何体文件:检查命名正确性、文件完整性和几何偏移量设置
|
||||
2. 材质匹配:例如透明材质与普通材质的兼容性
|
||||
3. 渲染控制器:验证控制器逻辑与参数设置
|
||||
|
||||
### 3.3.3 - 可见但贴图异常
|
||||
|
||||
(内容开发中)
|
||||
|
||||
### 3.3.4 - 可见但渲染异常
|
||||
(内容开发中)
|
||||
20969
docs/wiki/entities/vanilla-usage-components.md
Normal file
20969
docs/wiki/entities/vanilla-usage-components.md
Normal file
File diff suppressed because it is too large
Load Diff
1383
docs/wiki/entities/vanilla-usage-spawn-rules.md
Normal file
1383
docs/wiki/entities/vanilla-usage-spawn-rules.md
Normal file
File diff suppressed because it is too large
Load Diff
357
docs/wiki/entities/village-mechanic.md
Normal file
357
docs/wiki/entities/village-mechanic.md
Normal file
@@ -0,0 +1,357 @@
|
||||
---
|
||||
title: 村庄机制
|
||||
category: 巧思案例
|
||||
mentions:
|
||||
- AeroForta
|
||||
- MedicalJewel105
|
||||
- stirante
|
||||
- SmokeyStack
|
||||
- SirLich
|
||||
- Ciosciaa
|
||||
- ThomasOrs
|
||||
---
|
||||
|
||||
# 村庄机制
|
||||
|
||||
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
|
||||
|
||||
本文适用于想要为自定义实体实现村庄机制的开发者
|
||||
|
||||
## 导航行为
|
||||
|
||||
首先从基本导航行为开始。
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/custom_villager.json#components]
|
||||
"minecraft:preferred_path":{
|
||||
"max_fall_blocks":1,
|
||||
"jump_cost":5,
|
||||
"default_block_cost":1.5,
|
||||
"preferred_path_blocks":[
|
||||
{
|
||||
"cost":0,
|
||||
"blocks":[
|
||||
"grass_path"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cost":1,
|
||||
"blocks":[
|
||||
"cobblestone",
|
||||
"stone"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cost":50,
|
||||
"blocks":[
|
||||
"bed",
|
||||
"lectern"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
允许实体进行随机移动。
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/custom_villager.json#components]
|
||||
"minecraft:behavior.random_stroll":{
|
||||
"priority":9,
|
||||
"speed_multiplier":0.55,
|
||||
"xz_dist":10,
|
||||
"y_dist":5
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
使实体返回居所范围(在此案例中即村庄边界)。需要下文将解释的`minecraft:dweller`组件。
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/custom_villager.json#components]
|
||||
"minecraft:behavior.move_towards_dwelling_restriction": {
|
||||
"priority": 4,
|
||||
"speed_multiplier": 1.0
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
通过创建巡逻路径让实体在村庄周围移动。铁傀儡使用的机制。
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/custom_villager.json#components]
|
||||
"minecraft:behavior.move_through_village": {
|
||||
"priority": 3,
|
||||
"speed_multiplier": 0.6,
|
||||
"only_at_night": true
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
允许实体进入建筑物并在下雨时寻找庇护所。需要开门能力。
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/custom_villager.json#components]
|
||||
"minecraft:behavior.move_indoors":{
|
||||
"priority":5
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
使实体在日落时留在室内。
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/custom_villager.json#components]
|
||||
"minecraft:behavior.restrict_open_door":{
|
||||
"priority": 5
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
需搭配使用:
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/custom_villager.json#components]
|
||||
"minecraft:annotation.open_door":{
|
||||
"priority": 5
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/custom_villager.json#components]
|
||||
"minecraft:navigation.walk":{
|
||||
"can_pass_doors":true,
|
||||
"can_open_doors":true
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/custom_villager.json#components]
|
||||
"minecraft:behavior.open_door":{
|
||||
"priority":6,
|
||||
"close_door_after":true
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
## 核心行为
|
||||
|
||||
::: code-group
|
||||
```json [BP/entities/custom_villager.json#components]
|
||||
"minecraft:dweller": {
|
||||
"dwelling_type": "village",
|
||||
"dweller_role": "inhabitant",
|
||||
"preferred_profession": "farmer",
|
||||
"update_interval_base": 60,
|
||||
"update_interval_variant": 40,
|
||||
"can_find_poi": true,
|
||||
"can_migrate": true,
|
||||
"first_founding_reward": 5
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
- `dweller_role: inhabitant`\
|
||||
允许实体认领床和钟,需搭配`minecraft:behavior.sleep`。
|
||||
- `preferred_profession: farmer`\
|
||||
为`minecraft:behavior.work`的可选参数
|
||||
- `can_find_poi`\
|
||||
启用后实体可寻找兴趣点。已知兴趣点类型:
|
||||
|
||||
```
|
||||
bed // 床
|
||||
jobsite // 工作站点
|
||||
meeting_area // 聚集点
|
||||
```
|
||||
|
||||
- `can_migrate`\
|
||||
定义实体是否能在不同村庄间迁移
|
||||
|
||||
### 睡眠行为
|
||||
|
||||
可参考[睡眠实体指南](/wiki/entities/sleeping-entities)实现实体睡眠
|
||||
|
||||
### 工作行为
|
||||
|
||||
需要设置"dweller_role"为"inhabitant",若未设置"preferred_profession"则实体将移动到最近的工作站点。
|
||||
|
||||
::: code-group
|
||||
```json [空值]
|
||||
"minecraft:behavior.work": {
|
||||
"priority": 4,
|
||||
"active_time": 250,
|
||||
"speed_multiplier": 0.5,
|
||||
"goal_cooldown": 200,
|
||||
"sound_delay_min": 100,
|
||||
"sound_delay_max": 200,
|
||||
"can_work_in_rain": false,
|
||||
"work_in_rain_tolerance": 1000,
|
||||
"on_arrival": {
|
||||
"event": "minecraft:resupply_trades",
|
||||
"target": "self"
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
### 社交行为
|
||||
|
||||
允许实体进行社交活动。
|
||||
需要设置"dweller_role"为"inhabitant"。
|
||||
|
||||
```json
|
||||
"minecraft:behavior.mingle": {
|
||||
"priority": 4,
|
||||
"speed_multiplier": 0.5,
|
||||
"duration": 30,
|
||||
"cooldown_time": 10,
|
||||
"mingle_partner_type": "my:custom_entity",
|
||||
"mingle_distance": 2.0
|
||||
}
|
||||
```
|
||||
|
||||
## 日程系统
|
||||
|
||||
现在将所有机制整合到"minecraft:scheduler"中。
|
||||
首先创建简单配置。
|
||||
将工作行为放入组件组:
|
||||
|
||||
::: code-group
|
||||
```json [空值]
|
||||
"component_groups":{
|
||||
"work_schedule":{
|
||||
"minecraft:behavior.work":{
|
||||
"priority":4,
|
||||
"active_time":250,
|
||||
"speed_multiplier":0.5,
|
||||
"goal_cooldown":200,
|
||||
"sound_delay_min":100,
|
||||
"sound_delay_max":200,
|
||||
"can_work_in_rain":true,
|
||||
"work_in_rain_tolerance":1000,
|
||||
"on_arrival":{
|
||||
"event":"minecraft:resupply_trades",
|
||||
"target":"self"
|
||||
}
|
||||
}
|
||||
},
|
||||
"gather_schedule":{
|
||||
"minecraft:behavior.mingle":{
|
||||
"priority": 5,
|
||||
"speed_multiplier": 0.8,
|
||||
"cooldown_time":10.0,
|
||||
"duration": 30.0,
|
||||
"mingle_dist": 1.5,
|
||||
"mingle_partner_type": "my:custom_entity"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
配置工作日程:
|
||||
|
||||
::: code-group
|
||||
```json [空值]
|
||||
"minecraft:scheduler":{
|
||||
"min_delay_secs":0,
|
||||
"max_delay_secs":10,
|
||||
"scheduled_events":[
|
||||
{
|
||||
"filters":{
|
||||
"all_of":[
|
||||
{
|
||||
"test":"hourly_clock_time",
|
||||
"operator":">=",
|
||||
"value":0 // 早晨
|
||||
},
|
||||
{
|
||||
"test":"hourly_clock_time",
|
||||
"operator":"<",
|
||||
"value":12000 // 傍晚
|
||||
}
|
||||
]
|
||||
},
|
||||
"event":"work"
|
||||
},
|
||||
{
|
||||
"filters":{
|
||||
"all_of":[
|
||||
{
|
||||
"test":"hourly_clock_time",
|
||||
"operator":">=",
|
||||
"value":21000
|
||||
},
|
||||
{
|
||||
"test":"hourly_clock_time",
|
||||
"operator":"<",
|
||||
"value":24000
|
||||
}
|
||||
]
|
||||
},
|
||||
"event":"gather"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
事件部分配置示例:
|
||||
|
||||
::: code-group
|
||||
```json [空值]
|
||||
"events":{
|
||||
"work":{
|
||||
"remove":{
|
||||
"component_groups":[
|
||||
"gather_schedule"
|
||||
]
|
||||
},
|
||||
"add":{
|
||||
"component_groups":[
|
||||
"work_schedule"
|
||||
]
|
||||
}
|
||||
},
|
||||
"gather":{
|
||||
"remove":{
|
||||
"component_groups":[
|
||||
"work_schedule"
|
||||
]
|
||||
},
|
||||
"add":{
|
||||
"component_groups":[
|
||||
"gather_schedule"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
|
||||
进入游戏生成实体后放置床,应可见绿色粒子效果。
|
||||
|
||||
## 其他行为
|
||||
|
||||
以下行为可供自定义实体使用:
|
||||
- `minecraft:behavior.move_to_village`\
|
||||
劫掠者使用该机制来留在村庄
|
||||
- `minecraft:behavior.stroll_towards_village`\
|
||||
狐狸使用该机制寻找并前往村庄
|
||||
- `minecraft:behavior.inspect_bookshelf`\
|
||||
管理员村民用于查看书架
|
||||
- `minecraft:behavior.explore_outskirts`\
|
||||
允许实体在村庄外探索(需搭配日程系统组件组保证返回)
|
||||
- `minecraft:behavior.defend_village_target`\
|
||||
用于近战攻击。远程攻击可能误伤具有"inhabitant" role的实体
|
||||
|
||||
可用行为对照表:
|
||||
| 行为名称 | 用途 | 备注 |
|
||||
| ----------------------------------------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
|
||||
| `minecraft:behavior.defend_village_target` | 允许实体攻击伤害村民的敌人 | 建议仅用于近战攻击型实体 |
|
||||
| `minecraft:behavior.hide` | 村民用于在特定POI隐藏停留 | 当前POI类型文档不完整,建议保持`"poi_type": "bed"` |
|
||||
| `minecraft:behavior.move_to_village` | 劫掠者和女巫用于在村庄范围内随机移动 | - |
|
||||
| `minecraft:behavior.nap` | 狐狸用于小憩 | 类似睡眠但更灵活,内置感知特定实体自动唤醒系统 |
|
||||
47771
docs/wiki/entities/vuc-full.md
Normal file
47771
docs/wiki/entities/vuc-full.md
Normal file
File diff suppressed because it is too large
Load Diff
4500
docs/wiki/entities/vusr-full.md
Normal file
4500
docs/wiki/entities/vusr-full.md
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user