Перейти к содержанию

Хуки жизненного цикла задачи

Для каждой задачи можно задать действия, которые срабатывают в ключевые моменты её жизни. Хуки задаются в поле "on" задачи:

{
    "tasks": {
        "my_task": {
            "on": {
                "load": {
                    "functions": ["namespace:on_task_load"],
                    "tags": ["task_started"]
                },
                "tick": {
                    "functions": ["namespace:on_task_tick"]
                },
                "pinned_tick": {
                    "functions": ["namespace:on_task_pinned_tick"]
                },
                "unload": {
                    "functions": ["namespace:on_task_unload"]
                },
                "success": {
                    "functions": ["namespace:on_task_success"],
                    "tags": ["task_done"]
                },
                "failure": {
                    "functions": ["namespace:on_task_failure"]
                }
            }
        }
    }
}

Каждый хук необязателен — указывай только те события, на которые нужно реагировать. Внутри каждого хука два необязательных поля: - functions — массив идентификаторов mcfunction-функций датапака - tags — массив scoreboard-тегов, которые добавляются игроку при срабатывании хука

Можно указать только функции, только теги или оба поля сразу. Когда хук срабатывает, сначала добавляются все теги из tags, затем выполняются все функции из functions — в одном тике. Поэтому функция этого же хука уже видит его теги: можно добавить тег и сразу использовать его в функции того же хука.


Когда срабатывает каждый хук

Хук Когда срабатывает
load Один раз за жизнь задачи — когда она впервые становится частью активного этапа у игрока. Отметка «задача загружена» сохраняется вместе с миром и переживает релог игрока, рестарт сервера и перезагрузку датапаков — повторно хук не вызывается, пока задача не пройдёт через unload. Для повторяемых квестов (repeatable: true) повторная выдача создаёт новую жизнь задачи, и load сработает заново
tick Каждый тик, пока задача в активном этапе и не выполнена
pinned_tick Каждый тик, пока задача в активном этапе, не выполнена и квест закреплён. Срабатывает вдобавок к tick, а не вместо него
unload Один раз за жизнь задачи — когда она перестаёт быть активной: сама задача завершена (успехом, провалом или пропуском), её этап пройден, квест завершён или снят с игрока. Парный к load: пока задача загружена, релог и рестарт не вызывают unload. Срабатывает строго после load
success Один раз, в момент успешного завершения задачи. Терминальный — задача завершается и больше не активна, повторно сработать не может
failure Один раз, в момент провала задачи. Терминальный — взаимоисключающий с success, повторно сработать не может

Функции вызываются от имени игрока: @s внутри функции — тот игрок, чья задача сработала.

Пропуск задачи не вызывает ни success, ни failure. Если задача завершается пропуском (кнопкой skip или командой quest complete ... skip), оба этих хука молчат — срабатывает только unload.


Примеры

Выдать предмет при успехе

{
    "on": {
        "success": {
            "functions": ["story:rewards/give_key"]
        }
    }
}

Функция story:rewards/give_key:

give @s minecraft:tripwire_hook{display:{Name:'{"text":"Ключ от темницы"}'}}

Добавить тег и запустить функцию при успехе

{
    "on": {
        "success": {
            "functions": ["story:ch1/complete"],
            "tags": ["ch1_done"]
        }
    }
}

Хук и добавляет тег ch1_done, и вызывает функцию — порядок их применения описан выше: тег уже виден внутри функции story:ch1/complete.

Подготовка в load, работа в tick

load подходит для разовой настройки задачи, tick — для повторяющейся работы каждый тик. Здесь load один раз заводит scoreboard, а tick работает на нём:

{
    "on": {
        "load": {
            "functions": ["story:zombies/init"]
        },
        "tick": {
            "functions": ["story:zombies/accumulate"]
        }
    }
}

Полный рабочий рецепт с этими функциями — серверный счётчик, общий для всех игроков, — собран в паттерне Глобальный квест.


См. также