Перейти к основному содержимому

Создание квестов

webapp_banner.jpg

Пример квеста

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!"

create_quest_quest.jpg

Если интерфейс ваших квестов выглядит иначе, вы можете изменить его, чтобы он соответствовал показанному, с помощью команды /em alt.

Этот пример квеста даст игрокам задание убить 1 test_boss.yml. (Фактическое имя босса, отображаемое в трекере квестов, будет взято из поля name:, заданного в test_boss.yml.) А в награду за выполнение квеста они получат 1 Magmaguy's Toothpick.

Создание пользовательских квестов

isEnabled

Задаёт, включён ли квест.

KeyValuesDefault
isEnabledBooleantrue
Пример
isEnabled: true

customObjectives

Задаёт цели квеста.

KeyValuesDefault
customObjectivesSpecial [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"

create_quest_objective.jpg

Special [1]

Развернуть таблицу

Пользовательские цели создаются с использованием следующих значений:

KeyDescription
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

Задаёт награды за квест.

KeyValuesDefault
customRewardsУниверсальный формат лута EliteMobsnone
Пример
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

create_quest_rewards.jpg

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


questAcceptPermission

Задаёт право (permission), которое должно быть у игрока, чтобы он мог принять квест.

KeyValuesDefault
questAcceptPermissionStringnone
Пример
questAcceptPermission: elitequest.my_permission

questAcceptPermissions

Задаёт права (permissions), которые должны быть у игрока, чтобы он мог принять квест.

KeyValuesDefault
questAcceptPermissionsString Listnone
Пример
questAcceptPermissions: 
- elitequest.my_previous_quest_one.yml
- elitequest.my_previous_quest_two.yml

questLockoutPermission

Задаёт право (permission), которое игрок получит после завершения квеста и которое заблокирует ему повторное выполнение квеста. Если не указано, право блокировки квеста генерируется автоматически как elitequest.[filename].

KeyValuesDefault
questLockoutPermissionStringelitequest.[filename]
Пример
questLockoutPermission: elitequest.my_quest.yml

questLockoutMinutes

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

KeyValuesDefault
questLockoutMinutesInteger-1(квест никогда не повторяется)
Пример
questLockoutMinutes: 60

name

Задаёт имя квеста. Принимает цветовые коды.

KeyValuesDefault
nameString[filename]
Пример
name: "&aMy Great Quest Name"

questLore

Задаёт описание (lore) квеста, которое будет отображаться во внутриигровом меню квестов.

KeyValuesDefault
questLoreString Listnone
Пример
questLore:
- "Interesting lore sentence."
- "Yet another interesting lore sentence."

create_quest_lore.jpg


temporaryPermissions

Задаёт права, которые назначаются игроку до тех пор, пока он не сдаст квест.

Если вы используете этот параметр, чтобы предмет выпадал только при наличии у игрока определённого активного квеста, вам также нужно настроить соответствующее право в конфигурационном файле предмета.

KeyValuesDefault
temporaryPermissionsString Listnone
Пример
temporaryPermissions:
- elitequest.item_that_should_drop_only_during_quest.yml

questAcceptDialog

Задаёт реплики, которые появляются в чате при принятии квеста.

KeyValuesDefault
questAcceptDialogString Listnone
Пример
questAcceptDialog:
- "My hero! You are so helpful!"
- "I wish you the best of luck!"

create_quest_accept.jpg


questCompleteMessage

Задаёт реплики, которые появляются в чате при завершении квеста.

KeyValuesDefault
questCompleteMessageString Listnone
Пример
questCompleteMessage:
- "My hero! You have completed my difficult quest!"
- "As a reward you can have this loaf of bread!"

create_quest_complete.jpg


questCompleteCommands

Задаёт команды, которые будут выполнены при завершении квеста. Поддерживает плейсхолдеры: $player для имени игрока и $getX, $getY, $getZ для координат местоположения игрока.

KeyValuesDefault
questCompleteCommandsString Listnone
Пример
questCompleteCommands:
- say $player has finished a quest at $getX, $getY, $getZ!
- give $player diamond 1

create_quest_commands.jpg


turnInNPC

Задаёт имя файла NPC, с которым игрокам нужно поговорить/взаимодействовать, чтобы завершить квест. Это не обязательно тот же NPC, который выдал квест.

KeyValuesDefault
turnInNPCFilenamenone
Пример
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

Задаёт, будет ли квест использовать трекер квестов.

KeyValuesDefault
trackableBooleantrue
Пример
trackable: true

questLevel

Задаёт уровень квеста. Это всего лишь визуальный ориентир, чтобы игроки могли понять, насколько сложным будет квест. Это никак не изменяет уровни босса, предметов или другие уровни.

KeyValuesDefault
questLevelInteger0
Пример
questLevel: 10

create_quest_level.jpg


questAcceptSound

Задаёт звук, который воспроизводится при принятии квеста. Можно воспроизводить как звуки Minecraft, так и звуки из ресурс-пака.

KeyValuesDefault
questAcceptSoundStringnone
Пример
questAcceptSound: entity.experience_orb.pickup

create_quest_level.jpg


questCompleteSound

Задаёт звук, который воспроизводится при завершении квеста (его сдаче). Можно воспроизводить как звуки Minecraft, так и звуки из ресурс-пака.

KeyValuesDefault
questCompleteSoundStringnone
Пример
questCompleteSound: entity.player.levelup

create_quest_level.jpg


Поддержка локализации

Следующие поля поддерживают локализацию для многоязычных серверов:

  • name
  • questLore
  • questAcceptDialog
  • questCompleteMessage

Это позволяет вам предоставлять переводы для разных языков на вашем сервере.


Разрешения

Как упоминалось в таблицах выше, права обычно представляют собой 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 тиков). При обновлении пула новые цели заменяют старые, давая игрокам сменяющийся набор заданий.
  • Адаптация к динамическим подземельям: когда игрок входит в динамическое подземелье с определённым выбором уровня, все его активные динамические квесты адаптируются под уровень мобов подземелья. Уровень квеста, цели и отображаемое имя обновляются соответствующим образом, чтобы квесты оставались актуальными для содержимого подземелья.