跳转至

过滤器

过滤器(Filter)是Minecraft基岩版数据驱动系统中用于条件判断的通用机制。过滤器广泛应用于实体事件响应、生成规则、AI意向等需要检测特定条件的场景。

概述

过滤器通过一组过滤器测试(Filter Test)来判断条件是否成立。每个测试检查目标对象的某个属性或状态,整体结果由多个测试的逻辑组合决定。过滤器系统使得附加包开发者可以在不使用脚本的前提下实现复杂的条件逻辑。

基本结构

一个过滤器测试由以下字段组成:

过滤器测试示例
{
  "test": "is_family",
  "subject": "other",
  "operator": "==",
  "value": "monster"
}
test
测试的名称,指定要检查的属性或条件。
subject
测试的目标对象。可选值包括self(自身)、other(交互的另一方)、parent(父实体)、player(玩家)、target(当前目标)、baby(幼体)等。默认为self
operator
比较运算符。可选值包括==!=<<=>>=equalsnot。默认为==
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组件使用过滤器持续监测环境条件,并在条件满足时触发事件。
  • 生成规则:生成规则使用过滤器定义生物生成所需的环境条件。
  • 战利品表:战利品表的条件字段使用过滤器决定战利品的生成规则。