Название: Создание квестов L2j_Mobius [Версия для печати] Автор: admin Время: 2024-9-24 00:52 Название: Создание квестов L2j_Mobius Сборка: L2l_Monius $ D" z1 b! \# ~- {8 {, XСледующие квесты можно использовать в качестве шаблонов для создания практически любого простого квеста go kill или go talk. : E4 T, o+ g0 {3 [: H 4 S) } S" v. c: I2 E& n6 y) c- M' z4 ?0 F9 Q3 w! q
Иди и убей X монстров / Возвращение - награда.- V% I6 ?, {" b2 n& E F. V
Q00529_RegularBarrierMaintenance. I7 i9 p. t/ Q8 L& \, X
' f% n7 J ^9 CПолучите квест от любого из двух разных NPC / Убейте X монстров / Вернитесь с наградой. + ] y8 l8 \6 @Q00683_AdventOfKrofinSubspecies+ D6 k A M0 ~( ]' j0 [* s
2 ? p, r" z1 ^+ {1 Y3 `0 H! LУбейте X монстров, а также соберите X предметов / Возврат - награда. & [" O) g* Q2 u7 p( `& {Q10517_FafurionsMinions 1 Y4 W7 d# e+ `* p7 T2 Q& ?- K3 \! V/ C* S- W, h2 ~
Иди собери X капель монстров / Вернись - убей X монстров / Вернись - награда. 2 r: S0 i7 _( q) RQ10529_IvoryTowersResearchFloatingSeaJournal * o3 f. k) l, a ( I/ B$ ] e5 V$ YИди убей X монстров, а также собери X предметов / Возвращение - иди собери X предметов / Возвращение - награда. % q0 N! x# w$ S/ Z! Y, H* oQ10518_SucceedingThePriestess! I8 I# F8 u0 z+ m$ h: l( o
( D/ l$ P+ q3 z, N2 n$ _3 Z: d
Участвуйте в убийстве рейдбосса / Возврат - награда." C% Z; H4 o% T* C1 P
Q10519_контролирование вашей температуры0 ?/ Y& h8 l2 v4 Z0 g
# c7 p4 R, R) {4 ]Поговорите с NPC 1 / Примите участие в убийстве рейдбосса / Возвращение - награда. 0 C. F+ k7 L! Z Q7 f9 d% Q; U: ? WQ10533_OrfensAmbition9 U/ t& I$ G6 w
( r0 E$ N9 U5 s1 J9 X# R1 Z8 I |( t
- r6 D' @1 n" M- E$ V
9 F \: D. e, x( k$ m Руководство требует обновления. И, к сожалению, с самыми последними хрониками вы не сможете избежать модификаций клиента. Поэтому, исключительно в образовательных целях, я предлагаю свой опыт по добавлению нового квеста! % h: z- D) E% m9 F 8 y, ?6 Y- e+ zШаг 1: Создайте свой квест с уникальным ID. В этом примере я буду ссылаться на квест как "Q98765_NewQuest". ( ?9 K* p" a. e$ u - C7 C# Y$ e( J: B9 {! F( g2 W+ w7 tШаг 2: Когда вы успешно создали свой квест и Eclipse не выдает ошибок, добавьте название квеста и импортируйте его в файл "QuestMasterHandler.java". 6 e$ w' x+ d: f " t' g2 a7 L3 g" c3 [( iШаг 3: Перейдите в клиент и с помощью редактора клиента добавьте квест в следующие файлы .dat: "questname-ru.dat" и "QuestMarkConditionData.dat". ^/ O0 }2 n* T# j" \
6 t/ H& b4 _) C# KСледующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов.% w' Q- X# d" Y. i* x8 G
+ i& \. }* {" s: G5 }Шаг 4: Найдите в серверных файлах файл с названием "NewQuestData.xml" и добавьте туда свой квест. $ I- M( q2 U m0 ^+ P4 I0 \ " I" i# o7 E3 ^. _& ]Шаг 5: Найдите в клиенте следующие файлы и добавьте туда свой квест: "NewQuestData-ru.dat", "NewQuestDialog-ru.dat" и "NewQuestNpcPortrait.dat".; x( X6 N0 ?! ]- \
2 r4 @; w2 h( A7 r' W& sЕсли я что-то забыл, не стесняйтесь исправить меня. Это руководство создано исключительно в образовательных целях. l, W# i5 @$ p2 q
- H6 o1 G6 \2 E [Шаг 2: % S0 Y$ _7 f W) { : K" V5 J: U uСледующий шаг заключается в добавлении вашего квеста в QuestMasterHandler.java. Вот общий план: . k1 l# E2 J; D5 G& B3 x0 }/ d9 ^% P7 g+ C1 G! { 1. Импорт вашего квеста: В начале файла после всех существующих импортов добавьте строку, которая будет импортировать ваш квест. # p4 I( b/ j0 e6 ~5 SНапример: , [/ o$ P9 w S/ Z' h0 p4 |, x3 U$ X7 n$ M L2 K3 l8 W
1. Регистрация квеста: Найдите метод, который отвечает за регистрацию всех квестов. Обычно это делается в статическом блоке или методе init, где происходит инициализация квестов. В этом блоке добавьте строку, которая будет регистрировать ваш квест: U3 C2 v/ U. [; X! v: `% X 4 T6 Z: x) T Q( |
/**6 e B) A0 _+ j+ M' j
* @author NosBit$ V, L! b2 a# Y( l4 D
*/ ( E+ l$ g/ f4 ^2 r. B* l
public class QuestMasterHandler $ ]* H! }1 |5 A
{* H9 F( c9 \, j5 I4 ~
private static final Logger LOGGER = Logger.getLogger(QuestMasterHandler.class.getName());9 ~+ C& Y* t' R- l# x. J' e
; D" r/ ^+ L3 J( V- O6 N. L
private static final Class<?>[] QUESTS = u; Q7 U& e5 v* U+ O7 s Z
{
Скопировать код
Проверка: Убедитесь, что идентификатор вашего квеста (в данном случае Q98765_NewQuest.class) уникален и не конфликтует с уже существующими квестами. $ n2 V8 T/ G+ S# P9 E8 f7 k# `6 E/ [& q
) d2 m8 i L) N2 r! [3 o! Y H/ P Шаг 3: : {7 t0 Z$ {' A1 v7 J 6 W$ ~& O9 K6 X H( \) Z& XФайл QuestName-ru.dat используется для описания квестов и содержит различные параметры, которые задают характеристики квеста, его цели, награды, ограничения и т.д. 5 W, f" _. T2 G* W/ c; AДавайте разберем все поля на основе примера: - [+ K( s" f4 o6 J# H, T3 q 8 c0 D, d% U$ x4 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) Y5 a( N. f! S4 u! r( X
Скопировать код
Поля данных:
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 — завершение записи для квеста. : a# C; u; p7 x4 V8 W% h( {
" g& I9 F& G2 p6 N( Z- t
2 |2 ^3 C& r6 L% SФайл клиента QuestMarkConditionData.dat содержит информацию о квестах, связанных с условиями, необходимыми для активации или завершения определённых действий в игре. ! V. m& P4 G, I% j$ G3 L
Пример соодержания 7 m9 J& V* L9 J. S0 ]1 R$ ?: PВот описание структуры строки: 4 S6 Y6 z% J# W+ v. p, t b3 M
Давайте разберем все поля на основе примера:" ^6 \! a- u( k' U
4 u% z& j- G% r- |; l
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: Указывает на конец записи о квесте. S' Y0 { d2 |, w9 q {
Эта структура помогает клиенту определять условия, при которых игрок может начать или выполнить квест, а также идентифицировать необходимые взаимодействия с NPC. . f3 X3 h( o- [# t* y A1 L8 l, I) P" H) u7 r& J5 ?: a e5 D3 S
; F' I' |3 {) K. C
Следующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов.2 m: c j6 C9 M: o
. \3 Q7 z! q& OШаг 4 9 y- B0 b& D, iДля того чтобы добавить свой квест в файл NewQuestData.xml, нужно следовать структуре, аналогичной приведенному вами примеру. Вот как это может выглядеть: / J6 a! C; J7 l- L# k: y$ tПример добавления нового квеста:" S0 e/ u' ^- ?$ {1 F$ Z: S% f5 Y
<quest id="20001" type="1" name="Mystery of the Lost Relic" startNpcId="30050" endNpcId="30051"> 8 o3 l" B% p3 U' d( b
<locations> & L& n: o6 i( z" z; A# X( \; C/ K
<param name="startLocationId">2001</param>* A, O7 _# T* @4 {$ I5 B0 \0 m: N
<param name="endLocationId">2002</param> . p% c( Z6 q9 C! H
<param name="questLocationId">2003</param> 6 d) M y0 f$ Y6 Q* t1 W
</locations> 2 e v) u. {# ^
<conditions>$ h, l4 r2 z/ D3 z9 \
<param name="preQuestId">20000</param>- R3 F2 r Y0 f2 Z5 M
<param name="classIds">0;1;2;3;4;5;6</param> <!-- доступ для всех рас --> 6 ~$ P3 f+ e9 z) l0 v4 i+ J
</conditions> , c! Y7 Q* q; G ~; K3 p
<rewards># N% ^" q% F2 x* k2 O. \! w, ^1 w
<param name="rewardLevel">50</param> % ` c1 S% |+ e, i
quest: Основной элемент квеста, содержащий атрибуты:; U2 X" L4 o# Z9 }
id: ID квеста, уникальный для каждого квеста.
type: Тип квеста (1 – обычный квест).
name: Название квеста.
startNpcId: ID NPC, с которого начинается квест.
endNpcId: ID NPC, у которого квест заканчивается.2 y9 r; H0 Q, Y3 h: L% u5 v- R
locations: Указывает места начала, окончания и квестовой активности.- X- O- }9 p. d5 R- S3 ~
startLocationId: ID места, где начинается квест.
endLocationId: ID места, где квест заканчивается.
questLocationId: ID квестовой зоны.& {- N$ u* S4 b* s7 _+ A
conditions: Условия для начала квеста.1 i. }' Z( B, P- V G$ a
preQuestId: ID предварительного квеста (если есть).
classIds: ID классов или рас, которым доступен квест. 5 Y g& h* P: v, j1 H( ^% Q. u
rewards: Награды за выполнение квеста.- ^& A$ h% X- E3 ?8 ` R
rewardLevel: Минимальный уровень для получения награды.
rewardSp: Количество опыта (SP).
rewardItemId: ID предмета (например, Adena).
rewardItemCount: Количество предметов. 2 O0 `; J \3 H' w
goals: Цели квеста.8 X$ h- a1 Z- L
goalCount: Количество монстров, которых нужно убить или предметов, которые нужно собрать.
goalString: Описание цели.
goalItemId: ID квестового предмета (если требуется).
goalItemCount: Количество квестовых предметов для завершения цели. 8 n. z5 o+ `. F) [4 _
После того как вы добавите квест в файл NewQuestData.xml, нужно перезапустить сервер, чтобы изменения вступили в силу.: K- ^8 Y1 I% T2 ?0 q
- z3 A/ N: p# W+ X c/ FШаг 5/ i3 S9 M4 T9 C& D* b
Файл NewQuestDialog-ru.dat используется для хранения диалогов, связанных с квестом. Он определяет тексты, которые отображаются в окнах диалогов с NPC во время выполнения квеста. Вот разбор ключевых элементов строки и структура файла: , y( I1 s) u z" X4 y4 `. L9 \Структура данных
NewQuestDialog_begin — начало записи квеста в файле диалогов.
QuestId=10001 — идентификатор квеста (должен соответствовать ID, который ты используешь в других файлах).
Text0=... — первый диалог, который обычно отображается при старте квеста.
Text1=... — дополнительный текст, который отображается на различных этапах квеста.
Text2=... — текст, который отображается после выполнения определенных действий (например, после выполнения части задания).
Text3=... — дополнительный диалог, например, при встрече с NPC на следующем этапе квеста.
Text4=... — финальный текст или инструкции по следующему шагу для игрока.
NewQuestDialog_end — завершение записи для этого квеста.$ O/ a% H, P2 |. [; Z: u/ r
1 b+ K% {: r+ AПример записи для нового квеста (ID 98765) Если ты хочешь создать диалоги для нового квеста с ID 98765, твой файл может выглядеть так: * f+ t* Z" H7 J! r5 |4 ~, T/ h, Q! v
NewQuestDialog_begin QuestId=98765 Text0=[Вы готовы принять новый вызов и доказать свою силу?] Text1=[Как вы себя чувствуете? Вы выглядите уверенно. Это хороший знак, но не расслабляйтесь — впереди много испытаний. Примите это задание, если готовы.] Text2=[Пора приступить к тренировкам. Идите за мной в тренировочную зону.] Text3=[Следуйте моим указаниям, и вы раскроете весь свой потенциал.] Text4=[Поговорите с Дарти. Кликните на него и начните диалог.] NewQuestDialog_end 0 P$ I& s) [2 j" M0 c
Скопировать код
Разъяснение полей:9 f/ n# t8 N! c3 ^ {* u z9 \. R
QuestId=98765 — уникальный идентификатор нового квеста.
Text0 — вводный текст квеста. Отображается при первом контакте с NPC.
Text1 — дополнительный диалог, который дается игроку для создания контекста.
Text2 — текст, который отображается на следующем этапе квеста, например, после выполнения части задания.
Text3 — описание следующего шага или инструкции для игрока.
Text4 — финальный диалог или текст с указанием цели (встреча с другим NPC).8 y$ N% B+ |& m) i) y+ x0 L
" x! V r4 E: [3 d, i! F. m8 S9 x: O4 v1 ~- {6 l
Что можно изменить:
Тексты диалогов (Text0, Text1 и так далее) можно адаптировать под конкретные ситуации в квесте.
Количество текстов можно варьировать в зависимости от сложности квеста.- J4 m5 t* m' m4 V! w3 M
3 ]% ?2 q4 Q9 A- @8 Z* mФайл NewQuestData-ru.dat содержит параметры, связанные с квестом в игре Lineage II, и описывает условия, NPC, цели и награды. Рассмотрим параметры этого файла:' t/ `1 O( J3 m* H7 a
" s v3 m0 P! n/ _$ G+ M
newquestdata_begin / newquestdata_end: Эти параметры обозначают начало и конец блока данных квеста.
quest_id=10001: Уникальный идентификатор квеста (ID). В данном случае это квест с ID 10001.
quest_type=1: Тип квеста.9 w& D! f5 I1 Q$ [( A0 h
1 обычно означает стандартный квест.& R/ n7 D: G( m
quest_name=[Новый путь]: Название квеста. Здесь указано "[Новый путь]" — это имя, отображаемое в игре.
quest_level={0;0}: Уровневые ограничения квеста. " V; F2 S/ ?) O
Первое значение указывает минимальный уровень, второе — максимальный уровень.
{0;0} означает, что нет ограничений по уровню. ) k1 B. G( {* |" V8 G# q% o u
pre_quest={}: Предварительный квест, который нужно выполнить перед началом этого квеста.* I- v5 w4 M( l
В данном случае он пустой {}, что означает, что нет предварительных требований. W" _) O9 [2 v0 I8 b+ U9 W6 Z
class={0;10;18;25;31;38;44;49;53;123;124}: Классы или расы, которые могут брать квест. + _: i w: }0 B& @/ }
Номера классов указывают на те классы, которым доступен этот квест. В данном примере классы, такие как 0 (человеки), 10 (рыцари) и другие, имеют доступ. - C$ Y k: n( `3 z& J
quest_item=82948: ID квестового предмета, необходимого для выполнения цели или этапа квеста. 4 ?& J- r9 ^, r- T$ ?7 m
В данном случае это предмет с ID 82948.- n( ^( B) i. k0 {/ U; {: S
start_item=0: Предмет, который выдается при начале квеста.; [2 p& w, T0 Z7 n' @ \7 W4 v5 a$ T
Значение 0 означает, что предмет не выдается." I; n. B+ D' r# e
start_npc=34505: ID NPC, у которого начинается квест.
start_npc_loc=1002: Локация NPC, у которого начинается квест. 2 h' L5 E8 F2 e, B/ t( m
Это ID локации, где находится стартовый NPC.. F, D# f& i- [1 ? k
end_npc=34696: ID NPC, у которого завершается квест.
end_npc_loc=1003: Локация NPC, у которого завершается квест. 0 @2 U* I7 g; N# G) U7 q2 _9 @; R
Это ID локации, где находится конечный NPC.. L* |# A9 q; H1 q% n& s4 }# v
quest_loc=1003: Основная локация выполнения квеста. 0 W. C+ L7 g& j) K0 ~# k
Это ID зоны, где нужно выполнять основные задачи. % z5 r7 _5 M5 n$ N
goal_string=[Дарти (Зона Тренировки)]: Описание цели квеста.* {+ u# |- s) O2 ?# K a9 V
В данном случае цель связана с персонажем по имени "Дарти" в Зоне Тренировки.5 z( u' b$ O; ?' e/ v
goal_num=1: Количество действий, необходимых для выполнения цели (например, убийств монстров или сбора предметов).6 F/ v8 Y. g1 s9 d$ c; x
В данном случае нужно выполнить одно действие (1). & g$ v+ ?% p, z7 a# k
reward_level=65535: Уровень, при котором можно получить награду. # S3 D, o8 w, h: D/ d9 c! x
В данном случае это максимальное значение, указывающее, что награда доступна всегда.4 F, J Z% v9 R; e' w! O
reward_exp=0: Опыт (EXP), выдаваемый в качестве награды. * S- D: U4 A* B& E6 E2 ^
В данном случае опыт не выдается. " j5 f+ v; ]" u$ e4 a) B. W* Y8 u
reward_sp=0: Количество SP (Skill Points), выдаваемых в качестве награды. c8 O/ R) |: }2 Q7 s% {2 L' h
Здесь тоже 0, значит, SP не выдаются. $ C7 A* R) V2 w1 o& r
В данном случае наградные предметы отсутствуют.$ A3 `( W! m: V8 T; ~# G
Этот файл определяет основной функционал и настройки для конкретного квеста в игре. * G5 U5 k% H2 W% \* D , G$ W, k/ N. G( U8 a; n( q- h8 _: W5 E
! |6 P! u) d& b8 j/ L% Z
) i O. z0 Z. y) D) v, a" w B2 j
6 T$ I5 }% t( o! {
/ c3 \% l( }, @* R. F
% y* e' F; ^4 @! x' a3 B 9 `) A+ L1 b% O, M( E8 J% g. k+ i \# Y
$ L9 J$ b+ W0 ^- o
Добро пожаловать artace.ru - творческий сектор (https://www.artace.ru/)