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

Условия выполнения задачи

Задачи могут завершаться автоматически при выполнении заданного условия, через кнопки в квестовой книге (поле buttons) или явной командой.

Автоматическая проверка условий доступна только для датапак-квестов. Задачи, созданные командами, выполняются исключительно командой quest complete.

Условия проверяются каждый тик у задач активного этапа всех активных квестов — закреплённых и незакреплённых.

Для каждой задачи можно задать условие успеха и условие провала:

{
    "tasks": {
        "my_task": {
            "condition": {
                "success": {
                    // Описание условия успеха
                },
                "failure": {
                    // Описание условия провала
                }
            }
        }
    }
}

Оба поля внутри condition необязательны — можно задать только одно или оба.


Формат условий

Условие — это объект с полем type и набором полей, уникальных для типа.

{
    "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 тиков)

{
    "type": "score",
    "objective": "my_timer",
    "from": 600,
    "to": 0
}

При загрузке задачи счёт устанавливается в 600. Каждый тик через on.tick он уменьшается (или убывает другим способом). Условие выполнится, когда счёт дойдёт до 0.

Отслеживать уже идущий счётчик (без сброса)

{
    "type": "score",
    "objective": "mob_kills",
    "to": 100,
    "reset": false
}

Глобальный счётчик (global_score)

{
    "type": "global_score",
    "objective": "<string>",
    "player": "#GLOBAL",
    "from": 0,
    "to": "<int>"
}

Как и score, но проверяет счёт фиксированного игрока (player), а не контекстного. Поля criterion и reset отсутствуют: критерий objective фиксирован (dummy), значение в scoreboard при загрузке задачи не перезаписывается — при многих игроках каждый load иначе сбрасывал бы общий счёт.

  • objectiveобязательное. Название scoreboard objective (создаётся с типом dummy если не существует).
  • player — имя игрока. Поддерживает виртуальных игроков. По умолчанию: "#GLOBAL".
  • from — начальная база (направление + нулевая точка прогресс-бара). По умолчанию: 0.
  • toобязательное. Целевое значение.

Пример

Уничтожить 10 000 зомби всем сервером

{
    "type": "global_score",
    "objective": "zombies_killed_total",
    "to": 10000
}

Подробный разбор этого паттерна: Глобальный квест.


Условие выполнения предиката (predicate)

{
    "type": "predicate",
    "predicate": "<Identifier>"
}

Использует систему predicate Minecraft. Предикаты — это условия, описанные в JSON-файлах датапака; предикат оценивается относительно игрока, выполняющего квест. Задача выполнится, когда предикат вернёт истину. Бинарное условие: прогресс-бара нет.


Составное условие (all)

Позволяет объединить несколько условий — задача выполнится только когда все они выполнены. Прогресс в HUD = число выполненных подусловий.

{
    "type": "all",
    "conditions": [
        { "type": "..." },
        { "type": "..." }
    ]
}

Условия внутри all могут быть любого типа и вложены друг в друга без ограничений.

Пример

{
    "type": "all",
    "conditions": [
        {
            "type": "score",
            "objective": "gold_collected",
            "to": 100
        },
        {
            "type": "predicate",
            "predicate": "example:has_key"
        }
    ]
}

Составное условие (any)

Задача выполнится, когда выполнено хотя бы одно из подусловий. Бинарное: нет прогресс-бара.

{
    "type": "any",
    "conditions": [
        { "type": "..." },
        { "type": "..." }
    ]
}

Составное условие (none)

Задача выполнится, когда ни одно из подусловий не выполнено. Бинарное: нет прогресс-бара.

{
    "type": "none",
    "conditions": [
        { "type": "..." },
        { "type": "..." }
    ]
}

Условие по статусу optional-задач (optionals)

Завершает задачу, когда optional-задачи активного этапа достигают нужного статуса.

{
    "type": "optionals",
    "status": "success",
    "min": 2
}

Пул собирается автоматически: все optional-задачи активного этапа, исключая required-задачу этапа и саму задачу с условием. Это значит, что условие на required-задаче отслеживает все optional-задачи; условие на optional-задаче — все остальные optional.

  • status — ожидаемый статус: "success", "failure" или "skipped". Если не указан — засчитывается задача в любом терминальном статусе.
  • min — минимальное число задач с нужным статусом. Если не указан — должны совпасть все optional-задачи пула.

Если пул пуст (других optional-задач нет) — условие выполнено сразу. При N > 1 в HUD показывается прогресс-бар k / N, где k — число совпадающих по статусу задач, Nmin или размер пула. При N ≤ 1 прогресс-бар не показывается.

Примеры

Все optional-задачи должны быть выполнены успешно

Обязательная задача этапа завершится автоматически, когда все optional-задачи выполнены:

{
    "type": "optionals",
    "status": "success"
}

Выполнить хотя бы 2 из 3 optional-задач

{
    "type": "optionals",
    "status": "success",
    "min": 2
}

Кнопки ручного завершения (buttons)

Позволяют игроку самостоятельно завершить задачу прямо из квестовой книги. Это альтернатива condition — вместо автоматической проверки дизайнер даёт игроку явный выбор.

{
    "tasks": {
        "choose": {
            "title": "Make a choice",
            "buttons": ["success", "failure", "skip"]
        }
    }
}

Допустимые значения: "success", "failure", "skip". Порядок в массиве не важен — в книге кнопки всегда отображаются в порядке success → failure → skip. Дубликаты схлопываются (с предупреждением в лог).

Кнопки рисуются под задачей в квестовой книге. При наведении отображается tooltip. По нажатию сервер проверяет, что задача активна и не завершена, после чего выполняет её с выбранным статусом.

buttons и condition независимы — их можно использовать вместе. Кнопки срабатывают независимо от состояния условия.

Завершение задачи через кнопку, как и через /quest complete, переводит квест в complete только на следующем тике — в отличие от автоматических условий. Подробнее — Структура квеста.


См. также