Создание квестов
Пример квеста
EliteMobs поставляется с готовым файлом test_quest.yml, который будет разобран здесь как простой образец формата квеста.
Пользовательские квесты находятся в папке ~plugins/EliteMobs/customquests!
test_quest.yml
isEnabled: true
customObjectives:
Objective1:
amount: '1'
filename: test_boss.yml
objectiveType: KILL_CUSTOM
customRewards:
- filename=magmaguys_toothpick.yml:amount=1:chance=1
name: "&aKill the Test Boss"
questLore:
- "&cEnd the test boss'' reign of terror!"

Если интерфейс ваших квестов выглядит иначе, вы можете изменить его, чтобы он соответствовал показанному, с помощью команды /em alt.
Этот пример квеста даст игрокам задание убить 1 test_boss.yml. (Фактическое имя босса, отображаемое в трекере квестов, будет взято из поля name:, заданного в test_boss.yml.) А в награду за выполнение квеста они получат 1 Magmaguy's Toothpick.
Создание пользовательских квестов
isEnabled
Задаёт, включён ли квест.
| Key | Values | Default |
|---|---|---|
isEnabled | Boolean | true |
Пример
isEnabled: true
customObjectives
Задаёт цели квеста.
| Key | Values | Default |
|---|---|---|
customObjectives | Special [1] | none |
Примечание: если в качестве цели вы используете многофазового босса, то цель должна указывать на первую фазу в качестве объекта.
Примеры
KILL_CUSTOM:
customObjectives:
Objective1:
amount: '1'
filename: my_cool_boss.yml
objectiveType: KILL_CUSTOM
DIALOG:
customObjectives:
Objective1:
dialog:
- "&a[Dialog NPC] &fCome here often?"
- "&7&oI should eat more apples."
filename: dialog_npc.yml
npcName: Dialog NPC
location: at dialog location.
objectiveType: DIALOG
FETCH_ITEM:
customObjectives:
Objective1:
amount: '99'
itemName: Red Apples
filename: my_quest_item_red_apples.yml
objectiveType: FETCH_ITEM
ARENA:
customObjectives:
Objective1:
objectiveType: ARENA
filename: my_arena.yml
name: "Complete the Arena"

Special [1]
Развернуть таблицу
Пользовательские цели создаются с использованием следующих значений:
| Key | Description |
|---|---|
KILL_CUSTOM / FETCH_ITEM / DIALOG / ARENA | Задаёт тип цели, который она представляет. KILL_CUSTOM означает, что квест предполагает убийство определённого пользовательского босса, FETCH_ITEM означает, что квест предполагает получение определённого пользовательского предмета, DIALOG означает, что квест предполагает разговор с NPC, а ARENA означает, что квест предполагает прохождение определённой арены. |
filename | Задаёт имя файла пользовательского босса, пользовательского предмета, которого игрок должен убить / получить, NPC, с которым нужно поговорить, или арены, которую нужно пройти. |
amount | Задаёт количество пользовательских боссов, которых нужно убить, или предметов, которые нужно получить. По умолчанию 1, если не указано. |
dialog | Задаёт реплики NPC, с которым разговаривает игрок. |
name | Задаёт имя цели квеста, будь то NPC, пользовательский предмет или арена. Только для визуального отображения. |
itemName | Используется только с FETCH_ITEM — этот параметр изменяет то, как имя предмета отображается в трекере квестов. Он позволяет показать пользовательское имя, отличающееся от фактического внутриигрового имени предмета. |
Обратите внимание, что каждое поле пользовательской цели отделяется символом : !
customRewards
Задаёт награды за квест.
| Key | Values | Default |
|---|---|---|
customRewards | Универсальный формат лута EliteMobs | none |
Пример
customRewards:
- currencyAmount=50:amount=1:chance=0.05
- material=COOKED_COD:amount=3:chance=1.0
- filename=magmaguys_toothpick.yml:amount=1:chance=1.0

