Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius# A- h. D5 e1 L7 w
# B' D- D# u* m( E
Разбор файла QuestManager.java
( R" e" i! H& \4 o% u' y
/ @' t. D# m% rЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
9 R8 V" j" m+ b9 ]Основные элементы
6 ^) s3 y4 {1 ^4 X% z, L9 V- Лицензия
, p v( U0 n6 E. |! g- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
5 o# Z8 U) h9 Y/ ?
- Импорты
6 B9 C& v( L8 L7 l9 D- w* h$ e
7 o+ h G9 m3 i+ j( F8 q! IQuestManager.java — управление квестами и скриптами.
2 `7 t9 j* }: B( ]Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\/ V9 P' ]# ^, m; c5 Z! a
7 l2 t ~9 s2 G: m7 |8 R U v* [1 c1 ~0 i5 \( `. \
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.# R5 V- L1 a. H* c8 d3 D
1. Лицензионное соглашение/ M0 e. {2 I5 R5 n) v
- /*! `$ d' u" f0 T9 e
- * Этот файл является частью проекта L2J Mobius." F7 y }8 S/ L- D! U4 s
- *
2 N- d2 X. B4 g - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
7 {$ M$ J3 L0 _) R7 Q - * её в соответствии с условиями GNU General Public License, опубликованной& ~0 n# C) R6 R' P+ T( o) q8 k0 v/ I" U
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
X$ V, w# d% \6 S - * 1 p* n6 Y; x) o
- * Эта программа распространяется в надежде, что она будет полезной,
; R! X5 O' R [ H3 E - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
; p" }3 Q% k& e' z$ v8 o - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
3 ?2 d i0 n, h% j; U - * См. GNU General Public License для получения более подробной информации.
' {$ O: ~9 \. ~! A2 B - *
# g( q# g/ o; H2 W. g0 d' x1 { - * Вы должны были получить копию GNU General Public License
+ c& Q. T" m; ?" N - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
6 z7 U% r- r) f4 ~ - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3., |: J1 U2 W" z h0 A) d( m2 k
# A3 e7 U, }7 K0 b9 p' \
* c2 [, u% t# F) m2. Импортируемые библиотеки( \: q: c- w" H. R
; v1 g: P' l3 E# d
- package org.l2jmobius.gameserver.instancemanager;, a0 R1 O: J, k" r# q( Q' B. L2 z
- : c! X. C' q2 J
- import java.util.Map;" j- m7 W; y6 ]
- import java.util.concurrent.ConcurrentHashMap;
; S @. v* ~. m1 {) S- { - import java.util.logging.Level;8 Z5 i4 n* @' n2 t
- import java.util.logging.Logger;
# {. m8 C# F( ?- E" r - # i! D/ S& w, c: V
- import org.l2jmobius.Config;
9 ~3 e! T4 R2 H$ t& @/ B$ Z - import org.l2jmobius.commons.util.CommonUtil;3 P1 D+ w/ I: i' O% i
- import org.l2jmobius.gameserver.model.quest.Quest;# s: Q/ B1 D% ^ i" M, g
- 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 — менеджер для работы с игровыми скриптами.8 e& v& g* U' n8 v9 i! ~' k
8 t5 d4 N- j) j- w9 [8 N" m3. Описание класса QuestManager5 z+ Y4 F! m# _* ?
- /**
: c9 c; C; i2 e/ S - * Менеджер квестов и скриптов.6 S. {: t3 r$ h/ d
- * Автор: Zoey76
3 |$ s+ A H; j2 d0 y, N- a9 J - */% `: j2 n8 f- }" C4 U+ Q8 d& K3 k
- public class QuestManager
5 q# c7 s, b, E$ V - {
7 L* t$ B# y5 h% @6 e Q% G u- @ - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());1 l4 n H9 J6 a: e
- * Y4 }; C6 t- ~' c
- /** Карта, содержащая все квесты. */0 G) B* Z; i- I4 E) I- Z% @
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
) Y6 r/ ~3 z" N - /** Карта, содержащая все скрипты. */4 w8 }$ E1 s0 L$ q, S0 P' k/ V
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();1 N; N3 N1 C" f0 i9 d
- % O( k2 K7 [+ l! ^% ~
- protected QuestManager()
1 q* X7 m# ^0 `& k4 O. P! N - {3 S( x# H9 f! [+ |- D6 F
- }
% J, o9 U8 E$ M: \$ P - }
Скопировать код 4. Методы
3 z( }8 H8 ]7 T& q* rМетод reload(String questFolder)0 k4 v$ o9 H. D$ X7 O' h0 e; ?0 W# n
- public boolean reload(String questFolder)
* G7 l& d( G" T/ L/ Z- w4 T S - {. x" k% |1 b* ~) Z J7 ]% z
- final Quest q = getQuest(questFolder);/ c+ u' y+ }8 b1 S9 g# T# U$ V
- if (q == null)' | \' A4 r! Y; i+ z* ]( V( E+ B" o
- {$ A U! w( F( f( V, w% T. Y! [$ [
- return false;3 p4 M& I' O: J; u
- }
/ Q) c# Y7 u4 y& U! J - return q.reload();3 R& T7 ^1 X, C( Y7 R# d& }# q* m7 K# O6 M
- }
Скопировать код ! w/ X2 [. Z6 G0 [' F/ M7 v0 b. S
+ b$ G9 M" X$ uМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.( t! g9 t2 q/ w# [3 L0 c# p
Метод reload(int questId)
* ?' n0 ]4 L( p t8 x# {/ W0 G E
6 R( N+ J$ N( B- C/ k6 p- /**% P4 R; C, j9 @. u- `; o: G
- * Перезагружает квест по ID.0 h3 n3 W; i5 Z/ h$ [
- * @param questId ID квеста для перезагрузки
- c' f9 i' C) v, H2 q. I* f7 m - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
$ l( x* H# c9 i7 g& v7 o/ s - */5 ~0 B; K% Z* V, W1 M: R5 o
- public boolean reload(int questId)
3 s" t% m% V- d/ x - {
2 ^/ O Z) X6 c6 s; X - final Quest q = getQuest(questId);) \3 b- I! N! _6 Z2 @, s5 Z
- if (q == null); |8 h& z3 l: i
- {- I9 U: Q0 E' [% Q5 e" L
- return false;
2 F; }2 K& _$ |3 ~# }4 H8 ~ - }) H+ t- G Y% C+ n1 C4 x5 B9 L
- return q.reload();
8 i3 [. h2 ` r& a2 D( o - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
0 [3 Q1 H* D+ `. u+ [4 L
* v& g- R! `- J) Y: T5 A+ aМетод reloadAllScripts()6 [9 A5 G3 U; J8 H$ F9 O
( s( L2 y9 h( ]( x2 Y- n& g- /**+ G- X6 u" K& D# s# @+ H* U
- * Выгружает все квесты и скрипты, а затем перезагружает их.' v' {9 `+ m( C- u
- */
, p' I- i1 B: L% ]6 Z& o0 ? - public void reloadAllScripts()% P8 i- S. [3 p1 ~6 o: H8 W
- {+ h$ `* H' D& d+ v3 q% ?; U0 v
- unloadAllScripts();
4 }. V2 v, J% }8 R9 F& Y - 5 Q x) }' Q% e5 b1 `* V9 C6 S
- LOGGER.info("Перезагрузка всех серверных скриптов.");
, n( ?, _; A! e8 y* Q5 U" R - try$ U6 D+ t% W$ Z' ~6 ]
- {
) E) M( g. P" u6 b; C$ f7 j - ScriptEngineManager.getInstance().executeScriptList();$ p+ i! i$ v1 Q$ l
- }
% q" f, }$ ~! {; Q+ ^; j - catch (Exception e) u; x* H4 |" {, b1 `- P: n
- {
5 V# g* d1 k6 R3 Q) w" U6 } - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
" T" {0 ?. S5 z8 Z& ` - }3 ~' B" Z3 l2 Q1 t$ Z; g. Z
-
2 h8 H& h+ _- K; ?0 F2 }0 p7 ^, k - getInstance().report();
0 ]4 A/ I" @, {0 ]; C% j6 M1 z7 b - }
Скопировать код Метод unloadAllScripts()
7 e$ Q( L4 G G0 U" h) S( y' N0 j; R: O$ g. e* W/ i: q
- /**
9 J( g- u+ y# S4 E5 E* I- \ - * Выгружает все квесты и скрипты.2 G: ^1 h7 x, m" J: h
- */
( Y5 z+ H1 s' T0 M& {; l - public void unloadAllScripts()9 a( _5 E; I- Z3 W+ y) R# L
- {0 x$ i9 \7 P, c4 n
- LOGGER.info("Выгрузка всех серверных скриптов.");5 G% h; ]6 X3 n6 M
-
0 [4 o2 p7 o; [& U7 p- P - // Выгрузка квестов.1 i9 N: T3 _4 a2 R6 ~" `3 @
- for (Quest quest : _quests.values())/ m7 _5 S. Q/ u( `
- {
4 c) f# z% ? _- K: J - if (quest != null)" {' J, V& _% [# B
- {
% ?6 n! e/ D* L& h) n - quest.unload(false);
5 R) m; u# c% f- c% R' m - }
% g' i, K/ e/ c- L2 V- V2 n - }
$ p" _' Y$ S' | - _quests.clear();
+ ?; |; q* r+ O! y4 G: ] ], i# N( ? - // Выгрузка скриптов.1 f, b: c+ J0 ?+ F# O
- for (Quest script : _scripts.values())' f+ m. f5 x+ V4 w! s3 B3 }- v
- {# m$ X& z r! m" S, b
- if (script != null)/ i' o8 K+ L+ O$ }: U9 b# u! u5 A
- {+ C7 S8 ?, ]; Y; c
- script.unload(false);' u* w4 m2 _2 B* e
- }
1 i9 w; W6 p' I; s' E8 }: u8 \. { - }
, t% v' S; O! I; X; ^( o, G - _scripts.clear();& q Z5 t0 I1 T* P& ~1 r5 O
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
. `7 B% E# q5 ]8 X
! A5 K. R0 w1 P- s+ I' z2 uМетод report()5 Z9 D6 ^' U7 |, t6 P/ t* m* _# r
1 q$ U: }, m+ X; B$ l- /**
" `* {0 Y* N+ S5 e( s - * Логирует количество загруженных квестов и скриптов.
0 ^3 U/ `; l2 |, p, Q - */
3 v1 c) U& V8 S4 ~8 x+ l6 Q. X) Z - public void report()
7 g) b% Q9 s5 l( f; h, ~0 N - {
3 `. i3 p) l5 X3 t1 ] - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
$ e9 `/ D' z7 o# M- D- P# D - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
3 O$ V4 n j' |* n$ k1 L4 X - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
% i+ I- Q4 l. \9 K' Y( k2 E. W 0 I7 p) n) s& U4 {. x9 V
Метод getQuest(String name)/ r. b$ |, S, j; m2 P
X0 }6 x/ \9 [) D3 _/ a- /**
; b7 {3 o: L" a. g( R+ Z% b - * Получает квест по имени.
t8 i) M: W6 \4 O9 q - * @param name имя квеста
& S# @- o5 H. T6 s7 b - * @return квест* J. m4 @$ [7 @( ~ C) H
- */
0 v& M" m' Q( W# V: M* ^ - public Quest getQuest(String name)
/ R- J2 Q* j" y5 X% R - {0 n% ~/ g5 X/ V* K
- if (_quests.containsKey(name))) R. X+ d$ n: H9 [. Y
- {
7 P6 G# f/ B) | u. p2 Z - return _quests.get(name);9 a5 X; g' O# ?/ W% {
- }$ ~) e/ ^3 J, D+ Z( a( a
- return _scripts.get(name);, Y. X9 P9 Z3 X
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
( u0 `( a' v0 p4 Z N4 b
4 G6 g5 c6 ~* J( o k. JМетод getQuest(int questId)
, z9 ~: r {' V( }8 d
) R M$ O( p5 g1 y- /**& L0 h! k2 T0 o
- * Получает квест по ID.
; o# l' ?$ I6 S: L- S - * @param questId ID квеста
7 M/ K1 V0 v, B% s - * @return квест, если найден, {@code null} в противном случае) P$ |0 A3 M" c# y& a9 O& I; S. s
- */
$ r9 }' i: }/ y3 f7 ]* t/ p# w - public Quest getQuest(int questId)
" R4 g4 t; ?7 R- z - {. ]: G1 S. _' p% G1 p) \; y
- for (Quest q : _quests.values())6 C& X: Y7 Z, L; @* z
- {
3 h3 k9 _+ q; p - if (q.getId() == questId)
! {3 j3 t5 Y6 w+ p4 ]' G S! v - {
7 f$ a, l! k$ } - return q;
/ ^4 [; L) F3 }3 t0 k z' w& S - }
* ]& F5 @5 q4 W8 t - }
& f. q% I3 J! ?. L& u, C. H Z( | - return null;
: _- n) [* F: S1 h1 b - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.* |- Z; @* k8 h
) ], N: M; k& s1 ]- g( y# r0 vМетод addQuest(Quest quest)
2 W7 N" D- m- M; a1 j& v
* S# v5 V" J- i- /**5 I2 D6 H; ? m5 E$ L0 @* P1 y% h0 f
- * Добавляет новый квест.9 M# s1 s0 ?$ D0 Q, y8 {4 ]9 F9 I
- * @param quest квест для добавления+ Z6 d5 K2 D4 `4 ~
- */# U3 J# U4 ^3 ~8 u5 [, ?! I8 @
- public void addQuest(Quest quest). L' R$ e7 _- _- e- j
- {1 L: z. E: q: t: l+ S- B
- if (quest == null)
$ g+ ?4 d* M \7 T - {
( v" l5 A9 c3 [ - throw new IllegalArgumentException("Аргумент квеста не может быть null");2 O( G* Z: u9 N, M% E
- }' f3 G; J. z4 l/ C8 p% L f% r& x
-
7 u% H/ d: e, k - final Quest old = _quests.put(quest.getName(), quest);
4 `2 g7 N) h+ S - if (old != null)
! N* r1 U) e3 H- ~ - {
5 k; | ?; d5 \% q( L- l& q - old.unload();
& l* q: q* I6 p- V5 F( v/ F! ^ - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
! `1 P( R6 O6 H$ D - }
3 Z9 ~6 f& S8 L+ ~0 y/ ` -
' t" f) j+ Q; O. ?8 ~ - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
7 n) b3 r8 y6 o2 R2 `6 Z - {
- Q8 W; t/ h8 O3 t# n ^ - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
3 o2 V) [! _* |7 f1 D; G - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
9 x8 q( F1 r! J) N, l ?+ q, K - }+ L4 z0 L1 v( `+ B' N+ o; U o
- }
9 [( c8 s% `) ]( ~" Z - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера./ l- @9 f: W( p0 _0 j! d; D
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.- W N0 v3 _" C! ]/ f4 h9 t
( [0 K8 J, R, L8 J- f( R R& U
/ v2 e5 N, B, b s+ j( O; h3 c9 G$ i: B u
2 o0 S, h# r( o% j! n7 C3 } R: s |