Interrupter
Interrupter
Interrupter — это специальная нода для behaviour trees и макросов в EyeAuras, которая помогает "прерывать" долгие действия при наступлении определённых условий.
Как работает Interrupter?
У Interrupter всегда два дочерних элемента (два "ребёнка"):
- Условие (Condition) — что-то, что можно проверить (например, здоровье персонажа ниже 20%).
- Действие (Action) — какая-то задача, которую нужно выполнить (например, подождать несколько секунд или использовать способность).
Главный принцип работы
- Если Condition сразу возвращает
Success, Interrupter возвращаетFailure, не запуская Action. ПриRunningусловия он ждёт следующего такта дерева. - Пока Interrupter ожидает Action, он последовательно проверяет Condition, выдерживая 100 мс между завершёнными проверками.
- Если проверка обнаруживает
trueу Condition во время выполнения Action:- Interrupter запрашивает отмену и дожидается завершения Action, включая освобождение ресурсов.
- Возвращает статус
Failure.
- Если Condition не становится
trueдо завершения Action:- Interrupter возвращает результат работы этого Action (
Success,FailureилиRunning).
- Interrupter возвращает результат работы этого Action (
Проверки должны быть короткими и учитывать отмену. Время реакции включает их выполнение и задержки планировщика. Действие, игнорирующее токен отмены, нельзя остановить принудительно; уже выполненные эффекты не откатываются. Допущенная до остановки мониторинга проверка завершается; обнаруженный после остановки Success не меняет результат действия.
Состояние между тактами
При прерывании Interrupter сбрасывает принадлежащее ему состояние Action после завершения активного такта. Это работает и когда Condition становится Success на следующем такте после Running у Action: итератор скрипта освобождается с выполнением finally, текущий шаг исполнения и таймеры дочерних нод сбрасываются. После сброса Condition действие начинается с первого ребёнка. Обычный Running без прерывания сохраняет состояние. Граф, скрипт, Blackboard и сессия остаются. Reset обходит структурных детей, включая отключённых; вызываемое дерево SubTree и состояние сторонних нод требуют отдельного владения. Ошибка освобождения остаётся ошибкой; остальные дети могут не успеть сброситься.
Простой пример
Interrupter
├── Condition: Мана стала меньше 10%
└── Action: Кастовать заклинание Медитация
- Пока персонаж медитирует, Interrupter следит за маной.
- Если мана вдруг падает ниже 10%, Meditate будет прерван, и Interrupter вернёт
Failure. - Если мана выше 10%, и действие (Meditate) завершилось, Interrupter просто вернёт тот же результат (
Success, если всё прошло хорошо, илиFailure, если действию не удалось выполниться по другой причине).
Когда это удобно?
- Хотите отменять длинные действия, если что-то случилось.
- Необходимо срочно реагировать на изменения условий во время запущенного действия (например, прерывать восстановление при появлении врага или понижении параметров).