1. Вики
  2. /Сущности
  3. /События сущностей

События сущностей

Как использовать события сущностей в аддонах Bedrock: добавлять и убирать группы компонентов, выбирать случайный исход, выполнять шаги по порядку, связывать события в цепочки и менять свойства.

События - это то, как моб меняется. Детёныш вырастает, приручённый волк садится, крипер начинает шипеть: каждое из этих изменений - это событие, которое включает или выключает группы компонентов. На этой странице показано всё, что умеет событие, на примере Рубинового голема из гайда Файл сущности.

Файлы

События хранятся в том же файле, что и остальное поведение моба, в блоке events.

Пакет поведения
BP/
  entities/
    ruby_golem.json    <- "events" is inside minecraft:entity

Как выглядит событие

Событие - это имя и объект с действиями. Когда событие срабатывает, игра выполняет эти действия.

BP/entities/ruby_golem.json (events)
"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.

BP/entities/ruby_golem.json (events)
"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: каждая выполняется, только если её проверка прошла.

BP/entities/ruby_golem.json (events)
"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, но останавливается после первой записи, чьи фильтры прошли. Он идеально подходит для логики «если это, иначе если то, иначе...». Ванильные коровы с его помощью выбирают тёплый или холодный облик в зависимости от биома, где они появились.

BP/entities/ruby_golem.json (events)
"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 можно поставить прямо на событие. Если фильтр не прошёл, в событии ничего не выполнится.

BP/entities/ruby_golem.json (events)
"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 у одного моба. Больше помощи в разделе Когда что-то сломалось. Дальше: Правила появления.

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