Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius# K2 u, }9 d( R% i t
5 v; b+ l, }& U3 e
Разбор файла QuestManager.java
8 j1 v8 H: W. }- v/ q/ w4 J: I
# m1 T# G9 C% e0 I9 qЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.0 O; o3 ^# i! U& [ X
Основные элементы$ F% r: j: G$ d/ V! c
- Лицензия J8 h3 d( A% |- f! @* O
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
$ R9 ?5 @: X) s
- Импорты4 q- F' X9 @9 P; n
$ a( [! Y+ T4 t! z: I$ m
QuestManager.java — управление квестами и скриптами.6 W8 S0 n; ~, [8 t
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
7 k$ l2 l( ~/ i$ a# w% Z: Q9 m5 ?; ~* w2 a( p$ V9 D
) f8 z H& O1 y) x" O" e4 w# I
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
1 w( F- p; E* V. o: n. P1. Лицензионное соглашение- _+ d" P- {0 Z. `/ l
- /*1 P9 O" X/ k" x9 @* [% s
- * Этот файл является частью проекта L2J Mobius.
. @# q* [- A! b) v( R+ B* ~ - *
& c, H; G9 u+ j1 o - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
7 T# f7 x% r. G0 s: s - * её в соответствии с условиями GNU General Public License, опубликованной2 {2 N1 m3 ?: W" ?1 q
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии." s( c2 h- O0 \3 q3 L) C7 ]& \
- *
, {0 q$ X5 m p - * Эта программа распространяется в надежде, что она будет полезной,7 Y; T; }7 _. V( t9 q5 d; }3 P/ h
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии( }5 V3 S& X' j- O* B
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.- o u+ g3 r; S' G# z
- * См. GNU General Public License для получения более подробной информации.
U" ]7 I; `2 V8 ^* d% v. Z - * 9 f3 F) B! o$ d3 V4 R
- * Вы должны были получить копию GNU General Public License
9 C) w, `2 B8 `7 Z& p8 Z6 d - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.9 Q. M' |! s/ I3 k4 S, W
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
* S3 Y6 Z4 b M5 C& ^ V k- w* k, d1 t- K! k
) \$ i" h% j' J8 ]- X2. Импортируемые библиотеки
6 y+ W& Z: \+ A! Z+ G5 n$ |& z, q9 s8 a6 C3 o
- package org.l2jmobius.gameserver.instancemanager;6 ?' X/ _$ t# Q- ^; [9 \
- ' J2 N F& \+ p/ g! W4 y* C& J1 O8 V
- import java.util.Map;: Z s+ R# G5 n. \6 A7 W7 F; H
- import java.util.concurrent.ConcurrentHashMap;# ~! S/ p3 \2 v- a
- import java.util.logging.Level;2 ^; D5 r `- @- [1 u
- import java.util.logging.Logger;
4 i# y$ k* {5 M2 _! t: X4 w
( U$ q$ O2 m# s0 h7 O# b5 R- import org.l2jmobius.Config;3 b& D7 Z5 `. B! R0 s
- import org.l2jmobius.commons.util.CommonUtil;
. ]% g! |, u e3 S - import org.l2jmobius.gameserver.model.quest.Quest;( o$ a+ J, O" I3 f" q O z
- 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 — менеджер для работы с игровыми скриптами.0 _# Y2 j" B5 A* \$ K
9 G# k9 U$ o5 B' v& Z. i3. Описание класса QuestManager( i. W: \: ^* N/ V9 s
- /**
( D0 Z. {6 h, w - * Менеджер квестов и скриптов.7 |3 ?! f+ z) \$ B
- * Автор: Zoey76
% d; u3 j* `% i _/ b9 ^$ ~3 f - */0 c$ I' ^8 N' |1 X/ S |5 i7 J
- public class QuestManager
$ K8 E j2 Q- Q+ d8 w/ m! [- l4 Q - {! Z6 f9 ^& q: ~' b' m, F
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());/ ^. G& l. G0 E4 ^' s6 z
- 9 a: V/ b" t; r3 Y, e, w1 _
- /** Карта, содержащая все квесты. */
* }" N& O* z: B: J! E - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();9 }) R7 |0 r0 C6 {9 q! T
- /** Карта, содержащая все скрипты. */( ~! O# S8 Y3 w+ Z
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();% c4 v% o5 `/ O' Z
- 2 G! K% x% H6 @( N! }; S
- protected QuestManager()
' f. v' P9 Q& T! X# p - {
4 A- c& q$ Q7 K4 Z - }
9 I7 L) |8 S' Z1 Z3 X. ` - }
Скопировать код 4. Методы" p- c( W0 v7 a4 O8 ~
Метод reload(String questFolder)1 B6 E f) Z# w b, ]% N
- public boolean reload(String questFolder)4 o) { H7 u( m' p& f {
- {% _7 [8 f N( \7 l
- final Quest q = getQuest(questFolder);
& U/ X4 I9 M) l r: Z# y7 B - if (q == null): N" ~, F6 y. b) Q6 J
- {
; Q( J7 w4 |1 Y. L7 K7 I, C, x - return false;# Y" g8 ^8 p: q* [
- }
! t& k) D4 s! Q7 h3 h% C - return q.reload();6 o" v, g8 E4 K3 `( K
- }
Скопировать код
) @4 g9 R9 O: M5 T, a- {
6 n7 M! c0 y0 }& e- O6 WМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.7 t: p+ e5 s" J
Метод reload(int questId)
, x; e5 T# ]. O$ ?0 ~7 K0 r
" h" V! W4 x1 m# ~8 K- /**0 a8 L2 t$ {4 {/ C3 I$ f# z$ h( j
- * Перезагружает квест по ID.
$ n5 J3 k( Q1 ^( Q8 S - * @param questId ID квеста для перезагрузки1 M: e2 M7 O" g/ j! M X
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае8 _6 g* }; q, u* i/ M
- *// s4 M& X) F/ p" n5 X5 _
- public boolean reload(int questId)
, G9 l1 ^/ S) ]+ i) u - {
8 [7 T/ q# h6 w$ I - final Quest q = getQuest(questId);
( ]! H9 _. Y: B8 v4 t; G1 U0 h4 g/ _ - if (q == null)4 H7 ]) y0 }) m V! E; |3 @
- {* p$ s; G# L9 j) g. G5 e
- return false;
/ _6 i2 |2 n. v) k6 k - }
$ q) g( R9 u5 @+ ` - return q.reload();
; P7 t) P. `6 h# o. \3 j; W - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
* P% z6 M! y U& s
$ j7 k. v# s* m2 ]Метод reloadAllScripts()# B4 M( A! U1 m% z1 I
. u. ^3 Z: L( M
- /**! V& ^& g" q8 t6 R
- * Выгружает все квесты и скрипты, а затем перезагружает их.. Z9 K9 V# N2 o! G! A
- */% k/ r2 x- c; n5 H7 g8 {- H
- public void reloadAllScripts()
/ A/ i1 H' p1 j |( V3 q3 \* k - {
8 s0 G! b' ?2 h1 {4 D' i - unloadAllScripts();
6 L) Q- W. o) u8 I8 t - , @7 g h4 z ]# j( E
- LOGGER.info("Перезагрузка всех серверных скриптов.");
2 j: ~. d5 v* \( B8 T - try0 d3 Q- V- x& K7 p& \
- {
% I2 d* y" T+ c - ScriptEngineManager.getInstance().executeScriptList();
8 V! M- f3 e9 ?* Z! t# h( I ^ - }
: h' K2 T; U5 Z - catch (Exception e)0 C& D$ M: e( m2 }* V/ z3 M
- {3 r$ O P8 F5 D; ?, n8 K5 w- E
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
- X$ i$ C3 a3 i) T0 V - }
: T9 R2 f6 @# M6 i% Z- ~6 } - , v& n# ~; e4 F% q9 h, g
- getInstance().report();
1 Y' C" Q+ X+ c - }
Скопировать код Метод unloadAllScripts()" U) A! e4 e8 x* X4 o4 I
% b. N4 F0 j4 k! E! T8 H; h6 h
- /**6 z* C$ N2 s! Y- N+ O/ f
- * Выгружает все квесты и скрипты.
, }) X. z9 ?. Q - */ v: ^6 ~. [+ E+ S
- public void unloadAllScripts()& N6 ^/ C* `3 I0 j6 e7 S
- {
4 F5 e9 [; x$ \" ?7 O% @* @' ] - LOGGER.info("Выгрузка всех серверных скриптов.");
( e$ D/ h p2 l - * g' @( y, N' c
- // Выгрузка квестов. X7 {$ A1 S( |, N1 I: [ e
- for (Quest quest : _quests.values()) d8 P( y( A+ p% q; ^
- {
q7 O' R5 z/ f9 f - if (quest != null). T: _8 s8 ~# S9 H! I& w
- {
& M, D9 U' u* e! C% e - quest.unload(false);
! B7 B6 m/ `: B* d. i6 s - }
4 W' M% e4 Y0 ?3 w - }
- i( l" O. Y6 H! i) @$ t1 Q7 A1 e+ y - _quests.clear();3 i" `, @: k/ H: f3 f1 k9 l
- // Выгрузка скриптов.) K* E" `4 i8 h9 v! j
- for (Quest script : _scripts.values())7 _* z1 H ~8 E
- {, P# c0 S# Q) {; J% o. D. `
- if (script != null)3 N) S+ U+ [0 J2 f" |7 U5 e
- {3 |- i0 D0 [+ p( y% {8 x! {" q; v, X
- script.unload(false);
4 e( I+ ^0 O. r/ H, b - }
# K1 p" \/ \: ^8 H% R! U; Q6 c - }7 P; d V$ f, `1 ?
- _scripts.clear();
& O. l% y* c5 T1 f5 i' ] - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
% ?# G& K3 ]& m1 v( W# G: h 5 R1 y" G+ [) D% y y. y- W# G' Q
Метод report()+ `! L& K/ s% d5 Y
' a C; h2 O9 c& M6 ]. m
- /**
. D3 _4 f% }9 X$ ]! | - * Логирует количество загруженных квестов и скриптов.. i+ p$ n9 ^2 W" ?0 z
- */3 X C9 m/ K2 F
- public void report()
& F7 B; ?' I$ o" |8 T - {9 v8 n4 I5 K9 H. t( d4 X& a& {$ _
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");; ^& B7 I8 c% g# a
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
/ P7 A* E; l! F* Q6 M' i2 ^; f - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
! \& N2 M; T, e( X, S, P$ h 6 E; V; W! }$ {9 F7 V
Метод getQuest(String name)
0 T5 W2 d0 c2 P0 Y( j
# \- }" W. j- v- /**) t$ ~3 h* f d/ s+ t
- * Получает квест по имени.
& l9 _ }8 J% ]5 E4 [! C1 y: h! n! o - * @param name имя квеста& p. I$ o* Z1 B4 e- a" O
- * @return квест
! M) D! M) v% G. X9 x - */, M. E& S& c1 k2 ]" Y* F* W
- public Quest getQuest(String name)
$ s# d2 M6 c# z - {
. U3 j/ l- @6 B- v. D# v1 n2 E - if (_quests.containsKey(name))
+ K, ?# L$ X* l! Q, | - {
, u' J4 Z/ R: ?: Q - return _quests.get(name);
$ T5 W( I* ]' W( W - }
2 V+ i* [( x* W: X; p - return _scripts.get(name);! m/ P+ K5 @$ n) H* Y6 V
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.. P3 c: [" d5 j$ O( |2 a4 D& m
$ ]1 t9 ~! b) h& F1 F- }
Метод getQuest(int questId)* M. o+ _: w+ v4 V
5 h7 Q% ~( b& ] [9 d9 u# o6 ^/ ^$ _- /**
+ P2 _9 S" u/ ?! Z! n1 D& I - * Получает квест по ID.
5 ?$ x. ^! ~ a# i! t - * @param questId ID квеста
) l* A7 ^* g0 n$ i0 G* { - * @return квест, если найден, {@code null} в противном случае
3 P3 `, k) D) O: @. I - */9 l3 i r" s% V+ n5 F4 X; _
- public Quest getQuest(int questId)
; Z* i2 x: q9 o; @) |& x4 V - {
h0 z7 {5 R$ E; R - for (Quest q : _quests.values())# d" |* o+ n9 Q
- {
2 i# F6 w* N3 u' g* E+ n - if (q.getId() == questId)
" D) m3 N# h0 H3 I - {
# J* s/ Z8 a6 t; L1 @1 H5 E - return q;9 }* l- p$ K1 z9 E# _
- }' K: H) l5 I, ^% d0 @% ^& i
- }
, S4 t2 r3 p& g7 N - return null;
8 ^" z: n" y0 | - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
0 {: D6 `* r5 H$ d
9 W+ q' b# \5 c4 {$ uМетод addQuest(Quest quest)
! j' X/ e' x5 u% |& x* N
: |2 R, v% r' K- /**
. [ W- T5 ]3 Y9 _6 } - * Добавляет новый квест.* Q5 F& x+ j: ?: x, m5 C/ c
- * @param quest квест для добавления
* _9 W* I+ k4 p' T( Y# m8 ~% V - */
+ B/ l: o+ G5 x; a I - public void addQuest(Quest quest)% |2 h* l5 j$ S' q/ ^
- {
* T* m0 p* O2 w) d% S# T - if (quest == null)/ R `6 u: Q/ ?* i& L
- {3 t b! ]& w" t% X0 }
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
% C: p; `; C6 ~9 L. w4 R$ l - }
! N" I" p/ M0 H3 }* }& _ -
/ e( G3 @! E( ?" C. L6 s) j - final Quest old = _quests.put(quest.getName(), quest);
( A' D0 U; c7 U' v - if (old != null)
( s6 g/ I. T7 _: V' d - {
, B) a$ d+ I1 n3 M! g- h5 z, R - old.unload();
& h% y* V- a6 Y/ U/ | n5 e - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
8 e' x& v, w: A2 A, S0 [9 @ - }
/ E( R" H6 Y4 @3 h5 m* l - 4 z; Q; c# I* O/ P) C6 c8 A
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS): [2 L- x: P: Y* j0 k
- {
0 B$ \2 r( K' @, W/ ~* I+ ^8 D - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
7 J* y4 i8 B8 ~5 V - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");4 G2 w+ _( p# Z- r9 D3 U
- }$ M. b1 z' ? [
- }/ o+ n- `) Y" H) F& Q
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.( k, p% ?5 ^- w1 Y$ X* J- V
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
, B- x0 R y4 J. U
8 @# t$ O! v0 P+ s2 [# K/ Y0 b" B. P+ w( ~
2 f$ I) z$ q9 C0 c1 b4 O; l
|