Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius: r( ^2 n* }5 L6 W% w( v
3 ~( U. a: s9 E1 g" M
Разбор файла QuestManager.java) o6 W9 H& _9 R0 m- C" p
' v, x e- ^9 }4 yЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.( S! t6 l& S* Q/ u# y. e5 T1 p+ v
Основные элементы# z6 T9 {6 ^! ^# l1 ~ U- H
- Лицензия
: u2 P5 S: h7 B9 [- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.% q- w6 R) b0 s3 Z9 Y0 l2 K/ L
- Импорты* Q3 y3 J4 E$ @; n* F3 Z2 J
. o+ H9 Q( n+ G& z9 \9 h6 N# u8 GQuestManager.java — управление квестами и скриптами./ x1 p3 u7 k( p# `) r( ?, \) Z
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
8 l$ h ^& ~) X5 d8 k- r
5 ~: `/ g! N7 Y5 z) q* @' T. k$ I/ |$ ^* }
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.! ~; g! E/ \. Z! g4 [: k
1. Лицензионное соглашение
" p+ Y( L/ U/ i# j, M- /*& B8 k0 V" p. a V+ ~" i. |
- * Этот файл является частью проекта L2J Mobius.9 Q8 T4 N& l# v. J6 W. x
- *
. _( o2 E1 M2 k - * Эта программа является свободным ПО: вы можете распространять её и/или изменять" Z: G& [2 \1 v! a- F7 [
- * её в соответствии с условиями GNU General Public License, опубликованной; _2 a" _9 J& K2 _% F
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
: K2 P' h6 z3 O" F+ Z& J - *
" F( o: n% v7 z; C - * Эта программа распространяется в надежде, что она будет полезной,$ A8 ~! n$ P# U2 C$ N0 E% O) ?- e
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии" h% h; A$ o, a* V$ M: [. u
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
v/ n6 ~$ p, }; e - * См. GNU General Public License для получения более подробной информации.& g6 F5 b2 `+ W& V" g; u/ z7 @
- *
_6 K' H3 |+ l2 q1 H - * Вы должны были получить копию GNU General Public License
% n- ^# n1 k# ^' C0 @# b+ S - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>., `" S b; P7 p: y
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.7 [) s4 ]! [" W( L6 f L _
+ }6 K6 s- u5 {: a
/ L" N5 s( j- f2 s2. Импортируемые библиотеки
5 g; i0 F9 {. _& d. z: p4 P& n. k
- package org.l2jmobius.gameserver.instancemanager;' Z7 w) D% r* V% K, K
- $ W9 _, { C y1 i6 }
- import java.util.Map;
1 g, f# d$ W7 _* M& l, a2 h* ~ r - import java.util.concurrent.ConcurrentHashMap;/ \# @ s& }' C0 M9 D! l
- import java.util.logging.Level;; w& S9 B$ p4 y5 |% Y( b
- import java.util.logging.Logger;) M% m# w0 ^4 }: m1 q( f7 [
1 v8 `- K% q% x" J1 e- import org.l2jmobius.Config;
" H8 s" i' V; F( E9 K" k - import org.l2jmobius.commons.util.CommonUtil;% ~2 E6 F" `/ J6 \8 p
- import org.l2jmobius.gameserver.model.quest.Quest;% Z" M' d2 J0 q% Y
- 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 — менеджер для работы с игровыми скриптами.
- ^$ q. C) M; C* E) t( [& V( ~2 _6 ]9 z$ U B: n
3. Описание класса QuestManager
4 [' C2 M' H- O- S- B- /**
: e$ e* ^# E" y* c0 y; g \ - * Менеджер квестов и скриптов.% U5 p- x. g! M
- * Автор: Zoey76
8 {# O8 m- y! m- {6 V7 K1 _ - */
, M5 T$ C, W4 {% M6 O - public class QuestManager) k E6 I# g) g3 y7 f" I) b6 t4 e) g9 {
- {
# n3 H4 B" h: Q# [. E( ^) e | - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
; q. L3 n* Z2 Z8 _! A. [ -
6 `: a& E& c2 u6 z6 v - /** Карта, содержащая все квесты. */
) k' W0 K8 t8 n( l+ ? - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
& h; @3 ?7 y2 t" p6 a# N+ u- G - /** Карта, содержащая все скрипты. */
2 g8 v6 d2 n( x) e/ J N( h - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();& g3 o* D/ m* t1 e
- * ]( N H) W* \. G, S
- protected QuestManager()
6 E' N ]4 G% ]: Y$ g - {
4 l) ~% n( A. v. R3 ~9 C - }
% o5 {' d% R- n* Z) U) L0 v - }
Скопировать код 4. Методы9 v+ c& H9 b6 y: c6 i
Метод reload(String questFolder); s* L& C+ n2 G) \+ {; v
- public boolean reload(String questFolder)
+ n) d4 D% S- O- R% j T - {
& L, a; G9 @" c: `! T - final Quest q = getQuest(questFolder);
* w3 N& o; C7 l - if (q == null)
7 O1 d% z6 E1 ]% A5 O - {# E: a I$ L; l3 v
- return false;( X% I! m6 W/ `8 ]/ w* P9 E# g
- }: ~) @$ E+ B/ t3 @ i
- return q.reload();+ u6 w y1 q: ]5 Y2 I9 `& M% J
- }
Скопировать код
2 w* z( {2 {- I/ b/ Z Z, Z2 j: j7 u
9 |5 D7 N5 d5 Z: aМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.9 A" T/ _7 x: U
Метод reload(int questId)
3 j; J3 h x% @8 S+ K* U2 V( Y. Q8 @: H/ x
- /**
' e+ j! W$ c- E6 O - * Перезагружает квест по ID.4 o7 R. o& u# Z( r5 n
- * @param questId ID квеста для перезагрузки" C: i2 }- y! P1 D) f2 Q6 \) G5 ^
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
, L+ P0 p) S4 j# X9 O; o9 N - */
! A( b$ @' o3 y% F2 \: {7 i' v/ e - public boolean reload(int questId)
1 w1 {9 m- T" T; r7 J& H - {
& T: J0 i4 J: m* a( G - final Quest q = getQuest(questId);
$ u/ m8 T" u! S J# X _5 l - if (q == null)* {+ ~* L0 f' C# Y5 T, ]
- {7 q _0 K6 [1 t9 w9 P8 R% t
- return false;8 K. E# w2 g' N+ f6 ]& ?3 l; q# b
- }
" i5 K) e. I' f4 r! C1 ? - return q.reload();- N4 `0 u) y6 i; c" {0 ]2 W
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.6 x$ D! B, w4 b
2 [! _# E$ B! b! f8 Z/ m9 F
Метод reloadAllScripts()# k" ]3 \$ q# O1 y
/ M' @3 E+ Z+ s2 z- /**6 M' ^. Q1 `2 u+ \2 G% }/ ^ j
- * Выгружает все квесты и скрипты, а затем перезагружает их.
6 O; c: o- y( D& j* ? - */
0 k& I* W& Z) o8 s# g - public void reloadAllScripts()/ ^6 S s, L4 v8 a; u5 D
- {; g/ G" Y1 |0 h3 n& N1 }- f' z7 ]
- unloadAllScripts();
# S! H) f U1 j* j% J - 7 x1 m! N* G5 m2 v7 r
- LOGGER.info("Перезагрузка всех серверных скриптов."); x* M7 d/ b: O$ Z: P
- try
6 V: p7 K W' H# \1 R$ W - {
8 x0 v P2 s- [- `( R - ScriptEngineManager.getInstance().executeScriptList();% v7 n* e; j& T/ \5 ?' c! W
- }* R/ g, d7 p: ^' W8 L& X6 W+ e
- catch (Exception e)1 L# z6 b/ i& N3 Z$ P
- {
. f6 n# b7 ~" q: A& d" S1 A P6 } - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
. W! i- v/ m* K9 n5 } - }: d: A) z1 G0 i: X8 Y3 }) k
-
; E% p3 n" D, v B& T# c - getInstance().report();& o" o9 J8 b4 G
- }
Скопировать код Метод unloadAllScripts(). I) Q- ^6 \! {( ], n# v: _
5 I' b8 c/ T9 Y- J, d. t' \- /**% \0 y8 d- x0 D* |% F
- * Выгружает все квесты и скрипты.
9 k2 e* ], J( {# b/ R8 V0 \ - */
8 c8 x% a0 }$ S5 V - public void unloadAllScripts()2 P4 Z/ Y* B& Z* G. _' r( l* m- S
- {5 H( F# }/ J6 ^, |
- LOGGER.info("Выгрузка всех серверных скриптов.");' W: F4 h' X4 ~+ l
-
) C. s6 s4 Z4 A9 ?% b - // Выгрузка квестов. i, Q1 c# x6 X: [& ?+ A4 _# z# e
- for (Quest quest : _quests.values())! n! S% O4 l+ O- I7 U
- {* _- H- N2 p$ c9 i
- if (quest != null)
4 D5 F' H# B9 ~4 W" m6 ?- h' t - {
4 w: o7 J2 t% y# q" V! @, G0 X0 X' Z - quest.unload(false);
- r3 m3 n$ a. W3 \* n. S; [ - }
6 J* D' z& `2 e% q7 H - }" ]( z5 y# W( b1 q/ V: N
- _quests.clear();7 n" d+ x* e0 k0 W$ r3 P- ]
- // Выгрузка скриптов." ^4 j; z# y$ H# g
- for (Quest script : _scripts.values())
8 N7 l" e* s C - {
7 B; L, _0 I0 h9 k5 o# P - if (script != null)0 a2 }% ~6 Q8 D6 b; k5 x
- {
3 d Y. C& K* N% C - script.unload(false);
6 w6 p/ j7 N: Y3 i - }
! v& x7 V; S z. | R& K3 g - }
- u, L a. S$ k5 U0 a - _scripts.clear();
% w1 Q) }) \! k' o0 ?; f - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts., G9 M5 _1 I8 v- X- o+ a
' C3 q+ `; {: J0 C) `3 G$ nМетод report()
s" I+ n" i1 N2 P7 I* h' {7 x
- T7 ]# ?+ ^/ }9 l( S0 i& D% g- /**
/ z2 }( ^& L n6 E1 V! b - * Логирует количество загруженных квестов и скриптов.
5 q% J$ g8 |* R6 |% v - */
3 a4 x5 L$ P( }- C9 m - public void report()
6 d& t6 l% a0 N - {
$ j# n0 h$ Z! @+ k# n$ |# V - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
. X* J2 i5 q1 t - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
6 X) o$ x1 {, n7 H$ n& D9 a% t - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
: l$ L; {' t7 {+ | f
" ^# @) ^0 {: V, `" ZМетод getQuest(String name)
& {6 Q3 u8 o; h( F6 t. Y! P& {5 B5 R% A- m5 M9 |: t- M, w( Q# \
- /**2 _3 ]3 A: G. i: u$ B" y7 e2 w
- * Получает квест по имени.% v# { [+ v/ w4 O) E& ?
- * @param name имя квеста. W6 R% }6 T- `5 s5 Y, A7 y# k0 }- U
- * @return квест
& x( x9 f' b. U" { - */
, ~7 a$ z3 t' p \3 C1 F - public Quest getQuest(String name)- h& r/ D' {3 q2 o
- {8 N- L* S; {' t8 k" l, v' h) ]) H
- if (_quests.containsKey(name))
8 H) Y* O4 x5 }+ ~' M" g - {% B+ l! y4 e9 S) |5 A- {, M
- return _quests.get(name);! k7 x- n" d- c8 e3 B
- }! _% r7 x6 B+ a
- return _scripts.get(name);0 J4 D& n t; m$ ]7 s7 m( n
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
1 q% G. N s/ \+ ~ 5 V/ P% h/ D w( f6 q, y, L3 h
Метод getQuest(int questId), W3 X8 j: m! E. H
+ Q. m% U! O( W' u& Q% G. I- /**1 R7 t, L: c) W: w7 T
- * Получает квест по ID.5 J( u- ?6 L# O9 ?5 U3 U; @3 `
- * @param questId ID квеста2 W2 h8 w+ n4 V; L$ O6 c) L/ N% l
- * @return квест, если найден, {@code null} в противном случае5 z: i* `4 N3 C& Y S; d
- */
9 O; z. ^1 H, n. Z - public Quest getQuest(int questId)
8 s% Q$ y* v2 a. g - {. P9 Y3 @' O/ c3 n. I( U5 R
- for (Quest q : _quests.values())
. }' i9 o4 p& C; P - {
/ l3 ~! P. L R _1 ], A - if (q.getId() == questId)
k3 X" X: b' X+ {, p* l( b& f+ p - {
6 F3 t- T6 h9 \2 i$ b+ Q - return q;
+ D& ~- p' q' n4 q8 a: G0 A - }
- v. f" Z) `( U9 v2 y - }
( f% v$ U6 [9 P3 X7 `) S4 L( x ` - return null;( N0 p4 j& q! w9 ?3 r& ]5 z' ]
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
' R. A" E* ^" k! _+ h) u( p8 t
# r' x4 t) ^ ^ d( { bМетод addQuest(Quest quest)
- n2 a9 C' Y( l
o, P* Y; M5 W# e$ a( Y! w- /**0 r. {9 l+ t6 {. T
- * Добавляет новый квест.
' _3 S9 o+ X/ ?! v( k( D4 z- n& @ - * @param quest квест для добавления/ Y& J7 z8 V* Y. y: D; G4 R
- */
: G, v* ]* c: p8 R - public void addQuest(Quest quest)3 g8 q0 C/ ~) Y( a8 ?: @8 M
- {; `0 V& o. F$ E/ ^5 ]6 I
- if (quest == null)7 j* T; K$ J+ F1 F3 d+ }
- {8 q9 w$ A& z9 j0 C
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
0 }' l. _ f- K- G - }. ^9 r" Y @& C) ^
- 7 C) ~+ V& Q/ ~0 a& b
- final Quest old = _quests.put(quest.getName(), quest);
4 c( M* P' [. |3 j4 w - if (old != null)& ]# j( I% Y7 }& K P$ n) o0 B
- {
/ {& V2 q. ?# T4 j" P - old.unload();
* O& O; D9 k" X% P. m& J8 e2 S+ q - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
/ }' P6 \( m4 \9 K7 H2 W% y - }$ Y3 ?7 ?% Q7 Z: R; a: N
- % ~# | i( U5 V3 p+ ?1 V9 e. M
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
5 m0 H- V2 r. g T" n - {5 D/ J* V; R; g& }2 n$ ] s
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();. h r: I0 q6 W' m$ W; b: I
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");, x3 n/ a3 D5 q7 a5 @% S) F8 s# F
- }
8 y8 r4 R; K- X* j0 N, T - }7 s4 g- W1 j! r% d( y) I
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.) r! o% |9 K- |; @1 w' ~3 m# @
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
& f1 @% d: P0 W- G8 ^# K9 O- J
& r, l2 U: G5 }0 U$ @" L0 _( c1 g9 `: r/ g; C6 o
|