Название: Создание квестов L2j_Mobius [Версия для печати] Автор: admin Время: 2024-9-24 00:52 Название: Создание квестов L2j_Mobius Сборка: L2l_Monius , ]4 C6 \3 G6 S7 \
Следующие квесты можно использовать в качестве шаблонов для создания практически любого простого квеста go kill или go talk. 0 R- V: U5 _9 z7 b0 c$ Q9 q5 `0 K) \1 G
9 U4 m, o" e5 w i$ B) g/ `Иди и убей X монстров / Возвращение - награда. * M7 \9 o" R5 J HQ00529_RegularBarrierMaintenance ' ?* C4 Y4 Z; J1 }& Q ! T# Q, K8 i, z6 W4 G( O/ i; ?8 FПолучите квест от любого из двух разных NPC / Убейте X монстров / Вернитесь с наградой.5 C! N- P7 l6 a3 ?; W2 e
Q00683_AdventOfKrofinSubspecies , X+ j0 W+ ~' l/ {7 n' G: ?, k6 B! u) B9 n6 i4 k9 |- Q0 Q* B( s; a8 Q
Поговори с NPC 1 / Поговори с NPC 2 / Поговори с завершающим NPC / Награда. & S+ o4 R- ?; q& GQ10516_UnveiledFafurionTemple 1 `; |" D2 h! k5 Q* f& }3 p& z7 S/ Y3 G; I
Убейте X монстров, а также соберите X предметов / Возврат - награда.+ @4 y4 n) z$ T D
Q10517_FafurionsMinions + B# |0 J2 a1 |" }, m5 O 6 Q( J* h; @9 X" OИди собери X капель монстров / Вернись - убей X монстров / Вернись - награда. 5 V& U& i: |& t4 ~0 U; ZQ10529_IvoryTowersResearchFloatingSeaJournal / s- ~( b& d& B7 f+ D) H0 k7 S" v% U , w% A* T! I( j$ q" U7 M; @) |3 VИди убей X монстров, а также собери X предметов / Возвращение - иди собери X предметов / Возвращение - награда.& ?/ Z4 N7 \) N1 ?. a
Q10518_SucceedingThePriestess 8 \0 H8 V) U8 Z5 ]0 T& k2 }) f5 D* T1 F
Участвуйте в убийстве рейдбосса / Возврат - награда., O+ V4 c7 ^8 V! S f
Q10519_контролирование вашей температуры % J! i* |* a# U1 |* j6 H# i9 I# T! Q % x1 V$ H/ W) q) v2 f3 NПоговорите с NPC 1 / Примите участие в убийстве рейдбосса / Возвращение - награда.$ Q" ]" W- F* k. ^7 g3 V! M* t/ J* y4 D
Q10533_OrfensAmbition1 B# L0 |8 A5 ~# P2 F% p$ b
0 i7 K' ]) [1 c( k' N
M/ M# X; \! \7 C! E+ Q* C
7 C+ \5 K9 l/ W& W; K$ @% zРуководство требует обновления. И, к сожалению, с самыми последними хрониками вы не сможете избежать модификаций клиента. Поэтому, исключительно в образовательных целях, я предлагаю свой опыт по добавлению нового квеста!9 I' ?9 P8 ]. @ } 9 P% Z5 D' Y- ~! R
Шаг 1: Создайте свой квест с уникальным ID. В этом примере я буду ссылаться на квест как "Q98765_NewQuest".* C6 L( _3 t- f" b5 E% k
) q7 L: ]$ U5 e; f: B: cШаг 2: Когда вы успешно создали свой квест и Eclipse не выдает ошибок, добавьте название квеста и импортируйте его в файл "QuestMasterHandler.java".- n& h3 H& C p/ e7 v# g7 p6 W! N
% k+ x5 O7 I0 y V Шаг 3: Перейдите в клиент и с помощью редактора клиента добавьте квест в следующие файлы .dat: "questname-ru.dat" и "QuestMarkConditionData.dat".# k; M2 s" M8 U% R) v2 p
, u' P# Z. F! }6 rСледующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов., v' x* b# h n) X' t
8 N9 C( p4 X& N# ?6 w0 YШаг 4: Найдите в серверных файлах файл с названием "NewQuestData.xml" и добавьте туда свой квест. : U j1 Y, n3 d 6 h% c' h4 Z) u1 x6 m5 b8 ?# I) fШаг 5: Найдите в клиенте следующие файлы и добавьте туда свой квест: "NewQuestData-ru.dat", "NewQuestDialog-ru.dat" и "NewQuestNpcPortrait.dat". * T; d5 F& ?! F5 C- V# U9 @- O- R0 b6 c8 v- u2 v X0 K7 k4 T
Если я что-то забыл, не стесняйтесь исправить меня. Это руководство создано исключительно в образовательных целях., Z! f" x$ {4 |0 G3 ?8 a
1 F, y1 z" V/ i, W5 q) f% ? Шаг 2:$ e' o% ]; A! t+ m# x# H
* t" Y7 G% Z+ I' L# Y8 p: z
Следующий шаг заключается в добавлении вашего квеста в QuestMasterHandler.java. Вот общий план: * q* x& W2 H! E2 ^) \ G% q- E' P1 ?, }4 s1. Импорт вашего квеста: В начале файла после всех существующих импортов добавьте строку, которая будет импортировать ваш квест. 9 a# T+ V7 k3 A: C6 EНапример:( y Z2 W2 f# v3 e9 @
( v# M5 C! u$ U+ @
import quests.<span style="background-color: rgb(255, 255, 255);">Q98765_NewQuest</span>.<span style="background-color: rgb(255, 255, 255);">Q98765_NewQuest</span>; $ d ^8 w) Y: L
Скопировать код
1. Регистрация квеста: Найдите метод, который отвечает за регистрацию всех квестов. Обычно это делается в статическом блоке или методе init, где происходит инициализация квестов. В этом блоке добавьте строку, которая будет регистрировать ваш квест: . x! E$ c, R; A7 u % M+ K/ I. \ K! z4 O! c
/**' I+ P, B+ ~: E! K& I$ b0 [
* @author NosBit ; l9 y# b# S( Y2 Y
*/ : l' z9 V S$ s8 v
public class QuestMasterHandler7 b( h1 O W o& l9 ]
{ : t5 s) }* _2 @/ Z/ G- O
private static final Logger LOGGER = Logger.getLogger(QuestMasterHandler.class.getName()); 6 c; y5 Y x+ P
3 g7 z% C2 e" H0 v& q1 R5 d
private static final Class<?>[] QUESTS =( l. B1 |, A5 M% ~2 Q2 l
{
Скопировать код
Проверка: Убедитесь, что идентификатор вашего квеста (в данном случае Q98765_NewQuest.class) уникален и не конфликтует с уже существующими квестами.& {$ w( I- `7 K! c
8 A9 N5 Z# E* [3 \ 8 y5 E8 q/ n/ j+ x7 V* j" cШаг 3: 1 e* L1 R# j J+ E ; q; Y- o& j6 F, hФайл QuestName-ru.dat используется для описания квестов и содержит различные параметры, которые задают характеристики квеста, его цели, награды, ограничения и т.д. - R+ A% Q9 y1 S+ t
Давайте разберем все поля на основе примера:1 h" k7 R* t" }3 K: `. `
$ D+ Y5 D6 \6 E: C: k" u0 W9 K" o
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 0 U7 `* K8 g* t, F
Скопировать код
Поля данных:
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 B3 C; `: b* x
# S6 A: C3 O* [ I. I' i: t' A3 y0 T1 ^2 O& \0 O+ B
Файл клиента QuestMarkConditionData.dat содержит информацию о квестах, связанных с условиями, необходимыми для активации или завершения определённых действий в игре. * x; S8 P; M2 O( z3 L# r3 O4 d, V+ N* lПример соодержания- T+ P8 r! i" Z) I6 {
Вот описание структуры строки:' @ l' m0 G6 M: d1 o
Давайте разберем все поля на основе примера: / X) k* W% x6 Y& q# y& p9 | 9 |! d$ n, Q- E, |* n
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: Указывает на конец записи о квесте.* q# q# R% L4 W9 U
Эта структура помогает клиенту определять условия, при которых игрок может начать или выполнить квест, а также идентифицировать необходимые взаимодействия с NPC.8 i/ j+ c9 t* _8 B9 w; \
/ o! Z- C6 e0 f3 m* X n; ?
, p+ b# k3 ?) P! u. t: B
, L# l. b6 F7 I z
Следующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов. 8 b! S3 g3 a8 I+ l ! }" P. W9 {+ D' s9 g9 S: F LШаг 41 ]2 Y! G) b/ Z: C. N
Для того чтобы добавить свой квест в файл NewQuestData.xml, нужно следовать структуре, аналогичной приведенному вами примеру. Вот как это может выглядеть: ' K5 W# _- J2 qПример добавления нового квеста:5 x$ n4 b9 L3 u# p' L0 ~8 C
<quest id="20001" type="1" name="Mystery of the Lost Relic" startNpcId="30050" endNpcId="30051"> 0 \0 [1 @* Z* k# n! L Z& E
<locations> ' R3 P% F: a/ b
<param name="startLocationId">2001</param> 3 |9 Y0 N0 }: i
<param name="endLocationId">2002</param>7 ?: L9 L" A9 D5 M/ C# V
<param name="goalItemCount">1</param>% C# C+ b) s: g+ }
</goals> & W; K$ ^" a' p4 y- j
</quest> " {+ q% V' }1 g5 J* R( A
Скопировать код
Описание структуры:! t/ }* t+ q( B9 A) G
quest: Основной элемент квеста, содержащий атрибуты:2 r# l' e/ q; U' Y" k+ l- g
id: ID квеста, уникальный для каждого квеста.
type: Тип квеста (1 – обычный квест).
name: Название квеста.
startNpcId: ID NPC, с которого начинается квест.
endNpcId: ID NPC, у которого квест заканчивается.1 `: C) Y% K! z+ }
locations: Указывает места начала, окончания и квестовой активности. ; t+ q5 M" X, p1 o4 ^7 ?' s& ?
startLocationId: ID места, где начинается квест.
endLocationId: ID места, где квест заканчивается.
questLocationId: ID квестовой зоны.0 g: L8 G2 x2 j6 }5 {0 ^: f' ^
conditions: Условия для начала квеста. 2 m9 B4 _/ B6 E M7 }0 L
preQuestId: ID предварительного квеста (если есть).
classIds: ID классов или рас, которым доступен квест.- H8 K3 r' B- \ ?
rewards: Награды за выполнение квеста. 8 P0 E+ a: ]' ~& i, u V. ], r
rewardLevel: Минимальный уровень для получения награды.
rewardSp: Количество опыта (SP).
rewardItemId: ID предмета (например, Adena).
rewardItemCount: Количество предметов.2 m1 R( w0 S+ U& M5 z) c5 Y
goals: Цели квеста.! y; K b( G5 C% H: p/ h8 P" a7 G+ P( e
goalCount: Количество монстров, которых нужно убить или предметов, которые нужно собрать.
goalString: Описание цели.
goalItemId: ID квестового предмета (если требуется).
goalItemCount: Количество квестовых предметов для завершения цели.+ @6 ~/ w' U. p3 {
После того как вы добавите квест в файл NewQuestData.xml, нужно перезапустить сервер, чтобы изменения вступили в силу. 8 d1 \4 D. D5 I/ V9 W* [# X 1 K; Y' n4 [1 @+ cШаг 5 " u0 E# l# X$ I# o: qФайл NewQuestDialog-ru.dat используется для хранения диалогов, связанных с квестом. Он определяет тексты, которые отображаются в окнах диалогов с NPC во время выполнения квеста. Вот разбор ключевых элементов строки и структура файла:5 j' h- n+ L+ w- s; O% r Структура данных
NewQuestDialog_begin — начало записи квеста в файле диалогов.
QuestId=10001 — идентификатор квеста (должен соответствовать ID, который ты используешь в других файлах).
Text0=... — первый диалог, который обычно отображается при старте квеста.
Text1=... — дополнительный текст, который отображается на различных этапах квеста.
Text2=... — текст, который отображается после выполнения определенных действий (например, после выполнения части задания).
Text3=... — дополнительный диалог, например, при встрече с NPC на следующем этапе квеста.
Text4=... — финальный текст или инструкции по следующему шагу для игрока.
NewQuestDialog_end — завершение записи для этого квеста. ( d1 p' K$ @$ p1 R% T4 s
- a/ i B7 g% t# i* Q Пример записи для нового квеста (ID 98765) Если ты хочешь создать диалоги для нового квеста с ID 98765, твой файл может выглядеть так:& G g: Z! R1 w I! L9 F2 c
NewQuestDialog_begin QuestId=98765 Text0=[Вы готовы принять новый вызов и доказать свою силу?] Text1=[Как вы себя чувствуете? Вы выглядите уверенно. Это хороший знак, но не расслабляйтесь — впереди много испытаний. Примите это задание, если готовы.] Text2=[Пора приступить к тренировкам. Идите за мной в тренировочную зону.] Text3=[Следуйте моим указаниям, и вы раскроете весь свой потенциал.] Text4=[Поговорите с Дарти. Кликните на него и начните диалог.] NewQuestDialog_end % A8 Y% j/ r% r* f. W
Скопировать код
Разъяснение полей:- O9 a% d0 E( d9 ]
QuestId=98765 — уникальный идентификатор нового квеста.
Text0 — вводный текст квеста. Отображается при первом контакте с NPC.
Text1 — дополнительный диалог, который дается игроку для создания контекста.
Text2 — текст, который отображается на следующем этапе квеста, например, после выполнения части задания.
Text3 — описание следующего шага или инструкции для игрока.
Text4 — финальный диалог или текст с указанием цели (встреча с другим NPC). + I$ T7 R. Y) p7 y9 S# B) O
; g9 J D# r9 _2 q4 q1 r- v5 M# F. }! j$ A
Что можно изменить:
Тексты диалогов (Text0, Text1 и так далее) можно адаптировать под конкретные ситуации в квесте.
Количество текстов можно варьировать в зависимости от сложности квеста. " J; x; ~" R4 y( J) ]* L& `" j; j: |
% q! K) S8 c( ?7 s$ @& n' dФайл NewQuestData-ru.dat содержит параметры, связанные с квестом в игре Lineage II, и описывает условия, NPC, цели и награды. Рассмотрим параметры этого файла:0 s3 _: D1 K* {+ {5 z. O- |
4 Q( F% V. ~: Y# @# u. m
newquestdata_begin / newquestdata_end: Эти параметры обозначают начало и конец блока данных квеста.
quest_id=10001: Уникальный идентификатор квеста (ID). В данном случае это квест с ID 10001.
quest_type=1: Тип квеста.+ A6 G: G$ L4 _7 o; u
1 обычно означает стандартный квест.: w' g0 o- H u: X" s' |
quest_name=[Новый путь]: Название квеста. Здесь указано "[Новый путь]" — это имя, отображаемое в игре.
quest_level={0;0}: Уровневые ограничения квеста. ! u8 P9 D' F+ }. g: j u9 R/ o% k
Первое значение указывает минимальный уровень, второе — максимальный уровень.
{0;0} означает, что нет ограничений по уровню. 1 g2 z" \& t! j% B1 V
pre_quest={}: Предварительный квест, который нужно выполнить перед началом этого квеста. " B8 W F( d& X( U0 \1 o
В данном случае он пустой {}, что означает, что нет предварительных требований.. l u4 s& z. v( P$ ~/ N
class={0;10;18;25;31;38;44;49;53;123;124}: Классы или расы, которые могут брать квест.5 t4 ~7 x7 ]% D0 s [5 Z
Номера классов указывают на те классы, которым доступен этот квест. В данном примере классы, такие как 0 (человеки), 10 (рыцари) и другие, имеют доступ.- j. |5 |, d0 D- B1 O* h5 U8 N3 z' _. h
quest_item=82948: ID квестового предмета, необходимого для выполнения цели или этапа квеста. $ v& |( w. c; |% y! k) i
В данном случае это предмет с ID 82948. 0 D& y( {5 d$ K- t/ r% D, I- Z
start_item=0: Предмет, который выдается при начале квеста. 9 d. Z/ A3 r6 \1 E; q% `
Значение 0 означает, что предмет не выдается.# {) r4 A( M, J
start_npc=34505: ID NPC, у которого начинается квест.
start_npc_loc=1002: Локация NPC, у которого начинается квест., y8 S- | Z! x* U5 F6 I; x
Это ID локации, где находится стартовый NPC. 7 ]6 u* _: ]. ~& y! j
end_npc=34696: ID NPC, у которого завершается квест.
end_npc_loc=1003: Локация NPC, у которого завершается квест. 5 X) Z& W8 v( X; D& X+ H5 {: v8 z
Это ID локации, где находится конечный NPC. $ D/ k( [; O: g4 |% h
quest_loc=1003: Основная локация выполнения квеста. 9 u( n* u6 N* u* H; M
Это ID зоны, где нужно выполнять основные задачи.2 X1 d- X. F* \7 g
goal_string=[Дарти (Зона Тренировки)]: Описание цели квеста./ J8 W0 A) Q. t1 H
В данном случае цель связана с персонажем по имени "Дарти" в Зоне Тренировки. , c k0 |$ K2 \2 Q2 Y3 S
goal_num=1: Количество действий, необходимых для выполнения цели (например, убийств монстров или сбора предметов)., y( A6 c% C$ V0 u# F
В данном случае нужно выполнить одно действие (1). 2 z5 A5 H+ c: b% v! x- ~+ w! _( Z
reward_level=65535: Уровень, при котором можно получить награду. 2 P% L5 m. k7 [6 Y( x* T
В данном случае это максимальное значение, указывающее, что награда доступна всегда. }* W) K0 v6 a( J1 h- x" e
reward_exp=0: Опыт (EXP), выдаваемый в качестве награды. ' R5 A8 l6 v5 X
В данном случае опыт не выдается.. x" o. t2 [# A. s
reward_sp=0: Количество SP (Skill Points), выдаваемых в качестве награды.9 N3 D- s/ R+ x/ q3 s+ F$ }9 S
Здесь тоже 0, значит, SP не выдаются., s: S0 y" H1 } _4 E