Название: Создание квестов L2j_Mobius [Версия для печати] Автор: admin Время: 2024-9-24 00:52 Название: Создание квестов L2j_Mobius Сборка: L2l_Monius 2 [8 f W) I; e' i$ Q3 q
Следующие квесты можно использовать в качестве шаблонов для создания практически любого простого квеста go kill или go talk. 4 u; b( l4 f& L# b% p* i" W % X3 p* H/ [/ G# E8 P* S3 s( [. B9 j5 E
Иди и убей X монстров / Возвращение - награда.' h' c# v- n; `. N
Q00529_RegularBarrierMaintenance 5 O& \' M7 V) M# b' u4 J+ E: T& U- G, W
Получите квест от любого из двух разных NPC / Убейте X монстров / Вернитесь с наградой. : d9 r" K" z5 v# K' q0 E8 g L& wQ00683_AdventOfKrofinSubspecies % o* q7 G3 i. t) p' H1 n& M I- X3 M8 D: K) g1 k" [# GПоговори с NPC 1 / Поговори с NPC 2 / Поговори с завершающим NPC / Награда.9 s4 C) X" A& @ Y% J
Q10516_UnveiledFafurionTemple 4 |9 S4 \ T h 1 d. I: |, t. w+ Y3 }1 v5 H% GУбейте X монстров, а также соберите X предметов / Возврат - награда. 5 p( y# h! f6 K; GQ10517_FafurionsMinions$ V$ V7 _0 q6 |2 \! H, I
# _; @) T, u: z0 _* F5 }
Иди собери X капель монстров / Вернись - убей X монстров / Вернись - награда.* [4 D7 X! C7 w
Q10529_IvoryTowersResearchFloatingSeaJournal, m6 u6 a3 w$ ~; O" c" y
3 i* y) b, X0 EИди убей X монстров, а также собери X предметов / Возвращение - иди собери X предметов / Возвращение - награда. 3 w7 E( n) f7 \Q10518_SucceedingThePriestess : X. d( J* O, C( A' N* h4 R5 e B Y; Z* G/ L! n+ lУчаствуйте в убийстве рейдбосса / Возврат - награда. 7 m+ T, S: d! nQ10519_контролирование вашей температуры * }/ q7 X, q. q4 J; B8 k# m0 w2 ^9 Y6 g' y, M% q1 N
Поговорите с NPC 1 / Примите участие в убийстве рейдбосса / Возвращение - награда.$ t1 Z; h% e1 v
Q10533_OrfensAmbition " ~1 p$ b" b* E+ {; X9 C7 q- w( x3 f" L2 [
! e* R1 H, b! ?* p$ ^4 h1 r6 n! d3 K* U! @+ a5 j& ` R Руководство требует обновления. И, к сожалению, с самыми последними хрониками вы не сможете избежать модификаций клиента. Поэтому, исключительно в образовательных целях, я предлагаю свой опыт по добавлению нового квеста!$ X* P8 O% _5 Z. P+ G 7 _8 r& M. j: W( Q2 y8 y9 ~Шаг 1: Создайте свой квест с уникальным ID. В этом примере я буду ссылаться на квест как "Q98765_NewQuest".. o5 h3 F: ~+ }& ?) x7 m! s8 Y
" ^3 ~* X% E7 y- n1 NШаг 2: Когда вы успешно создали свой квест и Eclipse не выдает ошибок, добавьте название квеста и импортируйте его в файл "QuestMasterHandler.java". & k) I* P9 n) a0 e) g q: H 2 L6 } }3 T# s# n( a* OШаг 3: Перейдите в клиент и с помощью редактора клиента добавьте квест в следующие файлы .dat: "questname-ru.dat" и "QuestMarkConditionData.dat". 7 }0 h5 s2 _5 A, Y+ }* J/ o2 B/ B( x8 ]5 K8 C3 [
Следующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов. $ ~6 U& H& T3 f- A0 m8 }8 A4 B5 G9 Y5 d) Q2 b0 p Шаг 4: Найдите в серверных файлах файл с названием "NewQuestData.xml" и добавьте туда свой квест.7 j- t; _4 h) T. `# l7 u
|* O+ _& E% ^' Y# c: T Шаг 5: Найдите в клиенте следующие файлы и добавьте туда свой квест: "NewQuestData-ru.dat", "NewQuestDialog-ru.dat" и "NewQuestNpcPortrait.dat". 1 F; e7 X# w* l* d6 p% E! J( {. W, Q# y5 Y3 o6 X, u
Если я что-то забыл, не стесняйтесь исправить меня. Это руководство создано исключительно в образовательных целях.0 P# i5 U- i4 t& s
7 q+ P" p% {$ ^8 n( D0 s) ^' Z Шаг 2: 8 u, f* A' a) Z( k- `: g2 z. f; L - K" z. E9 j ?: W/ @Следующий шаг заключается в добавлении вашего квеста в QuestMasterHandler.java. Вот общий план:% M+ \% E8 ~$ z9 X% j: C' C
* u% J4 z S2 A m$ d1. Импорт вашего квеста: В начале файла после всех существующих импортов добавьте строку, которая будет импортировать ваш квест. 9 X) J# ^, ?, E9 M" R- |
Например:. p- A& ^: Q9 j* l6 H
1. Регистрация квеста: Найдите метод, который отвечает за регистрацию всех квестов. Обычно это делается в статическом блоке или методе init, где происходит инициализация квестов. В этом блоке добавьте строку, которая будет регистрировать ваш квест: + A* D! ]0 L8 F5 u+ m0 l) Q : Q) G; ^' `9 ~- e/ ~
/** % U5 `, c2 V; D% U( K4 g- v
* @author NosBit , S* U' \' k- E: _
*/. u7 @+ ~) C" s0 U! P& t
public class QuestMasterHandler ! w0 K! J8 d; m1 g
private static final Class<?>[] QUESTS =7 ]7 E: `) |9 K* M1 ~) a
{
Скопировать код
Проверка: Убедитесь, что идентификатор вашего квеста (в данном случае Q98765_NewQuest.class) уникален и не конфликтует с уже существующими квестами. ! V, S# p- I- M8 `' _2 s, ~& `1 N ( A: M! D, I$ \% h7 m9 V+ ?" K- j# c; n! ?2 ]$ p- [% Q0 t# u: _ Шаг 3:) ]# b6 l* r& f* H, {" j
* ?0 |* b/ _/ i% O+ @0 t7 p# C9 ?Файл QuestName-ru.dat используется для описания квестов и содержит различные параметры, которые задают характеристики квеста, его цели, награды, ограничения и т.д. # l' i1 F h( E _
Давайте разберем все поля на основе примера: - j( B5 p; e% h' ?8 A2 U $ W) C8 E/ C* H5 F
quest_begin tag=1 id=10811 level=1 title=[Узнай свой предел] sub_name=[Бремя силы] desc=[Если готовы, то еще раз поговорите с Рыцарем-Хранителем Евы Леонелом Хантером в Хейне.\n] goal_id={} goal_type={} goal_num={} target_loc={111382.0;220905.0;-3544.0} add_target_locs={} q_level={} lvl_min=100 lvl_max=0 journal_disp=3 entity_name=[Рыцарь-Хранитель Евы Леонел Хантер] get_item_in_quest=0 unk1=1 unk2=1 start_npc_id={33907} start_npc_loc={111382.0;220905.0;-3544.0} q_requirement=[Дворянин] quest_intro=[Рыцарь-Хранитель Евы Леонел Хантер из Хейна посоветовал прийти к нему, если Вы желаете узнать предел Ваших возможностей...] class_limit={} have_item={} clan_pet_quest=1 cleared_quest=1 mark_type=-1 category_id=0 priority_level=0 search_zoneid=121 iscategory=3 reward_id={45922;15625} reward_num={1;0} pre_level={0} faction_id=0 faction_level_min=0 faction_level_max=0 quest_end0 ? I' I: a5 ]/ c5 u- \( e- M+ W0 z
Скопировать код
Поля данных:
quest_begin — начало записи для квеста.
tag — идентификатор типа данных. Может использоваться для группировки квестов или идентификации квестов по определённым категориям.
id — уникальный идентификатор квеста. Должен быть уникален для каждого квеста.
level — уровень сложности квеста. Используется для группировки и показа квестов, подходящих по уровню.
title — название квеста, которое отображается в интерфейсе. Заключено в квадратные скобки.
sub_name — подзаголовок квеста, используется для дополнительного описания. Заключен в квадратные скобки.
desc — описание квеста, которое появляется при его принятии или выполнении. Здесь также используется разметка с символами переноса строки (\n).
goal_id — идентификатор цели квеста. Может содержать ID объекта или персонажа, который нужно достичь.
goal_type — тип цели. Указывает, какого типа задача ставится перед игроком (например, убить монстров, собрать предметы).
goal_num — количество необходимых действий для завершения цели. Например, количество монстров для убийства или предметов для сбора.
target_loc — координаты (X, Y, Z), куда должен отправиться игрок для выполнения задачи. Координаты указываются в формате {X;Y;Z}.
add_target_locs — дополнительные целевые локации, если квест предполагает несколько мест назначения.
q_level — уровень сложности или рекомендованный уровень для выполнения квеста.
lvl_min — минимальный уровень персонажа, с которого квест доступен.
lvl_max — максимальный уровень персонажа для выполнения квеста. Если не указан, то квест доступен на любом уровне выше минимального.
journal_disp — параметр, определяющий отображение квеста в журнале квестов (например, на каком этапе он должен отображаться).
entity_name — имя NPC или объекта, который связан с выполнением квеста (например, кто выдаёт квест или с кем нужно взаимодействовать).
get_item_in_quest — указывает, должен ли игрок получать предметы в ходе выполнения квеста. 0 — нет, 1 — да.
unk1 — неизвестное поле, возможно зарезервировано для будущих функций или модификаций.
unk2 — аналогично, поле с неизвестным назначением.
start_npc_id — ID NPC, который выдаёт квест. ID указан в фигурных скобках {}.
start_npc_loc — координаты NPC, который выдаёт квест. Используется формат {X;Y;Z}.
q_requirement — дополнительные требования к выполнению квеста, например, наличие определённого статуса или ранга (например, "Дворянин").
quest_intro — вводное описание квеста, которое отображается при первом контакте с NPC.
class_limit — ограничения по классам персонажа. Указываются ID классов, которым доступен квест.
have_item — список предметов, которые должны быть у игрока для выполнения квеста.
clan_pet_quest — указывает, является ли квест клановым или петом. 1 — да, 0 — нет.
cleared_quest — указывает, выполнен ли квест или нет. 1 — выполнен, 0 — не выполнен.
mark_type — тип метки, связанной с квестом. Используется для отображения различных иконок или маркеров на карте.
category_id — ID категории, к которой относится квест. Может использоваться для фильтрации квестов по категориям.
priority_level — уровень приоритета квеста. Чем выше значение, тем приоритетнее квест для отображения и выполнения.
search_zoneid — ID зоны, в которой происходит действие квеста. Определяет область, в которой игрок должен выполнять задание.
iscategory — указывает, является ли квест частью категории квестов (например, кампаний или цепочек заданий).
reward_id — ID награды за квест. Может быть несколько наград, указываются через точку с запятой.
reward_num — количество каждой награды, соответствующее полю reward_id.
pre_level — предварительный уровень или дополнительные условия, которые должны быть выполнены до начала квеста.
faction_id — ID фракции, к которой относится квест. Может быть использован для фракционных квестов.
faction_level_min — минимальный уровень фракции, необходимый для выполнения квеста.
faction_level_max — максимальный уровень фракции, при котором квест доступен.
quest_end — завершение записи для квеста. : q& {9 _ u; S0 T
/ u" m2 c( Q2 g/ c, `/ D/ R
z' D5 y) d/ c& I& U! ]Файл клиента QuestMarkConditionData.dat содержит информацию о квестах, связанных с условиями, необходимыми для активации или завершения определённых действий в игре. ' r0 q* J" R7 G0 u5 v5 L& x
Пример соодержания . p) _) U4 n. OВот описание структуры строки: 5 U8 V9 z# C4 J8 g. Q$ q; Y, ~8 o
Давайте разберем все поля на основе примера:8 v0 z! r! g9 A1 R4 X
, G+ M7 E3 A6 ~; S l
questmark_begin: Указывает на начало записи о квесте.
quest_id=10331: Идентификатор квеста. В данном случае, квест с ID 10331.
npc_id=32153: Идентификатор NPC (неигрового персонажа), с которым игрок должен взаимодействовать для начала или выполнения условий квеста.
race_filter={0}: Фильтр по расе. Указывает, какие расы могут участвовать в квесте. В данном примере {0} может означать, что квест доступен для всех рас или для определённой расы (например, 0 - для всех) .
class_filter={0;10}: Фильтр по классу. Указывает, какие классы могут участвовать в квесте. В этом случае {0;10} может означать, что квест доступен для классов с ID 0 и 10.
start_npc_loc={-118017.0;255965.0;-1320.0}: Координаты начала взаимодействия с NPC. Эти координаты определяют место, где находится NPC в игровом мире (X, Y, Z).
questmark_end: Указывает на конец записи о квесте. P0 Y6 y1 E4 G4 y) Y2 ]
Эта структура помогает клиенту определять условия, при которых игрок может начать или выполнить квест, а также идентифицировать необходимые взаимодействия с NPC.0 |0 l1 J+ b8 M7 z& P- e
6 G, h0 {5 e2 V4 `8 l
/ P" U8 w1 m+ K0 Q* A$ t1 Q5 {0 }" I5 j( v
Следующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов./ K+ I. Z4 W. ~; |1 j1 u
M: |6 Q! n. l% V' [' @/ X: dШаг 4 5 ?# d, q, B: B4 k1 f9 r, }Для того чтобы добавить свой квест в файл NewQuestData.xml, нужно следовать структуре, аналогичной приведенному вами примеру. Вот как это может выглядеть: $ r* S9 U2 p5 m$ ]# tПример добавления нового квеста: 5 i0 x. Q4 f+ {: e$ \7 x2 F
<quest id="20001" type="1" name="Mystery of the Lost Relic" startNpcId="30050" endNpcId="30051"> ( n h& T1 Q) g# r. \
quest: Основной элемент квеста, содержащий атрибуты: 8 m# e! A* R o1 w# Z5 y
id: ID квеста, уникальный для каждого квеста.
type: Тип квеста (1 – обычный квест).
name: Название квеста.
startNpcId: ID NPC, с которого начинается квест.
endNpcId: ID NPC, у которого квест заканчивается., |3 q- N' Z3 t: z2 z g
locations: Указывает места начала, окончания и квестовой активности.1 T; w6 c, d* m( T8 S$ w) a: u
startLocationId: ID места, где начинается квест.
endLocationId: ID места, где квест заканчивается.
questLocationId: ID квестовой зоны. + T3 v; o7 ]8 Z8 S1 b& q
conditions: Условия для начала квеста.1 U5 f9 N3 z; S+ K% b
preQuestId: ID предварительного квеста (если есть).
classIds: ID классов или рас, которым доступен квест.3 w% e( i0 K. ~# M2 w( V
rewards: Награды за выполнение квеста.2 T3 z# E+ H5 u0 \- \0 G* q8 K) D
rewardLevel: Минимальный уровень для получения награды.
rewardSp: Количество опыта (SP).
rewardItemId: ID предмета (например, Adena).
rewardItemCount: Количество предметов.* S/ u z* m3 \. N7 I8 Z
goals: Цели квеста. % [! Z+ i8 d" T7 t
goalCount: Количество монстров, которых нужно убить или предметов, которые нужно собрать.
goalString: Описание цели.
goalItemId: ID квестового предмета (если требуется).
goalItemCount: Количество квестовых предметов для завершения цели.$ u) P8 t% U) c. Q4 b9 L3 O
После того как вы добавите квест в файл NewQuestData.xml, нужно перезапустить сервер, чтобы изменения вступили в силу. - F8 ^) _3 t3 r& w. p1 P }" |! L % f) @) K! v! M% f5 R6 @6 KШаг 5 $ f! G8 n+ u* k! {Файл NewQuestDialog-ru.dat используется для хранения диалогов, связанных с квестом. Он определяет тексты, которые отображаются в окнах диалогов с NPC во время выполнения квеста. Вот разбор ключевых элементов строки и структура файла: / h7 T, e2 Y6 T' ?# i1 _2 `Структура данных
NewQuestDialog_begin — начало записи квеста в файле диалогов.
QuestId=10001 — идентификатор квеста (должен соответствовать ID, который ты используешь в других файлах).
Text0=... — первый диалог, который обычно отображается при старте квеста.
Text1=... — дополнительный текст, который отображается на различных этапах квеста.
Text2=... — текст, который отображается после выполнения определенных действий (например, после выполнения части задания).
Text3=... — дополнительный диалог, например, при встрече с NPC на следующем этапе квеста.
Text4=... — финальный текст или инструкции по следующему шагу для игрока.
NewQuestDialog_end — завершение записи для этого квеста. " h: @- s6 r7 e/ V( w5 B
, M* {& @" f+ L W Пример записи для нового квеста (ID 98765) Если ты хочешь создать диалоги для нового квеста с ID 98765, твой файл может выглядеть так: ' q! k. c- Z" O. O( U( h5 a
NewQuestDialog_begin QuestId=98765 Text0=[Вы готовы принять новый вызов и доказать свою силу?] Text1=[Как вы себя чувствуете? Вы выглядите уверенно. Это хороший знак, но не расслабляйтесь — впереди много испытаний. Примите это задание, если готовы.] Text2=[Пора приступить к тренировкам. Идите за мной в тренировочную зону.] Text3=[Следуйте моим указаниям, и вы раскроете весь свой потенциал.] Text4=[Поговорите с Дарти. Кликните на него и начните диалог.] NewQuestDialog_end 0 X# m% U6 y. l) }& W1 J0 f, h: S
Скопировать код
Разъяснение полей: : v) ?* D! J* o
QuestId=98765 — уникальный идентификатор нового квеста.
Text0 — вводный текст квеста. Отображается при первом контакте с NPC.
Text1 — дополнительный диалог, который дается игроку для создания контекста.
Text2 — текст, который отображается на следующем этапе квеста, например, после выполнения части задания.
Text3 — описание следующего шага или инструкции для игрока.
Text4 — финальный диалог или текст с указанием цели (встреча с другим NPC). # j- z& M1 t( F+ U- [
: ]; x# t2 l) m) t4 I8 B
7 k8 I3 p! K9 ^( M' \7 M' {8 [
Что можно изменить:
Тексты диалогов (Text0, Text1 и так далее) можно адаптировать под конкретные ситуации в квесте.
Количество текстов можно варьировать в зависимости от сложности квеста.$ d, S4 H6 C9 H6 _+ v0 c+ B2 S
1 h7 p! z4 x0 J7 Z0 B/ L. q- OФайл NewQuestData-ru.dat содержит параметры, связанные с квестом в игре Lineage II, и описывает условия, NPC, цели и награды. Рассмотрим параметры этого файла: ' E* t" G/ ?$ d$ c3 w5 E1 ?: ]4 ?, _2 _
newquestdata_begin / newquestdata_end: Эти параметры обозначают начало и конец блока данных квеста.
quest_id=10001: Уникальный идентификатор квеста (ID). В данном случае это квест с ID 10001.
quest_type=1: Тип квеста.1 q! h+ G6 ]' W: T
1 обычно означает стандартный квест. # O, F+ v( `( Y
quest_name=[Новый путь]: Название квеста. Здесь указано "[Новый путь]" — это имя, отображаемое в игре.
quest_level={0;0}: Уровневые ограничения квеста.. _/ v* J2 d4 q! o
Первое значение указывает минимальный уровень, второе — максимальный уровень.
{0;0} означает, что нет ограничений по уровню.. x+ K0 u {# w# e. |: _/ W: h: e
pre_quest={}: Предварительный квест, который нужно выполнить перед началом этого квеста.5 @# J' T* g: p! e
В данном случае он пустой {}, что означает, что нет предварительных требований.) }8 o h& H/ d+ y8 j" c
class={0;10;18;25;31;38;44;49;53;123;124}: Классы или расы, которые могут брать квест.8 E0 }, F$ a1 @1 T9 U8 ]6 e
Номера классов указывают на те классы, которым доступен этот квест. В данном примере классы, такие как 0 (человеки), 10 (рыцари) и другие, имеют доступ.6 @0 `+ L. X F( O
quest_item=82948: ID квестового предмета, необходимого для выполнения цели или этапа квеста.0 \- V& v5 o S/ [' U6 Y# K% U
В данном случае это предмет с ID 82948.- i5 z8 ^3 r( I2 V2 _! E
start_item=0: Предмет, который выдается при начале квеста.- N$ l$ N$ m* I, y3 O, X
Значение 0 означает, что предмет не выдается. . k5 C. q) j& j8 z
start_npc=34505: ID NPC, у которого начинается квест.
start_npc_loc=1002: Локация NPC, у которого начинается квест.2 a" [- n( X8 q) d0 R0 X6 _) h% i5 L
Это ID локации, где находится стартовый NPC. ! R' b; p1 E* V5 D7 x* k
end_npc=34696: ID NPC, у которого завершается квест.
end_npc_loc=1003: Локация NPC, у которого завершается квест.4 v3 n$ w3 J/ m- _
Это ID локации, где находится конечный NPC. 7 u) ^. o1 ^/ c) T
quest_loc=1003: Основная локация выполнения квеста." P6 B% }" c# v, w2 D
Это ID зоны, где нужно выполнять основные задачи. ! W( N! _9 b$ v( R; X) }; o
goal_string=[Дарти (Зона Тренировки)]: Описание цели квеста. }+ j0 c) f+ h+ M2 M, S8 i
В данном случае цель связана с персонажем по имени "Дарти" в Зоне Тренировки.9 F7 h3 z. q6 _% S
goal_num=1: Количество действий, необходимых для выполнения цели (например, убийств монстров или сбора предметов).# S( s1 H, n. `- Q$ v3 T
В данном случае нужно выполнить одно действие (1). & Q" z) n+ q% D& }5 }9 w# z D9 [
reward_level=65535: Уровень, при котором можно получить награду. 5 W; N/ B, R9 F; _2 k
В данном случае это максимальное значение, указывающее, что награда доступна всегда.* u! @9 }: a8 m) h2 c
reward_exp=0: Опыт (EXP), выдаваемый в качестве награды. 5 q: j0 e" u: @/ K" g% r4 W
В данном случае опыт не выдается.4 f/ R! a$ C5 _ X/ Q2 _
reward_sp=0: Количество SP (Skill Points), выдаваемых в качестве награды. ; ]' B+ ~4 j' o1 W$ k, T" i
Здесь тоже 0, значит, SP не выдаются.6 J* c; g, N& t% {, t# h