Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius T/ P% P( I1 m/ J! ^
8 d2 p ^- V/ cРазбор файла QuestManager.java# N+ @* h2 D* T# ~& q
* i- U+ t; D/ D% [0 i- EЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
4 P0 q+ a: u. u1 ~ sОсновные элементы
# j& c# {+ _* l/ V$ G% W- Лицензия
4 j8 O8 o1 ^; d) s% `: j- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
+ l: {8 [8 A! x6 [* C
- Импорты; \. e( ]. M' T' H. c. Q$ r4 r
9 k+ p- i8 y' y2 B0 F, ]; c
QuestManager.java — управление квестами и скриптами.6 ?3 f0 x# ?8 ^: d& E
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\1 o8 E$ h( ~( C; [& v
0 w- J- I6 l+ x" X' A; P) _% ~
* \$ A" K* X" H$ I, n0 M7 [/ \
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
6 d+ x7 p5 o h4 J" ~/ N1. Лицензионное соглашение3 Q8 b( f" Q' o) Y
- /*
' U! m1 i) g9 B$ a+ \) I - * Этот файл является частью проекта L2J Mobius.' k. E4 w& _( r# b
- * * @1 B0 p. R+ I3 |; o6 Z( W: U
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять/ G( s/ d2 _* @% m
- * её в соответствии с условиями GNU General Public License, опубликованной4 s, n' R5 O$ @
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
6 F- g [, g, N4 v - *
, d6 U. \ {$ H* k - * Эта программа распространяется в надежде, что она будет полезной,
- z. n' J, K4 x; O( t/ L5 _ - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии' b0 X$ N+ A6 Y
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
4 |0 x1 i: g) `. Z2 M& }% P2 \ - * См. GNU General Public License для получения более подробной информации." u% R8 q4 g' D- O: {
- * 9 X; K$ r6 O2 j/ N9 S r1 a
- * Вы должны были получить копию GNU General Public License% G2 ~9 m" k4 ^7 p$ N5 M
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.2 p, V+ w' ?/ Y7 W, I& `7 u/ ^- Z( M) }
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.$ i6 t; h2 _+ K h
1 L# o6 ^: a+ L x! Q; M) I4 \/ f8 ?3 Q; K8 h' G: R
2. Импортируемые библиотеки
- S/ ?! u. f2 v& L4 p
# O, ^, i! k. B- package org.l2jmobius.gameserver.instancemanager;, R7 M/ z' `, d$ Y
2 w0 l6 f% T# K4 T1 A2 P: y- import java.util.Map;. F) w+ j2 h+ k- ], q
- import java.util.concurrent.ConcurrentHashMap;
8 s7 B. ^% h4 a4 ? - import java.util.logging.Level;! ?$ z' M% O1 R8 C9 _
- import java.util.logging.Logger;
% p3 \2 z: W7 p
' c! F0 o' ?: D" w6 T K0 h- import org.l2jmobius.Config;
2 J4 U/ V) F5 X( @$ G+ t0 n - import org.l2jmobius.commons.util.CommonUtil;
6 \, m! j _3 g( h8 \3 t. A - import org.l2jmobius.gameserver.model.quest.Quest;" K7 y7 \7 w( W* { R8 n
- 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 — менеджер для работы с игровыми скриптами.
2 _, \6 X5 V2 K
6 W' P! p% S* t1 Y% { q4 D7 e3. Описание класса QuestManager& S+ [7 M( u* h3 N7 M4 m
- /**: B- ?: R; R) g1 C1 k; N: t
- * Менеджер квестов и скриптов.1 ^) Y1 E+ P2 ?
- * Автор: Zoey76" ~) ]' J6 b) d" Z
- */
) V' j# h3 Y0 ]; A) _/ R9 d6 _; K$ w - public class QuestManager' p* h3 x: Z8 b& d
- {
0 w, F2 G) J- d4 z# ? - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
4 p3 U. {1 X1 J. t - 1 Y: a' ^, K! j
- /** Карта, содержащая все квесты. */* Q& n" [3 A, {- v' B' d0 B
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();: ]8 K0 W! b4 ^2 K/ y( G
- /** Карта, содержащая все скрипты. */
0 A N/ x. k6 ^! }) j - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
: e8 {; T; E/ k# G. v8 D - ) O1 z8 g/ i; V4 s% `. W
- protected QuestManager() q" ?0 r0 l1 q8 r3 T, z d
- {
z, F; d- g+ I7 H - }7 P. t# Y _3 k+ N
- }
Скопировать код 4. Методы
/ E( M7 m( p" R; _Метод reload(String questFolder)$ q( H2 g1 x- j% h" X4 X
- public boolean reload(String questFolder)
# {$ {3 K# a5 h( D) I7 G' n u7 d. ` - {
) u: B+ }1 N0 p: l( a3 O* O - final Quest q = getQuest(questFolder);
5 I5 [4 M8 F8 U4 W) ^; [3 e9 A. ^ - if (q == null)
5 X/ G7 ^& O& H! S- F, w - {+ W4 e! A5 e) Z
- return false;, e6 B) d1 a2 j+ m
- }/ ?5 W" z) N. P' @5 p- U$ u5 [0 @
- return q.reload();+ K, D6 t( J4 c* H* h% A* S: P
- }
Скопировать код
) y! {& R1 P% m( h/ J% J) P
$ H% P- l6 F8 j( EМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
2 }- d f$ n0 `& W! c5 xМетод reload(int questId)! |$ k7 {7 \0 X- n D
7 o, x% n O& ]7 Q6 I
- /**/ K1 G# P, L% `2 d' \
- * Перезагружает квест по ID.; J. I$ P, k. N, V: d4 ?6 C
- * @param questId ID квеста для перезагрузки2 ?4 k5 a) V! T; N& I0 c h
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
: G7 X- l% k$ ~6 Q - */) H- A7 x6 Y' h4 x& a' g
- public boolean reload(int questId)! V) N8 h7 i% m2 j- P" i( o
- {$ M: }1 h. W! m
- final Quest q = getQuest(questId);
5 Z4 N T" K$ l* U% \ - if (q == null)
4 A% l/ J! l s( L6 R - {
+ M6 J( t: M, T5 a" j& a2 N1 l9 N - return false;3 N A" I) R! @6 L/ p1 l2 q% I
- }% o! A: o2 D! s0 f8 v
- return q.reload();
0 q7 C7 Y! R. O5 |$ Q0 C - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.- V) N2 y& {# N Z
: c& D! R# V9 k2 _
Метод reloadAllScripts()
" Q& t/ P2 H. p6 B( `- O, c; ^2 v( v! N. U
- /**
" \ E( @: a% E& O: ?; a - * Выгружает все квесты и скрипты, а затем перезагружает их.& Q: V2 D# a! S( k h
- */
4 @8 ~! C' [0 g7 D. \ - public void reloadAllScripts()" ?" j0 P4 X; o) b7 U. m
- {: m) s" }7 w0 y& T
- unloadAllScripts();
( b% w# i, x/ O9 _8 X( ~ - 4 e( C' Y! ]1 @8 Q5 r1 A) Y
- LOGGER.info("Перезагрузка всех серверных скриптов.");* {5 W3 D6 p1 O3 U1 y( E) \
- try
9 V$ |7 o# k) f - {4 h3 t) R! j$ _; x
- ScriptEngineManager.getInstance().executeScriptList();
0 u F5 l- V" ]/ K$ D0 x5 ~7 ` - }5 [2 Y5 k# k4 h0 H8 C* N6 x' o
- catch (Exception e): n, ~% B' e2 K
- {
- B, C: Q/ Q8 E. u - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);4 a" ]$ }( I; \' @* y5 o
- }. U0 J5 G; r1 X2 C
- # A- I1 J t) a6 V* J& m9 d( w& n
- getInstance().report();$ z0 A$ H* \) j% [! q
- }
Скопировать код Метод unloadAllScripts()
3 }9 s% ]$ e8 y# G9 ]. q- d$ ^8 X: \: F1 |9 Q
- /**7 d2 h" g S# e( k
- * Выгружает все квесты и скрипты.5 C3 H# K- x1 ]0 B' K
- */, i' \# a& y: e7 e6 D, L
- public void unloadAllScripts()# z2 ~8 a5 x, y5 E) V9 ^, G) a
- {
" i+ ?$ R: X8 I7 q7 e - LOGGER.info("Выгрузка всех серверных скриптов.");5 p1 l' f& q7 Z# ?
-
7 h+ [! ^ f& W4 [6 O4 y6 ]) B/ @2 ?( D - // Выгрузка квестов.
2 a" K& X$ L4 D - for (Quest quest : _quests.values())
* }, U5 w- U" B - {
1 V0 w5 \# {# X& \- {- p" |( K- x' o - if (quest != null)
& X$ R0 `# C: W- B1 | - {
' h2 @6 ^# q( c' Q" W. V - quest.unload(false);
$ T: [! I9 b$ h3 x5 j - }/ \: s5 d9 j+ C3 E1 N* Z7 ]6 c; w
- }4 `3 K6 c/ b: c" F5 H }
- _quests.clear();! s9 M* m3 P+ \' L
- // Выгрузка скриптов.
a: c8 a3 D( N1 Y* u - for (Quest script : _scripts.values())7 [% `, p8 K& X! r
- {) n2 |9 C) `( b
- if (script != null)* P) M' E l3 M, I4 `) a. ?
- {* C- f$ u. a5 U0 k% m' P: q% L
- script.unload(false);
3 J4 P' P4 r. F" x8 B - }
5 u& u# n, W1 ~3 S/ i0 ^2 r% } - }, r$ ?( R J, E. w* F. L9 O; Y P
- _scripts.clear();: g, u& N. K5 R6 ~
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
# W' ]% M" ~( N. E: A
/ G& ^% A. ^& N0 g! i9 u' i4 S x; nМетод report()9 c4 l- m* e6 B) m9 o8 v
/ B% q; M4 E8 o1 C4 h/ K
- /**5 M" K) l( }9 v$ C8 i% z9 W
- * Логирует количество загруженных квестов и скриптов.! f# `$ z6 L2 b. t; K4 Z
- */' Y3 ?) }$ u& _* V( A
- public void report()
. C' r0 C. I0 j6 B- c* r, r - {/ s3 v N% m! Y/ f' ]
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
. ?# N3 K$ a, X" g - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
9 u7 E/ ?& f9 B4 t% a l - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
8 }# H5 u" J6 P* e& _. c' I _3 N& x" z: T# b' E0 m% p. L3 {
Метод getQuest(String name)
- D( v/ I, N( F7 b1 ^2 [; K* f A0 X4 K7 O& E
- /**
/ ]$ z2 K/ b' q, m6 H - * Получает квест по имени.
: z) [' [; @' W9 r6 p - * @param name имя квеста
, H2 P0 c" r4 q K, R( v) R Z - * @return квест
2 T0 d& ]: C* u0 s, E2 ^ I: } - */
O! h; g! E$ Q8 @7 I - public Quest getQuest(String name)) A# w5 q6 B5 F: [" N
- {, r" ]7 s- V3 p7 w
- if (_quests.containsKey(name))/ E8 p$ _, |# B* [* I
- {
( ] D% o8 i q/ \% c6 y - return _quests.get(name);
' N; f5 W v) k; R) j# i; A - }, k0 K5 L+ I1 E; i
- return _scripts.get(name);
7 `( W( y- Z+ k- G# [8 l - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
5 \& }. c# x/ O; A1 n+ L a
0 y) M% R. P8 O1 r. d9 H8 a" M1 {Метод getQuest(int questId)/ g0 g! B# p: M9 d
9 x* o. m* F2 }& o* H- /**/ ?5 x5 V) p% f0 U' ~! O$ Z
- * Получает квест по ID.
% o+ P3 O8 z" t6 }7 Q1 v& @0 B - * @param questId ID квеста
7 u, ~# [* q; L2 t; t2 g - * @return квест, если найден, {@code null} в противном случае
. ?5 K' t; z# q# x5 ~5 Y - */
, D3 g" A; V: d! x - public Quest getQuest(int questId)
$ w. N$ {: n2 L' Y - {) w( ]4 `2 @1 S
- for (Quest q : _quests.values())
. ?, [' z; H% @/ p. [1 M5 |* O - {
' I/ } T% P3 c7 \ - if (q.getId() == questId)
: P' X' x; L! Q9 I+ v - {
; b3 e' M0 R/ c2 w5 ?' B4 J - return q;0 U9 E6 e6 }4 ?3 [% W/ {
- }
9 |7 v+ x. ]; S& [' B - }
' H* W: W3 l3 k z8 h - return null; c5 P9 T, a7 l% j3 q. [
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
8 `$ ^4 ~+ h/ E2 i, P. n
, B$ u, C# R+ Y" L( D% e2 NМетод addQuest(Quest quest)
* R9 `0 B. o5 B z. X2 Q0 l- @# U, r" [/ a
- /**
5 N3 s8 _( z$ h. X7 I - * Добавляет новый квест.
7 O. c. k' k% o" ]/ V4 }& U( n7 @ - * @param quest квест для добавления
2 C7 q+ S# w: w1 c; h- o+ m1 Q, h - */
! @& h/ n5 Y% f' k3 ~1 z. g - public void addQuest(Quest quest)
8 u- Y7 W3 F) F& k - {
- A/ a4 B$ V( n; ]3 z% c' \# [1 p - if (quest == null): I& f2 m/ Z; n% r9 D8 ^0 v
- {4 `/ N: Q9 m" E
- throw new IllegalArgumentException("Аргумент квеста не может быть null");: L$ w2 j. D Z; Q% ^0 ^( \; U5 O
- }" O/ F# u5 c9 \
-
5 I( O4 r+ o" b; \ - final Quest old = _quests.put(quest.getName(), quest);
& w: [# y( I2 r( l' e, \ - if (old != null)1 ~# E" t9 @& y; M% i" ?1 f
- {( y8 S3 E4 H2 k" m$ u V
- old.unload();, W* ?" O- {5 Y) ^- D/ j* {
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");7 [( n ?3 [4 f4 M3 w
- }5 q% k2 P9 m! @/ f' T) E$ Z+ ~4 D. H
-
; ^1 a# `3 q) e) q; d v - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS). S. \1 A7 X" {! G- y+ m9 R0 a
- {
- ^2 }: e% [4 X - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();% R' m! W; q5 T" R
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + "."); ^5 y! ~9 A/ O7 y' U
- }0 T1 q5 V' q- u, ]) e3 P
- }$ B2 v& i9 z* z5 ~# V( s7 C6 Y
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
4 ]! k) d! M% iЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.0 z3 i& c2 R k2 A
7 P$ E7 {0 ^" r$ \2 D
/ _0 I9 c9 e1 W4 p
% [6 L" S# A; F. E |