Interrupter

Interrupter

Interrupter — это специальная нода для behaviour trees и макросов в EyeAuras, которая помогает "прерывать" долгие действия при наступлении определённых условий.

Как работает Interrupter?

У Interrupter всегда два дочерних элемента (два "ребёнка"):

  1. Условие (Condition) — что-то, что можно проверить (например, здоровье персонажа ниже 20%).
  2. Действие (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).

Проверки должны быть короткими и учитывать отмену. Время реакции включает их выполнение и задержки планировщика. Действие, игнорирующее токен отмены, нельзя остановить принудительно; уже выполненные эффекты не откатываются. Допущенная до остановки мониторинга проверка завершается; обнаруженный после остановки Success не меняет результат действия.

Состояние между тактами

При прерывании Interrupter сбрасывает принадлежащее ему состояние Action после завершения активного такта. Это работает и когда Condition становится Success на следующем такте после Running у Action: итератор скрипта освобождается с выполнением finally, текущий шаг исполнения и таймеры дочерних нод сбрасываются. После сброса Condition действие начинается с первого ребёнка. Обычный Running без прерывания сохраняет состояние. Граф, скрипт, Blackboard и сессия остаются. Reset обходит структурных детей, включая отключённых; вызываемое дерево SubTree и состояние сторонних нод требуют отдельного владения. Ошибка освобождения остаётся ошибкой; остальные дети могут не успеть сброситься.

Простой пример

text
Interrupter 
├── Condition: Мана стала меньше 10% 
└── Action: Кастовать заклинание Медитация
  • Пока персонаж медитирует, Interrupter следит за маной.
  • Если мана вдруг падает ниже 10%, Meditate будет прерван, и Interrupter вернёт Failure.
  • Если мана выше 10%, и действие (Meditate) завершилось, Interrupter просто вернёт тот же результат (Success, если всё прошло хорошо, или Failure, если действию не удалось выполниться по другой причине).

Когда это удобно?

  • Хотите отменять длинные действия, если что-то случилось.
  • Необходимо срочно реагировать на изменения условий во время запущенного действия (например, прерывать восстановление при появлении врага или понижении параметров).