Фильтр - это вопрос с ответом «да» или «нет», который игра задаёт о мобе. «Атакующий - игрок?» «Сейчас день?» «Этот моб в воде?» Если ответ «да», фильтр проходит, и то, что он охраняет, может произойти.
Фильтры встречаются во всех файлах моба: в событиях, в компонентах вроде датчиков урона и выбора цели и в правилах появления. Разберитесь в них один раз, и сможете использовать их везде.
Файлы
У фильтров нет своего файла. Они находятся внутри других файлов, под ключами 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 | Как сравнивать с value | equals |
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. Ванильные правила появления часто так делают.
Где используются фильтры
Датчик урона: реакция на того, кто ударил
"minecraft:damage_sensor": {
"triggers": [
{
"on_damage": {
"filters": { "test": "is_family", "subject": "other", "value": "player" },
"event": "wiki:become_angry"
}
}
]
}Злить голема могут только игроки. Урон от мобов, падения или огня ничего особенного не вызывает. См. minecraft:damage_sensor.
Выбор цели: кого атаковать
"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.
Датчик окружения: реакция на мир
"minecraft:environment_sensor": {
"triggers": [
{
"filters": { "test": "in_water" },
"event": "wiki:start_rusting"
}
]
}Датчик окружения постоянно проверяет свои фильтры и вызывает событие, пока они проходят.
События и правила появления
Внутри событий filters решают, выполнится ли запись (см. События сущностей). В правилах появления minecraft:biome_filter использует те же проверки для выбора биомов (см. Правила появления).
Самые полезные проверки
Всего проверок больше сотни. Вот те, которые вам понадобятся чаще всего, сгруппированные по тому, что они проверяют.
Кто это?
| Проверка | Значение | Проходит, когда субъект... |
|---|---|---|
is_family | Имя семейства, например "player" | имеет это семейство в minecraft:type_family |
has_component | ID компонента, например "minecraft:is_baby" | имеет этот компонент прямо сейчас |
has_tag | Имя тега | имеет этот тег из /tag |
is_baby | true / false | детёныш |
is_tamed | true / false | приручён |
is_owner | true / false | хозяин моба, которому принадлежит фильтр |
has_nametag | true / false | имеет своё имя |
is_variant | Число | имеет это число в minecraft:variant |
is_mark_variant | Число | имеет это число в minecraft:mark_variant |
is_color | Название цвета, например "red" | имеет этот цвет |
Здоровье и состояние
| Проверка | Значение | Проходит, когда субъект... |
|---|---|---|
actor_health | Число | имеет здоровье, которое сравнивается со значением (используйте <, > и т. д.) |
is_missing_health | true / false | не на полном здоровье |
has_mob_effect | ID эффекта, например "poison" | находится под этим эффектом. См. Ванильные эффекты. |
on_fire | true / false | горит |
on_ground | true / false | стоит на земле |
is_sneaking | true / false | крадётся |
is_sprinting | true / false | бежит |
is_moving | true / false | движется |
is_riding | true / false | едет верхом на другой сущности |
rider_count | Число | везёт столько наездников |
has_target | true / false | имеет цель для атаки |
has_damage | Тип урона, например "fall" или "fire" | получает этот вид урона (датчики урона) |
Предметы
| Проверка | Значение | Проходит, когда субъект... |
|---|---|---|
has_equipment | ID предмета | держит этот предмет в слоте из domain, например "hand", "head" или "any" |
has_equipment_tag | Тег предмета | имеет предмет с этим тегом в слоте из domain |
has_ranged_weapon | true / false | держит лук или арбалет |
Где он находится
| Проверка | Значение | Проходит, когда субъект... |
|---|---|---|
in_water | true / false | в воде |
is_underwater | true / false | полностью под водой |
in_water_or_rain | true / false | в воде или под дождём |
in_lava | true / false | в лаве |
is_underground | true / false | имеет блоки над собой |
in_nether / in_overworld | true / false | в этом измерении |
has_biome_tag | Тег биома, например "desert" | в биоме с этим тегом. См. Ванильные биомы. |
is_biome | Тип биома, например "ocean" или "jungle" | в биоме этого общего типа |
is_altitude | Число | на высоте, которая сравнивается со значением |
is_block | ID блока | (с "subject": "block") участвующий блок - это именно этот блок |
is_in_village | true / false | внутри деревни |
has_biome_tag или is_biome?
Лучше используйте has_biome_tag. Теги точнее, и у кастомных биомов из других аддонов могут быть те же теги.
Расстояние
| Проверка | Значение | Проходит, когда... |
|---|---|---|
distance_to_nearest_player | Число блоков | ближайший игрок находится на таком расстоянии (используйте < или >) |
target_distance | Число блоков | цель моба находится на таком расстоянии |
owner_distance | Число блоков | хозяин моба находится на таком расстоянии |
home_distance | Число блоков | дом моба находится на таком расстоянии |
Время, погода и мир
| Проверка | Значение | Проходит, когда... |
|---|---|---|
is_daytime | true / false | сейчас день |
hourly_clock_time | Число от 0 до 24000 | время суток сравнивается со значением |
moon_phase | Число от 0 до 7 | луна в этой фазе |
weather_at_position | Погода, например "thunderstorm" | погода там, где стоит субъект, совпадает |
is_difficulty | "peaceful", "easy", "normal" или "hard" | в игре выбрана эта сложность |
is_game_rule | true / false | игровое правило из domain включено |
random_chance | Число | выпал случайный шанс: значение 10 проходит примерно 1 раз из 10 |
Свойства сущности
Эти проверки читают свойства, объявленные в description моба. Имя свойства пишется в domain:
| Проверка | Значение |
|---|---|
bool_property | true / 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 |
| Числовая проверка ведёт себя странно | Нет оператора, поэтому проверяется точное совпадение |
Больше помощи в разделе Когда что-то сломалось.