Название: Создание квестов L2j_Mobius [Версия для печати] Автор: admin Время: 2024-9-24 00:52 Название: Создание квестов L2j_Mobius Сборка: L2l_Monius ! M9 c1 h) V$ `3 N! M$ a/ A( X) _
Следующие квесты можно использовать в качестве шаблонов для создания практически любого простого квеста go kill или go talk. \3 {3 x) n8 ]3 H 7 o/ L: X) k8 R6 P9 ] + Y3 |* D8 \. c- S, d( HИди и убей X монстров / Возвращение - награда.6 K$ l" B8 Z# A4 P, j2 E
Q00529_RegularBarrierMaintenance 5 X9 `% m! I2 w" g$ A! v+ C8 h' l$ l* z
Получите квест от любого из двух разных NPC / Убейте X монстров / Вернитесь с наградой.; v0 \0 ~- {+ H1 D
Q00683_AdventOfKrofinSubspecies9 S$ R7 q9 | g; N: ^7 M: o3 f
7 U" u, Q( D% N! q: q
Поговори с NPC 1 / Поговори с NPC 2 / Поговори с завершающим NPC / Награда. ) p8 I3 h+ N6 H- bQ10516_UnveiledFafurionTemple+ ^$ N! i: p) r3 m+ \
$ F2 B( P+ R& u+ i7 G1 hУбейте X монстров, а также соберите X предметов / Возврат - награда.9 }/ c$ H* L% L- u% t5 T
Q10517_FafurionsMinions/ _* {8 ~& f. m+ `$ ^$ w0 X+ ^
. \ q+ J6 p1 _1 F- I0 y
Иди собери X капель монстров / Вернись - убей X монстров / Вернись - награда. 8 D4 `9 i) u2 m1 OQ10529_IvoryTowersResearchFloatingSeaJournal% d; [# a3 _$ _
/ h( O6 ~) q; }2 a+ I* b; pИди убей X монстров, а также собери X предметов / Возвращение - иди собери X предметов / Возвращение - награда. ' G+ o) x$ u& iQ10518_SucceedingThePriestess 7 S7 E/ |) S+ D- x" `$ n* e; U. Z! Y) y. H1 ]1 a( Y1 c g
Участвуйте в убийстве рейдбосса / Возврат - награда.: O! l+ f9 o1 }& x3 A1 s
Q10519_контролирование вашей температуры $ U% H" E. J% |# Y7 _& N# p, _, {. y* a. v/ V) p
Поговорите с NPC 1 / Примите участие в убийстве рейдбосса / Возвращение - награда. : z4 o1 ~' [" i3 `. zQ10533_OrfensAmbition 2 r/ p, {! [( ~2 a2 k! s' i; i4 y+ g1 I& m) ]1 X
' M$ F/ y! U2 ~0 c- B1 V" J* C
% G' N+ x Q, C/ c0 BРуководство требует обновления. И, к сожалению, с самыми последними хрониками вы не сможете избежать модификаций клиента. Поэтому, исключительно в образовательных целях, я предлагаю свой опыт по добавлению нового квеста!3 @& `2 g9 R$ N0 {8 b 8 O1 w% d% s6 b
Шаг 1: Создайте свой квест с уникальным ID. В этом примере я буду ссылаться на квест как "Q98765_NewQuest".* R: x! ]- D- Z/ g$ U' `
) K$ m8 l( a' h* }Шаг 2: Когда вы успешно создали свой квест и Eclipse не выдает ошибок, добавьте название квеста и импортируйте его в файл "QuestMasterHandler.java". 8 r- P- |3 [, o ! V" V8 t/ F6 |$ HШаг 3: Перейдите в клиент и с помощью редактора клиента добавьте квест в следующие файлы .dat: "questname-ru.dat" и "QuestMarkConditionData.dat".: u( N0 ^! V6 W% S5 @. s2 q0 t
! s& v; u# q8 Y' Z
Следующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов. , P( m3 P A q% j1 H; G % E+ E/ U T& |4 P( [1 m7 b- QШаг 4: Найдите в серверных файлах файл с названием "NewQuestData.xml" и добавьте туда свой квест. ; D6 ]8 J5 y3 i3 w7 D# W! @2 M m" R/ D7 m6 X; _& B5 N* f- P, aШаг 5: Найдите в клиенте следующие файлы и добавьте туда свой квест: "NewQuestData-ru.dat", "NewQuestDialog-ru.dat" и "NewQuestNpcPortrait.dat". 9 x/ w1 C* w' T' t J" ?( L* U" ~$ Z9 U9 e; F' _# [ y" M
Если я что-то забыл, не стесняйтесь исправить меня. Это руководство создано исключительно в образовательных целях.- B+ |3 s) D5 R
9 q% b' R% ^4 K6 W* rШаг 2: 4 E, l8 p% G: i# h( i % C/ M! A6 G+ g- H: ?5 [Следующий шаг заключается в добавлении вашего квеста в QuestMasterHandler.java. Вот общий план: ) k7 a; t6 Z- n V" h* Y 5 [, M# Y3 J: g1 @1. Импорт вашего квеста: В начале файла после всех существующих импортов добавьте строку, которая будет импортировать ваш квест. * S& Q( s: k. n0 k+ \
Например:( C" v' G2 L. G: Y# G1 S1 m, d# z
" J$ z3 T& k- [) M7 c( D* L3 _2 ~
import quests.<span style="background-color: rgb(255, 255, 255);">Q98765_NewQuest</span>.<span style="background-color: rgb(255, 255, 255);">Q98765_NewQuest</span>; 4 a) b2 S* s3 {* w
Скопировать код
1. Регистрация квеста: Найдите метод, который отвечает за регистрацию всех квестов. Обычно это делается в статическом блоке или методе init, где происходит инициализация квестов. В этом блоке добавьте строку, которая будет регистрировать ваш квест: 5 v6 t6 c" E- G! N& g! ?0 f9 Y0 d; R; J$ F P4 G/ C; u
/** 0 a+ G9 C7 J0 }9 S- U, T2 Y
* @author NosBit + Z+ v% ]; b# k) Z5 I K' z* A
*/ - ^! j; c" n% t/ \/ g$ d' J) z
public class QuestMasterHandler & O8 D5 P: g6 R9 _; G0 B: @( w
{ ) _* x- t* Y7 t; I% \+ n9 y
private static final Logger LOGGER = Logger.getLogger(QuestMasterHandler.class.getName());! M2 o$ c8 {+ U L" O! L0 r
+ m: u/ a9 E o. C0 _1 v* j
private static final Class<?>[] QUESTS =3 i0 R" T3 `! U: s1 e
{
Скопировать код
Проверка: Убедитесь, что идентификатор вашего квеста (в данном случае Q98765_NewQuest.class) уникален и не конфликтует с уже существующими квестами. 9 M# n j2 D9 K5 Y8 W ) F0 S# H" V$ E+ V* W) a+ \# g8 V& p3 R8 w( ^! L' k Шаг 3: 9 e0 o* A* T+ ^1 o5 Y 5 D/ ?5 H5 i! b$ z9 P5 v2 hФайл QuestName-ru.dat используется для описания квестов и содержит различные параметры, которые задают характеристики квеста, его цели, награды, ограничения и т.д. ( g3 E: N7 I. q* j2 k
Давайте разберем все поля на основе примера:& A8 j* E( J3 j/ \7 b8 x2 h# @+ e
# W7 ?6 m+ b0 ~
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 % M' n! o `, b
Скопировать код
Поля данных:
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 — завершение записи для квеста./ x( T& e# U5 v% X" n% Y2 {
8 V5 A; }/ U: z, [" D$ s/ [% P
6 X5 V% E; i' |% e; BФайл клиента QuestMarkConditionData.dat содержит информацию о квестах, связанных с условиями, необходимыми для активации или завершения определённых действий в игре. 5 L3 q' Q" n9 M. q2 Y) G) I2 a" O
Пример соодержания , b+ X6 q. H( H2 ]! A& ~Вот описание структуры строки: ) b) |' p! Q) t1 U- m
Давайте разберем все поля на основе примера:$ a7 w7 U$ K% ?: N3 s0 M
: K% N' R( }. ~3 v/ `
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: Указывает на конец записи о квесте.: {. L- {6 O" K+ Y
Эта структура помогает клиенту определять условия, при которых игрок может начать или выполнить квест, а также идентифицировать необходимые взаимодействия с NPC. F+ E* L# J+ r* ]8 m: t5 Q/ y3 V% g3 k9 s: W1 J- U8 A- E s
1 ?6 t( d8 p7 W- e b/ S
" ]0 m0 |" ]+ E v& @& |% ?: RСледующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов. " ]6 [5 `& _. b$ X3 E - Z2 |, i( ?/ R2 y2 f5 LШаг 4$ D5 ?0 T0 ]& k/ O
Для того чтобы добавить свой квест в файл NewQuestData.xml, нужно следовать структуре, аналогичной приведенному вами примеру. Вот как это может выглядеть:4 x* a. B. B' m/ L% T& m; z0 ]
Пример добавления нового квеста: ) b2 e7 q9 x4 R; p O
<quest id="20001" type="1" name="Mystery of the Lost Relic" startNpcId="30050" endNpcId="30051"> 7 w3 h g- z+ E3 n9 y! b
quest: Основной элемент квеста, содержащий атрибуты:, K- Q* }2 o2 b) l4 L# z
id: ID квеста, уникальный для каждого квеста.
type: Тип квеста (1 – обычный квест).
name: Название квеста.
startNpcId: ID NPC, с которого начинается квест.
endNpcId: ID NPC, у которого квест заканчивается. 8 B" B( A8 `' g) n$ n
locations: Указывает места начала, окончания и квестовой активности.& Q7 C* \# W" l# z8 o
startLocationId: ID места, где начинается квест.
endLocationId: ID места, где квест заканчивается.
questLocationId: ID квестовой зоны. & c; c* A+ v8 R9 P, Z" q# I5 d
conditions: Условия для начала квеста. $ w( r' y+ _! c5 \) f2 t
preQuestId: ID предварительного квеста (если есть).
classIds: ID классов или рас, которым доступен квест.5 L! D1 o) t+ t; H! \
rewards: Награды за выполнение квеста. & b1 n; Z* G2 F y7 F' y+ v- M d
rewardLevel: Минимальный уровень для получения награды.
rewardSp: Количество опыта (SP).
rewardItemId: ID предмета (например, Adena).
rewardItemCount: Количество предметов. " L. t: |6 Y6 }6 ~" W# P# u
goals: Цели квеста. & Q1 e6 c T5 N/ F
goalCount: Количество монстров, которых нужно убить или предметов, которые нужно собрать.
goalString: Описание цели.
goalItemId: ID квестового предмета (если требуется).
goalItemCount: Количество квестовых предметов для завершения цели. 8 }; q% O+ @) \0 Y! x
После того как вы добавите квест в файл NewQuestData.xml, нужно перезапустить сервер, чтобы изменения вступили в силу.: b# ^4 `1 D% G) e' z. b5 s
: G: u8 h) G; a4 h Шаг 5, F0 `, I7 {8 `- g E
Файл NewQuestDialog-ru.dat используется для хранения диалогов, связанных с квестом. Он определяет тексты, которые отображаются в окнах диалогов с NPC во время выполнения квеста. Вот разбор ключевых элементов строки и структура файла: * U- W# \+ C3 c, o% ~Структура данных
NewQuestDialog_begin — начало записи квеста в файле диалогов.
QuestId=10001 — идентификатор квеста (должен соответствовать ID, который ты используешь в других файлах).
Text0=... — первый диалог, который обычно отображается при старте квеста.
Text1=... — дополнительный текст, который отображается на различных этапах квеста.
Text2=... — текст, который отображается после выполнения определенных действий (например, после выполнения части задания).
Text3=... — дополнительный диалог, например, при встрече с NPC на следующем этапе квеста.
Text4=... — финальный текст или инструкции по следующему шагу для игрока.
NewQuestDialog_end — завершение записи для этого квеста. / w: \/ R2 J4 Y9 ~
3 c7 M+ g. B8 k5 eПример записи для нового квеста (ID 98765) Если ты хочешь создать диалоги для нового квеста с ID 98765, твой файл может выглядеть так:& ^; c# d+ V# p' r S1 d/ B' L
NewQuestDialog_begin QuestId=98765 Text0=[Вы готовы принять новый вызов и доказать свою силу?] Text1=[Как вы себя чувствуете? Вы выглядите уверенно. Это хороший знак, но не расслабляйтесь — впереди много испытаний. Примите это задание, если готовы.] Text2=[Пора приступить к тренировкам. Идите за мной в тренировочную зону.] Text3=[Следуйте моим указаниям, и вы раскроете весь свой потенциал.] Text4=[Поговорите с Дарти. Кликните на него и начните диалог.] NewQuestDialog_end/ q2 ?. v( p8 X8 A' Y
Скопировать код
Разъяснение полей: , k: k3 R: D& G) b% j
QuestId=98765 — уникальный идентификатор нового квеста.
Text0 — вводный текст квеста. Отображается при первом контакте с NPC.
Text1 — дополнительный диалог, который дается игроку для создания контекста.
Text2 — текст, который отображается на следующем этапе квеста, например, после выполнения части задания.
Text3 — описание следующего шага или инструкции для игрока.
Text4 — финальный диалог или текст с указанием цели (встреча с другим NPC). 8 Z) p" ~8 X4 I# L
1 j# E0 p; g9 m8 `% a& I, f1 _. r+ G) e
Что можно изменить:
Тексты диалогов (Text0, Text1 и так далее) можно адаптировать под конкретные ситуации в квесте.
Количество текстов можно варьировать в зависимости от сложности квеста.. [/ X. ~& i/ O
" \1 H: F# {& R2 p2 PФайл NewQuestData-ru.dat содержит параметры, связанные с квестом в игре Lineage II, и описывает условия, NPC, цели и награды. Рассмотрим параметры этого файла:0 r6 \8 n! T j# z0 l. ^* V, U
7 v4 B* G6 b8 l( `6 b% n
newquestdata_begin / newquestdata_end: Эти параметры обозначают начало и конец блока данных квеста.
quest_id=10001: Уникальный идентификатор квеста (ID). В данном случае это квест с ID 10001.
quest_type=1: Тип квеста.7 [# c4 [& l& A8 J6 D
1 обычно означает стандартный квест.: n6 T1 e6 L( H Y, q: P6 S
quest_name=[Новый путь]: Название квеста. Здесь указано "[Новый путь]" — это имя, отображаемое в игре.
quest_level={0;0}: Уровневые ограничения квеста. 9 j! a/ p; i. n& |4 Q! g7 n
Первое значение указывает минимальный уровень, второе — максимальный уровень.
{0;0} означает, что нет ограничений по уровню. ) d9 [4 H7 h* z9 L2 Q( E, m+ T
pre_quest={}: Предварительный квест, который нужно выполнить перед началом этого квеста.* A2 ?! b, m, Q" A* P
В данном случае он пустой {}, что означает, что нет предварительных требований.2 _4 z( S ~( H0 A! N ?% ]0 y( Q
class={0;10;18;25;31;38;44;49;53;123;124}: Классы или расы, которые могут брать квест. 4 E6 U3 K# \, n8 o2 |
Номера классов указывают на те классы, которым доступен этот квест. В данном примере классы, такие как 0 (человеки), 10 (рыцари) и другие, имеют доступ.' t" C8 S3 }. p' N
quest_item=82948: ID квестового предмета, необходимого для выполнения цели или этапа квеста./ q8 I/ Q% [4 g7 c) `
В данном случае это предмет с ID 82948. 3 f D1 I; l" _- t5 c |
start_item=0: Предмет, который выдается при начале квеста. % p% i) v/ H* u5 @6 I, E; @; ~# k
Значение 0 означает, что предмет не выдается. % N* C# e# C7 l. t3 Z& O; V, ?* N5 F
start_npc=34505: ID NPC, у которого начинается квест.
start_npc_loc=1002: Локация NPC, у которого начинается квест.9 Z! Z2 q1 l ?5 B8 I4 x" G) K
Это ID локации, где находится стартовый NPC.: V' n, n$ E( I% H/ N {
end_npc=34696: ID NPC, у которого завершается квест.
end_npc_loc=1003: Локация NPC, у которого завершается квест. 9 r2 [) ^& w* R' {* o P. [9 D
Это ID локации, где находится конечный NPC.* R* X4 n6 R, A: q# I! k' g% Y
quest_loc=1003: Основная локация выполнения квеста. 7 K* r z8 Q" t4 z' S8 W
Это ID зоны, где нужно выполнять основные задачи. 0 T; K: ?' X' q5 Y4 u L3 `
goal_string=[Дарти (Зона Тренировки)]: Описание цели квеста.0 o- L1 v, u: V5 G0 R, Y
В данном случае цель связана с персонажем по имени "Дарти" в Зоне Тренировки.: f/ m( X% n/ B+ ]5 z6 Y5 S
goal_num=1: Количество действий, необходимых для выполнения цели (например, убийств монстров или сбора предметов). 1 | ?' X4 m4 e* o9 w6 D
В данном случае нужно выполнить одно действие (1). 9 A( @+ g5 _: q# U* F2 E0 V: Z; I
reward_level=65535: Уровень, при котором можно получить награду.4 K5 J! ]5 A( x! p: x. M) |9 |
В данном случае это максимальное значение, указывающее, что награда доступна всегда. 0 d# m; u' i2 y6 R' E- m
reward_exp=0: Опыт (EXP), выдаваемый в качестве награды. 3 n% v. E: q0 r8 N# f# n P
В данном случае опыт не выдается.) A+ I* u" I3 e" H3 r1 `& L! n: u z
reward_sp=0: Количество SP (Skill Points), выдаваемых в качестве награды. ! u+ v7 @- H8 R& W! F1 x9 p
Здесь тоже 0, значит, SP не выдаются.$ i# w( }& Q ~+ s/ Q
reward_item={}: Наградные предметы., P% V4 T% r- ~) x
В данном случае наградные предметы отсутствуют.0 G3 Y1 b& J$ g/ L9 u0 M
Этот файл определяет основной функционал и настройки для конкретного квеста в игре.# x7 ^/ \3 g- l% m( J/ U# |0 L
" E$ O4 ?' o/ a% X
- |. g0 v. L, V6 P6 S- d p) `% d: ^1 s
( q- F3 d; D; o$ S4 d