События - это то, как моб меняется. Детёныш вырастает, приручённый волк садится, крипер начинает шипеть: каждое из этих изменений - это событие, которое включает или выключает группы компонентов. На этой странице показано всё, что умеет событие, на примере Рубинового голема из гайда Файл сущности.
Файлы
События хранятся в том же файле, что и остальное поведение моба, в блоке events.
BP/
entities/
ruby_golem.json <- "events" is inside minecraft:entityКак выглядит событие
Событие - это имя и объект с действиями. Когда событие срабатывает, игра выполняет эти действия.
"events": {
"wiki:become_angry": {
"add": { "component_groups": ["wiki:angry"] },
"remove": { "component_groups": ["wiki:calm"] }
}
}Давайте событиям своё пространство имён, например wiki:become_angry. Имена с minecraft: предназначены для событий, которые вызывает сама игра.
Все действия кратко
| Действие | Что делает |
|---|---|
add | Включает одну или несколько групп компонентов |
remove | Выключает одну или несколько групп компонентов |
set_property | Меняет свойство, объявленное в description.properties |
trigger | Вызывает другое событие |
randomize | Выбирает одну запись из списка с учётом веса |
sequence | Выполняет все записи из списка сверху вниз |
first_valid | Выполняет первую запись, чьи фильтры прошли, и пропускает остальные |
filters | Разрешает действия, только если фильтр пройден |
queue_command | Выполняет команду от имени моба на следующем тике |
play_sound | Проигрывает один из звуков моба, например "saddle" у верблюда |
add и remove
Эти два действия делают почти всю работу. Оба принимают список, поэтому можно переключать сразу несколько групп.
"add": { "component_groups": ["wiki:angry", "wiki:glowing_eyes"] },
"remove": { "component_groups": ["wiki:calm"] }- Группы должны существовать в
component_groupsв том же файле. Если имя написано с ошибкой, группа просто не добавится, поэтому внимательно проверяйте имена. - Если добавить уже включённую группу, она перезапустится. Таймер внутри неё снова начнёт отсчёт с нуля.
- Удаление выключенной группы ничего не делает, так что её можно смело удалять «на всякий случай».
set_property
Меняет свойство моба. Свойство должно быть объявлено в description.
"set_property": {
"wiki:mood": "angry",
"wiki:rubies_eaten": "math.min(q.property('wiki:rubies_eaten') + 1, 5)"
}Значение может быть обычным значением или выражением Molang в строке. Вторая строка выше каждый раз прибавляет 1, но никогда не превышает 5. Что можно прочитать, смотрите в разделе Запросы Molang.
trigger: цепочки событий
trigger вызывает другое событие. Так можно один раз написать кусочек логики и использовать его повторно.
"trigger": "wiki:calm_down"Можно также указать, кто получит событие:
"trigger": {
"event": "wiki:calm_down",
"target": "self"
}randomize: выбрать одно
randomize содержит список записей. Игра выбирает одну из них и выполняет её. У каждой записи может быть weight: записи с большим весом выбираются чаще. Запись без веса считается как 1.
"minecraft:entity_spawned": {
"randomize": [
{
"weight": 3,
"trigger": "wiki:spawn_adult"
},
{
"weight": 1,
"trigger": "wiki:spawn_baby"
}
]
}Шанс каждой записи равен её весу, делённому на сумму всех весов. Здесь сумма равна 4, поэтому взрослый голем появится с шансом 3 из 4 (75%), а детёныш - 1 из 4 (25%).
Запись может быть просто { "weight": 3 } без действий. Это значит «3 доли шанса ничего не сделать».
sequence: несколько действий по порядку
sequence выполняет все записи, от первой до последней. Он становится по-настоящему мощным, когда у записей есть свои filters: каждая выполняется, только если её проверка прошла.
"wiki:fed_ruby": {
"sequence": [
{
"set_property": {
"wiki:rubies_eaten": "q.property('wiki:rubies_eaten') + 1"
}
},
{
"filters": { "test": "is_baby", "value": true },
"trigger": "wiki:grow_up"
},
{
"filters": { "test": "int_property", "domain": "wiki:rubies_eaten", "operator": ">=", "value": 4 },
"add": { "component_groups": ["wiki:shiny"] }
}
]
}Изменения применяются в конце
Когда событие выполняется, игра сначала рассчитывает все его действия, а применяет их при следующем обновлении моба. Поэтому фильтр в одной из следующих записей sequence всё ещё видит старые значения. В примере выше третья запись проверяет счётчик до того, как первая запись прибавила 1. Помните об этом или разбейте логику на два события.
first_valid: побеждает первое совпадение
first_valid похож на sequence, но останавливается после первой записи, чьи фильтры прошли. Он идеально подходит для логики «если это, иначе если то, иначе...». Ванильные коровы с его помощью выбирают тёплый или холодный облик в зависимости от биома, где они появились.
"wiki:pick_color": {
"first_valid": [
{
"filters": { "test": "has_biome_tag", "value": "desert" },
"add": { "component_groups": ["wiki:sandy"] }
},
{
"filters": { "test": "has_biome_tag", "value": "frozen" },
"add": { "component_groups": ["wiki:icy"] }
},
{
"add": { "component_groups": ["wiki:plain"] }
}
]
}У последней записи нет фильтров, поэтому она проходит всегда. Она работает как вариант «иначе».
filters на всё событие
filters можно поставить прямо на событие. Если фильтр не прошёл, в событии ничего не выполнится.
"wiki:become_angry": {
"filters": { "test": "is_baby", "value": false },
"add": { "component_groups": ["wiki:angry"] }
}Теперь детёныши голема никогда не злятся. Для этого нужен format_version 1.19.20 или новее. Со старой версией игра пропускает фильтр и всегда выполняет событие.
queue_command
Выполняет команду так, будто её ввёл сам моб. Команда выполняется в течение следующего тика, если только моб к тому времени не исчез.
"queue_command": {
"command": "say I am made of rubies!"
}Удобно для мелочей вроде частиц, звуков или тегов ("tag @s add wiki:tamed"). Для чего-то большего проще использовать функцию или скрипт.
События, которые игра вызывает сама
У некоторых событий фиксированные имена с minecraft:. Если у вашего моба есть событие с одним из этих имён, игра вызовет его в нужный момент.
| Событие | Когда срабатывает |
|---|---|
minecraft:entity_spawned | Когда моб впервые появляется: сам по себе, из яйца призыва или через /summon |
minecraft:entity_born | Когда моб рождается от двух скрещённых родителей |
minecraft:entity_transformed | Когда другой моб превращается в этого через minecraft:transformation |
В minecraft:entity_spawned большинство мобов задают своё начальное состояние, например выбирают, быть взрослым или детёнышем.
Другие способы вызвать событие
- Компоненты. Многие компоненты принимают событие, например
timer,damage_sensor,environment_sensor,interactиageable. - Команды.
/event entity @e[type=wiki:ruby_golem] wiki:become_angryвызывает событие у каждого Рубинового голема. - Призыв.
/summon wiki:ruby_golem ~ ~ ~ 0 0 wiki:spawn_babyпризывает голема и сразу вызывает событие. См. /summon. - Правила появления. Условие
herdможет вызвать событие у части группы. См. Правила появления.
Если что-то пошло не так
| Что вы видите | Скорее всего, причина |
|---|---|
| Ничего не происходит | Имя события написано по-другому там, где его вызывают, или его вообще никто не вызывает |
| Группа не добавляется | Имени группы из add нет в component_groups |
Фильтр в sequence работает странно | Он видит значения, какими они были до начала события: см. предупреждение выше |
| Фильтр на всём событии игнорируется | format_version файла старше 1.19.20 |
randomize всегда выбирает одно и то же | Один вес намного больше остальных |
Быстро проверяйте события, вызывая их командой /event у одного моба. Больше помощи в разделе Когда что-то сломалось. Дальше: Правила появления.