Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius9 ]; g/ ?, |" @8 H& W
' P# e5 ` h6 }" \+ N
Разбор файла QuestManager.java0 \8 y" m( {5 e1 f0 ~! h$ F
% W" `2 Y, Y/ I/ H
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.# a1 ~# _" s0 c% ~9 F: p. x
Основные элементы
" I4 a5 Z$ Z" h6 g i) e- Лицензия
" {& ]4 ?+ B5 `7 ^& i8 Z- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.6 ?. K; {, }# I% d; ?; W) O8 Q, [
- Импорты
, i, h J1 N/ U* w. l4 L+ a
; }7 P; { X Z) _# h8 k4 rQuestManager.java — управление квестами и скриптами.
% i/ y* ~4 H- j! w* C" \1 Q2 L oПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\5 \% n) B0 c% }- J& @& ]" ?/ s
( J$ i% f3 |8 U, }
! Q( e/ a1 S' B. E( ZДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.! v. G6 s' G5 n- u6 T$ N
1. Лицензионное соглашение
- L6 N& s( e& H' A* S- /*
/ R9 u! z% k& A2 Q - * Этот файл является частью проекта L2J Mobius.
: Y5 C" Y) ?/ a' x - *
9 j) G) H% z! M: c8 F$ k - * Эта программа является свободным ПО: вы можете распространять её и/или изменять/ G/ f! B0 I- O+ Z
- * её в соответствии с условиями GNU General Public License, опубликованной R3 C- e# K6 \9 Y
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии." w" U( C) u$ H% O% j! B
- *
( ^% T) ~! y- C# y. Z! N - * Эта программа распространяется в надежде, что она будет полезной,
, N# m: [! A4 f f, J - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии5 _, {* d: ~; |8 Y; L/ P
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
- _/ N, L0 O! ]* {: b& T, Y$ Y0 o. n - * См. GNU General Public License для получения более подробной информации./ Y" T1 A. D& ~, C! h: m
- *
( T: M) e2 f( x2 q2 L6 G/ v - * Вы должны были получить копию GNU General Public License7 J8 M! ]/ X1 B3 f2 E& v( Y
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.$ ?( Z; S& P: G2 U) S0 I3 R5 p. N t
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.# m& _( ?9 x! ?: @$ P, y( [8 i
. X& z | [6 y3 }( \5 B$ O& T5 W: v. Y
2. Импортируемые библиотеки& B- C& i4 L; G/ ~7 _
4 Z! a* v8 b( a* j6 t- package org.l2jmobius.gameserver.instancemanager;
* K% o. w* l4 @1 M - ; Q: M/ V( ~- V2 E; L% H& k3 i
- import java.util.Map;2 p/ n9 {2 h/ B: B$ A- k
- import java.util.concurrent.ConcurrentHashMap;" l2 Y& [& O8 `
- import java.util.logging.Level;
) t' P8 [+ T) b% | - import java.util.logging.Logger;
% X9 q9 @: T9 K/ o7 P# m, ? - ' m- w/ X3 u9 S+ y. U/ R4 C; s
- import org.l2jmobius.Config;' t# d% R- i j6 c, q- i
- import org.l2jmobius.commons.util.CommonUtil;
. G6 I" |) U( w/ b - import org.l2jmobius.gameserver.model.quest.Quest;0 z5 D: Y, v3 @+ O# \3 ~
- import org.l2jmobius.gameserver.scripting.ScriptEngineManager;
Скопировать код java.util.Map — интерфейс для работы с коллекциями, которые сопоставляют ключи со значениями.java.util.concurrent.ConcurrentHashMap — потокобезопасная реализация карты для использования в многопоточных приложениях.java.util.logging.Logger — класс для логирования информации (вывод сообщений в консоль или лог-файлы).org.l2jmobius.Config — класс конфигурации сервера.org.l2jmobius.commons.util.CommonUtil — утилиты, которые могут использоваться в различных частях программы.org.l2jmobius.gameserver.model.quest.Quest — базовый класс квеста, представляющий игровой квест.org.l2jmobius.gameserver.scripting.ScriptEngineManager — менеджер для работы с игровыми скриптами.
( B# X: f' s$ o1 D
- q3 x% y! G! Z* I" K7 E8 ~3. Описание класса QuestManager
9 _2 w% T* p; Y' |8 A- /**( D( a+ T- Y6 R" ^, J+ h3 d% r
- * Менеджер квестов и скриптов.' \% f9 k. s) C) o$ ^( E& O% u: Q5 l
- * Автор: Zoey76
8 O, E& a/ e) { - */- W* i* V) }1 w: v& o& u
- public class QuestManager: m b8 x: \# e9 F+ @+ w
- {
4 v8 G$ l: P/ m% T/ F9 V- j - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());% }4 Q3 b: @0 ^+ E$ X7 R, g: }
- * Z+ H* ~8 d: r) Q8 o' J
- /** Карта, содержащая все квесты. */
4 K# T) k! ^0 r5 u) O. J - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
. A& Y! h; i& J4 ]( z - /** Карта, содержащая все скрипты. */
5 ~ j) r7 k3 ] I# E$ Y - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();7 o4 J) L0 q7 [9 `8 \) g
- ' _# ^. G' l4 p
- protected QuestManager()4 \: k+ T7 C+ d3 x2 Q4 E
- {
9 h2 g5 p$ M2 ]5 ? - }5 P' H, ?3 S6 `4 w7 f5 w* x2 w
- }
Скопировать код 4. Методы
7 @& Q. i7 A, P" s% I6 |0 XМетод reload(String questFolder)
; s" \1 k9 K/ K6 p- public boolean reload(String questFolder)2 x1 {9 v) A7 j G
- {* T: v0 n P b$ ~" D+ E% \! x
- final Quest q = getQuest(questFolder);" ^/ ~$ N8 G4 ^- g( Q4 U
- if (q == null): ]+ f, E' a1 }* K
- {/ h2 O- e) m: C9 }8 L- I5 y
- return false;
/ P( _4 [/ ]; I) | - }
' ]$ J1 O3 ^4 O - return q.reload();
! C2 f! B9 `) W - }
Скопировать код
1 N3 w) c3 i# i. D' {+ z" ?& X' c- l
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
) ?, \9 x& R( F( X2 _+ XМетод reload(int questId)9 v+ r( V V& g* F! O4 P
4 O6 h+ M* ~( {! W
- /**
4 m% h' I* t4 ^3 N, J1 C - * Перезагружает квест по ID.
& M& j) s+ i0 b - * @param questId ID квеста для перезагрузки/ e |9 @% z6 \
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае" g) v4 H% z6 J0 h/ O" y
- */
0 k8 {" G$ `; H: \ - public boolean reload(int questId)
- t/ }8 Z% {6 h8 k- B - {
5 z9 f2 Z4 p. {, u7 Q; W - final Quest q = getQuest(questId);
" w$ v. V# Y& I% ~. B+ }0 X - if (q == null)
0 C# |3 M- j& H; U- f; M1 V - {% e, \3 v+ V$ y' l* _9 Q0 X" w
- return false;
2 |- A, V/ o# b9 M; t - }
* V" y: `* ]6 x7 } D - return q.reload();
4 t ~5 Z! ^( {2 _2 v$ i3 b - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
: U S7 ?3 R. Y6 f9 ^0 k( H
, T& H. O2 r i6 ^0 C( x% xМетод reloadAllScripts()& o/ v& f+ M/ m+ I {% X
" w' }$ K- b8 U! \- /**
# ^5 s3 U/ S% D - * Выгружает все квесты и скрипты, а затем перезагружает их.3 W+ p; h' O- w Q
- */3 p* `/ c, s9 }
- public void reloadAllScripts()
3 C5 s. e) Z5 m - {
5 @8 F% c5 d$ O7 k% `/ B - unloadAllScripts();
8 D9 x: _! T) f4 l5 y7 D1 N7 o - 1 A4 k2 b3 q* ]6 K% ~2 y/ ^/ }. N
- LOGGER.info("Перезагрузка всех серверных скриптов.");
; H( H% ~7 E- p) } - try
3 n0 T9 W" o" C - {6 N2 }: S) e. B8 p- t1 J/ a8 J
- ScriptEngineManager.getInstance().executeScriptList();) w9 m$ \8 j5 | k$ K9 N" z
- }$ B# C7 E3 N; G4 f: i: c
- catch (Exception e)% D& u" c$ {+ J8 r
- {
; j+ }0 Q9 S' a1 g g4 F! o - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e); f$ ^( p x% ]5 o7 @
- }1 C1 |& Y9 T k7 F
-
* U# l& P9 R. H% M, D4 P1 X - getInstance().report();) |3 ~: b/ | i6 M5 w. f- a' ^, s
- }
Скопировать код Метод unloadAllScripts()
) }9 n/ T% m8 E% q& |8 o7 c2 \* X
- /**
7 c$ N# M# ?" U& I: N# o; [ - * Выгружает все квесты и скрипты.
: o( q: {, D# M: m - */
9 j/ F. X% [/ [8 g7 H - public void unloadAllScripts()
! @, V# n8 R, ]8 ]: q7 M - {
: d& O4 _0 w9 Y' { - LOGGER.info("Выгрузка всех серверных скриптов.");
" q/ x# M0 L$ W. J5 J - : N8 d# Q p* r* s5 e }
- // Выгрузка квестов.$ r# K2 P1 q% t
- for (Quest quest : _quests.values())
( q. x/ L0 o+ c5 U7 y) E - {
3 k0 [: S+ m- w" V - if (quest != null)
8 }! i0 n; n5 L% U - {. h& @0 s" k8 }: o' K* Y
- quest.unload(false);
/ `1 W; d# B- A - }3 L! ^& Z* t5 E. G+ ?0 ?
- }
0 W, h% a) s# g - _quests.clear();' A" B3 \" B* y
- // Выгрузка скриптов.* f: x* R" d7 u
- for (Quest script : _scripts.values())5 r1 j8 k5 e" P- J" B4 u
- {
, c1 L" w2 g4 s - if (script != null)% B, `% i9 m0 u. w1 a& V# J5 z
- {
. t. W% k+ I9 E9 }6 E, M( H - script.unload(false);9 s! D/ ^7 I. E7 M% y% ?* _' @ O
- }
4 c" q" B D* Q& x: g& I - }
^9 K7 B$ O9 E7 `1 k - _scripts.clear();% i6 s" @+ b8 k F* T% A' v+ y
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.( q0 H2 A5 B" o
3 U& t2 d6 G3 S/ s, k" Z% Q4 }1 y
Метод report()
& ]6 W! H# G1 T+ s: N: T
, a$ I( w. C4 y9 w/ h- /**! K: W' q, E8 _2 b! |
- * Логирует количество загруженных квестов и скриптов.6 z" W% _) o4 G
- */) ~- k. T8 j+ M/ D/ n' c# L
- public void report()
, {' Y6 S8 B# G& ~5 R/ v& a - {. X0 h$ o3 }0 g6 R; t5 `
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");7 v% n* o/ p# b( O5 w
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
, I7 m0 P6 K( O) X% [ - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.) \$ s2 ?$ A7 l1 L, \9 ~- E
6 @/ R9 B0 j% s5 Q! mМетод getQuest(String name)
1 J. L. E; j$ ]; W! s+ ~* S4 Z$ L6 h. @1 m' E. C6 E7 e5 |6 s6 u! T
- /**% w8 a1 a4 S& n; c2 P
- * Получает квест по имени.
, ^6 ?6 \$ O6 ?& Y, d. g - * @param name имя квеста- z _5 ~+ G$ @# e& @
- * @return квест
4 T2 j( |( _9 u' O6 G% O1 ^ - */. r- _' b$ C c
- public Quest getQuest(String name)+ C( ?& G* n7 G( P) V- O
- {
5 T$ b4 X: _! z* r' D% r" G8 K - if (_quests.containsKey(name))
r1 c6 v+ Y6 }$ ~+ m8 q; h/ y - {8 K9 E7 |7 |7 ~1 C% `' ~
- return _quests.get(name);4 [, h) D% h6 j* Q1 R
- }- e8 ]3 g+ L. h# e* k4 [/ }
- return _scripts.get(name);1 J7 ~2 t2 B9 F# H* H0 v" q* a. z- f
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
! [) D' x0 n' U3 Y3 E
3 }2 c+ [* I1 u, [' Q' `Метод getQuest(int questId)- X1 }+ v+ f9 S% _6 f
3 G4 `7 H9 j3 p( `1 r- /**+ v( \5 E) R9 ~3 C
- * Получает квест по ID.
9 w1 G: f" b- Y7 M - * @param questId ID квеста
" t( P; N. W% s; [( g - * @return квест, если найден, {@code null} в противном случае
/ m( k2 R$ K: b; n& a( Q. X - */' s/ E- N3 ?0 m
- public Quest getQuest(int questId)) v/ w4 F. x/ e- |4 i
- {
+ w9 w& n: g4 G: ` - for (Quest q : _quests.values())- q$ R7 p' }" ?- g+ p0 v4 g8 _
- {) o! N3 g, n9 \8 G3 z
- if (q.getId() == questId)* U. c# B2 W! `8 C+ l0 E# y4 |
- {
! n0 M F6 Q. b. ?' e - return q;
( L1 d. s9 R# c% U+ |9 m4 V. Q( \ - }! x! d/ R8 s0 K
- }7 R$ |' H" @ q& Y6 h% |
- return null;
8 h. H, B* I9 L/ T) r1 o0 \" l - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.2 K. Y) @5 y4 m7 f' L
2 m' {+ b7 t$ a5 m
Метод addQuest(Quest quest)
% X7 J* n7 n* b: F2 i/ E0 l& Q( J( w0 i, ]+ [
- /**
) B0 |! p) o+ V! F - * Добавляет новый квест.
$ u1 ~/ T: h: u" {. }5 b* E - * @param quest квест для добавления& j/ _! X0 B6 c7 a
- */
$ w3 n5 F5 L$ y0 V4 ?+ b1 e1 r - public void addQuest(Quest quest)
d- ~9 X: R+ v4 P) N! ]; ? - {% z" s8 Y0 i- j K
- if (quest == null)* Y/ [+ g) o* U8 u7 T
- {
$ ]) y. h$ [; L& G - throw new IllegalArgumentException("Аргумент квеста не может быть null"); D7 }: b& g+ q" Q( r& M8 W
- }- f X# I1 {& {! n
- 0 {3 r* l2 ]9 t8 {! n
- final Quest old = _quests.put(quest.getName(), quest);2 }7 m+ k, u& B* S
- if (old != null), c' h X9 j) O3 o/ K
- {" `" \ {/ D# ? h$ h
- old.unload();( {& d7 ?* I+ N4 l* r0 T% g% H7 x
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
( A% D9 J$ ^4 @2 @ - }
: ]+ ~. {7 m5 |" Z" Z+ e - % E7 U! \; m4 Z, w" B
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)# r& c k' K0 S' n1 l$ r$ ^
- {
# O6 Z: ~) j8 g4 f6 c+ Y: f# z/ N5 ] - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();* D: t; z: n' _
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
% n4 {' Q: n1 `2 [9 e6 l - } g& E7 z3 i( M* D, V& H
- }
1 Y3 @8 E" i1 m) u - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.- p/ g" i' u! c9 K: l7 p
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
" A, E3 a7 ~' p# i( }
$ s9 u2 N, t x% g7 v9 v9 s) p, p6 d
) g1 D4 H D. |0 C4 E2 O+ f1 h' ~
|