Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
$ ?6 h( [9 \- E8 I* X5 j3 h0 k9 w7 `
' X6 T" W p2 d4 `Разбор файла QuestManager.java
6 |- {& [; M1 y& `9 t
: o7 ?0 X5 i7 I6 v! k! J8 nЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.: r5 n" S) J0 u( q
Основные элементы+ v. f' N6 j3 ]8 K+ `" O9 j
- Лицензия! d# Y+ p! B! [. f' x1 G
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
* @, \: P% N, Q z: E) W' z* ~
- Импорты$ g5 R, I8 \. I
" K6 |" u/ g$ YQuestManager.java — управление квестами и скриптами.
8 @5 R8 K* P- o; v3 d xПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
4 i2 B# D, u& X$ W) h* ?+ { j5 Z5 f& {
' T* q& S( O, q; U( r& L' S
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.3 I4 j, j4 G# W6 F6 z: }
1. Лицензионное соглашение9 D% g7 |8 a6 s W7 w& z
- /*
6 @ W- v* N8 Z8 b- ]5 B - * Этот файл является частью проекта L2J Mobius.6 {2 ~- k J2 F. d0 U, j7 B! q
- * 1 A3 h5 f* l! \1 ]4 Q3 P4 k
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять7 d6 _) a. e6 W* p9 i
- * её в соответствии с условиями GNU General Public License, опубликованной
0 o) w4 k x- d6 k5 _4 e& w - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
/ i( R# [+ ~+ E5 f - *
* |* ^- H1 I; b9 C8 h8 ^( S' J - * Эта программа распространяется в надежде, что она будет полезной, J3 D5 q `& w
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии" h: P% Q) I! ~' X/ K: I* l
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
4 w, Y6 V! D% p( O9 K - * См. GNU General Public License для получения более подробной информации.+ j8 t; w% |7 @# G
- * * m& t5 J7 \8 G- ]1 L* E
- * Вы должны были получить копию GNU General Public License
* L; e& d2 r# I) I+ w- Z: f - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
! D- M5 c1 |* z - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.4 a# z" x$ Q4 q' T5 D3 ~! E6 [- d
/ j! K* w6 P2 J; t/ l" M, B6 F1 a: S4 z" J( E) P. U
2. Импортируемые библиотеки
O! _! Q3 L, s. v* Q# [$ h
- `$ I5 I/ ], g$ R- package org.l2jmobius.gameserver.instancemanager;! K6 p& g6 f5 ?7 F% d/ ] y9 |
- / }* f0 T' ]' F' g, Z$ f. T7 x. @
- import java.util.Map;5 F; S1 l+ f. M4 d/ l8 i' ^
- import java.util.concurrent.ConcurrentHashMap;: A# i) B4 e2 M' K& {
- import java.util.logging.Level;- Z) D* }( |! P* d
- import java.util.logging.Logger;* L* s: |6 R ]$ o2 O- O) C: D7 m X7 Q
7 ^2 Y, v! M6 g b# `- import org.l2jmobius.Config;
) m; k5 E6 U# g5 H- _ - import org.l2jmobius.commons.util.CommonUtil;4 V% e$ d8 N1 O1 M$ M4 }8 O
- import org.l2jmobius.gameserver.model.quest.Quest;# N& j- U; ?6 ]% u$ 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 — менеджер для работы с игровыми скриптами.
1 f8 s# _; ]: [9 o2 p. q
* Y ]7 W, X N7 d+ ]3. Описание класса QuestManager
! _2 S9 j+ r: J& S2 T4 Y7 N- /**) ^" _! X+ x8 ]! b7 O# l
- * Менеджер квестов и скриптов. M0 a- T4 ]9 g2 ^+ v6 @
- * Автор: Zoey76) ^' H6 s, q) o$ {
- */) {1 [- \! @- a+ N1 I
- public class QuestManager
* C: w- ^0 v. _5 l3 ~ - {3 t/ F ?* M; D7 a
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
m9 f0 S. e# C9 Q& Z: | -
" F) V+ d4 ?' c) q - /** Карта, содержащая все квесты. */
: I' ?3 O. z; n3 t, ]* \ h - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
4 M9 p% C3 q* m/ }4 h - /** Карта, содержащая все скрипты. */
4 I" y2 w2 {5 K4 V t - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
: `' Y& g+ ?$ x - % ~( L5 n% I# r
- protected QuestManager()
9 q: ~- u& }+ b; k; K - {
" J4 x2 s6 O' X! C' F4 v2 |' K0 ` - }
9 `- v% e" ]* h- Y z/ T6 [& d0 L - }
Скопировать код 4. Методы4 V" `' Z+ N) F4 y
Метод reload(String questFolder)
, ?* V7 m1 M# I2 i% _3 f- public boolean reload(String questFolder)
( V# ~$ M: g: Y* P - {
; D: w& l) u( \* N& P - final Quest q = getQuest(questFolder);/ c- v" r) ^& Y$ C
- if (q == null), z1 e) Z/ l. G8 o8 g. Q
- {
) \% j, R. @9 u - return false;
8 C7 m; {5 a: [6 s! g4 j - }2 F3 p: q: C1 {! t7 v/ E
- return q.reload();; [ d2 L: V* k" h
- }
Скопировать код
. x0 P P2 M9 \) ^+ G9 k7 Q! n) z/ f" {
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.. u4 N# a$ Y3 `$ F: v: L# ?! k
Метод reload(int questId)* h8 `3 F5 J% [1 L
7 j& u, q' ~3 t. f- /**
; H O" U$ g/ I d! S3 l2 i - * Перезагружает квест по ID.# k& D% n( ?* ~
- * @param questId ID квеста для перезагрузки
. n/ ]# c0 P4 x8 C+ s% ?" ^4 t/ c - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае( s) w) @1 J. {/ v( s* D* N% f A) R
- */% c, j/ g3 A3 ]( H
- public boolean reload(int questId)8 r7 a; H7 _9 ^! O- d8 `! Z
- {* l; K; ~8 p" j" ?
- final Quest q = getQuest(questId);
. _6 Z, X7 n0 S& p# k. x0 I4 I( J - if (q == null)
% c& R- `+ f: Z# q, P- p# f - {/ S+ j; d1 }. b9 s# W# E+ s
- return false;
' x% v1 q* V( `4 @9 A0 T6 t$ G* U - }! x9 B9 l' K! W0 p. M( H1 ~
- return q.reload();
3 Y! g t, _) H" C5 _ - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
0 C# Y* l( b1 w
2 t3 }) { o- F: V% MМетод reloadAllScripts()6 F( k$ ?0 j# n9 S9 A3 @
: S, C% T2 Q& K1 t2 Y( S
- /**4 [, O/ K; ~2 {- H
- * Выгружает все квесты и скрипты, а затем перезагружает их.: l2 @/ e H* J' R) i, p* T" C2 w
- */
& e) B4 m& F/ R - public void reloadAllScripts()8 v4 s6 F) Y; f# d
- {2 X% a# p7 c; h7 ?2 Q* `. l/ U
- unloadAllScripts();
+ ~6 X* d' v2 E. r' H -
: u# X' L0 j" K7 U! Y d - LOGGER.info("Перезагрузка всех серверных скриптов.");
3 Q* t" ?: m! Y/ G1 Z) {! x. Q - try% {, s! K5 U! J, q# l1 @8 f5 G# {# x
- {% x1 R. v' L. F& o/ S6 e
- ScriptEngineManager.getInstance().executeScriptList();. E- g- w, }6 g V) q
- }
: s$ |, Y, l( S; u# R - catch (Exception e)/ k3 E7 Z7 i4 o: U b _
- {
8 W2 l3 o5 q: \: X/ N - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
" n( y" E" t1 { s4 Y - }
% R" C. V8 t2 }# t9 P. d -
4 l1 \) B% c* ?8 R - getInstance().report();
( ?7 d d3 \* A+ ~, A - }
Скопировать код Метод unloadAllScripts()
7 K3 ?; a- e+ U' E% e
; \' e }2 _4 d1 ?. E8 y- /**
. ^* O% v8 a! X2 V9 a- t! D, }! K - * Выгружает все квесты и скрипты.! K5 r( X# q3 a* f
- */
e: P6 O* c/ z, Y7 O - public void unloadAllScripts()
/ F7 Y$ @5 o. ?5 \% m - {" t: y* S7 e1 x0 L- u* L4 A
- LOGGER.info("Выгрузка всех серверных скриптов.");& X f, V* W$ g) t
-
1 ]9 @7 } @8 D- ?4 f/ p9 Q# ~8 k - // Выгрузка квестов.
0 B% j% a% m( n& W. G3 G - for (Quest quest : _quests.values())% b9 o: Z' Q6 k, C9 Y
- {
# _8 ~2 p9 `- V9 y W - if (quest != null)
0 a( ~, ^$ ~% j' E$ T s0 t2 N) M - {( u& t1 W- F( t m& y
- quest.unload(false);1 W4 I& B: y! r) t+ |5 ?* T1 N
- }
9 ] y: i; u, F# } f - }
% p' C0 W* N- x: j& B/ d - _quests.clear();, ~' O, z4 u$ F$ u7 U
- // Выгрузка скриптов.
5 M2 o3 {6 Z! M' g% S+ Y$ r# b - for (Quest script : _scripts.values())
) F/ ^! g Q8 V1 N$ F - {
" W! R0 ~% T1 S - if (script != null)
0 I. s4 x/ Q( r0 M - {; M) m( d4 X5 s z) E
- script.unload(false);
$ v* e! { J( B* B4 u: j! ]0 G - }
& Z) x' Q5 W2 E9 f/ j8 l. @ - }
1 t- o/ ?0 ~1 t* d4 R% R - _scripts.clear();0 q' Y& J/ D9 }, l3 R
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.5 @3 l1 S# @) l
" ~; K* N4 ]) R8 d: ~! O% A$ @Метод report()) J9 y/ t) d& {$ q& u* i* o
, }5 J' _) Y, {- d6 Y3 x1 \
- /**" w: l* _" o* X5 P. k
- * Логирует количество загруженных квестов и скриптов.
( F5 y1 j e5 X) s& X( G* i! o - */. a$ }- Q M4 R, j8 J; F- h' {
- public void report()
6 p- @+ e' A# j& a/ K - {& P) d1 O! X4 O% w) {% J5 Q
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
& Z! {" v3 | I+ w+ i - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
) I1 r2 H5 I% X! e9 r - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов." G3 a9 x* E# ]% R, j5 J
/ K& d8 m; |' MМетод getQuest(String name)
" {$ j- T6 h5 T* `; _) W4 A- c1 u% T* `, t: i" O
- /*** ], g% x; L. C0 v" X
- * Получает квест по имени.' u3 ^" B$ K% O7 y' e4 J
- * @param name имя квеста
" S. T$ w h2 J8 ^, i7 p - * @return квест
0 k/ \5 s: \% e& d/ t9 p& ?( C - */
- U) g/ q/ f' L, v5 _8 H o# W - public Quest getQuest(String name): S0 u" } P- ^
- {$ D5 g' h* S- ?' x2 u2 N$ s& m
- if (_quests.containsKey(name))0 }( A9 I1 j& I2 ?! j; i; [
- {
( U R5 r" l- N5 Q6 j - return _quests.get(name);; ^3 l) h+ a& ], [9 _* X* n
- }. {2 G7 X e8 P% q
- return _scripts.get(name);4 `( y+ y2 [6 t* p6 h0 n" b7 o
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.. i8 w& c V0 F' ?" J+ M
: Q" O7 @: H7 x) }: F. I
Метод getQuest(int questId) q% S0 n- X" F7 `$ a4 l
- `* v: y* C5 R# V$ k3 J4 Y, ~
- /**; P' ~) G: I9 s8 H2 q0 @7 w
- * Получает квест по ID.
, o1 j* \3 G2 e' A9 H - * @param questId ID квеста8 ?3 |" M8 s1 R4 C ~
- * @return квест, если найден, {@code null} в противном случае) O8 j( e H# n) l$ s
- */+ u! ]1 y" n) i9 z& i
- public Quest getQuest(int questId)
6 n' a" Z) _8 m5 C% z( h - {! Q& b' L0 [- d. u) x0 e2 ?/ y
- for (Quest q : _quests.values())
) s" C! y& ^2 s: l - {
4 }, s. \7 M% V" L% j* c - if (q.getId() == questId)
; L, v$ s3 U# p1 N* \ - {1 J* N4 s* K1 ?' Z) r+ ?
- return q;
+ }$ y( r& ^: { - }. v6 ~1 B' r' C7 G
- }
6 [+ O' Z, b0 H" E* K, W3 ]* R% N1 n - return null;
& Z; l4 l& ?8 M% d - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
! S4 l. R" b8 P2 v2 o9 D. K 6 B( _, y$ E! k2 A
Метод addQuest(Quest quest)
, t$ E- l" j8 c# j( X( q/ P# ~( i" K/ C. g$ B0 k
- /**
3 T" |6 l% M( @ - * Добавляет новый квест.
7 d* Q; C* V4 e. z' u - * @param quest квест для добавления
/ N9 H9 I; d" X; y* |! }: ? - */
4 p+ q" U5 c, G6 F! ] - public void addQuest(Quest quest)8 J" X9 g( v7 |+ K8 {! _
- {
: j I- ?4 K. ^( Y) K, ]7 a - if (quest == null)" Q, ` X* G1 ?- F1 B' P/ w
- {0 {" e# @1 y0 E4 @ p+ j1 @
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
% g0 @- N6 s% E1 L - }6 l$ B ^6 n/ V* x+ }9 S
- 3 F+ o7 V( s5 {. c' c+ m* \
- final Quest old = _quests.put(quest.getName(), quest);
w( f( \/ U4 |0 J( y3 t+ v) _& p4 R - if (old != null)# i3 C( h- D+ \& Q: ]4 v# x; N
- {
8 T# j- a; c# B! g - old.unload();! k4 ~/ C6 V% n( Z9 I& I. J& a9 x
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
8 r9 |* }' J) [' v4 j# @: _3 B* o - }
3 n) |* ^" C1 ~5 M5 w -
. Q; P# H, d, P9 C - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
; [# y% |0 O, f9 q) U: v) l - {
: p) p/ j" S3 \, Q1 H+ O9 }$ l/ N - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();( i, Z+ t5 X# N" `/ n
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");$ C4 f& A) R) L
- }
`$ o; I: k! ? - }* U4 S" F2 u. |2 Z N2 ?( }
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
: x+ O F+ |+ ], g8 ]" wЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.' b4 @% e. H7 W) _8 _
! Z+ `- Z$ w! y9 D5 [" O
) h9 B5 b& @% [4 i1 v/ l4 n) \; t$ D) P% J) P7 i* \2 u" r& g
|