Примечание: если вы не укажете customRewards, система квестов автоматически сгенерирует награды на основе уровня квеста. Качество наград масштабируется в зависимости от сложности квеста и включает как валюту, так и предметы. Для точного контроля над наградами всегда указывайте customRewards явно.
questAcceptPermission
Задаёт право (permission), которое должно быть у игрока, чтобы он мог принять квест.
| Key | Values | Default |
|---|---|---|
questAcceptPermission | String | none |
Пример
questAcceptPermission: elitequest.my_permission
questAcceptPermissions
Задаёт права (permissions), которые должны быть у игрока, чтобы он мог принять квест.
| Key | Values | Default |
|---|---|---|
questAcceptPermissions | String List | none |
Пример
questAcceptPermissions:
- elitequest.my_previous_quest_one.yml
- elitequest.my_previous_quest_two.yml
questLockoutPermission
Задаёт право (permission), которое игрок получит после завершения квеста и которое заблокирует ему повторное выполнение квеста. Если не указано, право блокировки квеста генерируется автоматически как elitequest.[filename].
| Key | Values | Default |
|---|---|---|
questLockoutPermission | String | elitequest.[filename] |
Пример
questLockoutPermission: elitequest.my_quest.yml
questLockoutMinutes
Задаёт, сколько минут игроку придётся ждать, прежде чем он сможет выполнить квест снова (работает за счёт снятия права блокировки квеста).
| Key | Values | Default |
|---|---|---|
questLockoutMinutes | Integer | -1(квест никогда не повторяется) |
Пример
questLockoutMinutes: 60
name
Задаёт имя квеста. Принимает цветовые коды.
| Key | Values | Default |
|---|---|---|
name | String | [filename] |
Пример
name: "&aMy Great Quest Name"
questLore
Задаёт описание (lore) квеста, которое будет отображаться во внутриигровом меню квестов.
| Key | Values | Default |
|---|---|---|
questLore | String List | none |
Пример
questLore:
- "Interesting lore sentence."
- "Yet another interesting lore sentence."

temporaryPermissions
Задаёт права, которые назначаются игроку до тех пор, пока он не сдаст квест.
Если вы используете этот параметр, чтобы предмет выпадал только при наличии у игрока определённого активного квеста, вам также нужно настроить соответствующее право в конфигурационном файле предмета.
| Key | Values | Default |
|---|---|---|
temporaryPermissions | String List | none |
Пример
temporaryPermissions:
- elitequest.item_that_should_drop_only_during_quest.yml
questAcceptDialog
Задаёт реплики, которые появляются в чате при принятии квеста.
| Key | Values | Default |
|---|---|---|
questAcceptDialog | String List | none |
Пример
questAcceptDialog:
- "My hero! You are so helpful!"
- "I wish you the best of luck!"

questCompleteMessage
Задаёт реплики, которые появляются в чате при завершении квеста.
| Key | Values | Default |
|---|---|---|
questCompleteMessage | String List | none |
Пример
questCompleteMessage:
- "My hero! You have completed my difficult quest!"
- "As a reward you can have this loaf of bread!"

questCompleteCommands
Задаёт команды, которые будут выполнены при завершении квеста. Поддерживает плейсхолдеры: $player для имени игрока и $getX, $getY, $getZ для координат местоположения игрока.
| Key | Values | Default |
|---|---|---|
questCompleteCommands | String List | none |
Пример
questCompleteCommands:
- say $player has finished a quest at $getX, $getY, $getZ!
- give $player diamond 1
![]()
turnInNPC
Задаёт имя файла NPC, с которым игрокам нужно поговорить/взаимодействовать, чтобы завершить квест. Это не обязательно тот же NPC, который выдал квест.
| Key | Values | Default |
|---|---|---|
turnInNPC | Filename | none |
Пример
turnInNPC: my_cool_quest_npc.yml
Выдача квестов
Чтобы назначить квест NPC, который будет выдавать его игрокам, нужно настроить файл NPC, а не файл квеста.
В конфигурационном файле вашего NPC (~/plugins/EliteMobs/npcs/) добавьте:
questFileName: my_quest.yml
Для NPC, которые выдают несколько квестов:
questFileName:
- quest_one.yml
- quest_two.yml
Подробнее о настройке NPC см. документацию по созданию NPC.
trackable
Задаёт, будет ли квест использовать трекер квестов.
| Key | Values | Default |
|---|---|---|
trackable | Boolean | true |
Пример
trackable: true
questLevel
Задаёт уровень квеста. Это всего лишь визуальный ориентир, чтобы игроки могли понять, насколько сложным будет квест. Это никак не изменяет уровни босса, предметов или другие уровни.
| Key | Values | Default |
|---|---|---|
questLevel | Integer | 0 |
Пример
questLevel: 10

