Название: Создание квестов L2j_Mobius [Версия для печати] Автор: admin Время: 2024-9-24 00:52 Название: Создание квестов L2j_Mobius Сборка: L2l_Monius ! j1 _. M) `) j' ~) ZСледующие квесты можно использовать в качестве шаблонов для создания практически любого простого квеста go kill или go talk. 6 }4 y7 P/ v- h. x6 q# D7 @" }/ B! ~
6 H- d# T m$ P, q8 s2 k
Иди и убей X монстров / Возвращение - награда. $ w6 l9 \, S b! A! zQ00529_RegularBarrierMaintenance 2 o) s4 U9 O3 E6 |5 s6 x+ c$ i 6 K# ~) h: z# U$ a* ]: dПолучите квест от любого из двух разных NPC / Убейте X монстров / Вернитесь с наградой.. h; \5 b) f9 r5 C4 [7 y1 x' j+ w" w
Q00683_AdventOfKrofinSubspecies8 ]' \/ _; Q' Y- l* g+ m
, A* ^$ O# Z0 i' w2 I/ F
Поговори с NPC 1 / Поговори с NPC 2 / Поговори с завершающим NPC / Награда. + A, X5 S- W. M' AQ10516_UnveiledFafurionTemple 9 y5 c5 F V) g( X m% x% z: K4 ]$ N+ F S/ H
Убейте X монстров, а также соберите X предметов / Возврат - награда.2 a' m2 E3 ^8 F+ w
Q10517_FafurionsMinions$ j& F7 J8 J9 J3 z5 I w
2 R9 J. F& V' }: [" d
Иди собери X капель монстров / Вернись - убей X монстров / Вернись - награда.) Q* }% `! ^" t" {* V
Q10529_IvoryTowersResearchFloatingSeaJournal7 L* l8 \8 Q8 c; d7 q* C- @: a
9 |8 t0 \2 `8 x- s
Иди убей X монстров, а также собери X предметов / Возвращение - иди собери X предметов / Возвращение - награда., H+ A+ f* k2 |( W
Q10518_SucceedingThePriestess% g5 w" M( L+ a5 E) B- ^# _& S# D% R
+ R$ J4 Y. C8 k P. a7 w1 N3 Y
Участвуйте в убийстве рейдбосса / Возврат - награда.. `3 g/ C3 t7 |
Q10519_контролирование вашей температуры$ ~, h# E, F- `5 x9 S$ L
% P" ^) ^7 P }, WПоговорите с NPC 1 / Примите участие в убийстве рейдбосса / Возвращение - награда.2 u% V5 Z8 H4 T W! ?
Q10533_OrfensAmbition+ d! }- L) h f5 U4 U
5 R( ^! j8 N8 A& i. U, Y
& D" e5 K1 }2 J& G
& ^/ C6 p# m& o/ ?* ~ Руководство требует обновления. И, к сожалению, с самыми последними хрониками вы не сможете избежать модификаций клиента. Поэтому, исключительно в образовательных целях, я предлагаю свой опыт по добавлению нового квеста!# s! L8 O% U X: N! `6 V. Y" y9 p ! ?$ O) ]. b" V+ |2 Z" CШаг 1: Создайте свой квест с уникальным ID. В этом примере я буду ссылаться на квест как "Q98765_NewQuest". 4 Z! V& @) b% o; p6 z4 I7 x$ z3 p8 @ Шаг 2: Когда вы успешно создали свой квест и Eclipse не выдает ошибок, добавьте название квеста и импортируйте его в файл "QuestMasterHandler.java".- \$ L4 O9 v* v5 S" i8 W
: R4 c0 ?( s5 a' S. CШаг 3: Перейдите в клиент и с помощью редактора клиента добавьте квест в следующие файлы .dat: "questname-ru.dat" и "QuestMarkConditionData.dat". ) E p3 G7 R5 l i9 d2 P! d8 ?$ _9 f) R6 ~
Следующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов.4 u- H: Y/ R2 U9 O4 O
) I: q2 @; |1 D4 N- P ?" P' c Шаг 4: Найдите в серверных файлах файл с названием "NewQuestData.xml" и добавьте туда свой квест. ' }5 Y6 n) Z+ J5 n # |# H- C5 [+ b; q' c( v3 c ^0 oШаг 5: Найдите в клиенте следующие файлы и добавьте туда свой квест: "NewQuestData-ru.dat", "NewQuestDialog-ru.dat" и "NewQuestNpcPortrait.dat". 0 V3 i8 l" n; O( m- T # J8 H. |. O8 I6 {* \Если я что-то забыл, не стесняйтесь исправить меня. Это руководство создано исключительно в образовательных целях.( y; H/ z6 ?9 p. m b# c
- P$ C4 P7 I& ^/ ~$ Z Шаг 2: # \ z3 z% E( }( a( G0 ~ % {4 v* F. {+ n, U, m1 F8 Z; ?; Q5 pСледующий шаг заключается в добавлении вашего квеста в QuestMasterHandler.java. Вот общий план: 3 ]6 s5 a. w) P, o u( e) J9 T- }8 f) G$ j/ b' k: A3 t 1. Импорт вашего квеста: В начале файла после всех существующих импортов добавьте строку, которая будет импортировать ваш квест. ! @) j9 j% g$ y0 j- w5 B
Например: 8 }* B- ]4 K, x, R$ O! @ e& D# Q# c, _
import quests.<span style="background-color: rgb(255, 255, 255);">Q98765_NewQuest</span>.<span style="background-color: rgb(255, 255, 255);">Q98765_NewQuest</span>; / h8 }8 }! ]& `: s B. r
Скопировать код
1. Регистрация квеста: Найдите метод, который отвечает за регистрацию всех квестов. Обычно это делается в статическом блоке или методе init, где происходит инициализация квестов. В этом блоке добавьте строку, которая будет регистрировать ваш квест:, v/ G, ?! E+ n! p C
5 i* U+ M0 `8 k7 I) M
/** 0 l, @2 B/ _2 k; {: y
* @author NosBit 4 Y" a$ L* G$ O M! o
*/ 7 s+ d% K0 U/ Y! F+ M q
public class QuestMasterHandler " ~2 T$ G5 B0 \% G2 V4 [
private static final Class<?>[] QUESTS = Q, q, V- D0 L7 ?$ ^ K4 l
{
Скопировать код
Проверка: Убедитесь, что идентификатор вашего квеста (в данном случае Q98765_NewQuest.class) уникален и не конфликтует с уже существующими квестами. 5 _/ U, S: c; H' h/ R % q8 U. S) Y, ~: L5 h 9 F% w% R. T% A, yШаг 3:6 e7 l6 z7 W+ Y
9 K" M" I/ q Z8 z8 B2 W/ J
Файл QuestName-ru.dat используется для описания квестов и содержит различные параметры, которые задают характеристики квеста, его цели, награды, ограничения и т.д. & o$ ?/ U+ s) \, g/ y1 m8 b' a ]1 [Давайте разберем все поля на основе примера:3 i$ \+ f( u8 Z, i% h
+ q! v+ I" ^) T% l
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, n! l. `: t* e& x) P7 p
Скопировать код
Поля данных:
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 Y( ~4 o$ x9 n9 |, D$ r$ C" I
, f t% E: d4 ?- s) u r 4 a( R; U! r' [' B/ x2 f8 VФайл клиента QuestMarkConditionData.dat содержит информацию о квестах, связанных с условиями, необходимыми для активации или завершения определённых действий в игре. ) c1 S$ v5 n/ ?4 V3 ?9 EПример соодержания ; @! x- u: T0 B" Q9 e( @& l2 BВот описание структуры строки: 0 r# v [! ]" m& [
Давайте разберем все поля на основе примера: . ~) e" s+ f# f9 P- j b$ x/ ^6 d4 P4 i
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: Указывает на конец записи о квесте. - z4 Y* e$ P) g2 [. A% c
Эта структура помогает клиенту определять условия, при которых игрок может начать или выполнить квест, а также идентифицировать необходимые взаимодействия с NPC.3 J% p' F6 @, |
8 F( B9 t, H1 P s) v$ y
5 d, r, H* c8 M. J. n* M: ?% b$ a " p9 v- H: F2 ?5 a4 A% SСледующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов.& N! t9 b4 ?3 \5 _4 l" T
9 B! |/ t% P4 ?3 U" v+ j3 x& M4 FШаг 4 0 Q/ R b9 s3 p: Q: R, fДля того чтобы добавить свой квест в файл NewQuestData.xml, нужно следовать структуре, аналогичной приведенному вами примеру. Вот как это может выглядеть: 7 Q' j# |! w% I, S: m' `Пример добавления нового квеста: ; S& g( i+ w' d. R$ F V9 v! w
<quest id="20001" type="1" name="Mystery of the Lost Relic" startNpcId="30050" endNpcId="30051">; B# I7 R3 g2 [3 Y' `) A
<locations> " R. L0 z" y0 B+ n, T# f% G4 O
<param name="startLocationId">2001</param> ! {% @$ A' S! _9 a
quest: Основной элемент квеста, содержащий атрибуты: 6 O9 I9 S4 k Z6 e! S0 [( H
id: ID квеста, уникальный для каждого квеста.
type: Тип квеста (1 – обычный квест).
name: Название квеста.
startNpcId: ID NPC, с которого начинается квест.
endNpcId: ID NPC, у которого квест заканчивается. , A- \: y; z) N
locations: Указывает места начала, окончания и квестовой активности. 4 h5 ~; _0 p- J' Q8 ` c" v' N
startLocationId: ID места, где начинается квест.
endLocationId: ID места, где квест заканчивается.
questLocationId: ID квестовой зоны.7 |2 V$ Q8 U$ Q
conditions: Условия для начала квеста.; k8 ~+ [+ f$ h
preQuestId: ID предварительного квеста (если есть).
classIds: ID классов или рас, которым доступен квест.2 `9 V+ t% M+ C5 S$ s% Z9 h
rewards: Награды за выполнение квеста., c/ {" R+ o i% | O+ C: U
rewardLevel: Минимальный уровень для получения награды.
rewardSp: Количество опыта (SP).
rewardItemId: ID предмета (например, Adena).
rewardItemCount: Количество предметов.+ ~7 O7 n8 ~1 q1 H# a; D8 |+ L
goals: Цели квеста.4 H' Y+ f/ k% E% k
goalCount: Количество монстров, которых нужно убить или предметов, которые нужно собрать.
goalString: Описание цели.
goalItemId: ID квестового предмета (если требуется).
goalItemCount: Количество квестовых предметов для завершения цели.- O$ \* e4 s5 A4 ~8 I
После того как вы добавите квест в файл NewQuestData.xml, нужно перезапустить сервер, чтобы изменения вступили в силу.: t5 C) w' {0 ?% }) H
9 @# Z5 Y, u) K2 h9 B* Z6 ?/ N2 ^/ r Шаг 5- m( K5 G5 W2 w
Файл NewQuestDialog-ru.dat используется для хранения диалогов, связанных с квестом. Он определяет тексты, которые отображаются в окнах диалогов с NPC во время выполнения квеста. Вот разбор ключевых элементов строки и структура файла: 6 E- Z) o( m- U5 LСтруктура данных
NewQuestDialog_begin — начало записи квеста в файле диалогов.
QuestId=10001 — идентификатор квеста (должен соответствовать ID, который ты используешь в других файлах).
Text0=... — первый диалог, который обычно отображается при старте квеста.
Text1=... — дополнительный текст, который отображается на различных этапах квеста.
Text2=... — текст, который отображается после выполнения определенных действий (например, после выполнения части задания).
Text3=... — дополнительный диалог, например, при встрече с NPC на следующем этапе квеста.
Text4=... — финальный текст или инструкции по следующему шагу для игрока.
NewQuestDialog_end — завершение записи для этого квеста. % I% X4 `' [ v0 y
& T* b) @! U7 j7 [. W6 m; hПример записи для нового квеста (ID 98765) Если ты хочешь создать диалоги для нового квеста с ID 98765, твой файл может выглядеть так:& P! O; [, r! D% e9 C+ S1 a
NewQuestDialog_begin QuestId=98765 Text0=[Вы готовы принять новый вызов и доказать свою силу?] Text1=[Как вы себя чувствуете? Вы выглядите уверенно. Это хороший знак, но не расслабляйтесь — впереди много испытаний. Примите это задание, если готовы.] Text2=[Пора приступить к тренировкам. Идите за мной в тренировочную зону.] Text3=[Следуйте моим указаниям, и вы раскроете весь свой потенциал.] Text4=[Поговорите с Дарти. Кликните на него и начните диалог.] NewQuestDialog_end - M! V. t+ H+ n; [( x8 ?
Скопировать код
Разъяснение полей:; i( C7 E: Z! h) b
QuestId=98765 — уникальный идентификатор нового квеста.
Text0 — вводный текст квеста. Отображается при первом контакте с NPC.
Text1 — дополнительный диалог, который дается игроку для создания контекста.
Text2 — текст, который отображается на следующем этапе квеста, например, после выполнения части задания.
Text3 — описание следующего шага или инструкции для игрока.
Text4 — финальный диалог или текст с указанием цели (встреча с другим NPC).1 r9 R2 W) _! {" ]( g
Тексты диалогов (Text0, Text1 и так далее) можно адаптировать под конкретные ситуации в квесте.
Количество текстов можно варьировать в зависимости от сложности квеста. 5 {: V* A! j" ?# B
# Y5 s8 y) V: T* K
Файл NewQuestData-ru.dat содержит параметры, связанные с квестом в игре Lineage II, и описывает условия, NPC, цели и награды. Рассмотрим параметры этого файла:2 y, S; L+ {, m& b( s6 \
% L. f5 r! H, s0 x
newquestdata_begin / newquestdata_end: Эти параметры обозначают начало и конец блока данных квеста.
quest_id=10001: Уникальный идентификатор квеста (ID). В данном случае это квест с ID 10001.
quest_type=1: Тип квеста. * U- S2 n& U. n+ k" ~. `0 `2 O
1 обычно означает стандартный квест.# L" Y) j. D/ F7 C
quest_name=[Новый путь]: Название квеста. Здесь указано "[Новый путь]" — это имя, отображаемое в игре.
quest_level={0;0}: Уровневые ограничения квеста./ C+ o( i Q8 H2 A& u0 y
Первое значение указывает минимальный уровень, второе — максимальный уровень.
{0;0} означает, что нет ограничений по уровню. 6 U5 u# R# f0 ~$ V* z; Z
pre_quest={}: Предварительный квест, который нужно выполнить перед началом этого квеста.) {; g4 b5 X& B
В данном случае он пустой {}, что означает, что нет предварительных требований. . s+ @. y) W" i+ f
class={0;10;18;25;31;38;44;49;53;123;124}: Классы или расы, которые могут брать квест. ( d! X" O2 I" {
Номера классов указывают на те классы, которым доступен этот квест. В данном примере классы, такие как 0 (человеки), 10 (рыцари) и другие, имеют доступ. 2 N# E2 ]! R0 A+ [" B) E. f
quest_item=82948: ID квестового предмета, необходимого для выполнения цели или этапа квеста.9 c: z9 Q+ G2 d$ h
В данном случае это предмет с ID 82948.2 v' B! S- @+ V. B
start_item=0: Предмет, который выдается при начале квеста. 6 q: [0 n* O6 x2 v
Значение 0 означает, что предмет не выдается. ) w/ F1 T5 z- c; Q( @
start_npc=34505: ID NPC, у которого начинается квест.
start_npc_loc=1002: Локация NPC, у которого начинается квест. ! X; P- x7 I) d: k' ~1 Z
Это ID локации, где находится стартовый NPC.& @) j0 Z5 v# P% k, D
end_npc=34696: ID NPC, у которого завершается квест.
end_npc_loc=1003: Локация NPC, у которого завершается квест. $ ?0 N) y" p2 v& [
Это ID локации, где находится конечный NPC. 3 Z2 O9 ]1 `: v; H3 `
quest_loc=1003: Основная локация выполнения квеста. : q+ q- h- k( r& |/ y
Это ID зоны, где нужно выполнять основные задачи. . d9 b& O7 u9 v: t, \
goal_string=[Дарти (Зона Тренировки)]: Описание цели квеста.6 S+ L% v* Y9 @
В данном случае цель связана с персонажем по имени "Дарти" в Зоне Тренировки. 9 H! U* s H$ \
goal_num=1: Количество действий, необходимых для выполнения цели (например, убийств монстров или сбора предметов).0 m& {" {' B( b7 w/ M
В данном случае нужно выполнить одно действие (1).0 x B5 i0 o/ b0 R: \
reward_level=65535: Уровень, при котором можно получить награду. ! O. B+ O0 V |( A& T: d0 D
В данном случае это максимальное значение, указывающее, что награда доступна всегда.1 Q/ p# R' x4 m/ B2 B. h) `
reward_exp=0: Опыт (EXP), выдаваемый в качестве награды. & Z( h! y6 f/ Y# f- ~8 i
В данном случае опыт не выдается. ' v, z$ D5 l% C: B
reward_sp=0: Количество SP (Skill Points), выдаваемых в качестве награды. ) g7 z' H$ f0 e
Здесь тоже 0, значит, SP не выдаются. 4 N2 m' B9 V6 a8 K- g