Название: Создание квестов L2j_Mobius [Версия для печати] Автор: admin Время: 2024-9-24 00:52 Название: Создание квестов L2j_Mobius Сборка: L2l_Monius 7 |+ K: B* f- b4 x3 s- vСледующие квесты можно использовать в качестве шаблонов для создания практически любого простого квеста go kill или go talk. " {+ K% r9 }/ x! h: r, I 5 O6 w+ b" A% n* [% ]# ^7 K 7 e4 {7 p, R kИди и убей X монстров / Возвращение - награда.2 }6 K' k3 [0 [1 T: z( i
Q00529_RegularBarrierMaintenance- m' }/ V3 }1 Z3 q
7 ^# x T/ G( a3 p# M
Получите квест от любого из двух разных NPC / Убейте X монстров / Вернитесь с наградой. ) a9 C4 G0 t( r/ C& h7 F. a! sQ00683_AdventOfKrofinSubspecies " y& v! s; E+ M4 q/ F ; c' o" s+ }9 D# SПоговори с NPC 1 / Поговори с NPC 2 / Поговори с завершающим NPC / Награда. 5 m" D# J4 v; T: r/ h8 ^Q10516_UnveiledFafurionTemple8 ~) Y) d# O. H6 J
% Z- \* }& P+ T9 _Убейте X монстров, а также соберите X предметов / Возврат - награда.' u9 _5 s v* S# X
Q10517_FafurionsMinions q) }6 S$ I+ i$ Y4 M! E
) s1 G) s8 A" M3 Z* Y# I" y
Иди собери X капель монстров / Вернись - убей X монстров / Вернись - награда.- v1 \- J6 `1 B
Q10529_IvoryTowersResearchFloatingSeaJournal ! ~# p8 ?/ T3 J ( t/ W! i1 \1 D/ U9 b2 p6 s: aИди убей X монстров, а также собери X предметов / Возвращение - иди собери X предметов / Возвращение - награда.9 g% L8 T. H; I6 i! m4 y! P' b
Q10518_SucceedingThePriestess * ~, ^1 ^2 \! v7 [" \$ Q , e' [1 q6 d A c& g" C6 HУчаствуйте в убийстве рейдбосса / Возврат - награда., a1 x" L. Z j3 s
Q10519_контролирование вашей температуры ( H- S: W5 s3 v4 I" o 3 |. A) g( p6 qПоговорите с NPC 1 / Примите участие в убийстве рейдбосса / Возвращение - награда. - p/ Z/ k1 E3 h. Z1 IQ10533_OrfensAmbition 2 W8 Y1 f- I" K) \( C2 }7 d 0 N( c( {' w! p: I% T, a- x % m+ w7 s( E" U2 {0 B* S1 n+ d7 u8 \. ]/ K. h; I/ Z Руководство требует обновления. И, к сожалению, с самыми последними хрониками вы не сможете избежать модификаций клиента. Поэтому, исключительно в образовательных целях, я предлагаю свой опыт по добавлению нового квеста!' n. A" z0 z; Z! u4 m& O: e7 T7 L 0 }- X( @- @8 T6 P, f- E5 JШаг 1: Создайте свой квест с уникальным ID. В этом примере я буду ссылаться на квест как "Q98765_NewQuest".1 z5 U% n" W$ E$ k
: O% X' Z* d% c Шаг 2: Когда вы успешно создали свой квест и Eclipse не выдает ошибок, добавьте название квеста и импортируйте его в файл "QuestMasterHandler.java".1 y9 P1 C5 I+ u4 M2 F @* z2 ^
; B; j& h3 b1 q+ P Шаг 3: Перейдите в клиент и с помощью редактора клиента добавьте квест в следующие файлы .dat: "questname-ru.dat" и "QuestMarkConditionData.dat".* B* t$ _5 n' s0 {" _/ p' r0 v! D
1 s- w8 B5 o! p7 o; p
Следующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов. 1 l9 g6 [5 E$ G. w! o' ~+ k8 [: i. ~9 U$ l" e2 ~; G2 Z# \" T0 I Шаг 4: Найдите в серверных файлах файл с названием "NewQuestData.xml" и добавьте туда свой квест. ; Q5 ?+ {( n( x. [9 E7 Z# M1 `5 j3 m5 V- V% t$ |) e! S Шаг 5: Найдите в клиенте следующие файлы и добавьте туда свой квест: "NewQuestData-ru.dat", "NewQuestDialog-ru.dat" и "NewQuestNpcPortrait.dat".% n3 k4 L- p- j5 h
" y( I1 [3 X+ ZЕсли я что-то забыл, не стесняйтесь исправить меня. Это руководство создано исключительно в образовательных целях.5 l, B# K% l8 g0 y9 C _
* A: M7 S0 f9 Q2 G# u7 L Шаг 2: ^( Y# g6 L; {0 ]
* S2 E& W; [1 r. v; X
Следующий шаг заключается в добавлении вашего квеста в QuestMasterHandler.java. Вот общий план: * j4 a9 l0 f/ G4 h/ W1 ]" |% G$ I% M+ h, b' l0 V8 c W 1. Импорт вашего квеста: В начале файла после всех существующих импортов добавьте строку, которая будет импортировать ваш квест. . V% n. S1 E4 e' q6 F P# J0 W
Например: 2 b3 W6 e) c! [4 u" q6 b & Z: L3 ?9 T; v8 \
import quests.<span style="background-color: rgb(255, 255, 255);">Q98765_NewQuest</span>.<span style="background-color: rgb(255, 255, 255);">Q98765_NewQuest</span>; / T9 Z* X; P D
Скопировать код
1. Регистрация квеста: Найдите метод, который отвечает за регистрацию всех квестов. Обычно это делается в статическом блоке или методе init, где происходит инициализация квестов. В этом блоке добавьте строку, которая будет регистрировать ваш квест: ' B% V( k" J- k+ w3 A' w 6 b8 T. l. r6 ~% g) n: g
/**6 l+ L: r3 S* z
* @author NosBit , V J3 Y6 n/ g" S. c/ x7 n! i
*/+ e9 f/ F1 }6 P+ T
public class QuestMasterHandler ! R# y5 C. Y+ |- r5 z E
{2 `$ m2 q6 ]9 q% U: o/ k7 X: z* Z) K
private static final Logger LOGGER = Logger.getLogger(QuestMasterHandler.class.getName()); " G. P3 i: n! k, O) X( M
. l# S( G- Z- a7 F0 C
private static final Class<?>[] QUESTS =, b- j% e. W7 |; F/ F
{
Скопировать код
Проверка: Убедитесь, что идентификатор вашего квеста (в данном случае Q98765_NewQuest.class) уникален и не конфликтует с уже существующими квестами. ; ^1 P5 N; p8 j1 s0 e1 j5 e& O- P5 i $ r# F3 ~6 S9 |6 d% M9 x5 q1 A; r4 W, o( \( P* @ Шаг 3:% m% B2 h1 E; F! i5 i
+ |7 k W) x0 K. e% WФайл QuestName-ru.dat используется для описания квестов и содержит различные параметры, которые задают характеристики квеста, его цели, награды, ограничения и т.д. 6 X, S- \9 O9 x$ h8 e U" `Давайте разберем все поля на основе примера:/ ?: E1 Y4 p9 j9 f
5 r) p/ s1 l* x7 w, D* b
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 . o' ` ^- h v4 A7 ?. A2 l8 W) j
Скопировать код
Поля данных:
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 — завершение записи для квеста.$ E' `5 C+ M. P2 s
% k) A8 J0 d4 P) S5 | + X B8 F1 t" n0 A/ ]% dФайл клиента QuestMarkConditionData.dat содержит информацию о квестах, связанных с условиями, необходимыми для активации или завершения определённых действий в игре. - I) r( C! g {9 OПример соодержания8 m: @9 C: x+ ?. K9 i1 }6 r
Вот описание структуры строки: - C/ g0 o' U& g) u# i: c
Давайте разберем все поля на основе примера:9 j1 u# w9 s& }' h
6 F/ ?2 x- y; G! a8 i9 B- 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: Указывает на конец записи о квесте.; Q7 I9 }, z' R& w# D" y3 R
Эта структура помогает клиенту определять условия, при которых игрок может начать или выполнить квест, а также идентифицировать необходимые взаимодействия с NPC.+ f. r X) L) N+ L
! i1 J0 }( p" ]$ ?, @; n
( E7 W, ?7 V/ x1 A: m2 h, r; N4 S
6 C( F/ M' _8 N8 Q; O. I5 _5 f7 v; l! HСледующие шаги относятся к любым новым хроникам, которые используют всплывающие окна квестов. 2 T9 U+ E7 S1 y4 }* j( e/ R. \6 H& Z) i( q Шаг 4# G9 ?- S& ]$ v
Для того чтобы добавить свой квест в файл NewQuestData.xml, нужно следовать структуре, аналогичной приведенному вами примеру. Вот как это может выглядеть: . B3 t4 S) i7 T! E0 \Пример добавления нового квеста: + D# q) N1 }9 u$ ], M
<quest id="20001" type="1" name="Mystery of the Lost Relic" startNpcId="30050" endNpcId="30051">) K& v; p% a) P' A
goalCount: Количество монстров, которых нужно убить или предметов, которые нужно собрать.
goalString: Описание цели.
goalItemId: ID квестового предмета (если требуется).
goalItemCount: Количество квестовых предметов для завершения цели.4 u- _, A" }& [7 d
После того как вы добавите квест в файл NewQuestData.xml, нужно перезапустить сервер, чтобы изменения вступили в силу.9 g v: U' w$ T/ f+ T
3 [' s! J. ~ ?( ^/ h- S Шаг 5 % \3 n# G8 G7 \: P1 E' q. uФайл NewQuestDialog-ru.dat используется для хранения диалогов, связанных с квестом. Он определяет тексты, которые отображаются в окнах диалогов с NPC во время выполнения квеста. Вот разбор ключевых элементов строки и структура файла: + l/ q1 o2 _3 N( ]Структура данных
NewQuestDialog_begin — начало записи квеста в файле диалогов.
QuestId=10001 — идентификатор квеста (должен соответствовать ID, который ты используешь в других файлах).
Text0=... — первый диалог, который обычно отображается при старте квеста.
Text1=... — дополнительный текст, который отображается на различных этапах квеста.
Text2=... — текст, который отображается после выполнения определенных действий (например, после выполнения части задания).
Text3=... — дополнительный диалог, например, при встрече с NPC на следующем этапе квеста.
Text4=... — финальный текст или инструкции по следующему шагу для игрока.
NewQuestDialog_end — завершение записи для этого квеста.5 B0 b! g9 d' b2 T. G
0 O' W( I7 X# ]; s) W4 B& E! o% PПример записи для нового квеста (ID 98765) Если ты хочешь создать диалоги для нового квеста с ID 98765, твой файл может выглядеть так: 4 I5 Y6 C% g* P& R" F
NewQuestDialog_begin QuestId=98765 Text0=[Вы готовы принять новый вызов и доказать свою силу?] Text1=[Как вы себя чувствуете? Вы выглядите уверенно. Это хороший знак, но не расслабляйтесь — впереди много испытаний. Примите это задание, если готовы.] Text2=[Пора приступить к тренировкам. Идите за мной в тренировочную зону.] Text3=[Следуйте моим указаниям, и вы раскроете весь свой потенциал.] Text4=[Поговорите с Дарти. Кликните на него и начните диалог.] NewQuestDialog_end& v s: T0 E6 |$ p+ E! R5 Q; a
Скопировать код
Разъяснение полей:8 N# N% o; D0 F' ^
QuestId=98765 — уникальный идентификатор нового квеста.
Text0 — вводный текст квеста. Отображается при первом контакте с NPC.
Text1 — дополнительный диалог, который дается игроку для создания контекста.
Text2 — текст, который отображается на следующем этапе квеста, например, после выполнения части задания.
Text3 — описание следующего шага или инструкции для игрока.
Text4 — финальный диалог или текст с указанием цели (встреча с другим NPC). ! W0 H) r7 n) |6 u) Z1 G
' q/ ]# x- p' L+ G
4 ~3 M/ A; M3 N5 i1 g( H3 K
Что можно изменить:
Тексты диалогов (Text0, Text1 и так далее) можно адаптировать под конкретные ситуации в квесте.
Количество текстов можно варьировать в зависимости от сложности квеста.$ I5 f$ l0 H$ G4 L |+ `
`! [9 y. C# V6 WФайл NewQuestData-ru.dat содержит параметры, связанные с квестом в игре Lineage II, и описывает условия, NPC, цели и награды. Рассмотрим параметры этого файла: , Y0 m: N" ]4 L, v ) i; e7 D9 G( k* z" P1 g. a
newquestdata_begin / newquestdata_end: Эти параметры обозначают начало и конец блока данных квеста.
quest_id=10001: Уникальный идентификатор квеста (ID). В данном случае это квест с ID 10001.
quest_type=1: Тип квеста. - w4 V7 n/ u) ~( R% q
1 обычно означает стандартный квест.6 a: M1 _5 H! L* a+ ]4 v# t0 ^% \0 s
quest_name=[Новый путь]: Название квеста. Здесь указано "[Новый путь]" — это имя, отображаемое в игре.
quest_level={0;0}: Уровневые ограничения квеста. ' u1 C# }3 p! i+ F% C' {1 c
Первое значение указывает минимальный уровень, второе — максимальный уровень.
{0;0} означает, что нет ограничений по уровню.- f5 ]! _7 A* R0 l
pre_quest={}: Предварительный квест, который нужно выполнить перед началом этого квеста. H4 m- z/ n% ^+ P8 s2 X+ ]
В данном случае он пустой {}, что означает, что нет предварительных требований. , s4 U) J# e9 R
class={0;10;18;25;31;38;44;49;53;123;124}: Классы или расы, которые могут брать квест.- U+ Z9 U( n6 T
Номера классов указывают на те классы, которым доступен этот квест. В данном примере классы, такие как 0 (человеки), 10 (рыцари) и другие, имеют доступ. ! P5 R$ H. |* T; E7 M
quest_item=82948: ID квестового предмета, необходимого для выполнения цели или этапа квеста. / t0 I x) Q1 ^$ y
В данном случае это предмет с ID 82948.9 `1 d6 @4 B) R/ X6 f* I
start_item=0: Предмет, который выдается при начале квеста.9 K! w$ _/ f$ o( e" F
Значение 0 означает, что предмет не выдается. ) T, N# }3 h* i, @4 d$ K
start_npc=34505: ID NPC, у которого начинается квест.
start_npc_loc=1002: Локация NPC, у которого начинается квест." B$ \# O+ ^; Z
Это ID локации, где находится стартовый NPC. `, s6 ^0 `0 p( V
end_npc=34696: ID NPC, у которого завершается квест.
end_npc_loc=1003: Локация NPC, у которого завершается квест.! h% }7 q, c. _! @
Это ID локации, где находится конечный NPC.' J! L1 @ O5 M0 H
quest_loc=1003: Основная локация выполнения квеста. 8 N$ u# f5 T* ]8 h+ O+ [" `
Это ID зоны, где нужно выполнять основные задачи.# k: h7 i, ]% `0 C0 i- p- r3 S
goal_string=[Дарти (Зона Тренировки)]: Описание цели квеста. % C* s/ a/ x: l1 f" E9 y! ^! K) H7 O
В данном случае цель связана с персонажем по имени "Дарти" в Зоне Тренировки.3 v. u+ T5 E2 U" E7 h+ O
goal_num=1: Количество действий, необходимых для выполнения цели (например, убийств монстров или сбора предметов).: a) q" l. L- g" y5 F5 t
В данном случае нужно выполнить одно действие (1)., b1 ?7 L2 E- ]/ T: }* i
reward_level=65535: Уровень, при котором можно получить награду. # m- r; r+ Q5 F, p
В данном случае это максимальное значение, указывающее, что награда доступна всегда.6 s6 |8 o$ D1 U& y e2 p- P
reward_exp=0: Опыт (EXP), выдаваемый в качестве награды.' C# |3 f) t* P/ y3 `8 U2 m
В данном случае опыт не выдается. 6 u2 k& Q8 T+ m# ~
reward_sp=0: Количество SP (Skill Points), выдаваемых в качестве награды.: y* t+ _( O1 C- Q9 H# j% X& _
Здесь тоже 0, значит, SP не выдаются. 3 Z5 C, d, T# V
reward_item={}: Наградные предметы. % U: |! V( f. V. q3 f' M
В данном случае наградные предметы отсутствуют.9 b) V) X- ~! A4 V
Этот файл определяет основной функционал и настройки для конкретного квеста в игре. 2 {. I1 |4 G2 C4 q / P" C7 `6 c5 Y8 O+ w/ L 8 u" ]' r. F; c: T2 m/ p& F: S4 H. o+ f
3 n. J6 t7 D, }- H* I, x8 ?
2 O( i1 [- y' K" O, i+ S# I. r0 W! L; O8 o
- o; `" n# b: P: i3 I : B/ v) m+ h( B6 R; v7 D7 B3 i 2 |. s6 h4 o, N f1 z. M- c ) {8 J2 x' v, V- R
Добро пожаловать artace.ru - творческий сектор (https://artace.ru/)