Название: Создание квестов L2j_Mobius [Версия для печати] Автор: admin Время: 2024-9-24 00:52 Название: Создание квестов L2j_Mobius Сборка: L2l_Monius ! v. X4 {+ k0 l% Z, WСледующие квесты можно использовать в качестве шаблонов для создания практически любого простого квеста go kill или go talk.. u' Y' t+ m0 W0 n6 e$ r+ n0 c
8 T$ e d9 l7 J0 J* P0 D1 u8 ]( L1 v
, B7 f `. l) r5 t% B) VИди и убей X монстров / Возвращение - награда., p, _! x* n2 V' O3 D Q
Q00529_RegularBarrierMaintenance: W( q1 R: r) d }
5 z) h/ | W2 ~6 D; @, K fПолучите квест от любого из двух разных NPC / Убейте X монстров / Вернитесь с наградой.8 M4 |& f0 N% w9 u% ]
Q00683_AdventOfKrofinSubspecies; `" C' d9 E2 m% W0 n
' i, P: A( N- G& Y y% R* _
Поговори с NPC 1 / Поговори с NPC 2 / Поговори с завершающим NPC / Награда. [+ D" B, ?0 v& d) n4 D* F7 u% r
Q10516_UnveiledFafurionTemple 8 ^% o2 E$ ~$ K 1 V& w; V& E! \9 t: ZУбейте X монстров, а также соберите X предметов / Возврат - награда. / ?5 T9 H9 q4 v7 |; c. W3 |4 r$ `Q10517_FafurionsMinions) S' u" I8 P/ M9 F; w
/ T0 P1 c" F1 q# Y4 CИди собери X капель монстров / Вернись - убей X монстров / Вернись - награда." Z2 D% j0 v% }& ~; p
Q10529_IvoryTowersResearchFloatingSeaJournal- L0 u2 v0 W- Q
; ]7 ~! c8 i7 J* B0 \$ L0 L
Иди убей X монстров, а также собери X предметов / Возвращение - иди собери X предметов / Возвращение - награда. |' ^9 N1 D6 GQ10518_SucceedingThePriestess/ M6 {2 y: a% P6 F
6 T% ?: }5 Z) j) I$ u3 E+ A# Y1 T/ GУчаствуйте в убийстве рейдбосса / Возврат - награда. : v$ a, X5 m! o9 \1 Z: CQ10519_контролирование вашей температуры * O6 t! e! _- q( F2 [8 m3 v/ J$ a
Поговорите с NPC 1 / Примите участие в убийстве рейдбосса / Возвращение - награда.5 F) e* r; S( q
Q10533_OrfensAmbition/ G2 I* b. F1 E- `) j
: U# u. E9 F6 @& j6 |2 a2 f& h* {) r# B, b* T: I$ G* x: O
7 z- u5 D/ `, C9 KРуководство требует обновления. И, к сожалению, с самыми последними хрониками вы не сможете избежать модификаций клиента. Поэтому, исключительно в образовательных целях, я предлагаю свой опыт по добавлению нового квеста!' V4 }( E @$ s; S+ o9 T$ l8 X 0 E8 B1 S/ B# y2 \/ nШаг 1: Создайте свой квест с уникальным ID. В этом примере я буду ссылаться на квест как "Q98765_NewQuest". ; }* g+ q6 C7 `6 p" D0 l8 g . Y, {* U; A) s4 X7 e1 n; jШаг 2: Когда вы успешно создали свой квест и Eclipse не выдает ошибок, добавьте название квеста и импортируйте его в файл "QuestMasterHandler.java". ' S n; |: @$ S0 q8 t ! c! [9 W5 _: Z7 V, mШаг 3: Перейдите в клиент и с помощью редактора клиента добавьте квест в следующие файлы .dat: "questname-ru.dat" и "QuestMarkConditionData.dat". * c( w8 {7 S. |5 l, H _, Z% y! Z* o9 ]Следующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов. g: i9 z( y- \% f o8 m 5 ^( M$ R5 Y9 t; X7 c! c. \Шаг 4: Найдите в серверных файлах файл с названием "NewQuestData.xml" и добавьте туда свой квест. # W' ~( B7 }! p& m0 ?' ?# n% Q. A) ^! d: f3 L! f5 | Шаг 5: Найдите в клиенте следующие файлы и добавьте туда свой квест: "NewQuestData-ru.dat", "NewQuestDialog-ru.dat" и "NewQuestNpcPortrait.dat". 1 W5 y$ P. R: k6 y% R; k& h3 ^4 a) S3 h2 Y0 X4 |1 u' a
Если я что-то забыл, не стесняйтесь исправить меня. Это руководство создано исключительно в образовательных целях. % [1 i5 P+ N) z0 m) `0 v" o) A7 d3 m$ H8 m$ M8 g% r' @ Шаг 2: 9 `9 A' ~0 L+ O+ u # `0 p( M/ k/ H/ x; y: ^ v* T+ UСледующий шаг заключается в добавлении вашего квеста в QuestMasterHandler.java. Вот общий план:3 @. Z7 M; B6 Z# D2 R8 x3 v: C
/ P5 j4 N( ~/ v% s 1. Импорт вашего квеста: В начале файла после всех существующих импортов добавьте строку, которая будет импортировать ваш квест. & ~& A. l1 H$ X% f! z0 }! U
Например:5 t u' G1 p3 `' n1 M
1. Регистрация квеста: Найдите метод, который отвечает за регистрацию всех квестов. Обычно это делается в статическом блоке или методе init, где происходит инициализация квестов. В этом блоке добавьте строку, которая будет регистрировать ваш квест:# t, a) @& r* Z( Q; U+ N& }! Q
% h" ^! l O/ j3 @
/** , }3 h; i8 u( O5 g8 O3 N" \: |
* @author NosBit 3 \7 T. ?7 @: j3 W) ~- E
*/ & M; z) F2 p+ k/ c9 f$ ] z1 l/ m
public class QuestMasterHandler " ~9 q3 P0 I. K
{ / I2 [% H: N6 v0 e. o+ Y; z0 T
private static final Logger LOGGER = Logger.getLogger(QuestMasterHandler.class.getName()); " ?- n+ A8 f; g0 d2 H
9 |2 g; ]0 V0 g0 a
private static final Class<?>[] QUESTS = 5 }7 q, {! t' Z/ E
{
Скопировать код
Проверка: Убедитесь, что идентификатор вашего квеста (в данном случае Q98765_NewQuest.class) уникален и не конфликтует с уже существующими квестами. ; O* @, f7 w% O+ H o / ~( N3 M0 o5 H3 b* L" d; s" i" F: k) U- g Шаг 3:0 u! H7 \, W. n; O
; f1 V6 B1 N; R: mФайл QuestName-ru.dat используется для описания квестов и содержит различные параметры, которые задают характеристики квеста, его цели, награды, ограничения и т.д. / z% R" P% b: b& g& AДавайте разберем все поля на основе примера: ) G: _9 f0 l2 o# }1 \ H 6 k5 E4 P, {0 v+ z' v7 X
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 6 ]3 d( B0 N7 l& }% E4 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 — завершение записи для квеста.9 ^1 w% j f6 u
4 U) r5 k1 H0 D- X$ @3 u
8 t0 I6 v9 {8 K1 H" y
Файл клиента QuestMarkConditionData.dat содержит информацию о квестах, связанных с условиями, необходимыми для активации или завершения определённых действий в игре. 5 m$ y" Y+ T$ k/ \$ WПример соодержания 6 N/ e6 n i' ^' l L8 e: l4 yВот описание структуры строки:9 x* i* M' f6 U7 c2 y/ K
Давайте разберем все поля на основе примера: 8 k" t% a4 \( N/ T - n5 S/ V J: f5 F# \2 U; j
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: Указывает на конец записи о квесте. O+ C/ w9 \9 O3 u) a- C) ?7 `$ |
Эта структура помогает клиенту определять условия, при которых игрок может начать или выполнить квест, а также идентифицировать необходимые взаимодействия с NPC.5 i5 R2 d) x$ b" O6 d; `: Y
* x) s6 x1 Y. k% F/ v; {& \- x 1 a9 y; Y# b3 n5 c % O2 Q" N- H, h; kСледующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов. - Z' ]. n, Q/ c$ ~3 n( E. x( e& t) Q6 d, I6 O Шаг 40 g0 }0 F( {# O8 q# d# ^
Для того чтобы добавить свой квест в файл NewQuestData.xml, нужно следовать структуре, аналогичной приведенному вами примеру. Вот как это может выглядеть:6 d Y) j3 q! E. ^" Z( }/ h
Пример добавления нового квеста:: A- X% t6 s3 r/ l" e9 V: J
<quest id="20001" type="1" name="Mystery of the Lost Relic" startNpcId="30050" endNpcId="30051">6 e& x: q/ E3 V) \* M
<locations>7 V. D% u2 v7 u0 v4 R& R' }
<param name="startLocationId">2001</param>: I; t. ^) h: C2 r( m
conditions: Условия для начала квеста. 4 C" t ~( N9 v% d O, H0 y
preQuestId: ID предварительного квеста (если есть).
classIds: ID классов или рас, которым доступен квест.! X, m, t. N1 J0 o* g
rewards: Награды за выполнение квеста. & O; N. l9 Z6 ^, K9 B
rewardLevel: Минимальный уровень для получения награды.
rewardSp: Количество опыта (SP).
rewardItemId: ID предмета (например, Adena).
rewardItemCount: Количество предметов. ; Y/ f; n2 i5 k; G$ K
goals: Цели квеста. . {8 e! r% e( b8 k
goalCount: Количество монстров, которых нужно убить или предметов, которые нужно собрать.
goalString: Описание цели.
goalItemId: ID квестового предмета (если требуется).
goalItemCount: Количество квестовых предметов для завершения цели.( f8 C5 ?( x: y0 s+ {& l4 d- N+ W
После того как вы добавите квест в файл NewQuestData.xml, нужно перезапустить сервер, чтобы изменения вступили в силу. # Z2 k: m/ i9 `# {' I" v3 o% L 3 U' z! S. Z. ~0 z" rШаг 5/ l, E5 C% q! M% E9 f) x' X
Файл NewQuestDialog-ru.dat используется для хранения диалогов, связанных с квестом. Он определяет тексты, которые отображаются в окнах диалогов с NPC во время выполнения квеста. Вот разбор ключевых элементов строки и структура файла: ; J" B* k6 _" sСтруктура данных
NewQuestDialog_begin — начало записи квеста в файле диалогов.
QuestId=10001 — идентификатор квеста (должен соответствовать ID, который ты используешь в других файлах).
Text0=... — первый диалог, который обычно отображается при старте квеста.
Text1=... — дополнительный текст, который отображается на различных этапах квеста.
Text2=... — текст, который отображается после выполнения определенных действий (например, после выполнения части задания).
Text3=... — дополнительный диалог, например, при встрече с NPC на следующем этапе квеста.
Text4=... — финальный текст или инструкции по следующему шагу для игрока.
NewQuestDialog_end — завершение записи для этого квеста. 9 i3 X0 k1 R3 b* G
" i6 H% m1 r/ n# z; y Пример записи для нового квеста (ID 98765) Если ты хочешь создать диалоги для нового квеста с ID 98765, твой файл может выглядеть так:2 x8 l8 ]9 M9 W& J* b2 w
NewQuestDialog_begin QuestId=98765 Text0=[Вы готовы принять новый вызов и доказать свою силу?] Text1=[Как вы себя чувствуете? Вы выглядите уверенно. Это хороший знак, но не расслабляйтесь — впереди много испытаний. Примите это задание, если готовы.] Text2=[Пора приступить к тренировкам. Идите за мной в тренировочную зону.] Text3=[Следуйте моим указаниям, и вы раскроете весь свой потенциал.] Text4=[Поговорите с Дарти. Кликните на него и начните диалог.] NewQuestDialog_end! b2 k& k0 c8 G" f- s
Скопировать код
Разъяснение полей:4 K. U9 z; n; o: C
QuestId=98765 — уникальный идентификатор нового квеста.
Text0 — вводный текст квеста. Отображается при первом контакте с NPC.
Text1 — дополнительный диалог, который дается игроку для создания контекста.
Text2 — текст, который отображается на следующем этапе квеста, например, после выполнения части задания.
Text3 — описание следующего шага или инструкции для игрока.
Text4 — финальный диалог или текст с указанием цели (встреча с другим NPC). ' J7 C- V2 U; k; h
9 o) a. E8 N1 F ]3 F " h! ?6 E$ o4 i; N: g; P8 OЧто можно изменить:
Тексты диалогов (Text0, Text1 и так далее) можно адаптировать под конкретные ситуации в квесте.
Количество текстов можно варьировать в зависимости от сложности квеста.8 L0 o* ~; S+ W
7 z% D1 A$ z* a ]
Файл NewQuestData-ru.dat содержит параметры, связанные с квестом в игре Lineage II, и описывает условия, NPC, цели и награды. Рассмотрим параметры этого файла:( t0 \0 _* Y( h+ u
! N/ h. v6 s5 u0 ]! h! F
newquestdata_begin / newquestdata_end: Эти параметры обозначают начало и конец блока данных квеста.
quest_id=10001: Уникальный идентификатор квеста (ID). В данном случае это квест с ID 10001.
quest_type=1: Тип квеста.6 p+ m$ k! f3 e o, D
1 обычно означает стандартный квест.# a0 B8 I' ^1 h; b( ~: S) J
quest_name=[Новый путь]: Название квеста. Здесь указано "[Новый путь]" — это имя, отображаемое в игре.
quest_level={0;0}: Уровневые ограничения квеста. 4 L0 |4 b' O0 I/ c
Первое значение указывает минимальный уровень, второе — максимальный уровень.
{0;0} означает, что нет ограничений по уровню. / ?3 V, w% r+ R) n
pre_quest={}: Предварительный квест, который нужно выполнить перед началом этого квеста. 0 u. z; J* T1 w
В данном случае он пустой {}, что означает, что нет предварительных требований.1 [; k4 {' H, v, R6 {
class={0;10;18;25;31;38;44;49;53;123;124}: Классы или расы, которые могут брать квест. 4 W7 z9 x, M' k6 c1 @
Номера классов указывают на те классы, которым доступен этот квест. В данном примере классы, такие как 0 (человеки), 10 (рыцари) и другие, имеют доступ. , k4 w$ B8 e7 ^
quest_item=82948: ID квестового предмета, необходимого для выполнения цели или этапа квеста.* \& ]5 Q* ^6 \/ t# _5 o: Y
В данном случае это предмет с ID 82948. & c. p) J8 U. f/ {5 ^% E0 B
start_item=0: Предмет, который выдается при начале квеста. 5 Q& ^: h/ U# U* P. ]! e' ?$ ~0 f
Значение 0 означает, что предмет не выдается.; e2 Y X/ S1 O0 t0 ?
start_npc=34505: ID NPC, у которого начинается квест.
start_npc_loc=1002: Локация NPC, у которого начинается квест. e& u5 L: C3 C) h
Это ID локации, где находится стартовый NPC. " F: q/ R) c, ~1 G1 i3 g
end_npc=34696: ID NPC, у которого завершается квест.
end_npc_loc=1003: Локация NPC, у которого завершается квест. 6 {! s5 o G/ u, y
Это ID локации, где находится конечный NPC. 3 [/ ?7 I( f5 \, o) R. o/ f8 v8 a. n
quest_loc=1003: Основная локация выполнения квеста.. f) ?* p! Z+ m( v: U
Это ID зоны, где нужно выполнять основные задачи. ) }" N) o. C7 u! P
goal_string=[Дарти (Зона Тренировки)]: Описание цели квеста. 9 P# Q; I4 _! o/ [5 e9 _6 _; n
В данном случае цель связана с персонажем по имени "Дарти" в Зоне Тренировки.. @) R9 _& ?& W; K9 [
goal_num=1: Количество действий, необходимых для выполнения цели (например, убийств монстров или сбора предметов). + O |; Y+ S8 z, }' x
В данном случае нужно выполнить одно действие (1).4 k; U! G/ C/ Z; J" Y
reward_level=65535: Уровень, при котором можно получить награду. + f, V, S; Q. Q9 `4 V9 u
В данном случае это максимальное значение, указывающее, что награда доступна всегда. % J' N9 S# I6 H& P- X
reward_exp=0: Опыт (EXP), выдаваемый в качестве награды." C" \8 `( V+ n) F+ [2 M0 y" E
В данном случае опыт не выдается.# \3 e( G! n2 G0 n4 K. c
reward_sp=0: Количество SP (Skill Points), выдаваемых в качестве награды. * m0 o& M* ~' l8 u+ b" [( V+ F7 H ?) Y
Здесь тоже 0, значит, SP не выдаются. ! ^" b$ H, r2 F3 F e) q