1. Вики
  2. /Сущности
  3. /Фильтры

Фильтры

Как работают фильтры сущностей в аддонах Minecraft Bedrock: test, subject, operator, value, all_of, any_of и none_of, плюс таблица самых полезных проверок.

Фильтр - это вопрос с ответом «да» или «нет», который игра задаёт о мобе. «Атакующий - игрок?» «Сейчас день?» «Этот моб в воде?» Если ответ «да», фильтр проходит, и то, что он охраняет, может произойти.

Фильтры встречаются во всех файлах моба: в событиях, в компонентах вроде датчиков урона и выбора цели и в правилах появления. Разберитесь в них один раз, и сможете использовать их везде.

Файлы

У фильтров нет своего файла. Они находятся внутри других файлов, под ключами filters (или biome_filter в правилах появления).

Где встречаются фильтры
BP/
  entities/
    ruby_golem.json      <- in events and many components
  spawn_rules/
    ruby_golem.json      <- minecraft:biome_filter

Одна проверка

Самый маленький фильтр - это одна проверка (test):

Одна проверка
{ "test": "is_family", "subject": "other", "operator": "==", "value": "player" }

Читайте её как предложение: «Семейство (family) другой (other) сущности равно player?»

ПолеЧто значитЕсли не указать
testКакой вопрос задать. См. таблицы ниже.Обязательно
subjectО ком спрашиватьself
operatorКак сравнивать с valueequals
valueС чем сравниватьДля проверок «да/нет»: true
domainДополнительная деталь для некоторых проверок, например слот снаряжения или имя свойстваЗависит от проверки

Благодаря значениям по умолчанию короткие фильтры встречаются часто:

Короткие формы
{ "test": "is_daytime" }
{ "test": "in_water", "value": false }
{ "test": "has_tag", "value": "wiki:tamed" }

Первый спрашивает «сейчас день?». Второй спрашивает «этот моб не в воде?».

Субъекты: кого проверяем

СубъектКто это
selfМоб, которому принадлежит фильтр
otherДругая сущность во взаимодействии: та, которую выбирают целью, касаются или с которой взаимодействуют
playerИгрок, участвующий во взаимодействии
targetТекущая цель моба
damagerТот, кто нанёс урон, в датчике урона
parentРодитель моба
blockБлок, участвующий в проверке, для блочных проверок вроде is_block

Какие субъекты имеют смысл, зависит от того, где стоит фильтр. В датчике урона other и damager - это атакующий. В поведении выбора цели other - это моб, которого рассматривают как цель.

Операторы: как сравнивать

ОператорЗначение
==, =, equalsРавно (по умолчанию)
!=, <>, notНе равно
<Меньше
<=Меньше или равно
>Больше
>=Больше или равно

Операторы «больше/меньше» имеют смысл только для числовых проверок, таких как actor_health или distance_to_nearest_player.

Объединение проверок

Несколько проверок объединяются в группу:

ГруппаПроходит, когда
all_ofПроходит каждая проверка внутри (И)
any_ofПроходит хотя бы одна проверка внутри (ИЛИ)
none_ofНи одна проверка внутри не проходит (НЕ)

Группы могут содержать другие группы, так что можно собрать любое нужное правило. Этот фильтр проходит для игрока, который не крадётся, ночью или во время грозы:

Вложенный фильтр
"filters": {
  "all_of": [
    { "test": "is_family", "subject": "other", "value": "player" },
    { "test": "is_sneaking", "subject": "other", "value": false },
    {
      "any_of": [
        { "test": "is_daytime", "value": false },
        { "test": "weather_at_position", "value": "thunderstorm" }
      ]
    }
  ]
}

Просто список означает all_of

Если написать обычный список проверок без имени группы, должна пройти каждая проверка, как в all_of. Ванильные правила появления часто так делают.

Где используются фильтры

Датчик урона: реакция на того, кто ударил

BP/entities/ruby_golem.json (components)
"minecraft:damage_sensor": {
  "triggers": [
    {
      "on_damage": {
        "filters": { "test": "is_family", "subject": "other", "value": "player" },
        "event": "wiki:become_angry"
      }
    }
  ]
}

Злить голема могут только игроки. Урон от мобов, падения или огня ничего особенного не вызывает. См. minecraft:damage_sensor.

Выбор цели: кого атаковать

BP/entities/ruby_golem.json (component_groups)
"minecraft:behavior.nearest_attackable_target": {
  "priority": 2,
  "entity_types": [
    {
      "filters": {
        "all_of": [
          { "test": "is_family", "subject": "other", "value": "monster" },
          { "test": "is_family", "subject": "other", "operator": "not", "value": "creeper" }
        ]
      },
      "max_dist": 16
    }
  ]
}

Голем охотится на монстров, но не трогает криперов. См. behavior.nearest_attackable_target.

Датчик окружения: реакция на мир

BP/entities/ruby_golem.json (components)
"minecraft:environment_sensor": {
  "triggers": [
    {
      "filters": { "test": "in_water" },
      "event": "wiki:start_rusting"
    }
  ]
}

Датчик окружения постоянно проверяет свои фильтры и вызывает событие, пока они проходят.

