Условия выполнения задачи¶
Задачи могут завершаться автоматически при выполнении заданного условия, через кнопки в квестовой книге (поле buttons) или явной командой.
Автоматическая проверка условий доступна только для датапак-квестов. Задачи, созданные командами, выполняются исключительно командой
quest complete.
Условия проверяются каждый тик у задач активного этапа всех активных квестов — закреплённых и незакреплённых.
Для каждой задачи можно задать условие успеха и условие провала:
{
"tasks": {
"my_task": {
"condition": {
"success": {
// Описание условия успеха
},
"failure": {
// Описание условия провала
}
}
}
}
}
Оба поля внутри condition необязательны — можно задать только одно или оба.
Формат условий¶
Условие — это объект с полем type и набором полей, уникальных для типа.
Типов ровно семь. Других нет — неизвестный type приводит к ошибке загрузки квеста.
| Тип | Что проверяет | HUD |
|---|---|---|
score |
Значение scoreboard objective контекстного игрока | Прогресс-бар |
global_score |
Значение scoreboard objective фиксированного игрока | Прогресс-бар |
predicate |
Minecraft-предикат | Бинарное |
all |
Все вложенные условия | Прогресс-бар (выполнено / всего) |
any |
Хотя бы одно вложенное условие | Бинарное |
none |
Ни одного вложенного условия | Бинарное |
optionals |
Статусы optional-задач активного этапа | Прогресс-бар (k / N) |
Бинарное условие либо выполнено, либо нет — прогресс-бара нет. Прогресс-бар означает, что условие отдаёт числовой прогресс к цели; бар показывается, только если целевое значение больше 1 (например, score с диапазоном 0 → 1 или all с одним подусловием — без бара).
Условие достижения счёта (score)¶
{
"type": "score",
"objective": "<string>",
"criterion": "<ScoreboardCriterion>",
"from": 0,
"to": "<int>",
"reset": true
}
Использует систему scoreboard Minecraft. Проверяет счёт контекстного игрока (того, кто выполняет квест). Если расстояние от from до to больше 1, под задачей в HUD показывается прогресс-бар.
objective— обязательное. Название scoreboard objective. Если такого objective нет — он будет создан с типом изcriterionв момент загрузки задачи.criterion— тип objective в момент его создания. Если objective с таким именем уже есть, поле игнорируется. Допустимы типы, поддерживаемые Minecraft (полный список на вики). По умолчанию:"dummy".from— начальная точка. По умолчанию:0. Еслиfrom > to— условие работает в обратном направлении: нужно опуститься нижеto. Определяет также нулевую базу прогресс-бара.to— обязательное. Целевое значение. Восходящее:score >= to. Нисходящее:score <= to.reset— еслиtrue(по умолчанию), при загрузке задачи счёт игрока вobjectiveбудет установлен вfrom. Еслиfalse— счёт не трогается: условие отслеживает текущее значение.
Примеры¶
Добыть 5 дубовых брёвен¶
{
"type": "score",
"objective": "oak_logs_mined",
"criterion": "minecraft.mined:minecraft.oak_log",
"to": 5
}
Пережить таймер обратного отсчёта (30 секунд = 600 тиков)¶
При загрузке задачи счёт устанавливается в 600. Каждый тик через on.tick он уменьшается (или убывает другим способом). Условие выполнится, когда счёт дойдёт до 0.
Отслеживать уже идущий счётчик (без сброса)¶
Глобальный счётчик (global_score)¶
Как и score, но проверяет счёт фиксированного игрока (player), а не контекстного. Поля criterion и reset отсутствуют: критерий objective фиксирован (dummy), значение в scoreboard при загрузке задачи не перезаписывается — при многих игроках каждый load иначе сбрасывал бы общий счёт.
objective— обязательное. Название scoreboard objective (создаётся с типомdummyесли не существует).player— имя игрока. Поддерживает виртуальных игроков. По умолчанию:"#GLOBAL".from— начальная база (направление + нулевая точка прогресс-бара). По умолчанию:0.to— обязательное. Целевое значение.
Пример¶
Уничтожить 10 000 зомби всем сервером¶
Подробный разбор этого паттерна: Глобальный квест.
Условие выполнения предиката (predicate)¶
Использует систему predicate Minecraft. Предикаты — это условия, описанные в JSON-файлах датапака; предикат оценивается относительно игрока, выполняющего квест. Задача выполнится, когда предикат вернёт истину. Бинарное условие: прогресс-бара нет.
Составное условие (all)¶
Позволяет объединить несколько условий — задача выполнится только когда все они выполнены. Прогресс в HUD = число выполненных подусловий.
Условия внутри all могут быть любого типа и вложены друг в друга без ограничений.
Пример¶
{
"type": "all",
"conditions": [
{
"type": "score",
"objective": "gold_collected",
"to": 100
},
{
"type": "predicate",
"predicate": "example:has_key"
}
]
}
Составное условие (any)¶
Задача выполнится, когда выполнено хотя бы одно из подусловий. Бинарное: нет прогресс-бара.
Составное условие (none)¶
Задача выполнится, когда ни одно из подусловий не выполнено. Бинарное: нет прогресс-бара.
Условие по статусу optional-задач (optionals)¶
Завершает задачу, когда optional-задачи активного этапа достигают нужного статуса.
Пул собирается автоматически: все optional-задачи активного этапа, исключая required-задачу этапа и саму задачу с условием. Это значит, что условие на required-задаче отслеживает все optional-задачи; условие на optional-задаче — все остальные optional.
status— ожидаемый статус:"success","failure"или"skipped". Если не указан — засчитывается задача в любом терминальном статусе.min— минимальное число задач с нужным статусом. Если не указан — должны совпасть все optional-задачи пула.
Если пул пуст (других optional-задач нет) — условие выполнено сразу. При N > 1 в HUD показывается прогресс-бар k / N, где k — число совпадающих по статусу задач, N — min или размер пула. При N ≤ 1 прогресс-бар не показывается.
Примеры¶
Все optional-задачи должны быть выполнены успешно¶
Обязательная задача этапа завершится автоматически, когда все optional-задачи выполнены:
Выполнить хотя бы 2 из 3 optional-задач¶
Кнопки ручного завершения (buttons)¶
Позволяют игроку самостоятельно завершить задачу прямо из квестовой книги. Это альтернатива condition — вместо автоматической проверки дизайнер даёт игроку явный выбор.
Допустимые значения: "success", "failure", "skip". Порядок в массиве не важен — в книге кнопки всегда отображаются в порядке success → failure → skip. Дубликаты схлопываются (с предупреждением в лог).
Кнопки рисуются под задачей в квестовой книге. При наведении отображается tooltip. По нажатию сервер проверяет, что задача активна и не завершена, после чего выполняет её с выбранным статусом.
buttons и condition независимы — их можно использовать вместе. Кнопки срабатывают независимо от состояния условия.
Завершение задачи через кнопку, как и через
/quest complete, переводит квест вcompleteтолько на следующем тике — в отличие от автоматических условий. Подробнее — Структура квеста.
См. также¶
- Формат файла квеста — поле
conditionв общем списке полей задачи. - Хуки жизненного цикла задачи — реакция на завершение задачи (
on.success/on.failure). - Ожидание события — отдельного типа-таймера нет; отсрочку и ожидание собирают этим паттерном.
- Частые вопросы и ошибки — если условие не завершает задачу.