questAcceptSound
Задаёт звук, который воспроизводится при принятии квеста. Можно воспроизводить как звуки Minecraft, так и звуки из ресурс-пака.
| Key | Values | Default |
|---|---|---|
questAcceptSound | String | none |
Пример
questAcceptSound: entity.experience_orb.pickup

questCompleteSound
Задаёт звук, который воспроизводится при завершении квеста (его сдаче). Можно воспроизводить как звуки Minecraft, так и звуки из ресурс-пака.
| Key | Values | Default |
|---|---|---|
questCompleteSound | String | none |
Пример
questCompleteSound: entity.player.levelup

Поддержка локализации
Следующие поля поддерживают локализацию для многоязычных серверов:
namequestLorequestAcceptDialogquestCompleteMessage
Это позволяет вам предоставлять переводы для разных языков на вашем сервере.
Разрешения
Как упоминалось в таблицах выше, права обычно представляют собой Strings или String Lists. Но давайте рассмотрим подробнее, как вы будете использовать их для блокировки и разблокировки квестов.
Допустим, вы создаёте quest_3 в запланированной серии квестов и не хотите, чтобы игроки могли взять quest_3 до того, как они завершат quest_2. Мы настроили бы файл квеста так:
questAcceptPermission: elitequest.quest_2.yml
questLockoutPermission: elitequest.quest_3.yml
Установив questAcceptPermissions в значение elitequest.quest_2.yml, мы теперь не позволяем игрокам брать quest_3.yml до того, как они завершат quest_2.yml.
Установив questLockoutPermission в значение elitequest.quest_3.yml, мы запретили игрокам получать этот квест, пока он уже есть у них в трекере или если они уже его завершили. Это не позволяет игрокам повторять квест.
Если вы хотите сделать квест, который становится доступен только после того, как игроки завершат серию квестов, то вы настроили бы файл квеста так:
questAcceptPermissions:
- elitequest.quest_2.yml
- elitequest.quest_3.yml
- elitequest.quest_4.yml
Если вы хотите, чтобы игроки могли получать определённые предметы только при наличии нужного активного квеста, то мы можем сделать это с помощью temporaryPermissions. Мы создадим право в файле квеста с помощью temporaryPermissions, а затем создадим соответствующее право в файле предмета с помощью permission.
Например, мы откроем наш файл квеста и добавим следующее:
temporaryPermissions:
- elitequest.my_cool_item.yml
Затем мы откроем файл предмета, в нашем случае my_cool_item.yml, и добавим следующее:
permission: elitequest.my_cool_item.yml
Теперь у обоих файлов совпадающие права, благодаря чему наш предмет должен выпадать только при наличии у игроков нужного активного квеста.
Динамические квесты
Динамические квесты — это процедурно генерируемые квесты, которые автоматически создаются и обновляются EliteMobs. В отличие от пользовательских квестов, заданных в конфигурационных файлах, динамические квесты не требуют ручной настройки и адаптируются к прогрессу каждого игрока.
Как они работают
- Уровень (тир) квеста: тир динамического квеста игрока определяется на основе его боевого уровня:
tier = combatLevel / 5, ограничено диапазоном от 1 до 20. Например, игрок с боевым уровнем 45 получит динамические квесты 9-го тира. Сами квесты (и их награды) масштабируются под фактический боевой уровень игрока, который ограничен диапазоном от 1 до 100. - 3 квеста на тир: для каждого из 20 тиров квестов система генерирует ровно 3 случайные цели квестов за раз. Игрокам предлагаются 3 квеста, соответствующие их текущему тиру.
- Цикл автообновления: пул целей динамических квестов перегенерируется каждые 60 секунд (каждые 1200 тиков). При обновлении пула новые цели заменяют старые, давая игрокам сменяющийся набор заданий.
- Адаптация к динамическим подземельям: когда игрок входит в динамическое подземелье с определённым выбором уровня, все его активные динамические квесты адаптируются под уровень мобов подземелья. Уровень квеста, цели и отображаемое имя обновляются соответствующим образом, чтобы квесты оставались актуальными для содержимого подземелья.
