Название: Создание квестов L2j_Mobius [Версия для печати] Автор: admin Время: 2024-9-24 00:52 Название: Создание квестов L2j_Mobius Сборка: L2l_Monius . H: p1 A" e: `% O* BСледующие квесты можно использовать в качестве шаблонов для создания практически любого простого квеста go kill или go talk. [' [0 h2 T% W: V" A# ^) U" h
- L9 r- [3 O5 `5 T6 k$ v9 F1 T$ q; o
Иди и убей X монстров / Возвращение - награда.7 G6 y; o) t" m0 N: Z$ t
Q00529_RegularBarrierMaintenance _6 l0 a% J4 Z! g
* e' q) c' C8 A& d% |5 U
Получите квест от любого из двух разных NPC / Убейте X монстров / Вернитесь с наградой./ ^& N( ?/ i) p8 N2 u) {
Q00683_AdventOfKrofinSubspecies' t2 O2 |# u; _" B/ _6 A$ m
9 b }% [- x; |- A% H1 Y4 X# ~Поговори с NPC 1 / Поговори с NPC 2 / Поговори с завершающим NPC / Награда.2 i" \, ^% A" \' z) v- S0 b% `/ j
Q10516_UnveiledFafurionTemple7 Z6 X/ w7 {$ ~6 _5 V- b7 n: I
" t" a; j* O* K5 |' d/ R+ B# NУбейте X монстров, а также соберите X предметов / Возврат - награда.' X! b; P# B2 Z) k: J S0 x. J
Q10517_FafurionsMinions ( M% y& R: g0 w, W2 ?4 l 2 j; S2 H" B. S7 w: o4 MИди собери X капель монстров / Вернись - убей X монстров / Вернись - награда.% G# Q1 S1 n0 t! p3 r
Q10529_IvoryTowersResearchFloatingSeaJournal 6 U: T; p) \# h b& |! k0 K# c- T7 D( [! pИди убей X монстров, а также собери X предметов / Возвращение - иди собери X предметов / Возвращение - награда. 1 U7 e5 V d+ E/ K. R: @Q10518_SucceedingThePriestess' V+ X; V% D, E5 |) i4 I+ I- x
. @0 N" B: S, l2 U
Участвуйте в убийстве рейдбосса / Возврат - награда.( k: U0 [( D- ^8 A. X: L! g! P$ M
Q10519_контролирование вашей температуры # q4 d% Y5 C0 m" d& H9 l8 h* V* c; p3 b' [
Поговорите с NPC 1 / Примите участие в убийстве рейдбосса / Возвращение - награда.5 ]& ]/ S9 _# d& B
Q10533_OrfensAmbition & `/ ]" p, d4 _9 ~ 8 D& l/ G9 E$ b# R+ Q: f ! ~) W9 @; v& I s6 d3 a$ }6 ~0 G- ~8 G/ r" i; |3 i% D Руководство требует обновления. И, к сожалению, с самыми последними хрониками вы не сможете избежать модификаций клиента. Поэтому, исключительно в образовательных целях, я предлагаю свой опыт по добавлению нового квеста!1 O& D6 h0 `, r. J 6 u Z; U0 Q: k
Шаг 1: Создайте свой квест с уникальным ID. В этом примере я буду ссылаться на квест как "Q98765_NewQuest". 3 {+ l! L6 Y- J5 w3 n/ s2 |( ^# d8 o+ S# X2 M Шаг 2: Когда вы успешно создали свой квест и Eclipse не выдает ошибок, добавьте название квеста и импортируйте его в файл "QuestMasterHandler.java"., d1 G, K) ?$ \) p& g# I" Y7 t; T6 w
, Z" e; Q$ \- V, o9 I Шаг 3: Перейдите в клиент и с помощью редактора клиента добавьте квест в следующие файлы .dat: "questname-ru.dat" и "QuestMarkConditionData.dat". 2 O! j6 D# {3 o$ s2 B7 l % X/ C; D9 p4 [2 AСледующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов.' l2 l5 `$ O b# D' w6 z1 @# U# U! s
- D; n8 H$ @7 Z7 T& ~4 r" P5 j Шаг 4: Найдите в серверных файлах файл с названием "NewQuestData.xml" и добавьте туда свой квест.$ h3 ?" l1 F8 @& c% W6 Q5 _2 Q
* J2 ]$ z9 i2 N) L Шаг 5: Найдите в клиенте следующие файлы и добавьте туда свой квест: "NewQuestData-ru.dat", "NewQuestDialog-ru.dat" и "NewQuestNpcPortrait.dat".4 g8 ^" x5 k5 s7 P" Z0 m0 \
/ Y6 x2 J# l; q7 J6 hЕсли я что-то забыл, не стесняйтесь исправить меня. Это руководство создано исключительно в образовательных целях. - g* z& I) A+ ?# c5 b 3 J0 X% T# } d6 z8 FШаг 2: ' k, F5 y2 P/ y& O$ b* S4 ]6 ]7 k0 S+ B- z2 l
Следующий шаг заключается в добавлении вашего квеста в QuestMasterHandler.java. Вот общий план:8 C3 ?( U5 N3 C. t4 \& t
0 ~8 j) U* _" d9 z" C 1. Импорт вашего квеста: В начале файла после всех существующих импортов добавьте строку, которая будет импортировать ваш квест. , _( T. t. z: [2 y) ]; U
Например: & |$ a7 ]7 l. w: f$ @8 L4 d 9 g* N8 e1 M: L* B" v# ~
1. Регистрация квеста: Найдите метод, который отвечает за регистрацию всех квестов. Обычно это делается в статическом блоке или методе init, где происходит инициализация квестов. В этом блоке добавьте строку, которая будет регистрировать ваш квест:/ o* d, }5 U5 v/ e2 S! J
private static final Class<?>[] QUESTS = : N* A3 `+ S+ ], Z: G6 [: X P
{
Скопировать код
Проверка: Убедитесь, что идентификатор вашего квеста (в данном случае Q98765_NewQuest.class) уникален и не конфликтует с уже существующими квестами. 5 c; [; H) A' l1 S: s1 Q+ M5 Z4 _9 o5 Q( g
) p% a) C& \3 _% [; Z) P Шаг 3: ; O& I4 V# T: M3 h6 A$ @, F) Z9 w: h! ~
Файл QuestName-ru.dat используется для описания квестов и содержит различные параметры, которые задают характеристики квеста, его цели, награды, ограничения и т.д. 2 N& y! l# ^; e4 S- e3 Y' }/ w. ?
Давайте разберем все поля на основе примера: # b7 v4 b& j |* I. l% O9 I6 B8 j0 y
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_end }/ D& w ~2 E" O3 G
Скопировать код
Поля данных:
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 — завершение записи для квеста.0 l# i- G4 F9 v( w+ g1 H% H4 \
) D. k$ X0 z) |) y# J T+ t, v: m( u2 ?3 p9 fФайл клиента QuestMarkConditionData.dat содержит информацию о квестах, связанных с условиями, необходимыми для активации или завершения определённых действий в игре. " h. {* |# x# k5 C6 H: bПример соодержания 8 o# g# g# U5 xВот описание структуры строки: 3 p9 n0 B' P2 q8 S/ `
Давайте разберем все поля на основе примера:/ p% l5 U2 a% B. I4 Q% q
/ b/ G, c/ v: {3 c
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: Указывает на конец записи о квесте. . e5 s# W% H0 I4 c0 V+ z
Эта структура помогает клиенту определять условия, при которых игрок может начать или выполнить квест, а также идентифицировать необходимые взаимодействия с NPC.$ K. @" H3 l' g5 M" y$ V. j
( A) W. M( b4 B/ J / e( y; X9 u7 i; Z7 ?" H+ `* _/ {3 _2 C
Следующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов.$ t P" _# _7 }$ J0 m9 M% X
7 d4 ^3 Z# d" o1 e0 D- D: PШаг 4 2 p7 z0 y. {; w- EДля того чтобы добавить свой квест в файл NewQuestData.xml, нужно следовать структуре, аналогичной приведенному вами примеру. Вот как это может выглядеть: 6 A; n9 }# R. Z4 _3 @Пример добавления нового квеста:: F" U+ L& m- L% b/ l3 M& D
<quest id="20001" type="1" name="Mystery of the Lost Relic" startNpcId="30050" endNpcId="30051">7 V4 Y: e1 o& W8 g+ o! }" v
quest: Основной элемент квеста, содержащий атрибуты: 7 V- b4 [% |& F
id: ID квеста, уникальный для каждого квеста.
type: Тип квеста (1 – обычный квест).
name: Название квеста.
startNpcId: ID NPC, с которого начинается квест.
endNpcId: ID NPC, у которого квест заканчивается. $ x# @4 n7 o i; t# e! P! z
locations: Указывает места начала, окончания и квестовой активности. 3 z- e' o* p6 [0 d1 _+ Z) C# V/ o
startLocationId: ID места, где начинается квест.
endLocationId: ID места, где квест заканчивается.
questLocationId: ID квестовой зоны.6 P0 d9 k! s- R( r& G
conditions: Условия для начала квеста. 3 _: ?" u8 D$ Z* D
preQuestId: ID предварительного квеста (если есть).
classIds: ID классов или рас, которым доступен квест.7 Q+ l5 x- O3 N& C
rewards: Награды за выполнение квеста.8 k$ B. m6 ?3 [8 W( Y
rewardLevel: Минимальный уровень для получения награды.
rewardSp: Количество опыта (SP).
rewardItemId: ID предмета (например, Adena).
rewardItemCount: Количество предметов.7 I4 ?9 @2 E Z V
goals: Цели квеста. ; d: N! k* D2 w5 j- i" o3 ?
goalCount: Количество монстров, которых нужно убить или предметов, которые нужно собрать.
goalString: Описание цели.
goalItemId: ID квестового предмета (если требуется).
goalItemCount: Количество квестовых предметов для завершения цели.7 U% f: C& z! \. b, D* S
После того как вы добавите квест в файл NewQuestData.xml, нужно перезапустить сервер, чтобы изменения вступили в силу. ' _# j0 N7 | z! a$ Z9 v: B1 O1 g# i/ W5 x+ y9 w3 K q Шаг 5 6 L5 ]5 V( L, G3 b/ r+ {1 |1 ^; nФайл NewQuestDialog-ru.dat используется для хранения диалогов, связанных с квестом. Он определяет тексты, которые отображаются в окнах диалогов с NPC во время выполнения квеста. Вот разбор ключевых элементов строки и структура файла: # s7 c6 S H5 ?0 z1 rСтруктура данных
NewQuestDialog_begin — начало записи квеста в файле диалогов.
QuestId=10001 — идентификатор квеста (должен соответствовать ID, который ты используешь в других файлах).
Text0=... — первый диалог, который обычно отображается при старте квеста.
Text1=... — дополнительный текст, который отображается на различных этапах квеста.
Text2=... — текст, который отображается после выполнения определенных действий (например, после выполнения части задания).
Text3=... — дополнительный диалог, например, при встрече с NPC на следующем этапе квеста.
Text4=... — финальный текст или инструкции по следующему шагу для игрока.
NewQuestDialog_end — завершение записи для этого квеста.! [" L: \8 e; V, Q7 ]( ]
. h" D4 Q- v8 ` \ Пример записи для нового квеста (ID 98765) Если ты хочешь создать диалоги для нового квеста с ID 98765, твой файл может выглядеть так: 2 Q0 x1 _) B' x7 ~
NewQuestDialog_begin QuestId=98765 Text0=[Вы готовы принять новый вызов и доказать свою силу?] Text1=[Как вы себя чувствуете? Вы выглядите уверенно. Это хороший знак, но не расслабляйтесь — впереди много испытаний. Примите это задание, если готовы.] Text2=[Пора приступить к тренировкам. Идите за мной в тренировочную зону.] Text3=[Следуйте моим указаниям, и вы раскроете весь свой потенциал.] Text4=[Поговорите с Дарти. Кликните на него и начните диалог.] NewQuestDialog_end: ^: F5 [6 a. j; u; |# M
Скопировать код
Разъяснение полей:( j/ }# w9 G6 b6 i
QuestId=98765 — уникальный идентификатор нового квеста.
Text0 — вводный текст квеста. Отображается при первом контакте с NPC.
Text1 — дополнительный диалог, который дается игроку для создания контекста.
Text2 — текст, который отображается на следующем этапе квеста, например, после выполнения части задания.
Text3 — описание следующего шага или инструкции для игрока.
Text4 — финальный диалог или текст с указанием цели (встреча с другим NPC). 3 g9 e; P) Q, \. ~6 {' M
1 W) O1 _6 }% }$ `! Q" G( ~
+ ~* t& s: L& z, C: u* E
Что можно изменить:
Тексты диалогов (Text0, Text1 и так далее) можно адаптировать под конкретные ситуации в квесте.
Количество текстов можно варьировать в зависимости от сложности квеста. ( t' i: E3 a* O, l: ~( B! M" f
3 s O! }7 D6 D7 AФайл NewQuestData-ru.dat содержит параметры, связанные с квестом в игре Lineage II, и описывает условия, NPC, цели и награды. Рассмотрим параметры этого файла:5 u( J! s- u3 i4 ?4 V2 q
2 u4 V0 f4 B6 @# H8 S$ S
newquestdata_begin / newquestdata_end: Эти параметры обозначают начало и конец блока данных квеста.
quest_id=10001: Уникальный идентификатор квеста (ID). В данном случае это квест с ID 10001.
quest_type=1: Тип квеста. & D( z4 S2 G! S2 A3 |0 d. O
1 обычно означает стандартный квест. ! L U4 W4 m+ B {- b4 G
quest_name=[Новый путь]: Название квеста. Здесь указано "[Новый путь]" — это имя, отображаемое в игре.
quest_level={0;0}: Уровневые ограничения квеста. : H! b3 H6 c" i, Q! h8 e: t
Первое значение указывает минимальный уровень, второе — максимальный уровень.
{0;0} означает, что нет ограничений по уровню. {; j8 o! O/ c1 K8 d
pre_quest={}: Предварительный квест, который нужно выполнить перед началом этого квеста. & x3 t# Q" _& e/ A& ^$ n9 P
В данном случае он пустой {}, что означает, что нет предварительных требований.( W* o1 ^" U3 i. a: X
class={0;10;18;25;31;38;44;49;53;123;124}: Классы или расы, которые могут брать квест. / ?, ]. L/ ^8 @" K) m
Номера классов указывают на те классы, которым доступен этот квест. В данном примере классы, такие как 0 (человеки), 10 (рыцари) и другие, имеют доступ.. Y: j; g+ G7 m$ G. R
quest_item=82948: ID квестового предмета, необходимого для выполнения цели или этапа квеста. $ g; m$ S4 [& }9 H h( R
В данном случае это предмет с ID 82948.5 f- R$ \) m2 k3 u/ A
start_item=0: Предмет, который выдается при начале квеста./ \: ]; p8 ^- @0 v n. l
Значение 0 означает, что предмет не выдается.! N; w- p/ I& I% U
start_npc=34505: ID NPC, у которого начинается квест.
start_npc_loc=1002: Локация NPC, у которого начинается квест. ' f, v* i; `; s- _/ } L
Это ID локации, где находится стартовый NPC. + ^ l! S( X0 t& U/ e/ S" R" v) j
end_npc=34696: ID NPC, у которого завершается квест.
end_npc_loc=1003: Локация NPC, у которого завершается квест. 0 A: L1 v* A8 c8 e/ A6 E
Это ID локации, где находится конечный NPC. 6 }$ M" I+ y4 c- k. g) D3 G7 H
quest_loc=1003: Основная локация выполнения квеста.5 \% z# y0 F. t# O" |9 x
Это ID зоны, где нужно выполнять основные задачи.; n0 {! w5 j. W) D/ \
goal_string=[Дарти (Зона Тренировки)]: Описание цели квеста./ v7 b4 u, V, u4 F$ q4 M
В данном случае цель связана с персонажем по имени "Дарти" в Зоне Тренировки. - G" q, ? ^$ E" o
goal_num=1: Количество действий, необходимых для выполнения цели (например, убийств монстров или сбора предметов). - |* V2 }( ?4 U. X
В данном случае нужно выполнить одно действие (1). 5 H, r% ^% W) J! @+ D
reward_level=65535: Уровень, при котором можно получить награду. , T0 g l0 b1 T0 R% L
В данном случае это максимальное значение, указывающее, что награда доступна всегда. s& h# _7 [- l5 b" u! m$ ]0 e
reward_exp=0: Опыт (EXP), выдаваемый в качестве награды.4 E+ ? l! O! M
В данном случае опыт не выдается. 1 I5 _# H j- W' y
reward_sp=0: Количество SP (Skill Points), выдаваемых в качестве награды.( v9 S5 m; U% p9 L/ Q+ {1 ?
Здесь тоже 0, значит, SP не выдаются.4 p! F3 o* ^" b8 v