Название: Создание квестов L2j_Mobius [Версия для печати] Автор: admin Время: 2024-9-24 00:52 Название: Создание квестов L2j_Mobius Сборка: L2l_Monius ; K/ `) Z: n8 m& |1 t1 ?; R! V: o
Следующие квесты можно использовать в качестве шаблонов для создания практически любого простого квеста go kill или go talk. * U" Q1 U h1 }* T" D5 S" _' Y; g9 [2 k+ J8 G: P8 R
L/ S! c- j) r; A
Иди и убей X монстров / Возвращение - награда. + r, q% r9 E" ?6 _# o# @2 }7 { \Q00529_RegularBarrierMaintenance$ K; E' @$ T' U/ Y8 C
. ]6 |& G7 [5 g+ v7 G; B8 u
Получите квест от любого из двух разных NPC / Убейте X монстров / Вернитесь с наградой. * U# A3 F, h9 B* `1 m6 K, ?: V) HQ00683_AdventOfKrofinSubspecies ) K9 }% W" T# _% J* F- r# p0 W ' M u0 i$ @! W2 x) LПоговори с NPC 1 / Поговори с NPC 2 / Поговори с завершающим NPC / Награда." s: \! k2 u$ F7 I$ Q7 g- R
Q10516_UnveiledFafurionTemple: H z+ i3 ^/ D( K. Y
4 Q9 i6 @% F' }6 ?- r1 AУбейте X монстров, а также соберите X предметов / Возврат - награда.3 ]+ h1 q4 U0 R
Q10517_FafurionsMinions( d$ o9 Y; B* Z+ J4 q+ O
3 l) B5 B+ M. ]+ q# }Иди собери X капель монстров / Вернись - убей X монстров / Вернись - награда.& w% p% |- v% R& J
Q10529_IvoryTowersResearchFloatingSeaJournal/ d) J2 G& k B* i
% |, P Z1 z2 S: o- b& m# CИди убей X монстров, а также собери X предметов / Возвращение - иди собери X предметов / Возвращение - награда.1 s3 V% u- y% k
Q10518_SucceedingThePriestess2 ]! M& b" |0 h) R( r2 o7 ^; t# G& V
/ ~6 h/ P* N- s* [5 J( YУчаствуйте в убийстве рейдбосса / Возврат - награда.1 F. ?% c+ X1 d) N# v
Q10519_контролирование вашей температуры ) O& h* h# W n2 c- e 0 g7 ^. c; k+ j9 J: eПоговорите с NPC 1 / Примите участие в убийстве рейдбосса / Возвращение - награда. 6 {/ A, J. Y6 h( C4 c5 _Q10533_OrfensAmbition" D, | q. R- f7 L3 r# r
+ e% [: [0 p5 r! M. C 0 k. a: J! x4 {1 g% w/ U' U+ b$ a+ H% v0 A: T7 X0 U( O Руководство требует обновления. И, к сожалению, с самыми последними хрониками вы не сможете избежать модификаций клиента. Поэтому, исключительно в образовательных целях, я предлагаю свой опыт по добавлению нового квеста! , K2 a7 N; O: J0 _) N4 n 6 J7 p, E$ z. w4 mШаг 1: Создайте свой квест с уникальным ID. В этом примере я буду ссылаться на квест как "Q98765_NewQuest".% G: } `- k+ M, g2 U* ?
0 e! m c4 n+ W1 y( O X" T. YШаг 2: Когда вы успешно создали свой квест и Eclipse не выдает ошибок, добавьте название квеста и импортируйте его в файл "QuestMasterHandler.java".* I0 X/ X: r, ^+ o' E' ?
; A; e# k9 _1 ^' c% P/ DШаг 3: Перейдите в клиент и с помощью редактора клиента добавьте квест в следующие файлы .dat: "questname-ru.dat" и "QuestMarkConditionData.dat".9 R* P4 Y5 f& u7 T, o Y4 F' Y+ V! X
. z0 `' x) j3 X" T5 K- j; E/ v* b
Следующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов.3 v" K8 Y+ k( m0 W8 Q+ ?
4 |+ ^7 |; S% @! `Шаг 4: Найдите в серверных файлах файл с названием "NewQuestData.xml" и добавьте туда свой квест. ' G; O4 I0 E! K _) {2 A ) B' ^' Q8 i/ k3 xШаг 5: Найдите в клиенте следующие файлы и добавьте туда свой квест: "NewQuestData-ru.dat", "NewQuestDialog-ru.dat" и "NewQuestNpcPortrait.dat". " s# `* K6 o, w1 t$ w5 G' n 3 q ^% J" e- f! T, N0 b4 aЕсли я что-то забыл, не стесняйтесь исправить меня. Это руководство создано исключительно в образовательных целях.9 M# e" k$ n+ Z0 X- J
_/ |3 k7 h& O; }Шаг 2: / n7 `+ M" _' i8 D, e , m& J. g5 U; ]5 K+ VСледующий шаг заключается в добавлении вашего квеста в QuestMasterHandler.java. Вот общий план:' u% g) @, J8 F8 E- w" a3 x
! r+ M* f: Z7 c3 T* [5 q1 N 1. Импорт вашего квеста: В начале файла после всех существующих импортов добавьте строку, которая будет импортировать ваш квест. / @6 _% m$ g( `8 O
Например: - k3 I# l* _: t( L9 P9 i 4 L6 K' u8 R- ^" l! s
import quests.<span style="background-color: rgb(255, 255, 255);">Q98765_NewQuest</span>.<span style="background-color: rgb(255, 255, 255);">Q98765_NewQuest</span>;5 Y, f% p: }% K' T1 {. q! e* N
Скопировать код
1. Регистрация квеста: Найдите метод, который отвечает за регистрацию всех квестов. Обычно это делается в статическом блоке или методе init, где происходит инициализация квестов. В этом блоке добавьте строку, которая будет регистрировать ваш квест: 2 E/ L: ^! A: W, V% o8 y4 ?9 }$ \ % z8 O* W- c% v# ?$ ]3 r- H- ?" k0 S
/** - Q" _; b0 r; a4 n% G2 f
* @author NosBit+ ^8 J( r- a5 a+ Y/ ^# G
*/ ) n5 n1 _+ S& e3 N2 c, M9 ^% N+ b
public class QuestMasterHandler8 @' y0 K p5 A8 a
{ ^: l5 Y$ f0 U% Z# `
private static final Logger LOGGER = Logger.getLogger(QuestMasterHandler.class.getName());9 C+ E$ o: z! o' H& @5 g
Проверка: Убедитесь, что идентификатор вашего квеста (в данном случае Q98765_NewQuest.class) уникален и не конфликтует с уже существующими квестами.: n$ y! a% y4 @: q0 V
4 C! |2 ~* u4 w/ ]5 T8 i: J
/ w8 X! Q6 C* G% e) k6 ] Шаг 3:, o8 Y- @5 N' E- ^2 R# K% ]
, t: y8 w$ i& U5 ]/ V' b7 Q# HФайл QuestName-ru.dat используется для описания квестов и содержит различные параметры, которые задают характеристики квеста, его цели, награды, ограничения и т.д. & L& V9 _9 F: l) [6 H$ v6 P
Давайте разберем все поля на основе примера: / R$ a |+ X! D5 {. H3 O( w . c3 e* ?, R& K
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 5 A- o: l# {1 U
Скопировать код
Поля данных:
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 — завершение записи для квеста.' c% g1 \9 _# V+ J* k4 C- c, t
% F5 |8 \* A( j$ B4 Z! _7 N
( M0 [3 H( m$ [2 v
Файл клиента QuestMarkConditionData.dat содержит информацию о квестах, связанных с условиями, необходимыми для активации или завершения определённых действий в игре. : k# h! r0 `* I$ t/ U4 aПример соодержания * C( y$ e% l7 k- gВот описание структуры строки:0 o# h* v5 z$ ^& I2 `0 h' s( b1 G. u
Давайте разберем все поля на основе примера:, B$ V- L/ c7 D* e: M( I! I
, A) L3 }. u4 Y$ j7 E
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: Указывает на конец записи о квесте. . V2 `3 Z* W0 |; ^
Эта структура помогает клиенту определять условия, при которых игрок может начать или выполнить квест, а также идентифицировать необходимые взаимодействия с NPC. 7 Y# V4 ]1 v; F; H 4 d9 v7 P, g8 S$ Q% c0 p( u, P6 Y/ ^5 I% C9 P" E
0 o' Q! ^; s( DСледующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов. ( J1 R" u& v; C, g1 _* A) v4 Z6 V3 W2 T# {3 _9 T. n' `/ B; @2 S Шаг 4 2 u( [ l& t+ t7 g9 j) s8 S! G8 qДля того чтобы добавить свой квест в файл NewQuestData.xml, нужно следовать структуре, аналогичной приведенному вами примеру. Вот как это может выглядеть:" l; z e& q: A8 G
Пример добавления нового квеста:. n7 G8 z% j: W: H3 o
<quest id="20001" type="1" name="Mystery of the Lost Relic" startNpcId="30050" endNpcId="30051"> ( Q) ?: S2 J7 E9 P& n
<param name="goalItemCount">1</param>( h3 S X$ R1 ]! ^8 c- N' a% Y7 Z( p
</goals> ) O/ j" b5 V) _- i. s7 Q$ K" n
</quest>$ g9 T( n' |9 c6 B' ]& A, J
Скопировать код
Описание структуры:) g9 G8 L3 @' m& A& w
quest: Основной элемент квеста, содержащий атрибуты: 2 k/ l( t2 g: Y3 [6 G: w8 L3 a
id: ID квеста, уникальный для каждого квеста.
type: Тип квеста (1 – обычный квест).
name: Название квеста.
startNpcId: ID NPC, с которого начинается квест.
endNpcId: ID NPC, у которого квест заканчивается.; R: w* E3 m1 }, Z; C. G1 D
locations: Указывает места начала, окончания и квестовой активности.0 z# v' @6 r4 K; W% Z
startLocationId: ID места, где начинается квест.
endLocationId: ID места, где квест заканчивается.
questLocationId: ID квестовой зоны.4 Z8 [& m. R( s
conditions: Условия для начала квеста.# E9 ^0 {$ F! S! s1 H
preQuestId: ID предварительного квеста (если есть).
classIds: ID классов или рас, которым доступен квест.; o/ \7 B: K+ Q; D! g5 c
rewards: Награды за выполнение квеста. 9 n. o# z$ w6 m! [1 Z7 ]
rewardLevel: Минимальный уровень для получения награды.
rewardSp: Количество опыта (SP).
rewardItemId: ID предмета (например, Adena).
rewardItemCount: Количество предметов. ; D+ J# n( J1 o. s$ C: M
goals: Цели квеста.% V! @" B. U& g7 c
goalCount: Количество монстров, которых нужно убить или предметов, которые нужно собрать.
goalString: Описание цели.
goalItemId: ID квестового предмета (если требуется).
goalItemCount: Количество квестовых предметов для завершения цели.5 a! ]. o4 @1 ^1 ^4 p
После того как вы добавите квест в файл NewQuestData.xml, нужно перезапустить сервер, чтобы изменения вступили в силу.# e0 s8 X( h, M2 Q9 v+ K) D
9 n# I" L8 \5 C# h& \: N& M5 gШаг 5 ) y0 F0 _" R. i( P( m# |. Y8 T1 S4 ?Файл NewQuestDialog-ru.dat используется для хранения диалогов, связанных с квестом. Он определяет тексты, которые отображаются в окнах диалогов с NPC во время выполнения квеста. Вот разбор ключевых элементов строки и структура файла:4 e+ u. J2 O% Q6 @* R3 \ Структура данных
NewQuestDialog_begin — начало записи квеста в файле диалогов.
QuestId=10001 — идентификатор квеста (должен соответствовать ID, который ты используешь в других файлах).
Text0=... — первый диалог, который обычно отображается при старте квеста.
Text1=... — дополнительный текст, который отображается на различных этапах квеста.
Text2=... — текст, который отображается после выполнения определенных действий (например, после выполнения части задания).
Text3=... — дополнительный диалог, например, при встрече с NPC на следующем этапе квеста.
Text4=... — финальный текст или инструкции по следующему шагу для игрока.
NewQuestDialog_end — завершение записи для этого квеста. ; ?3 O2 n3 B2 r1 I* W
" C/ i @* a5 ] } Пример записи для нового квеста (ID 98765) Если ты хочешь создать диалоги для нового квеста с ID 98765, твой файл может выглядеть так:/ f3 i$ f+ w$ Q# E9 ]3 V
NewQuestDialog_begin QuestId=98765 Text0=[Вы готовы принять новый вызов и доказать свою силу?] Text1=[Как вы себя чувствуете? Вы выглядите уверенно. Это хороший знак, но не расслабляйтесь — впереди много испытаний. Примите это задание, если готовы.] Text2=[Пора приступить к тренировкам. Идите за мной в тренировочную зону.] Text3=[Следуйте моим указаниям, и вы раскроете весь свой потенциал.] Text4=[Поговорите с Дарти. Кликните на него и начните диалог.] NewQuestDialog_end ( N6 S& S% s6 N% g: C0 h# U
Скопировать код
Разъяснение полей:& @8 S, i& G$ J- t% ]( y
QuestId=98765 — уникальный идентификатор нового квеста.
Text0 — вводный текст квеста. Отображается при первом контакте с NPC.
Text1 — дополнительный диалог, который дается игроку для создания контекста.
Text2 — текст, который отображается на следующем этапе квеста, например, после выполнения части задания.
Text3 — описание следующего шага или инструкции для игрока.
Text4 — финальный диалог или текст с указанием цели (встреча с другим NPC). $ L8 P0 V/ n. S- d1 x
6 n; r) C; R( }+ d7 u ) m# b+ r3 ?$ j' Q+ P" BЧто можно изменить:
Тексты диалогов (Text0, Text1 и так далее) можно адаптировать под конкретные ситуации в квесте.
Количество текстов можно варьировать в зависимости от сложности квеста.# T7 g3 M& ~9 \& N
3 Q5 e+ g+ m* z) S8 w! l. A
Файл NewQuestData-ru.dat содержит параметры, связанные с квестом в игре Lineage II, и описывает условия, NPC, цели и награды. Рассмотрим параметры этого файла: $ P$ U% \6 p, [& H9 e K0 V: D' r0 \) S I1 s6 V* L
newquestdata_begin / newquestdata_end: Эти параметры обозначают начало и конец блока данных квеста.
quest_id=10001: Уникальный идентификатор квеста (ID). В данном случае это квест с ID 10001.
quest_type=1: Тип квеста.$ O# r) k6 m& `1 e6 v2 U) J6 i
1 обычно означает стандартный квест.: `" @. Z6 s( K9 h! d
quest_name=[Новый путь]: Название квеста. Здесь указано "[Новый путь]" — это имя, отображаемое в игре.
Первое значение указывает минимальный уровень, второе — максимальный уровень.
{0;0} означает, что нет ограничений по уровню. ' O1 a2 @2 P0 k5 {& b
pre_quest={}: Предварительный квест, который нужно выполнить перед началом этого квеста. $ B3 v, ~3 X9 ^1 y" a0 x; L* T2 c
В данном случае он пустой {}, что означает, что нет предварительных требований. 5 h) }% {1 I* Q% m9 C4 X" y
class={0;10;18;25;31;38;44;49;53;123;124}: Классы или расы, которые могут брать квест.: i- y* a7 J/ W; O6 x1 a0 \6 I
Номера классов указывают на те классы, которым доступен этот квест. В данном примере классы, такие как 0 (человеки), 10 (рыцари) и другие, имеют доступ.# \. ?0 o5 S E
quest_item=82948: ID квестового предмета, необходимого для выполнения цели или этапа квеста. 5 ?! m& y0 s, E( J& ~+ z! G
В данном случае это предмет с ID 82948. " Q& \- N0 v7 ?. B( L: T: `
start_item=0: Предмет, который выдается при начале квеста. 3 _, j& L/ O, @6 q: D1 d
Значение 0 означает, что предмет не выдается.5 N# G" R! d6 b! S
start_npc=34505: ID NPC, у которого начинается квест.
start_npc_loc=1002: Локация NPC, у которого начинается квест.1 h+ }2 H5 v; e1 D6 T3 S6 p
Это ID локации, где находится стартовый NPC.8 x4 {! {. `8 u, [. v' k7 F: k9 K- G
end_npc=34696: ID NPC, у которого завершается квест.
end_npc_loc=1003: Локация NPC, у которого завершается квест./ @+ J9 ~6 r7 S& R8 @+ K; I; k
Это ID локации, где находится конечный NPC. % C, O& h# Y' H/ W3 g: ]
quest_loc=1003: Основная локация выполнения квеста. 9 u3 O5 t: [. T7 K% `
Это ID зоны, где нужно выполнять основные задачи. : L" K# J* x% H: d" \4 M K8 y9 y
goal_string=[Дарти (Зона Тренировки)]: Описание цели квеста.3 d7 G7 J( ~/ W* I- W
В данном случае цель связана с персонажем по имени "Дарти" в Зоне Тренировки. / o( B; h2 n/ a/ P
goal_num=1: Количество действий, необходимых для выполнения цели (например, убийств монстров или сбора предметов).: U1 P; d& s3 M# `2 w" Y1 v
В данном случае нужно выполнить одно действие (1).$ t% ]4 d; O1 }5 m% s' y5 a
reward_level=65535: Уровень, при котором можно получить награду. c( o& Y) d7 u: u% K8 o" q( Z
В данном случае это максимальное значение, указывающее, что награда доступна всегда. & F, f$ c# J/ X. i8 G
reward_exp=0: Опыт (EXP), выдаваемый в качестве награды. / T$ e% ~3 J+ _" p
В данном случае опыт не выдается.: j4 P6 F: X5 b. P0 |( ]$ G
reward_sp=0: Количество SP (Skill Points), выдаваемых в качестве награды. * P5 k7 z" j& U6 Y& }) p( ~
Здесь тоже 0, значит, SP не выдаются. [! ^ T! U2 n5 ~9 N/ w# E9 U$ P