Название: Создание квестов L2j_Mobius [Версия для печати] Автор: admin Время: 2024-9-24 00:52 Название: Создание квестов L2j_Mobius Сборка: L2l_Monius 7 G1 U' M; Y+ h5 T n3 h' dСледующие квесты можно использовать в качестве шаблонов для создания практически любого простого квеста go kill или go talk.7 y+ W1 T4 b6 g' B( Q2 ~, a2 H' U' X
- b$ U, @! y# e% }; H7 O: x # ]0 u7 j- d$ F2 s/ t0 ^Иди и убей X монстров / Возвращение - награда. ! y5 V: A7 P6 a) sQ00529_RegularBarrierMaintenance4 Q. a" E$ B* j5 \( {' F; I* `
( W" m% j( X" Q( g; ?& `5 e! C
Получите квест от любого из двух разных NPC / Убейте X монстров / Вернитесь с наградой.$ c- k+ H3 Z- V# I4 Z" H
Q00683_AdventOfKrofinSubspecies1 Z: v/ d& S. n$ G9 C
2 ]2 S$ I. I% W" N0 Y1 F6 }% `
Поговори с NPC 1 / Поговори с NPC 2 / Поговори с завершающим NPC / Награда. 6 b* q0 y9 Y: O* lQ10516_UnveiledFafurionTemple 4 N7 O7 [# \/ M" | U% o5 j2 W $ W3 X' [3 a5 k2 oУбейте X монстров, а также соберите X предметов / Возврат - награда.& N8 O2 H0 _$ n
Q10517_FafurionsMinions 6 S0 z G, ~* y! Z3 Y E# ]% q8 r% ~5 N d, J: a/ w9 R
Иди собери X капель монстров / Вернись - убей X монстров / Вернись - награда.% m# t6 \* O) E3 S2 z; n- R
Q10529_IvoryTowersResearchFloatingSeaJournal 0 |; ~- R8 J# `. j2 { % A, a6 q) \4 MИди убей X монстров, а также собери X предметов / Возвращение - иди собери X предметов / Возвращение - награда. 4 o, X+ v2 S7 k' SQ10518_SucceedingThePriestess# N" L% }) ^& a6 L9 F
9 ^' p- N) r3 e/ T, H% x( m9 CУчаствуйте в убийстве рейдбосса / Возврат - награда. + F4 H( C' ~4 g9 qQ10519_контролирование вашей температуры " T1 P: G) Y4 a& N6 E ( \: d S! c% Z/ ~/ EПоговорите с NPC 1 / Примите участие в убийстве рейдбосса / Возвращение - награда.' S" U4 }7 f1 j3 n6 Z, U
Q10533_OrfensAmbition / O" u4 R* b1 | " ^; L- z- ]; h5 s4 }% s7 ` + S6 `+ {. ~3 x1 z S: {( U8 X; S K! m* B; R# f B Руководство требует обновления. И, к сожалению, с самыми последними хрониками вы не сможете избежать модификаций клиента. Поэтому, исключительно в образовательных целях, я предлагаю свой опыт по добавлению нового квеста! / p6 L, u4 _, _3 { # N, W3 p* x+ `" M* C9 \# nШаг 1: Создайте свой квест с уникальным ID. В этом примере я буду ссылаться на квест как "Q98765_NewQuest". 9 B: H) D! @, l9 F! g1 A 7 ^: n, o, k8 Z5 p- G% _Шаг 2: Когда вы успешно создали свой квест и Eclipse не выдает ошибок, добавьте название квеста и импортируйте его в файл "QuestMasterHandler.java". ' ~5 w, G4 B H( G1 I. [ e4 S! z2 P) ^ Шаг 3: Перейдите в клиент и с помощью редактора клиента добавьте квест в следующие файлы .dat: "questname-ru.dat" и "QuestMarkConditionData.dat".+ z3 `; O* r. C0 Y
0 \9 W5 w: i( ~( N2 f1 fСледующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов.4 _3 i, m, x6 o
0 w& g: x4 |, S- {Шаг 4: Найдите в серверных файлах файл с названием "NewQuestData.xml" и добавьте туда свой квест.5 |- c/ \' k5 B+ I
. t% Y3 c1 B/ x: [/ PШаг 5: Найдите в клиенте следующие файлы и добавьте туда свой квест: "NewQuestData-ru.dat", "NewQuestDialog-ru.dat" и "NewQuestNpcPortrait.dat".. J6 ~4 W, H) l' s0 _
) J- N+ y- T- A, u' CЕсли я что-то забыл, не стесняйтесь исправить меня. Это руководство создано исключительно в образовательных целях. ) e% O" |( X+ q- k- n! R# v9 P0 ?6 P# P 3 z: S2 y7 N8 a, z8 i7 uШаг 2: & B: n3 t" k# H" F b1 h6 n; f# l' X9 }Следующий шаг заключается в добавлении вашего квеста в QuestMasterHandler.java. Вот общий план:* b3 S. D9 b6 s- Q6 M/ U' |
& E. q) C! Y k5 \+ i& r7 J1. Импорт вашего квеста: В начале файла после всех существующих импортов добавьте строку, которая будет импортировать ваш квест. 9 ~7 B O. } m. x+ PНапример: 0 {; R2 `/ U* o* n , {0 m- Q1 `- V% }4 h ^
import quests.<span style="background-color: rgb(255, 255, 255);">Q98765_NewQuest</span>.<span style="background-color: rgb(255, 255, 255);">Q98765_NewQuest</span>; % w6 i. c9 q9 T' n0 q x
Скопировать код
1. Регистрация квеста: Найдите метод, который отвечает за регистрацию всех квестов. Обычно это делается в статическом блоке или методе init, где происходит инициализация квестов. В этом блоке добавьте строку, которая будет регистрировать ваш квест: # N$ c) }5 R9 p' v $ }" a. H2 k: ~1 a- m& d3 a9 W3 s
/**/ K4 s+ c9 b& v, u
* @author NosBit! B0 @. P+ P, Y0 @5 P B
*/ 8 T2 M+ E+ I; Z0 x6 K; h$ u
public class QuestMasterHandler 3 p$ }/ t8 v& p' u
{5 p. U! h B& e. f: M
private static final Logger LOGGER = Logger.getLogger(QuestMasterHandler.class.getName()); , |. o9 C0 d2 T/ e
& g% I+ _2 k- V6 J& \# s% M7 P
private static final Class<?>[] QUESTS = , C4 _: b9 F7 v9 @" F
{
Скопировать код
Проверка: Убедитесь, что идентификатор вашего квеста (в данном случае Q98765_NewQuest.class) уникален и не конфликтует с уже существующими квестами.+ f! m; ]" U% V' ?7 }7 A
* Y0 M$ W- L; T! P7 J3 y
( d! g5 t% {2 Y3 q, M! [Файл QuestName-ru.dat используется для описания квестов и содержит различные параметры, которые задают характеристики квеста, его цели, награды, ограничения и т.д. , j) a- I O9 V3 eДавайте разберем все поля на основе примера: r$ B9 l& T- X" r7 j9 }4 n, K
6 _, e5 Z; w# x* M
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 2 B! v# g) G4 o0 V8 _: n; w
Скопировать код
Поля данных:
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 — завершение записи для квеста. & m$ _, M6 h2 s$ q( v4 P) B% ?
' E2 U7 A1 ]/ n) ?: D$ j" Y! y6 Y6 \% T. @( g- p& O
Файл клиента QuestMarkConditionData.dat содержит информацию о квестах, связанных с условиями, необходимыми для активации или завершения определённых действий в игре. 0 ^; B2 ` ~+ r0 s$ t! h3 V
Пример соодержания/ K5 w6 d, X8 A/ a: ^ R5 a
Вот описание структуры строки: 3 @7 z7 y2 v6 E8 z( _! V
Давайте разберем все поля на основе примера: 6 q) ^: ?2 f% h* Z5 T I. z' v3 N8 K% f" X
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: Указывает на конец записи о квесте. A, |8 b, R3 K/ ^' R
Эта структура помогает клиенту определять условия, при которых игрок может начать или выполнить квест, а также идентифицировать необходимые взаимодействия с NPC. 6 r" ?3 c- L! `: v) }4 Z0 R$ q8 g1 ^1 o
3 j E3 u3 h! S5 S& X& W X2 N( {7 i/ ~+ i3 g% C
Следующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов. : m H7 T% _1 j# N5 Q, u, D5 a* f, j) J2 m3 M9 ] Шаг 4 " t: l- U- i u2 zДля того чтобы добавить свой квест в файл NewQuestData.xml, нужно следовать структуре, аналогичной приведенному вами примеру. Вот как это может выглядеть:: C" R \# b0 l% {+ G. K1 h- S5 c
Пример добавления нового квеста:; z7 M n& h! q c% u- R
<quest id="20001" type="1" name="Mystery of the Lost Relic" startNpcId="30050" endNpcId="30051">7 g3 \" X Y7 _. \ Y8 v, K
conditions: Условия для начала квеста.& T' V7 h7 s: G" ?/ w
preQuestId: ID предварительного квеста (если есть).
classIds: ID классов или рас, которым доступен квест.) D" ^6 R# |3 i I( @ Q
rewards: Награды за выполнение квеста.! e7 ~% s0 [! V. B
rewardLevel: Минимальный уровень для получения награды.
rewardSp: Количество опыта (SP).
rewardItemId: ID предмета (например, Adena).
rewardItemCount: Количество предметов.: ]$ i5 P8 C/ c
goals: Цели квеста. # y6 Z8 _4 e+ z. m8 o1 u
goalCount: Количество монстров, которых нужно убить или предметов, которые нужно собрать.
goalString: Описание цели.
goalItemId: ID квестового предмета (если требуется).
goalItemCount: Количество квестовых предметов для завершения цели.* T7 W* U5 T$ r" s V
После того как вы добавите квест в файл NewQuestData.xml, нужно перезапустить сервер, чтобы изменения вступили в силу. , F% m8 Z- Y. o" k. M& P) c# p8 y8 ~. o2 t7 t Шаг 5 " V7 ^; b5 z" B% fФайл NewQuestDialog-ru.dat используется для хранения диалогов, связанных с квестом. Он определяет тексты, которые отображаются в окнах диалогов с NPC во время выполнения квеста. Вот разбор ключевых элементов строки и структура файла: 6 o! n4 D" W2 HСтруктура данных
NewQuestDialog_begin — начало записи квеста в файле диалогов.
QuestId=10001 — идентификатор квеста (должен соответствовать ID, который ты используешь в других файлах).
Text0=... — первый диалог, который обычно отображается при старте квеста.
Text1=... — дополнительный текст, который отображается на различных этапах квеста.
Text2=... — текст, который отображается после выполнения определенных действий (например, после выполнения части задания).
Text3=... — дополнительный диалог, например, при встрече с NPC на следующем этапе квеста.
Text4=... — финальный текст или инструкции по следующему шагу для игрока.
NewQuestDialog_end — завершение записи для этого квеста. ! H; B$ j; Y9 W, X6 o
6 `, W' l! `1 R9 m' [8 WПример записи для нового квеста (ID 98765) Если ты хочешь создать диалоги для нового квеста с ID 98765, твой файл может выглядеть так:. U( [; r2 p* B! r
NewQuestDialog_begin QuestId=98765 Text0=[Вы готовы принять новый вызов и доказать свою силу?] Text1=[Как вы себя чувствуете? Вы выглядите уверенно. Это хороший знак, но не расслабляйтесь — впереди много испытаний. Примите это задание, если готовы.] Text2=[Пора приступить к тренировкам. Идите за мной в тренировочную зону.] Text3=[Следуйте моим указаниям, и вы раскроете весь свой потенциал.] Text4=[Поговорите с Дарти. Кликните на него и начните диалог.] NewQuestDialog_end7 x @" N8 l% s# S; v
Скопировать код
Разъяснение полей:+ [1 V) \; ?7 a6 ~) \
QuestId=98765 — уникальный идентификатор нового квеста.
Text0 — вводный текст квеста. Отображается при первом контакте с NPC.
Text1 — дополнительный диалог, который дается игроку для создания контекста.
Text2 — текст, который отображается на следующем этапе квеста, например, после выполнения части задания.
Text3 — описание следующего шага или инструкции для игрока.
Text4 — финальный диалог или текст с указанием цели (встреча с другим NPC).4 s9 e6 A5 _; s1 X
# K- J- k8 |' T! |! F( c& M" B X4 r* J
3 C2 c- f ^5 W& I! J
Что можно изменить:
Тексты диалогов (Text0, Text1 и так далее) можно адаптировать под конкретные ситуации в квесте.
Количество текстов можно варьировать в зависимости от сложности квеста.$ f1 |5 X7 D3 J3 d' M1 k: }
3 s( }$ _1 H4 o% z1 RФайл NewQuestData-ru.dat содержит параметры, связанные с квестом в игре Lineage II, и описывает условия, NPC, цели и награды. Рассмотрим параметры этого файла: % o& I$ s: Z3 J* r* j3 `, i7 p+ {- D
newquestdata_begin / newquestdata_end: Эти параметры обозначают начало и конец блока данных квеста.
quest_id=10001: Уникальный идентификатор квеста (ID). В данном случае это квест с ID 10001.
Первое значение указывает минимальный уровень, второе — максимальный уровень.
{0;0} означает, что нет ограничений по уровню.; J5 I( w: w& Z9 q- p
pre_quest={}: Предварительный квест, который нужно выполнить перед началом этого квеста. & F# v j6 M$ f7 Y- m! t
В данном случае он пустой {}, что означает, что нет предварительных требований. ; u8 r3 @% N( S4 ?
class={0;10;18;25;31;38;44;49;53;123;124}: Классы или расы, которые могут брать квест. 9 v% H+ K( D$ b7 i' s
Номера классов указывают на те классы, которым доступен этот квест. В данном примере классы, такие как 0 (человеки), 10 (рыцари) и другие, имеют доступ.7 E9 ^' k0 n: c/ d
quest_item=82948: ID квестового предмета, необходимого для выполнения цели или этапа квеста. B6 E& {2 m! D. P: z
В данном случае это предмет с ID 82948. 3 B( {2 K5 ~( P* ]
start_item=0: Предмет, который выдается при начале квеста. % g' _3 Y* y6 w( \) `- A
Значение 0 означает, что предмет не выдается. r* g* W. Y% D5 r
start_npc=34505: ID NPC, у которого начинается квест.
start_npc_loc=1002: Локация NPC, у которого начинается квест. , J/ q; _ ]* I6 z
Это ID локации, где находится стартовый NPC.$ q9 ^) j8 u+ K' @
end_npc=34696: ID NPC, у которого завершается квест.
end_npc_loc=1003: Локация NPC, у которого завершается квест." K9 `& ~; K- W8 e, J5 r( D& d
Это ID локации, где находится конечный NPC.6 |0 c9 [, L2 @2 x
quest_loc=1003: Основная локация выполнения квеста., m u$ S; J4 I+ N+ W( ~
Это ID зоны, где нужно выполнять основные задачи.# Z# `4 }) u: o: d
goal_string=[Дарти (Зона Тренировки)]: Описание цели квеста.$ w8 z7 O" N7 h! Q/ B5 w+ h4 @! S
В данном случае цель связана с персонажем по имени "Дарти" в Зоне Тренировки. / _* W% k5 I" N- @% K& Z
goal_num=1: Количество действий, необходимых для выполнения цели (например, убийств монстров или сбора предметов). 4 H }0 |' L7 d. _$ P0 C
В данном случае нужно выполнить одно действие (1).6 V7 _ n5 A3 V- L
reward_level=65535: Уровень, при котором можно получить награду.; o! i- E' d! V& m+ P8 x$ C7 P6 ~
В данном случае это максимальное значение, указывающее, что награда доступна всегда./ G% H1 M) P* |: A
reward_exp=0: Опыт (EXP), выдаваемый в качестве награды./ S, m2 [+ ^$ N( J
В данном случае опыт не выдается.0 @ U$ d3 F6 o. E3 b, \
reward_sp=0: Количество SP (Skill Points), выдаваемых в качестве награды.$ I( k7 P' v7 w/ R; o
Здесь тоже 0, значит, SP не выдаются.8 c: c# b/ K1 E m/ ^
reward_item={}: Наградные предметы.3 Q) @) o- B$ g" H, O b! t+ i
В данном случае наградные предметы отсутствуют.' h* u9 X1 X1 L% i
Этот файл определяет основной функционал и настройки для конкретного квеста в игре. 0 M! U1 l; |( `; J 2 U/ z j% ?: ], z# w# F, q _ 7 F/ K6 X' Z& O2 ^* e6 i# C% k4 ]3 E) ?2 g& y2 X" T; d6 x