过滤器¶
过滤器(Filter)是Minecraft基岩版数据驱动系统中用于条件判断的通用机制。过滤器广泛应用于实体事件响应、生成规则、AI意向等需要检测特定条件的场景。
概述¶
过滤器通过一组过滤器测试(Filter Test)来判断条件是否成立。每个测试检查目标对象的某个属性或状态,整体结果由多个测试的逻辑组合决定。过滤器系统使得附加包开发者可以在不使用脚本的前提下实现复杂的条件逻辑。
基本结构¶
一个过滤器测试由以下字段组成:
test- 测试的名称,指定要检查的属性或条件。
subject- 测试的目标对象。可选值包括
self(自身)、other(交互的另一方)、parent(父实体)、player(玩家)、target(当前目标)、baby(幼体)等。默认为self。 operator- 比较运算符。可选值包括
==、!=、<、<=、>、>=、equals、not。默认为==。 value- 期望的比较值。类型取决于测试的种类,可以是字符串、数值或布尔值。
逻辑组合¶
多个过滤器测试可以通过以下逻辑运算进行组合:
all_of:所有子测试必须通过(逻辑与)。any_of:至少一个子测试通过(逻辑或)。none_of:所有子测试都不通过(逻辑非)。
逻辑组合可以嵌套,构建任意复杂的条件表达式:
逻辑组合示例
{
"all_of": [
{"test": "is_daytime", "value": false},
{
"any_of": [
{"test": "is_family", "subject": "other", "value": "player"},
{"test": "is_family", "subject": "other", "value": "villager"}
]
}
]
}
上述示例表示“夜间,且交互对象是玩家或村民”。
常用过滤器测试¶
实体状态测试¶
| 测试名 | 描述 |
|---|---|
is_family | 实体是否属于指定族 |
has_component | 实体是否拥有指定组件 |
has_tag | 实体是否拥有指定标签 |
is_baby | 实体是否为幼体 |
is_sleeping | 实体是否在睡觉 |
is_sneaking | 实体是否在潜行 |
is_underwater | 实体是否在水下 |
is_riding | 实体是否在骑乘 |
环境测试¶
| 测试名 | 描述 |
|---|---|
is_daytime | 当前是否为白天 |
is_biome | 所在位置是否为指定生物群系 |
has_biome_tag | 所在生物群系是否拥有指定标签 |
is_underground | 实体是否在地下 |
is_in_water | 实体是否在水中 |
weather | 当前天气状态 |
moon_phase | 当前月相 |
hourly_clock_time | 当前游戏内时间 |
距离与位置测试¶
| 测试名 | 描述 |
|---|---|
distance_to_nearest_player | 与最近玩家的距离 |
in_water_or_rain | 是否在水中或雨中 |
is_altitude | 当前Y坐标是否在指定范围内 |
is_brightness | 当前位置亮度是否在指定范围内 |
过滤器的应用场景¶
过滤器在以下场景中被使用:
- 实体事件:通过
filters字段控制事件响应的条件。 - AI意向:部分行为组件通过
filters字段限制行为的触发条件。 - 环境感知组件:
minecraft:environment_sensor组件使用过滤器持续监测环境条件,并在条件满足时触发事件。 - 生成规则:生成规则使用过滤器定义生物生成所需的环境条件。
- 战利品表:战利品表的条件字段使用过滤器决定战利品的生成规则。