Название: Создание квестов L2j_Mobius [Версия для печати] Автор: admin Время: 2024-9-24 00:52 Название: Создание квестов L2j_Mobius Сборка: L2l_Monius , `2 z1 _2 ~) [' i. T7 J2 {
Следующие квесты можно использовать в качестве шаблонов для создания практически любого простого квеста go kill или go talk.3 m, g6 h) Y7 U; w$ R: @
1 K$ N& v: ^( g" A# W3 \
! V# C1 |. I& z1 A' D
Иди и убей X монстров / Возвращение - награда. 1 r* S: ?2 o& t( z2 |6 j8 cQ00529_RegularBarrierMaintenance X1 o2 U+ z1 K# | . k5 d; }* D f8 ]Получите квест от любого из двух разных NPC / Убейте X монстров / Вернитесь с наградой.. n/ X1 d$ ~& G# f3 c# Y4 H
Q00683_AdventOfKrofinSubspecies0 Q* P1 Z/ h8 ~) g! d
; X D0 }8 P; c! E
Поговори с NPC 1 / Поговори с NPC 2 / Поговори с завершающим NPC / Награда. % ~' {) G( h, S: {Q10516_UnveiledFafurionTemple 7 t3 W3 ^! Q4 I8 L6 W4 H6 M5 b" R3 g9 s; i
Убейте X монстров, а также соберите X предметов / Возврат - награда.# Y \6 O6 M& ?$ M* z
Q10517_FafurionsMinions 8 w; B& }3 y8 Q* v, r+ w% D5 P ' W" z3 [. \- u% A9 C5 LИди собери X капель монстров / Вернись - убей X монстров / Вернись - награда. # b# m& v9 [7 b$ pQ10529_IvoryTowersResearchFloatingSeaJournal4 f f5 M1 v) b1 `& }( c
4 Z! f1 o- w# aИди убей X монстров, а также собери X предметов / Возвращение - иди собери X предметов / Возвращение - награда. ' R( v) ~) ^/ U; ?$ sQ10518_SucceedingThePriestess 5 L$ m3 _6 Z- f% b! H# [5 y7 S5 X3 [- W, }. R; }
Участвуйте в убийстве рейдбосса / Возврат - награда.% \1 p3 F8 K% G W( G5 k
Q10519_контролирование вашей температуры; O0 b7 y. V, A7 ]/ V4 d
" l6 Y8 ~) @" w) ?Поговорите с NPC 1 / Примите участие в убийстве рейдбосса / Возвращение - награда. ' w) T' w( y# P, zQ10533_OrfensAmbition . p6 h3 S; T% p+ ]' z 2 l7 V2 H$ G1 {' n8 d6 A4 ]+ H9 Q& P. q
# k f0 Q1 |$ T4 fРуководство требует обновления. И, к сожалению, с самыми последними хрониками вы не сможете избежать модификаций клиента. Поэтому, исключительно в образовательных целях, я предлагаю свой опыт по добавлению нового квеста! 5 Z+ j+ f4 O4 @/ }. G1 S' C + r7 D& T! B, hШаг 1: Создайте свой квест с уникальным ID. В этом примере я буду ссылаться на квест как "Q98765_NewQuest".5 y }& G- I: L. j4 `( O
, w9 @; [! d1 u, m4 Z# o { Шаг 2: Когда вы успешно создали свой квест и Eclipse не выдает ошибок, добавьте название квеста и импортируйте его в файл "QuestMasterHandler.java". $ y& A- U; n3 ^4 v) z" C9 m/ ^) F: A; r' ?' |5 k* _9 u! l# ^ Шаг 3: Перейдите в клиент и с помощью редактора клиента добавьте квест в следующие файлы .dat: "questname-ru.dat" и "QuestMarkConditionData.dat".4 h9 V/ t0 O/ e& N, i
- V" V% q# A. [: J3 z7 Y: DСледующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов.7 t( S8 J' K$ \& q) ^3 S2 b1 O
$ s6 c& w* C# j5 ] E- ^3 cШаг 4: Найдите в серверных файлах файл с названием "NewQuestData.xml" и добавьте туда свой квест. " j9 c( N. S! F- \( t8 \( R5 k @8 J6 B5 B. e& t" q& h: F8 R Шаг 5: Найдите в клиенте следующие файлы и добавьте туда свой квест: "NewQuestData-ru.dat", "NewQuestDialog-ru.dat" и "NewQuestNpcPortrait.dat".9 e/ s5 F1 A* Q0 k& @* F I8 ~" K
+ ~% o2 ~8 c' g7 |+ P4 v
Если я что-то забыл, не стесняйтесь исправить меня. Это руководство создано исключительно в образовательных целях.. W$ Q! B$ O3 a8 I" H
& A2 I! |7 c3 R$ T& M* yШаг 2: 7 {5 {1 \6 s5 F) j5 D+ p/ U: a$ i % i% H8 S$ V& _9 S/ oСледующий шаг заключается в добавлении вашего квеста в QuestMasterHandler.java. Вот общий план:" [* Y+ \6 r5 n8 h7 C% K- L
* w) V+ b9 o; q% s: J& Z% ^3 B9 x1. Импорт вашего квеста: В начале файла после всех существующих импортов добавьте строку, которая будет импортировать ваш квест. $ Z+ h7 h; P4 V0 z+ Z+ M, m
Например:' G7 h, g5 |* \/ I" x$ W) n0 e
1 Y) o! y* w4 e+ f* B, ]0 N' W/ ?
import quests.<span style="background-color: rgb(255, 255, 255);">Q98765_NewQuest</span>.<span style="background-color: rgb(255, 255, 255);">Q98765_NewQuest</span>; 0 ^6 U0 u7 E% E' i+ Z& h) R y1 X4 h
Скопировать код
1. Регистрация квеста: Найдите метод, который отвечает за регистрацию всех квестов. Обычно это делается в статическом блоке или методе init, где происходит инициализация квестов. В этом блоке добавьте строку, которая будет регистрировать ваш квест: 3 l/ r4 ^/ V& u/ r* g- i6 G1 u9 M+ e4 p+ F
/** * p! K6 M5 [1 b* Q
* @author NosBit* t# m4 W6 }, l( R0 n& W) w
*/ & {% G h3 j1 K8 |
public class QuestMasterHandler2 a: x( i1 J% m1 u+ F0 C# T
{ 2 W: Q. X. j' z8 R$ x
private static final Logger LOGGER = Logger.getLogger(QuestMasterHandler.class.getName());5 E# ?6 t, m, J" O
% c: V4 n) D% i
private static final Class<?>[] QUESTS = / D2 {9 S+ k9 M. S% H2 [
{
Скопировать код
Проверка: Убедитесь, что идентификатор вашего квеста (в данном случае Q98765_NewQuest.class) уникален и не конфликтует с уже существующими квестами.& b* x" r" [ c3 D9 A* J
' V! _$ Q$ m2 {/ M1 y
5 y' F6 r; [5 O" U K) X7 r# `2 t/ B5 U Шаг 3:2 F9 E. v9 O1 b. }$ d, V# d
" ?- U/ l- v* q
Файл QuestName-ru.dat используется для описания квестов и содержит различные параметры, которые задают характеристики квеста, его цели, награды, ограничения и т.д. 7 ^- Z6 z, \% X4 T0 E5 OДавайте разберем все поля на основе примера: ' I: o2 D2 u7 j) `6 P' l4 L# U 9 v* W+ `: w) i0 F
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% ?+ h5 }; }' Z# y9 ?
Скопировать код
Поля данных:
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 — завершение записи для квеста. ! `5 V6 X4 J/ |
2 L: B4 l) l. w2 G0 m8 O, [0 X
2 H7 q- m6 ?' \4 wФайл клиента QuestMarkConditionData.dat содержит информацию о квестах, связанных с условиями, необходимыми для активации или завершения определённых действий в игре. " m. X1 l# @; m: @
Пример соодержания / u5 A5 V6 ~& {& F9 y$ u: ]Вот описание структуры строки: / s0 \2 V3 ~' q' I& a
Давайте разберем все поля на основе примера: 0 r- `( E) |$ `; |# J* B$ \' }, q
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: Указывает на конец записи о квесте. 4 f& b, u0 y9 j% H& d5 _ L
Эта структура помогает клиенту определять условия, при которых игрок может начать или выполнить квест, а также идентифицировать необходимые взаимодействия с NPC.( W [4 O7 G0 I4 F
, v' L& W7 X' N( [) | e+ k
% i) x; F" C: y, a ' l' i3 [# d7 u' hСледующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов. 4 G: Y6 M! ~' t! J1 h9 Y Z" x& ?0 g% s8 E' a9 M2 ~* F Шаг 4 - x2 @" Q) t8 L5 q9 _8 n( EДля того чтобы добавить свой квест в файл NewQuestData.xml, нужно следовать структуре, аналогичной приведенному вами примеру. Вот как это может выглядеть: 4 }9 s5 i u, Q% r5 A8 V6 iПример добавления нового квеста: f1 E1 S3 N7 r K) g& w# L9 p3 \
<quest id="20001" type="1" name="Mystery of the Lost Relic" startNpcId="30050" endNpcId="30051">% t! g) g) Q9 S1 D: J8 ]
<locations> + _& W( K9 o5 i8 d$ ~
<param name="startLocationId">2001</param>$ B4 d( ?- a. v1 X
<param name="endLocationId">2002</param>1 l8 Z3 N8 n$ H# F
quest: Основной элемент квеста, содержащий атрибуты:% z/ M4 ?/ ^) p" f2 n7 H0 j
id: ID квеста, уникальный для каждого квеста.
type: Тип квеста (1 – обычный квест).
name: Название квеста.
startNpcId: ID NPC, с которого начинается квест.
endNpcId: ID NPC, у которого квест заканчивается.+ ]/ Y- L4 c$ ~; ~. A9 `* e: H2 O' Q
locations: Указывает места начала, окончания и квестовой активности. - B' y% ]1 k0 H4 u# P, R- C2 o1 E
startLocationId: ID места, где начинается квест.
endLocationId: ID места, где квест заканчивается.
questLocationId: ID квестовой зоны. 9 ~' p/ b/ S% \; _1 o
conditions: Условия для начала квеста. ) [( d" A0 a. b$ R0 D
preQuestId: ID предварительного квеста (если есть).
classIds: ID классов или рас, которым доступен квест. 4 q, Q( ~: ?1 ^' f @5 [3 h3 k4 t
rewards: Награды за выполнение квеста.8 J6 R* n9 W* D5 f+ I R( O+ a
rewardLevel: Минимальный уровень для получения награды.
rewardSp: Количество опыта (SP).
rewardItemId: ID предмета (например, Adena).
rewardItemCount: Количество предметов.5 p$ d) v4 W H$ H
goals: Цели квеста. ' Z* i$ O1 G8 B) w: @" W# w0 I% J
goalCount: Количество монстров, которых нужно убить или предметов, которые нужно собрать.
goalString: Описание цели.
goalItemId: ID квестового предмета (если требуется).
goalItemCount: Количество квестовых предметов для завершения цели.8 \5 r/ M) Q- F! d& g g
После того как вы добавите квест в файл NewQuestData.xml, нужно перезапустить сервер, чтобы изменения вступили в силу.' q8 \( A3 t4 U7 a. d
# n7 `4 d5 H: T9 S- W( V5 _3 SШаг 5" `2 x% Q6 ], S, [* O) L
Файл NewQuestDialog-ru.dat используется для хранения диалогов, связанных с квестом. Он определяет тексты, которые отображаются в окнах диалогов с NPC во время выполнения квеста. Вот разбор ключевых элементов строки и структура файла: 8 U. |! t+ N ^# B5 [8 l% E" v ]7 @Структура данных
NewQuestDialog_begin — начало записи квеста в файле диалогов.
QuestId=10001 — идентификатор квеста (должен соответствовать ID, который ты используешь в других файлах).
Text0=... — первый диалог, который обычно отображается при старте квеста.
Text1=... — дополнительный текст, который отображается на различных этапах квеста.
Text2=... — текст, который отображается после выполнения определенных действий (например, после выполнения части задания).
Text3=... — дополнительный диалог, например, при встрече с NPC на следующем этапе квеста.
Text4=... — финальный текст или инструкции по следующему шагу для игрока.
NewQuestDialog_end — завершение записи для этого квеста. . `( Y: l& v/ s: K& @
9 }9 w7 Q1 g2 I9 sПример записи для нового квеста (ID 98765) Если ты хочешь создать диалоги для нового квеста с ID 98765, твой файл может выглядеть так:) g( T! ~) y9 V' j
NewQuestDialog_begin QuestId=98765 Text0=[Вы готовы принять новый вызов и доказать свою силу?] Text1=[Как вы себя чувствуете? Вы выглядите уверенно. Это хороший знак, но не расслабляйтесь — впереди много испытаний. Примите это задание, если готовы.] Text2=[Пора приступить к тренировкам. Идите за мной в тренировочную зону.] Text3=[Следуйте моим указаниям, и вы раскроете весь свой потенциал.] Text4=[Поговорите с Дарти. Кликните на него и начните диалог.] NewQuestDialog_end - m8 M- ^# T- v% q0 \( Z6 |; k
Скопировать код
Разъяснение полей:) E& h( Y* q( F* h: [0 A
QuestId=98765 — уникальный идентификатор нового квеста.
Text0 — вводный текст квеста. Отображается при первом контакте с NPC.
Text1 — дополнительный диалог, который дается игроку для создания контекста.
Text2 — текст, который отображается на следующем этапе квеста, например, после выполнения части задания.
Text3 — описание следующего шага или инструкции для игрока.
Text4 — финальный диалог или текст с указанием цели (встреча с другим NPC).5 K1 d6 a0 B3 N' T8 E5 y
9 B6 i2 r- y$ t: l! [
8 B7 v: H' d2 H$ hЧто можно изменить:
Тексты диалогов (Text0, Text1 и так далее) можно адаптировать под конкретные ситуации в квесте.
Количество текстов можно варьировать в зависимости от сложности квеста. : l2 l8 V1 q1 L& t! {6 Q1 p
+ f/ k1 O) |4 z! b8 R0 Q: G, J
Файл NewQuestData-ru.dat содержит параметры, связанные с квестом в игре Lineage II, и описывает условия, NPC, цели и награды. Рассмотрим параметры этого файла:7 a% L3 C# g) b$ K$ k
) s Y3 n- d# }' s5 f* L3 ^( X) H
newquestdata_begin / newquestdata_end: Эти параметры обозначают начало и конец блока данных квеста.
quest_id=10001: Уникальный идентификатор квеста (ID). В данном случае это квест с ID 10001.
quest_type=1: Тип квеста. - ~$ U; Y4 O& d* s
1 обычно означает стандартный квест. 9 s0 v' b" J1 x( o* D8 @2 d+ c
quest_name=[Новый путь]: Название квеста. Здесь указано "[Новый путь]" — это имя, отображаемое в игре.
quest_level={0;0}: Уровневые ограничения квеста.& o0 h! ~5 T1 W6 F
Первое значение указывает минимальный уровень, второе — максимальный уровень.
{0;0} означает, что нет ограничений по уровню. 4 x! y6 _9 e8 B7 q
pre_quest={}: Предварительный квест, который нужно выполнить перед началом этого квеста.; p r, W6 p# r, W! R$ P) T0 X0 u
В данном случае он пустой {}, что означает, что нет предварительных требований.0 O/ F, p5 p; ^, z
class={0;10;18;25;31;38;44;49;53;123;124}: Классы или расы, которые могут брать квест.- M: N+ N4 g, J
Номера классов указывают на те классы, которым доступен этот квест. В данном примере классы, такие как 0 (человеки), 10 (рыцари) и другие, имеют доступ. / a+ Z) l2 ]) ?8 |
quest_item=82948: ID квестового предмета, необходимого для выполнения цели или этапа квеста.; W3 P1 a7 U+ s, k A! x1 A
В данном случае это предмет с ID 82948.! Y( v4 O3 K \/ \! K- K
start_item=0: Предмет, который выдается при начале квеста. 7 c" h" t& H4 a( z c
Значение 0 означает, что предмет не выдается.! q5 j2 R @1 }" ?
start_npc=34505: ID NPC, у которого начинается квест.
start_npc_loc=1002: Локация NPC, у которого начинается квест. 9 Y3 a! ~' @8 Q) C& E. B0 f/ a4 ~5 X% A
Это ID локации, где находится стартовый NPC.: A5 m7 u6 C4 `; V3 N- j7 V
end_npc=34696: ID NPC, у которого завершается квест.
end_npc_loc=1003: Локация NPC, у которого завершается квест. ! x5 k2 e" H9 ?% V) z; o
Это ID локации, где находится конечный NPC.' D! ^* |$ U/ M- {# F4 E4 Z" S
quest_loc=1003: Основная локация выполнения квеста. 6 a( n. t8 X2 e0 |$ d- C7 u
Это ID зоны, где нужно выполнять основные задачи.- Z' R3 f/ R, C
goal_string=[Дарти (Зона Тренировки)]: Описание цели квеста.9 |& q2 N. l% G4 Y+ x4 U# {3 H
В данном случае цель связана с персонажем по имени "Дарти" в Зоне Тренировки.8 z2 z# ^3 W- H+ J; j9 Q3 C a$ q
goal_num=1: Количество действий, необходимых для выполнения цели (например, убийств монстров или сбора предметов). |6 h v3 F; r
В данном случае нужно выполнить одно действие (1).' a+ w% G9 V$ k1 I" a6 N1 [
reward_level=65535: Уровень, при котором можно получить награду. 8 S% U Q3 B3 m y0 o" p4 w- J
В данном случае это максимальное значение, указывающее, что награда доступна всегда.$ ]/ t; t: S! i0 O
reward_exp=0: Опыт (EXP), выдаваемый в качестве награды. 0 e; X) ]0 F' N
В данном случае опыт не выдается. ' a8 O6 Y7 X/ m/ X# r! U
reward_sp=0: Количество SP (Skill Points), выдаваемых в качестве награды. , R* k& W! L, b! Y4 |
Здесь тоже 0, значит, SP не выдаются. 8 f# \0 J- Z. Q2 h; ]8 u, d
reward_item={}: Наградные предметы. ) N* a! w& D/ w% M9 W. e
В данном случае наградные предметы отсутствуют. 1 {8 s% ^, v" q4 a
Этот файл определяет основной функционал и настройки для конкретного квеста в игре. 1 h5 E7 f0 j5 m$ o# R& E# O, J. n1 {" |
# |: H0 o# p7 `% K 8 z6 I. a* g! A3 s% d, N( I- V8 w+ v# q& [# l/ M/ K) w1 w5 v2 h- c