Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius7 u* ?. P8 A7 B
& E+ V& b8 `3 ]% |! }; v0 VРазбор файла QuestManager.java/ ]9 H( K" z7 ~2 ?) Q1 ?. b
3 {. m( S+ m! P! M* }0 D- M
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
+ h' a( E, ]. J Y* l8 iОсновные элементы" _- D r. C3 L6 h5 D }
- Лицензия
8 e& y0 [: K; u( L" j# ]- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.# _' s" z+ k# u4 I4 P9 ?
- Импорты& b6 T) C- ~1 |% W2 Q$ K5 a3 S
: Z1 F* J$ g2 n% lQuestManager.java — управление квестами и скриптами.
3 I8 b, W1 x- b( GПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
7 X% d. P. m' O8 X; U" z
- Q$ g; z, _; S7 W- R% c0 H4 R2 T. X9 l' X) |
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.3 [7 ~- G9 s5 i, _- t* [0 c
1. Лицензионное соглашение
% p, E: `- K! o8 P0 h/ V- /*
) \; B9 j' f, x7 Q& r( o5 a - * Этот файл является частью проекта L2J Mobius.
, c/ N, |! o P - *
, H& n+ f3 X, _( P; [ - * Эта программа является свободным ПО: вы можете распространять её и/или изменять3 s3 |/ x/ |6 e
- * её в соответствии с условиями GNU General Public License, опубликованной7 T0 V5 q: B8 a5 u
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.. }( J& Q2 v/ |: ]( E
- *
% B2 j& b2 @9 x - * Эта программа распространяется в надежде, что она будет полезной,9 d/ @1 Z. c- f% {! Z, q
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
2 K* x3 s" m3 n% T2 @- c: f3 ` - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.6 H9 Z+ b8 |; Q% i
- * См. GNU General Public License для получения более подробной информации.
# v! \4 u! C& f - *
% J9 E+ a. t3 N - * Вы должны были получить копию GNU General Public License: f0 W; _6 l+ Q2 {# x+ l
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
3 K8 y+ e' V2 O$ S& U! m - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
9 M2 T3 W" v* l7 n- ]/ W- [, ~7 C6 n4 \2 J
- b: r M/ P; N! U' y2. Импортируемые библиотеки i2 S K- A4 b9 B+ j5 b
" x$ a) t- q# E
- package org.l2jmobius.gameserver.instancemanager;- @& J0 d" }! I3 y) s. {
- 6 {" w& T2 i. L W0 I0 m9 E2 e
- import java.util.Map;
2 m; [+ x+ c: b2 t0 `- h0 n - import java.util.concurrent.ConcurrentHashMap;
- c/ I- T1 b0 ?* s5 l - import java.util.logging.Level;
+ z! X! ^5 ]# I - import java.util.logging.Logger;
0 i0 P( w4 s9 Y% ^: N7 i - ! N, b! T% B) c) ]' f9 S
- import org.l2jmobius.Config;
7 z% H+ U% H, q& B - import org.l2jmobius.commons.util.CommonUtil;# D8 S" n* E/ X8 X. \& s
- import org.l2jmobius.gameserver.model.quest.Quest;* P' T: ]/ E e4 }' W7 {" t+ v* I
- 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 {, i/ E- \ K3 B: D
$ S, K8 o& Y5 ^3. Описание класса QuestManager6 s. c+ Q/ d1 d+ n) E2 ~5 ?
- /**6 w$ M8 ^* d6 p$ Z, m" b
- * Менеджер квестов и скриптов.
, l! ^) i) C3 _ ~1 u$ y - * Автор: Zoey76
3 a" _$ I3 M. V3 P( V7 C- A( j+ d- z - */! H6 R2 u B# @6 b* g( s
- public class QuestManager
( y; W! H* H) a6 r) V2 q+ k - {
( Q, {- @# q8 u- @; q' B) M - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());2 d" j' R U# L5 m9 G/ ]) S. K, @
- 8 o3 S& M* U6 u1 b% h" n9 @' q
- /** Карта, содержащая все квесты. */, \) j, V& @; N
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
5 \- o' y) C$ O) C& r* X+ a - /** Карта, содержащая все скрипты. */
2 D% c" \' o t% i+ g- |2 i' \ - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
# y8 x! F# s: Z' A& D% k. b - " `* t H) C- ]6 z I6 n
- protected QuestManager()
* S8 K f" P& ^ E - {
! |& D7 k! v9 y! r9 R' R9 w% v - }: `1 a, s( h7 v% C
- }
Скопировать код 4. Методы
* \( r1 v' l6 _& JМетод reload(String questFolder)
) U" S8 F9 M9 d6 p4 b- public boolean reload(String questFolder)
: F& f4 J2 p9 D - {+ L8 B: X) n' R; |2 _% v5 @" n
- final Quest q = getQuest(questFolder);9 @8 `+ v' g, x! I3 h7 t
- if (q == null)
: u( u2 m4 K1 Z: ], y9 _% }( w - {; N a. K6 B- Z
- return false;
, L+ H- ?8 n C3 Q& z - }
+ N; `: X$ s. Z% T - return q.reload();# w. F* l9 `' E9 F# ]# b: }
- }
Скопировать код
% ^) P, }/ u- |2 B t" {
6 ~3 e6 ?6 K- h! m1 yМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
0 |* m( v; W# h: b6 j2 D* qМетод reload(int questId)& d7 O! i% T, i: D2 ^1 F- t# k
$ f, V1 [, \- T4 {& n ~9 p
- /**
/ Y, V ?+ {6 D# z5 q# m- m+ z- u - * Перезагружает квест по ID.3 m0 U& G$ d2 a" p* R# o D
- * @param questId ID квеста для перезагрузки
3 L8 Z& V) F Z4 J; f& a - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
2 ]9 O' o0 Z; }. d1 l1 L: q - *// A: J2 K" R( T/ D2 N% ]$ e# A; M
- public boolean reload(int questId)! n2 I' a) R8 E: q9 a' }, D
- {3 f+ e5 j: D9 |, {
- final Quest q = getQuest(questId);" S. \. G* ?. a! \3 ^7 A
- if (q == null)
% h* z* A) Z: r3 e* B+ `4 J- j - {
$ u/ x1 _- l" U' w' U, U - return false;6 L& [+ u& T: E: K a8 S2 e
- }1 d) d! c" T3 k' {# n8 D
- return q.reload();
8 I' p% j! ^& I- a( q. y$ v - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
, @6 ]$ P$ ^6 B3 v# q5 P
- x( B% D/ p$ h# aМетод reloadAllScripts()2 l n" a, Z5 x: c/ {. L+ r! A
. Y# D, h5 ~! S3 @3 q! ~" [
- /**
6 [- S) Q" N4 r5 f1 h - * Выгружает все квесты и скрипты, а затем перезагружает их.
+ A! r: A" i9 W8 } - */" o# u, {9 V: B4 y% V
- public void reloadAllScripts()+ O" l! s" y M5 e% t. s
- {- W4 S0 k5 C% B5 R6 m/ d( C
- unloadAllScripts();" G1 w) N+ J2 W: T( F/ y2 t1 \9 Y( Q3 b
- . S1 r( b' U, ]* ` u% j a
- LOGGER.info("Перезагрузка всех серверных скриптов.");& {6 }3 A7 w! G" k3 t
- try
5 {1 [* I+ v t" w - {; O' M; w; `0 Z: z0 c
- ScriptEngineManager.getInstance().executeScriptList(); x" f y# \8 K7 F9 r
- }
0 c% f/ B" S) q& M - catch (Exception e) r9 q* L! b5 n% z9 A/ h
- {
R3 \3 c$ y9 M: V) K2 h - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
5 b" j$ J3 G7 d+ v5 ?$ c - }4 D' g6 w* F' x
-
% u1 F. q! Y1 r: b6 e( S - getInstance().report();
1 H3 Q$ t8 G' t - }
Скопировать код Метод unloadAllScripts()
1 J" T# h6 b1 r. |' E. V# [$ q* v$ L" |5 S; E# ~6 ], i0 l0 v \/ K3 Q
- /**& j; K6 j! h8 l# Z6 l! `
- * Выгружает все квесты и скрипты.
+ `1 S" L7 ]" k$ F7 y# k - */
- w. \( W& X8 n) L5 P, N% E9 _ - public void unloadAllScripts()
; G$ t/ X0 e$ ?5 k7 c - {8 u( R. P4 _; V1 \$ {. S; @
- LOGGER.info("Выгрузка всех серверных скриптов.");% F/ T9 f! N' }+ ` @( @, V$ W0 U
- - y8 p& w* P5 X& t% E- r& M
- // Выгрузка квестов.
2 b( _/ @4 Z# X$ y - for (Quest quest : _quests.values())# h8 H# y8 }# `5 r) ^
- {
# Y3 J7 r! B8 p& F D - if (quest != null)6 g2 |/ I& v8 ^3 l" W+ c
- {% n# S- M+ }9 y+ d% x: p$ `2 T
- quest.unload(false);# f3 r8 I+ y; ]+ n4 @
- }0 M* F' Q+ \' L$ B3 @+ c
- }: \6 A" K6 ^1 Y. k0 m
- _quests.clear();
8 U6 g0 E" M2 g4 C& b9 I4 V - // Выгрузка скриптов.
" ~ d: ^+ b/ H# Q, ^+ g( i - for (Quest script : _scripts.values())
( X. z K& o/ U" n3 O' k - {& X# g) s/ Z1 @2 ~
- if (script != null)' v3 n+ h6 w. m+ O+ A9 w+ I- ^& n
- {
4 K: S# d6 Y& m' C3 B4 |; O& z* t: ] - script.unload(false);
* z5 t" a7 p6 ?! v1 ]5 w" @ - }
0 d2 d1 x7 U0 D- D9 p - }
% h9 S$ R$ u& _/ J& q - _scripts.clear();; y! ?; o3 w4 p" X$ l# [/ r3 X( g5 q
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
/ x( x5 P3 j1 A; r% |" L- Q7 \& z $ W; P# {% P& f8 b! J# v" ?
Метод report()
/ m. n, q7 q4 g0 m; y7 i8 K/ C( h- V/ g
- /**
. Z- o8 T. b) a8 j9 \ - * Логирует количество загруженных квестов и скриптов.
/ M7 ^' P! c" f8 k, F# X3 T! b - */
: o0 D5 h5 F/ n( q - public void report()
8 f0 }8 X0 f& d8 @ n0 [ - {( _% [2 ~* x# A: w4 b
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
; ?* |) E( B- y - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");& b( L0 T1 I w8 }
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.. e- I# u/ K; t3 x. w2 g
9 u3 D( s) u B `& b& r
Метод getQuest(String name)3 ~! W" ]2 y7 }, S; N
$ X; z, Q) @% m' P% v5 a. j" g8 u
- /**. u' J3 l# N2 s+ Z: ?: U: T# J8 A8 H
- * Получает квест по имени.
1 X2 u7 @4 u. `$ Z; @6 c - * @param name имя квеста8 y' K: M: B7 n7 ?
- * @return квест
+ Z% u* D( L$ K, Y, }1 A# V- T" z - */! v9 s3 G. i& S& X) N! ]: ~9 O
- public Quest getQuest(String name)
4 C( I, Y) m; W- W# ~- A, J! V - {
/ i7 O3 v$ N( x4 [ - if (_quests.containsKey(name))0 W9 u; z. b l3 w2 G( K
- {
/ p2 `1 `1 H* d& i* g( K - return _quests.get(name);
& }! J* J( i: W- o - }
- H4 f8 A- j& o" w - return _scripts.get(name);+ o+ \0 w6 ?6 S- t( D/ ]% q9 \' m" @
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.0 E. ]4 F, ] c5 U
2 w# X- k* e \( T* o+ PМетод getQuest(int questId)
( E4 E( N; v* f" [ T. R" O- ]9 b0 E) j9 l# ]" H
- /**
) P$ S1 g" M7 X( U' X: u9 f" F - * Получает квест по ID./ ~8 ]' q4 D) W1 [: b! H6 N
- * @param questId ID квеста
+ B7 K) R3 |+ ^/ i, o8 l b) [ - * @return квест, если найден, {@code null} в противном случае
, g7 L+ k4 J# V6 z3 T! _/ i" |6 [ - */. C) v4 i: k8 q* k) B
- public Quest getQuest(int questId)# G* V w2 G* ~. M7 @
- { g! l( ^6 A0 ~' |5 O+ O1 z4 e
- for (Quest q : _quests.values())
2 q# l6 l: [! j& W0 c) |5 r - { N, q Z! {* u7 r3 G, m# X0 w9 @
- if (q.getId() == questId)2 D' O w( q. N/ N
- {1 f+ Y: s" o0 }9 C
- return q;' P. o7 }/ _" o. z
- }; X2 C- k6 ~- e, u! V$ a, Y8 y! X
- }! a& I1 E3 y8 K( S+ ]" X/ [* i
- return null;5 v% A) d2 {, l, [
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
# P) X; E' Q# W1 t0 j8 \
0 N& W2 z3 [' XМетод addQuest(Quest quest)
/ E: i+ c9 J3 q% u' o& F* y* P+ B% |1 p; l1 S0 b! M5 i
- /**8 u3 y! |, [% C' N" W- Z: J
- * Добавляет новый квест.
" R7 ? E# Y- j( ^. |- e8 m - * @param quest квест для добавления
" j0 P6 R5 [$ M - */* u8 I3 ~9 U: a! b$ u
- public void addQuest(Quest quest), R* ^: [6 }% A" k
- {
% H& M) ?4 |/ }" N- P) c/ ]# x4 G - if (quest == null)
5 s8 W" [! @" V; w% f5 _ - {
3 O/ n, J3 d% f. D2 U$ { - throw new IllegalArgumentException("Аргумент квеста не может быть null");+ _. X& H+ Z2 O: c. U' l/ q
- }
# E1 C* i& b8 m - 9 M9 ], W, l4 [) ?
- final Quest old = _quests.put(quest.getName(), quest);& A/ x6 e* |8 ]$ l
- if (old != null)
# ]' X* S0 Y R - {$ O% y1 {6 d$ n" X) _2 J; _9 x
- old.unload();& I1 s- A8 a* Q5 {( a. n
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");. u$ N3 r& w$ ?' S0 S
- }
5 h9 n! B4 A$ ], X# p ^ -
6 k8 _* l$ N2 \0 I7 X' q- X - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)% _/ F+ z' d6 |$ `
- {, [3 i# S* o+ m( {! p
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();" \! _, z6 p/ @- H; r$ C. ?
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
6 J4 d8 O" Y8 m; q+ \ - }
+ B' ?+ T' X3 X, D3 `! }: H - }) I& V; t* G$ B0 I& @% x( g
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
0 \5 w$ }* S6 \+ ^ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
( V. ~( R) l. \; K% M- o' d+ ]# V2 ^& h4 g* W
/ I8 K1 T4 B) y' u9 C" n+ j
4 S$ L; m5 t$ Z5 @
|