Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
1 g4 y4 W9 S0 S4 N6 G! b8 {% A
Разбор файла QuestManager.java
$ Z0 o- ~. X- f6 O
! j" d* E2 d p) d) ]! X( dЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.1 X8 C5 J1 h, r! J% }* v
Основные элементы
( D9 ~! ~+ f2 K3 o' c8 I9 i- Лицензия s1 ]9 n% J/ C: j! {+ l
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.2 U, Z0 Y4 h3 `. b; I5 L! A: z( }
- Импорты u* A- K! J/ Q; b/ ^, p; I5 [
% l7 r% Q4 x% l7 MQuestManager.java — управление квестами и скриптами.
+ p6 B1 g$ b' H( _$ Q2 n3 i, T2 kПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
! S" S- R9 F+ F, G3 v
) r/ s$ M. _2 }; {! O- L5 p3 r: I0 L; `, x
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
/ _. n, o; K' S9 M3 h$ S. ?" e( E1. Лицензионное соглашение
; s7 C9 K. R) q- S6 M; \. C6 F- /*
: T' J6 y0 E' H5 x - * Этот файл является частью проекта L2J Mobius.6 [5 K* ~0 H k* I, T! k
- *
7 ?% F) L# g! N6 t" N% c; ^/ K' W - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
, G% _. l# E* I) V - * её в соответствии с условиями GNU General Public License, опубликованной
. d7 X; V2 S! ~/ I2 W2 E, H' l - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
4 q3 L5 d3 B2 Y' L, V& m7 Q; ?9 D* I - * 4 d/ m. E" o; d. Y9 Y. G8 O4 H
- * Эта программа распространяется в надежде, что она будет полезной,! n# J) I4 R! Y
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
+ j: O1 m" d$ Q' d0 U - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.. O9 u( l8 r+ _1 V8 |3 ?6 f
- * См. GNU General Public License для получения более подробной информации.
# @( D' H$ T. ^! ^ - * , j) |$ K) }' }/ o K. A
- * Вы должны были получить копию GNU General Public License
9 K2 N- x7 h% C2 R& \% S' u8 s - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.1 b4 R x( q8 o6 O; p2 Y
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.* F3 ?2 X! e7 @4 d
: S6 @3 C. S) c2 M
: C0 l6 j+ v' d3 E! }2. Импортируемые библиотеки
^6 X/ Q7 T( O3 i, S7 n# w5 Z6 _
: E- w |( ^) ^% l C* |- package org.l2jmobius.gameserver.instancemanager;
7 N7 \3 R3 M6 l% g0 l2 k& K
& w# S5 N+ R; E# F6 f* n0 X8 i- import java.util.Map;+ _! C2 O3 ^5 a! \& P4 |
- import java.util.concurrent.ConcurrentHashMap;
5 Z+ y7 l* l$ L+ N- F" z - import java.util.logging.Level;
- U9 m5 F; s& E - import java.util.logging.Logger;3 X: a5 M3 W( j, n: e9 F& a& @
- ) t/ s9 U: C9 w% e
- import org.l2jmobius.Config;, }+ W/ H! Z0 G5 E" a3 y
- import org.l2jmobius.commons.util.CommonUtil;0 k" p( U3 _# W5 H+ |; `
- import org.l2jmobius.gameserver.model.quest.Quest;
! V6 x4 R t7 B2 E0 C9 _ - 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 K: @# o( k" b- q# I: N
( \4 ?6 s! s! L" N; r! f, J* `3. Описание класса QuestManager3 F" t) |6 D6 T0 Y. b# {2 V
- /**
9 z8 F' t) o) L3 V$ N8 _% Q2 k - * Менеджер квестов и скриптов.
% n2 w2 v' r7 A - * Автор: Zoey76
) Z, u5 E, A6 ~2 G0 b - */
+ ]$ W( ^: S0 C1 X! H - public class QuestManager& z: V- e2 F# _
- {$ A0 K3 \. a3 u/ F
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
2 d$ V6 B# l j! @ -
5 t5 |$ W- a8 }) y - /** Карта, содержащая все квесты. */- a, U) a+ }- y; c7 p, a
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
# N& S1 O0 Z8 q( u9 d& ~1 I" V - /** Карта, содержащая все скрипты. */5 \3 }; G: W ~
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
B' m/ q1 Q, ^, J - . s( G$ |. Z' W4 M0 Z
- protected QuestManager()
, g2 L. |5 x6 x - {
/ W$ ~" E, R( T/ z' p7 X P - }0 Z, U4 F' Z! y
- }
Скопировать код 4. Методы2 G8 C+ e3 \( @& @1 D' l: k4 G4 F
Метод reload(String questFolder)
( F6 \4 p9 S0 z' z- public boolean reload(String questFolder)
* _2 ?: V+ z e" ~" I - {" I8 r0 H6 O7 }* `8 n- k
- final Quest q = getQuest(questFolder);
8 j9 r* i: X: m) `/ D, r& g - if (q == null)
7 h/ \' M" G$ _7 u# o* A" i: G0 ] - {
& m2 x4 p K4 b8 @9 T! p9 |2 P - return false;
" K, k8 M& Z# G - }7 k6 g2 T8 s Y) G t: n
- return q.reload();
# H! X: J. |; V& f1 _ - }
Скопировать код
5 M* O6 k' c u7 M8 @: r, B# t8 U
2 r3 [! v _1 U5 j2 B1 EМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.. L. U5 ~- J: U6 Z
Метод reload(int questId), s6 q3 y; ?8 o+ |0 v! o# D$ d- v
8 ~1 J. c, |; E3 o! ^
- /**" }8 o( Z9 G6 Y6 d3 Z
- * Перезагружает квест по ID.
4 A0 C( B% p) b6 f - * @param questId ID квеста для перезагрузки
7 N" c2 f! t& u! |4 _7 ~ - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае# ~7 @; M1 A5 _1 V
- */7 o& x4 r0 @' `5 O9 |2 B3 B9 K
- public boolean reload(int questId)7 B6 ?8 F0 V+ \+ s9 _: \2 e: I
- {4 n; B2 A5 r y# A1 a5 X
- final Quest q = getQuest(questId);: s2 d6 P0 \" e; F, P! m' e
- if (q == null)
# ~# a2 T6 Z; G2 Q3 d3 k* t9 G; S - {
; z$ w& Q7 e3 Y- d9 v - return false;
4 V4 }0 S9 J! C" d7 H - }! C# n* ~- Y- ?( ~7 J% K, P! U
- return q.reload();
/ n( }5 ~, a( \5 \8 E - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.: S0 r& L$ p' A7 J
7 S7 F- M v3 x$ x
Метод reloadAllScripts()0 [2 j: D7 u" D' l
$ x$ R" K2 }& j. j5 K
- /**: P' {1 b1 g: E8 O+ S
- * Выгружает все квесты и скрипты, а затем перезагружает их.% }5 I2 S9 I. |8 g8 Z7 R* v
- */8 Y' b0 M7 L) P# }+ \* A
- public void reloadAllScripts(). [7 w ], J J n9 _8 p0 [; _
- {
$ j& `+ i2 z0 U# N$ w) F6 S, V4 L' v - unloadAllScripts();
. m8 e0 }- Z% K" e7 o -
2 ?) @" |% B2 R - LOGGER.info("Перезагрузка всех серверных скриптов.");: o/ y& c3 @$ g1 N- M) T& H
- try+ ?) A: U, T) C, k
- {/ {' A, ^4 o0 V# _
- ScriptEngineManager.getInstance().executeScriptList();) }* _4 q3 T* o
- }
* R, ]7 }: ]* ^* M# ?: Z# I* `6 b& u6 r - catch (Exception e)
; o9 i' R1 z5 y - {
5 A$ ^. w9 ^8 G7 J e2 W; X - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
! ?# l8 ^7 b8 O5 w/ | - }7 G7 m% E) r) O! C4 f
- ' z- _# A# J3 l9 k
- getInstance().report();
' O1 a& D% h2 d& l- R& @- q2 O; T - }
Скопировать код Метод unloadAllScripts()
+ ?5 H% ?/ Z( m# U& Q( ?9 F3 B; ^0 f; c- v8 O3 N
- /**) |- ?2 ]) \4 f! J d
- * Выгружает все квесты и скрипты.
- S+ t& A( ]; O' P! Z - */
: ^5 p) h) y* E/ C4 |$ H8 b - public void unloadAllScripts(), |1 h, L9 g; X1 s( K( n, x; \: c
- {5 h. q7 g T. `/ ~$ p, n
- LOGGER.info("Выгрузка всех серверных скриптов.");6 f9 Z' G/ N' Q e( t. I
-
+ E( Q7 U; G* n, X( p; K - // Выгрузка квестов.
0 G3 A" @8 Z! G5 H9 L: J - for (Quest quest : _quests.values())' z8 u9 {# B; x2 j1 u/ D5 X
- { c' c. ] m" j' w' s' N) A
- if (quest != null)
% q* }0 s5 W9 J- z - {
, A! p% z) U5 U5 i1 D - quest.unload(false);7 ~9 k5 F1 [1 L& v
- }- N0 x. R$ P6 q
- }
$ Z# y( Z* D. V6 c - _quests.clear();
6 b0 S5 V9 {! Z N% C/ N8 D" X" z - // Выгрузка скриптов.# A* `9 i4 t2 F5 y
- for (Quest script : _scripts.values())4 v [/ H( J' w. K: [
- {4 `3 a5 i4 u0 L
- if (script != null)
9 M, _; j9 v9 J! U( A W+ Z - {, F* M9 y3 F$ y) g* Q# H
- script.unload(false);
: u, g! o. k4 }* n {8 [3 P( @ - }
& J* X& K: M Q! ^ - }/ c( f4 u5 l; {( _9 Q+ t8 d
- _scripts.clear();: H3 I" m9 [% `
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.' S7 P' i& G- f: O! x
% U8 D& z4 V! ?3 c- W' U
Метод report()7 f$ i( Y2 `' y% [
0 X' a/ O$ ^* c G# z- /**4 v4 K2 Q& g& t- U5 U1 @
- * Логирует количество загруженных квестов и скриптов.$ o% [8 T6 @: ]) q5 h
- */- B$ c( y5 |0 _8 L& C# T0 @% W# {& @
- public void report()
; n2 P* q9 n4 D* O! V9 N5 w; N5 p - {4 w4 ]- W) Q1 `! C d
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");- o2 {; h" p1 d" J' m
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");3 C8 F% r* v) R- k; P4 K
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.( K5 F3 A7 ^# @& k6 N* H* `
( S0 k% D, q7 g+ ^9 F- V- G8 r9 _: P
Метод getQuest(String name) Y) y! ?# g" [* D/ b& X0 @- W; ]& ^4 K
; T2 X( D& N9 c# ~- /** n+ c! t$ d; v- f6 ?
- * Получает квест по имени.# J. j9 U n5 a G! [* t- |0 }
- * @param name имя квеста9 M x( Z% B' N7 k
- * @return квест
2 }& ?% O- n! c' Q9 x1 I - */9 r6 h5 q! j* z3 a
- public Quest getQuest(String name); E; M% @. V9 M. b9 I
- {
% V4 |* h7 v0 v9 D! d& u4 C0 z4 f+ Q9 X - if (_quests.containsKey(name))" t! L- r( b) \" c% O S
- {
; S: U7 |: X' ^6 q5 K6 |& S4 b - return _quests.get(name);+ |9 l. W }+ n4 C( a
- }" [/ a/ W: U/ _/ T. X
- return _scripts.get(name);7 a! G |, _! ^' }- q
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
2 h( p4 G3 e3 T3 R6 W# L $ u; m6 `: @& c# _! T; J
Метод getQuest(int questId)( f' l" t7 I- O& {
. m$ c- ^, `2 ~" N
- /**
, w" }# ?& @, I" C - * Получает квест по ID.) O; }* h6 [: T) M& X) y% \
- * @param questId ID квеста1 S! A, l# t6 L+ K
- * @return квест, если найден, {@code null} в противном случае
+ h' L8 c1 s) ~! G9 O2 ?( c9 e - */
) ]9 d; \" }+ m: O5 s) J - public Quest getQuest(int questId)
% P" u+ A/ q( R* r - {# ~# m/ ?& Z# N% o- c$ r: [2 {
- for (Quest q : _quests.values())
4 t. [; L; W8 O6 W - {7 Q4 H: K! @! E" J1 k
- if (q.getId() == questId)
# r5 m" n2 R5 g6 Y - {5 s9 Q0 h8 g* G# B# ]# _4 P
- return q;
I* ^& Q4 b2 @: w - }
; @1 V1 X' F) C) k" w. S, A1 G - }
1 Q. B$ l* y5 Y3 Y2 x% I6 n* L" ^ - return null;; a1 ^4 @! D" Z5 ~
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
3 t" Q* t) {, a8 u' R# _, [* p & m! ?. K. o. ~" V9 B8 |
Метод addQuest(Quest quest)6 m1 t# l) u2 C# v2 G3 ]
# M6 y: W; p$ n- X$ T5 s' O7 H2 {2 T
- /**, M" A. t- I/ F2 |0 B& q
- * Добавляет новый квест.
/ P, L( \: ]) ]! S" p - * @param quest квест для добавления
! E1 U5 f/ S" l: B$ f - */
9 U. b+ T5 [6 y6 P2 q# e - public void addQuest(Quest quest)
- e: k0 ^/ v7 A# _ - {; b/ u4 D. |! ]5 k
- if (quest == null)
: p/ j0 V+ D4 P6 ^: N4 F - {
9 v; P L4 d; Q2 ? - throw new IllegalArgumentException("Аргумент квеста не может быть null");
, x) E2 ]1 p$ z9 M8 Y5 H - }: U8 Q/ I4 a% ^8 M% y
-
0 q+ Q4 U; q& v9 Q) E9 d' M0 j - final Quest old = _quests.put(quest.getName(), quest);: U: g+ @3 U' k9 d+ H; P
- if (old != null)7 w/ p% K7 F; T9 }
- {
9 M; K5 U% ^2 r: T! M7 ` - old.unload();
# b4 j% q& I9 t% q) G - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
8 s" y7 x8 T) u; j& I - }1 @4 o3 ^& f/ ^: F2 f
- % [# E7 D" v9 j) z+ l$ C5 g6 W1 J
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
4 h6 V# Q! o: ?8 g$ n - {
! h! l. l" ~2 {! z/ g0 B/ e5 d8 j - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
2 P! x& ~" L) i/ u - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
9 E6 M3 y v) L - }- V/ Q! |" x" T* T4 t! _: a
- }
' t- z: J9 E' ^; H7 ] - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
" f: l; L' U0 w; c* a O6 MЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.1 y+ j" V i( L" I: k( O
$ n7 C& n4 `8 \+ P3 }
$ p" i7 y9 h" ]9 L! x' E1 u- m- C5 H4 A( T0 @# R/ e
|