Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
1 J' a0 c0 A r( G# A# B
+ P/ A/ |3 f! X. L3 }8 A5 nРазбор файла QuestManager.java, |/ R. h# W& }; p2 _8 f4 q1 L
( d5 E! T1 s' `, W1 G3 P9 @; h% `
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
9 g4 j1 A! u# D) B' k# [5 PОсновные элементы
; A' p2 i" ` ^) _- Лицензия" W0 |6 c: f, }7 y# j) H$ W
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии./ u9 r o& L3 V0 G7 n. {+ @
- Импорты
5 J a a- n4 ]& N , R0 @9 \3 x8 U$ [9 D
QuestManager.java — управление квестами и скриптами.
+ Q0 r5 W( H K9 ^/ VПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
3 F( L6 G; C2 q; I! |! f* y1 A! `5 d; d% }7 T; i2 W. `
* ^- A8 A9 T3 W8 C$ T
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
J _2 N1 _2 Y- r1. Лицензионное соглашение
9 d! T& Y9 v1 V" f t- /*
8 u' m* U& G! ` E( v0 O( Y+ o# ~! P - * Этот файл является частью проекта L2J Mobius./ f7 o6 e2 n9 Y. @ P1 C0 u
- *
? V y6 e3 ]* o3 L6 j - * Эта программа является свободным ПО: вы можете распространять её и/или изменять2 G% d2 X1 ^( ^/ \2 J& o# D1 l7 o' j
- * её в соответствии с условиями GNU General Public License, опубликованной
& O O) ^0 C) I+ b, b - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
" [$ A# u r( w! h; D& \$ T1 Z - * , l0 k2 M V% t; |
- * Эта программа распространяется в надежде, что она будет полезной,0 |0 f" _6 z) z) T6 c4 F! @
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии' M5 b: i9 U( h5 \/ d X* |" C
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
e( ?8 b5 k" Z- C2 L) Q3 x0 u - * См. GNU General Public License для получения более подробной информации.: @! c1 C2 ]' _9 x9 }
- *
+ k T' C; v6 u3 `2 r- Y - * Вы должны были получить копию GNU General Public License
/ X! D1 `* R! B: L( d - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>. `( U6 w4 K% S* H* e2 m z9 x
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.0 T: k4 O0 Y$ q+ `* K
3 m P7 H' R+ S/ ~+ v9 p
8 u' U5 q6 k% b& f5 O3 i2. Импортируемые библиотеки5 t4 [" ]: ~0 y- ~( r8 A
6 ^) U7 W" q7 Y9 E' B. G! S- package org.l2jmobius.gameserver.instancemanager;
% C* T; i( h% h% o- R - , g1 D, v6 k& R, E! C6 K3 M
- import java.util.Map;
: h+ M% }; s1 n- \$ C& H - import java.util.concurrent.ConcurrentHashMap;5 r5 L: {: J4 L: K1 F4 a: F
- import java.util.logging.Level;9 T) F# C' |4 u3 v: O& c
- import java.util.logging.Logger;
! |. C2 r1 [2 |; c - : P: N! r, r. ^- T% A" k. I& Y
- import org.l2jmobius.Config;; s7 T1 `: i. w4 f
- import org.l2jmobius.commons.util.CommonUtil;1 h5 A) o9 r! v+ S$ c- Y" H7 T
- import org.l2jmobius.gameserver.model.quest.Quest;) [7 G2 Q1 _/ j
- 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 — менеджер для работы с игровыми скриптами.
, d- Q2 N9 {+ q3 U/ z- L
& ~% U1 J# l/ v1 h& o3 t3. Описание класса QuestManager8 n; l# f, v; J( J
- /**5 T% {! n& C+ w. S+ v
- * Менеджер квестов и скриптов.
$ F$ \) ^* G2 }" v# Q; \( L- d - * Автор: Zoey76
' b& G3 m( N' e4 P - */
8 Y, O' P- N! q" j0 Q! G; c% l - public class QuestManager
2 r+ U8 l( G; @3 |$ T8 t" p - {
: \) D% Q4 g) R \+ w5 @$ w# a - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());2 M" }: F/ J1 W7 X# F
-
/ C1 r1 O0 V6 b/ z - /** Карта, содержащая все квесты. */* J s) t4 a. e* r- \* Z3 u6 ~. ^
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
6 p* E; a/ i: W) s% m - /** Карта, содержащая все скрипты. */
" M) I; O. c" U5 ^5 w; _* p, L - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();% ^7 s. {2 p- N7 C7 z* u" P {: Q
-
! j! H7 r, L2 I% {& A/ p1 _8 w - protected QuestManager()
. o; f: U Y$ t/ s7 R - {6 l- o" Y0 J5 p, I
- } e/ `& v K, B
- }
Скопировать код 4. Методы0 d8 e" b7 G9 X# p. Z4 g
Метод reload(String questFolder), Q/ s$ A9 ]% y$ [& R4 c
- public boolean reload(String questFolder)
7 i3 K5 m/ Q; l - {
( Y* \/ T4 K9 F& N0 R - final Quest q = getQuest(questFolder);
8 j9 E' \6 m* t3 Q; [ - if (q == null)
" a5 [$ O9 K4 x/ T' W8 Q - {( b7 M1 H' \) S9 b& ^3 {( @* h* W
- return false;* }- |5 a$ c4 T
- }+ u3 `# L3 ^3 v
- return q.reload();
! \- x" z6 W% y, e3 ] - }
Скопировать код
( t9 v9 z ^5 p7 v/ g% Y! d# w
+ M' C1 }; i& n7 G" LМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
& L0 r, Q8 H- k0 `2 x7 _Метод reload(int questId)2 x) _2 r" ?& ?$ y' A$ r
1 w) M, J. C `9 \: A5 l3 ^- /**8 s4 k' q" {2 X$ ?
- * Перезагружает квест по ID.; s0 V8 u5 v U) X
- * @param questId ID квеста для перезагрузки
6 w6 _6 J u: Q1 r& A6 r - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае S% T, D1 \3 ^$ w P2 Z, X' U
- */! I' w' L9 y5 U* h
- public boolean reload(int questId)6 g" I% L5 c( `+ h
- {
3 N3 j7 E; r6 @) X - final Quest q = getQuest(questId);
' }5 C# H' G# A$ Z1 k0 N9 V - if (q == null)7 t4 F5 o1 o5 y! B' [, E
- {0 _* k- Y" C* \! y
- return false;
, w: n$ F! ]. H# n0 m1 r3 I' Y) `% | - }9 z, C, r* Y8 v- |6 s5 M) ~; x
- return q.reload();
, m5 s8 m* k* a1 O+ O - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID., v! h: _( b& C5 [* ?' `! K
- j, w4 J- a/ d( g
Метод reloadAllScripts(), i; P7 U7 k: G! P) A
& w% h j* C2 A$ U7 w' W
- /** e$ T- c4 p& R9 N; y5 _3 S
- * Выгружает все квесты и скрипты, а затем перезагружает их.
. F% I+ X8 W+ ?0 o - */+ v+ |7 N% U' G
- public void reloadAllScripts()3 i4 v. {# M+ G8 Q5 N: T1 j
- {6 l, j9 ^2 W& N
- unloadAllScripts();
6 I. \% Q+ S+ t, Z. J6 b7 L - 4 v) c- }, O, y% ?! n
- LOGGER.info("Перезагрузка всех серверных скриптов.");
" Q. |2 B- `# c - try
& H2 M8 | A) Q' d, |" \0 \ - {/ y. T8 C9 ?$ b0 P7 z
- ScriptEngineManager.getInstance().executeScriptList();& D& \: k5 d9 U" p+ r- \1 i8 X
- }" q( t: C9 }5 q% U: E0 \! |
- catch (Exception e)2 r8 Q. }) |9 Z% u" j( g5 L
- {( T h$ i4 n5 }9 m
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
" `$ G4 y6 ?- I4 e8 U" f - }; G" J+ B! b2 O; ~& O) h0 c
- - q: C* j1 t P4 _: x, ?' g: `( K5 |
- getInstance().report();
8 m( e+ y. q! [0 Y; V - }
Скопировать код Метод unloadAllScripts()! K! m- R, b9 g* H( U$ Q$ A* O
7 w+ {' X6 a4 @! v
- /**, p8 j! W6 r4 {( b; x
- * Выгружает все квесты и скрипты.8 ~1 i4 P0 J9 O) _3 Q
- */3 l4 H8 [1 S& q' a8 K% _# G! |# \
- public void unloadAllScripts(), S* y, c1 ^8 B! H# t j
- {
# ~$ |0 S5 ]1 ^ v; k5 S - LOGGER.info("Выгрузка всех серверных скриптов.");
. g2 e1 ?( d$ ]. ] - 3 o* y/ |& {6 \( }, S
- // Выгрузка квестов.$ j; @& W n9 j: J
- for (Quest quest : _quests.values())- ]8 w& ?, c9 A# F0 Z, d) z
- {* K9 a! ?# Z. Q+ s# [. n
- if (quest != null)6 }* [" A! k+ C
- {. N0 b+ ^. R3 w" A) F
- quest.unload(false);
5 V! n5 G' K, x0 o" ]8 f - }5 ^% O1 I* P+ t( n$ s# g+ c
- }
3 t' f0 h: T2 _5 L/ q - _quests.clear();
) Q$ m. l1 X0 b v - // Выгрузка скриптов.
7 f' f. ^$ g% \- Q c - for (Quest script : _scripts.values()): s9 e% a/ j5 V1 G0 m7 r
- {" t" L7 ~" {/ D, }; ?) s
- if (script != null)
% w* Y3 q3 Y' h - {8 ]) D! S: e |/ ~. A$ P8 }
- script.unload(false);
7 d: _0 Q, n+ n7 J' l6 G7 C) P - }! { G3 p/ Q# f& [+ f; K# E; ]
- }8 {* \$ p- U+ c8 Q( G0 R) f
- _scripts.clear();
. `0 D2 ~- W M - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.6 l4 f7 ]7 Y" a4 Y+ p) e
3 I6 [9 n* _5 Z0 H$ ~4 P! l
Метод report()" T& o# a& p: H1 Y' r0 `
0 V; F/ R' \% t+ r7 a5 ^+ X! \- /**1 r. R" {* ^) e
- * Логирует количество загруженных квестов и скриптов.0 {2 P$ o5 H: V% C% \: i
- */
) y7 A/ L" L( o7 D Z) Z1 [ - public void report()) l) b2 P, _. c
- {: M: V+ {; j% X' e/ N( ^6 i
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
8 I& ?1 l2 `0 {* w - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
$ N: H% @ k- B$ w1 s4 @8 G - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.2 Y7 L" O& j) s! k# } V
& D8 a2 J* Y8 B0 E W/ }" U" ?Метод getQuest(String name)
7 O6 G( h1 y( S p. }, `7 ? Z! Z) K# \+ B: n
- /**/ j* U; O2 ~+ U- V6 k! y# \7 O
- * Получает квест по имени.! u; |1 h3 S& e. h+ a4 ~5 p
- * @param name имя квеста
. c/ q! p5 _$ a3 g4 c1 d& x8 ^ - * @return квест
! z; n3 v# L/ n+ Y - */5 u- I3 m9 i1 i9 ?
- public Quest getQuest(String name)4 M- M) |; S: P
- {
F4 \: a# }2 L( ? - if (_quests.containsKey(name))
9 B, s& }4 [( Q. p2 V+ H, n' J - {: y! L/ |* l* x! h
- return _quests.get(name);
! Q. t2 E% o( [; j) ` | - }' D0 R# d! l& b- H) C" {4 f9 r
- return _scripts.get(name);9 b' `' Z6 Q: [
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
. ]# o! n5 p* g+ \# g: H# U! I
1 {0 `9 {5 Z5 K P! }( b. B9 [Метод getQuest(int questId)
1 b U' t0 u/ B& G, W* M
6 M0 n, T! z; D' i' K* M$ O- /**
; |0 E- y: e$ q2 X4 o - * Получает квест по ID.5 e$ v6 L, j6 p
- * @param questId ID квеста
) J/ [0 ]: V# P. [; K - * @return квест, если найден, {@code null} в противном случае
5 ^& K# @: c9 w& }7 ?& ?6 L" o/ O - */
. U& h4 r3 ~. m - public Quest getQuest(int questId)9 u8 R5 x" K' \; V3 U5 v
- {: _- Y, U$ ~4 T, D' _4 S% K
- for (Quest q : _quests.values())
1 v8 Y% Y' ]% e& m6 H - {
& r# O& e0 z- B - if (q.getId() == questId); }2 N' W+ ~% [2 p( ^, C6 }+ a
- {
3 \7 t l7 F5 ]0 _7 \( g- y- K0 t9 k - return q;
0 D1 u' O* O6 {! u- z4 M - }+ Z/ d! n& I3 K& G5 m) H
- }
+ _: y3 ]2 e; v- @" Z - return null;: {# E" r5 e6 r3 p: `" ?2 Z8 M
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.5 M4 V1 j& L+ F! N+ }* O
7 e# q0 ~9 ]5 G* R# l j2 l4 S; S, C8 ~
Метод addQuest(Quest quest)/ S/ q$ ]7 N u, k* O, p
# k5 {/ }6 P) H5 n/ I; D
- /**
( m8 ]* j$ s6 @' I: P - * Добавляет новый квест.7 e( g( R+ W: Z3 ]
- * @param quest квест для добавления
; [" l5 V. D0 m8 X. t, h - */+ c( _* V6 s. d$ U2 }
- public void addQuest(Quest quest)
7 Y5 i8 d5 a6 b: K0 K( V6 D - {$ c' z& a6 K% ]' C
- if (quest == null)
$ s" n8 L+ J% p7 @ - {
6 ~- Z& \$ G* n! ^& v, M, E - throw new IllegalArgumentException("Аргумент квеста не может быть null");2 C% |+ L; r& N
- }. z/ @$ o* Q0 z" {
-
' T2 `- ~5 A1 H3 \, k - final Quest old = _quests.put(quest.getName(), quest);
, E% b; p8 Q. { - if (old != null), p' K( y1 i- g1 z1 y
- {
: e! L3 R7 _7 z( d( W - old.unload();
+ Y1 p ?0 [1 [0 z - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
- ?) X5 {+ D' m" H9 x% Q - }
! o) w' C0 ]+ Q+ Y: s# [ - # Q- _1 ^6 T2 K. t: {/ `
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
6 h7 q4 ~7 B- N5 F/ | - {
* W0 {& f, U6 N# L- b - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();/ B9 D2 n" D, A
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");4 O2 b: z- |# r8 ?# x
- }1 V5 S( I0 H6 v: H
- }: {7 D* E2 a* G& R% }' V
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.% k: X3 O5 M; [4 |
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
" f9 P$ T N! ], t; P! k/ O# p- w' p* P* ?5 ?6 \( B) i
3 l' W1 Y5 h3 e4 D. ]: K
( n+ \5 a& v3 I( X) Q$ W |