События и правила появления

Внутри событий filters решают, выполнится ли запись (см. События сущностей). В правилах появления minecraft:biome_filter использует те же проверки для выбора биомов (см. Правила появления).

Самые полезные проверки

Всего проверок больше сотни. Вот те, которые вам понадобятся чаще всего, сгруппированные по тому, что они проверяют.

Кто это?

ПроверкаЗначениеПроходит, когда субъект...
is_familyИмя семейства, например "player"имеет это семейство в minecraft:type_family
has_componentID компонента, например "minecraft:is_baby"имеет этот компонент прямо сейчас
has_tagИмя тегаимеет этот тег из /tag
is_babytrue / falseдетёныш
is_tamedtrue / falseприручён
is_ownertrue / falseхозяин моба, которому принадлежит фильтр
has_nametagtrue / falseимеет своё имя
is_variantЧислоимеет это число в minecraft:variant
is_mark_variantЧислоимеет это число в minecraft:mark_variant
is_colorНазвание цвета, например "red"имеет этот цвет

Здоровье и состояние

ПроверкаЗначениеПроходит, когда субъект...
actor_healthЧислоимеет здоровье, которое сравнивается со значением (используйте <, > и т. д.)
is_missing_healthtrue / falseне на полном здоровье
has_mob_effectID эффекта, например "poison"находится под этим эффектом. См. Ванильные эффекты.
on_firetrue / falseгорит
on_groundtrue / falseстоит на земле
is_sneakingtrue / falseкрадётся
is_sprintingtrue / falseбежит
is_movingtrue / falseдвижется
is_ridingtrue / falseедет верхом на другой сущности
rider_countЧисловезёт столько наездников
has_targettrue / falseимеет цель для атаки
has_damageТип урона, например "fall" или "fire"получает этот вид урона (датчики урона)

Предметы

ПроверкаЗначениеПроходит, когда субъект...
has_equipmentID предметадержит этот предмет в слоте из domain, например "hand", "head" или "any"
has_equipment_tagТег предметаимеет предмет с этим тегом в слоте из domain
has_ranged_weapontrue / falseдержит лук или арбалет

Где он находится

ПроверкаЗначениеПроходит, когда субъект...
in_watertrue / falseв воде
is_underwatertrue / falseполностью под водой
in_water_or_raintrue / falseв воде или под дождём
in_lavatrue / falseв лаве
is_undergroundtrue / falseимеет блоки над собой
in_nether / in_overworldtrue / falseв этом измерении
has_biome_tagТег биома, например "desert"в биоме с этим тегом. См. Ванильные биомы.
is_biomeТип биома, например "ocean" или "jungle"в биоме этого общего типа
is_altitudeЧислона высоте, которая сравнивается со значением
is_blockID блока(с "subject": "block") участвующий блок - это именно этот блок
is_in_villagetrue / falseвнутри деревни

has_biome_tag или is_biome?

Лучше используйте has_biome_tag. Теги точнее, и у кастомных биомов из других аддонов могут быть те же теги.

Расстояние

ПроверкаЗначениеПроходит, когда...
distance_to_nearest_playerЧисло блоковближайший игрок находится на таком расстоянии (используйте < или >)
target_distanceЧисло блоковцель моба находится на таком расстоянии
owner_distanceЧисло блоковхозяин моба находится на таком расстоянии
home_distanceЧисло блоковдом моба находится на таком расстоянии

Время, погода и мир

ПроверкаЗначениеПроходит, когда...
is_daytimetrue / falseсейчас день
hourly_clock_timeЧисло от 0 до 24000время суток сравнивается со значением
moon_phaseЧисло от 0 до 7луна в этой фазе
weather_at_positionПогода, например "thunderstorm"погода там, где стоит субъект, совпадает
is_difficulty"peaceful", "easy", "normal" или "hard"в игре выбрана эта сложность
is_game_ruletrue / falseигровое правило из domain включено
random_chanceЧисловыпал случайный шанс: значение 10 проходит примерно 1 раз из 10

Свойства сущности

Эти проверки читают свойства, объявленные в description моба. Имя свойства пишется в domain:

ПроверкаЗначение
bool_propertytrue / false
int_propertyЦелое число
float_propertyДробное число
enum_propertyОдно из слов в values
has_propertyИмя свойства (в value, без domain)
Проверка свойства
{ "test": "enum_property", "domain": "wiki:mood", "value": "angry" }

Если что-то пошло не так

Что вы видитеСкорее всего, причина
Фильтр никогда не проходитНе тот subject. В датчике урона или выборе цели обычно нужен other, а не self.
Фильтр проходит, когда не долженВ проверке «да/нет» нет "value": false там, где вы имели в виду «не», или ключ написан с ошибкой (например allof). Загляните в журнал контента (Content Log).
Проверка семейства не проходитЭтого семейства нет в списке minecraft:type_family цели
Проверка свойства не проходитИмя свойства в domain не совпадает с именем в description.properties
Числовая проверка ведёт себя странноНет оператора, поэтому проверяется точное совпадение

Больше помощи в разделе Когда что-то сломалось.

We use cookies to improve your experience and analyse site traffic. Learn more