滤器

即MinecraftFilter,用于测试指定项目是否指定的条件,这是Addon附加包的一重大特色之一,带有较复杂的逻辑。
滤器被用于的地方较多,如实体行为组件、实体生成规则、事件、生物群系等
至于是怎么用到实体行为组件里,请查看实体文档已查阅需要使用到滤器的组件,这些基本上均为内嵌。

制作

格式

  • test:(字符串)要测试的项目(详细介绍见下)。
  • subject:(字符串)测试的主体。只有部分测试需要指定这个字段(详细介绍见下)。
  • domain:(字符串)域。只有部分测试需要指定这个字段(详细介绍见下)。
  • value(字符串或数字或布尔)给定的值。将会拿实际的数据与这个值进行比较。
  • operator:(字符串)比较方式。在指定项目(test)上,主体(subject)的域(domain)与给定的值(value)的比较方式(

测试主体

  • self:调用此测试的实体(即使用了该滤器的实体)。
  • other:除调用者以外的,参与交互的实体。该实体具体是哪个,由调用该滤器的组件或事件决定。可能没有这个实体。
  • parent:调用者的父母。可能没有这个实体。
  • player:参与交互的玩家。该玩家具体是哪个,由调用该滤器的组件或事件决定。可能没有这个实体。
  • target:调用者的目标实体。通常是该实体正在追杀的目标。可能没有这个实体。

比较方式

  • =、==、equals:等于。当主体的项目与给定数据完全一致时,测试通过。如果比较方式被省略,则默认使用该种方式比较。
  • !=、<>、not:不等于。当主体的项目与给定数据不一致时,测试通过。
  • <:小于。当主体的项目小于给定数据时,测试通过。
  • <=:小于等于。当主体的项目小于或等于给定数据时,测试通过。
  • >:大于。当主体的项目大于给定数据时,测试通过。
  • >=:大于等于。当主体的项目大于或等于给定数据时,测试通过。

组合

滤器其实可以将基本单位通过逻辑进行任意组合。

  • any_of:(数组)当其下只要有任何一个滤器通过时,这组滤器就能通过。
  • all_of:(数组)当其下的所有滤器通过时,这组滤器才能通过。
  • none_of:(对象或数组)当其下的(所有)滤器没有通过时,该滤器才能通过。

例如可以这么写:

{
    "any_of": [
        { "test": "has_biome_tag", "operator": "==", "value": "taiga"}, 
        { "test": "has_biome_tag", "operator": "!=", "value": "mega" }
    ]
}

当生物群系有taiga标签或者没有mega标签时,条件达成。
如果把any_of改成all_of:

{
    "all_of": [
        { "test": "has_biome_tag", "operator": "==", "value": "taiga"}, 
        { "test": "has_biome_tag", "operator": "!=", "value": "mega" }
    ]
}

就变成了当生物群系有taiga标签并且没有mega标签时,条件才能达成。
如果改成none_of:

{
    "none_of": [
        { "test": "has_biome_tag", "operator": "==", "value": "taiga"}, 
        { "test": "has_biome_tag", "operator": "!=", "value": "mega" }
    ]
}

就变成了当生态群系有taiga标签或者没有mega标签时,条件都不能达成。

all_of、any_of以及none_of可以自由组合和嵌套

  {
    "none_of": [
        { /* A */ "test": "is_family", "subject": "other", "value": "mob" },
        {
            "all_of": [
                { /* B */ "test": "is_family", "subject": "other", "value": "player" },
                { 
                    "none_of": { /* C */ "test": "has_ability", "subject": "other", "value": "instabuild" } 
                }
            ]
        }
    ]
}

只要 A 滤器通过,或者B 滤器通过C 滤器不通过,这整个一大块就不能通过。

更多示例以及测试项目请看↓提示(一定要配合使用)

测试项目

*请前往>API文档>其它文档>滤器 查看