Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius( n9 G0 T# {7 ~) l1 T
7 ]# |( m5 N4 j' [) E. pРазбор файла QuestManager.java% G/ [9 ?" R# @. w* q9 u
' q P9 v' ]5 k% h3 X3 z
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.$ R. X. F9 X# c. j! Q. B3 L, f
Основные элементы1 X, c+ Y/ o9 }5 F
- Лицензия
8 o M2 S9 x3 [9 Q( A8 J5 \& G, s, J \- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.( p, c1 H- T& E, K% a6 k: C
- Импорты1 @/ @( n- F+ y5 S" _) i+ i% D
) G. l# R6 I3 ]' i" I& {
QuestManager.java — управление квестами и скриптами.% O9 o4 r3 H3 J# C7 ^
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
c. B, [ ], J3 j
! A8 q7 g/ H, `0 V- @. T' J. A# O* ?# o; e( x9 A
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
$ T Y% o% y) _$ r) m1. Лицензионное соглашение
5 e& x: \2 e8 @' o/ H3 T3 a- /*
. K; ^, t: t& z& s2 \1 S8 U - * Этот файл является частью проекта L2J Mobius.( p- S/ ^0 r2 [5 B0 t
- * j$ E+ }$ a7 P* Z3 g. x$ T& G9 g
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
9 ~* j$ ^+ q& O - * её в соответствии с условиями GNU General Public License, опубликованной
: [7 H' X4 x' t1 _8 }1 s- C - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
! c4 j( l1 ?% s: h& v$ C - *
( H9 ?6 _# O- P. _ t - * Эта программа распространяется в надежде, что она будет полезной,, c- e$ m1 S1 \* m [- y4 G
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
- S1 K: G8 R' V6 R - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
F+ b$ \& P$ X2 L - * См. GNU General Public License для получения более подробной информации.
/ J1 s% S' ?& q0 h7 w+ v/ i5 I - * 3 c9 I! ?% V) ], s `2 [! h" i
- * Вы должны были получить копию GNU General Public License/ _: c( F0 @- F# c
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
: G: q; u2 t( J) l% c - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.8 c- u" T2 L4 ^- x; s
) e8 E6 d8 h" w3 c4 N0 Z8 a4 ?6 S7 z3 |' `4 z0 J
2. Импортируемые библиотеки4 ^$ P3 a+ E6 l
% L0 P l/ k3 r! p- package org.l2jmobius.gameserver.instancemanager;
; V! r* h1 t* \! ?2 B; M5 O
% C8 v/ k8 S) u& E3 h4 L( ?3 a4 E- import java.util.Map;! {* b6 }) e; r$ o7 @6 G# I
- import java.util.concurrent.ConcurrentHashMap;
# t2 R" N) z3 d: Y& T' [ - import java.util.logging.Level;7 e5 ^/ ?3 `' s |8 {
- import java.util.logging.Logger;
+ E+ @& r8 j4 e) B
8 r4 i i2 d9 M" n/ a- import org.l2jmobius.Config;
, J) M9 w# z4 S: l/ `- w8 W - import org.l2jmobius.commons.util.CommonUtil;
. u& D5 } I6 f - import org.l2jmobius.gameserver.model.quest.Quest;; F3 a7 A" T: ~5 O! S
- 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 — менеджер для работы с игровыми скриптами.
/ \: w- H& B) z) g: I x4 _$ P4 ~% A: @/ K
3. Описание класса QuestManager
$ L6 ^! e- X( ~0 b: \- /**
' p& }8 f" F+ Y, } - * Менеджер квестов и скриптов.2 M3 l2 S* t# r3 P! T! t
- * Автор: Zoey76% s6 M! c! j: u6 l5 D4 B
- */& B& N3 _+ D- U$ ?6 o9 \* y
- public class QuestManager
7 }- g0 p: E" S - {
7 r$ o" S. E' {8 Y5 x" l - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
; q. J0 `' }& F! R- j: e- a6 Z - 0 |, z% C# U2 m7 B
- /** Карта, содержащая все квесты. */
j/ f) {% g! f: j: D4 k( C$ x - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
3 Z1 _3 F3 o+ ?2 ^% g/ g* D - /** Карта, содержащая все скрипты. */
/ G% T) ~( P" Y+ w - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();* H9 h% I: L6 K: P% _: K& f
- 3 ~. P. V4 M# n& Q
- protected QuestManager()
+ [ x6 a0 H2 @/ ] - {8 b" o" E4 F, s N: G1 o
- }
9 p) L% V6 ]5 ~2 o( j$ Y& x - }
Скопировать код 4. Методы
5 O+ p! ?! K7 C) j* aМетод reload(String questFolder)4 M2 K4 _$ S3 F! a
- public boolean reload(String questFolder)
( H& B6 w, x/ l - {+ c% v+ E$ B* \/ G# W/ Q
- final Quest q = getQuest(questFolder);
6 T% J( k9 G: t# X1 j! W& m - if (q == null) X. v( o3 R- r+ [+ `
- {
4 i; c' u4 n1 f) Q4 ?: [+ U+ D - return false;
) R1 ?# b: {( X7 S% d - }
4 T7 I* f2 c( }5 O9 h, @ - return q.reload();
( I) n! c f; p: o l9 } - }
Скопировать код
t7 R+ i/ [8 Q) C4 a, P+ P8 ]* L- l2 i4 w( _/ E5 _. c4 |! g
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.& c" V- X; X& I1 V* T5 \% U
Метод reload(int questId)
" D0 e. h5 d% h% T) {$ A, P7 k+ P) T
4 l; V3 p. O- ^6 n7 i0 F' w- /**1 h1 W" p- o9 R0 E5 s' f
- * Перезагружает квест по ID. k3 }& l7 P, n: Y2 K
- * @param questId ID квеста для перезагрузки A6 d: M- h# h" Q3 H7 F7 |
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае, E; `! @# h# O, M
- */* G" I8 U! U0 T
- public boolean reload(int questId)
' D3 u% N; z% T+ H) p4 j - {
" j& ]3 [4 i- r5 M3 w' [ - final Quest q = getQuest(questId);
& M. q% X9 W1 `1 n6 ^ - if (q == null)( |) L' X' c4 }. J4 w9 v
- {
7 N; q- H# o2 G1 H" c - return false;
) X# H4 E) V- ?: v% M* B+ K1 [ - }. V) b6 l$ N* \% Z# X% L8 `3 d
- return q.reload();7 V& O5 y' m* b; h2 n
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
, ~, n4 ]' }5 e. u1 C2 b G2 @* t, w $ N1 Y( i/ X) n% v
Метод reloadAllScripts()+ |( s1 _! T# v; X' {, h7 x
9 }5 R) o8 q! K' i" n+ U# h
- /**" X! G c( N1 v( G
- * Выгружает все квесты и скрипты, а затем перезагружает их./ L8 _$ \: w/ S- t
- */) t- h! q, N: G6 }& Z! V
- public void reloadAllScripts()2 Q- S+ A+ A$ C8 S- O
- {
+ N' f8 ]' T' c' a( F7 m% ~ - unloadAllScripts();
0 {) ~$ W, s/ N( N8 O - + C5 S( {% a" g5 @
- LOGGER.info("Перезагрузка всех серверных скриптов.");
2 G6 i" K1 @3 b! ^, x - try
% q, Y% ~4 K6 g7 y2 Y5 G; a - {
; t7 I" r0 b3 I - ScriptEngineManager.getInstance().executeScriptList();
9 U* F! T. c$ @6 H/ |8 _+ B - }6 c5 s" D( F. L& p/ I; X
- catch (Exception e)0 {% C# n$ D4 _" ~$ Z& ?
- {
! G- [" B" g+ c4 E - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);1 p% s. s- c$ z: `
- }- d T3 F; v* G8 F# a) l* j
-
: f, O [) v5 a4 @. d - getInstance().report();
, j" p6 {. j$ `" s1 Z x8 x - }
Скопировать код Метод unloadAllScripts()5 p( ~ j0 [) t! A, c* P2 B
/ \* e2 T0 |8 d' s& o
- /**( V& t, x* `+ B/ o
- * Выгружает все квесты и скрипты.. T; i4 b8 z( v V% q
- */
. K; } u) V$ S3 q- E: u# { - public void unloadAllScripts()
+ R0 [% L3 V: w! u9 O - {
) c" @$ ]: V8 j' c5 { - LOGGER.info("Выгрузка всех серверных скриптов.");
7 B& y/ v" r# U5 T+ x. w; O -
1 k$ d$ c A! W% N - // Выгрузка квестов.
/ b7 g0 P1 q& H3 F- F+ l4 i - for (Quest quest : _quests.values())% m: |; Y& k, M c
- {$ D5 b# z" X) b0 k9 O7 r
- if (quest != null)
2 }+ A; o$ N" V0 p6 S - {, x" J8 q" q7 J: Z9 y) f# l
- quest.unload(false);) _7 }4 g+ P' K! J5 n: w
- }
6 o4 [, J5 O0 d, a - }
! q6 X+ u* d9 D - _quests.clear();
# h8 Y+ R: ? M; |' T7 H( Y" \ - // Выгрузка скриптов.
+ X$ R2 H$ D: U. ]& X - for (Quest script : _scripts.values())
/ b" b6 H E7 ?( h - {
! _* p( n% X' p: G( d& T - if (script != null)7 n1 ^& C$ e4 z7 J% {& b& G, I: M
- {
; c2 S9 l3 i( {; t) n) j - script.unload(false);
+ u" @. g, E1 D - }' Y9 }1 b; [# Y* b
- }6 A5 C6 y+ M/ a4 F
- _scripts.clear();/ P/ w& l8 R+ Z7 r3 M* v2 U
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
2 e" c( b: @* z
! [4 T* X. T5 y- k5 d- cМетод report()
- M: |/ `7 X2 W& B; N5 f& n, `; a6 E" L+ R8 ~
- /**
+ B% b0 V e/ D - * Логирует количество загруженных квестов и скриптов.
' J& r/ g+ J1 I* o/ g9 b( c# D/ H2 S - */# x! w5 R6 A) e. `- ~
- public void report()5 T0 n- _: {, g
- {8 k; {$ N4 Y, d6 v7 c1 q
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
y1 {' _$ B8 B; Y. s% P - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
# q7 T. j3 H N) T) T - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.* W( V6 u- K0 V9 V, D/ P$ e
9 c: U" w: v2 V2 B
Метод getQuest(String name)
9 K* v9 p. S2 ?8 |1 w+ d. g+ w% W( r. i' |9 S0 m+ | C
- /**# q5 ~8 A7 p! M7 l4 M: f5 }8 g
- * Получает квест по имени.
* I- H# R, c0 P0 n% S4 m! l - * @param name имя квеста
* X0 ?) b L0 k K2 m' j: \ - * @return квест
: i% P7 k+ D# l% p4 H" w! d - */
, J2 v# g7 P7 y9 m' E% h* k9 b1 a - public Quest getQuest(String name)0 j5 I+ _4 C3 e% E
- {
2 p7 q, ^: K4 \8 ] - if (_quests.containsKey(name))- R; V# L; r2 K, M
- {
& @1 S @9 e4 K6 b1 O4 t& y6 A - return _quests.get(name);: \$ ~' x$ p, E$ D! ^4 ^
- }9 D; R w' w$ s+ x! z+ f
- return _scripts.get(name);0 U. @* q& H( @6 B
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
% @( |" ]" r# q$ ]+ `+ ~' k S 8 F) \5 P( W7 P5 n5 B' V' |
Метод getQuest(int questId)
) ?' P$ z- Z! O4 P8 _6 r& b7 l, X( V/ Q, L4 c3 X, G+ B
- /** L2 `0 s+ H% a+ e; p
- * Получает квест по ID.
9 \. N; }$ u4 J% s8 Y; I - * @param questId ID квеста
% K; t& e" a6 z' L; o - * @return квест, если найден, {@code null} в противном случае
. I' f& ^" ]; y; U - */6 N5 w7 j! A) X3 S8 l
- public Quest getQuest(int questId)
5 J6 s0 P. c3 X4 k8 Y+ A u - { P e2 ?4 K: n! V5 H i' f. {1 w B
- for (Quest q : _quests.values())
# k/ i* y$ ~; R$ z - {
1 w* o* u. F6 K& | - if (q.getId() == questId)3 C* a3 j5 o) L9 h9 _+ `
- {
4 T. p( a$ ~& p5 C - return q;' Z2 v* Z! Q; Q* K
- }8 D5 R" [! X* G# s# l4 Y
- }# D' z; I+ S$ \1 P ?2 n2 c
- return null;
" D& t" g9 U9 G, a - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.: {2 _ @: o. Z) f6 ~- U+ I
5 a) V1 A- K( O' k! S$ g/ QМетод addQuest(Quest quest)
5 y" Z9 r% Y( U& Q" v7 B
3 y: i; [9 n) q1 `0 P$ S1 m- /**' {/ h; r0 O- {" j0 u/ p$ A
- * Добавляет новый квест.
! V Q E5 l1 t( N! E0 Z0 } - * @param quest квест для добавления! v5 D) Q5 \( `& Q0 u
- */$ p6 M5 F3 i4 D* o6 O5 h1 f' Y
- public void addQuest(Quest quest)# e% r2 S' G- s' b1 y M& u8 G
- {
5 @: ~/ z7 A8 S% x, E - if (quest == null)
g7 Q9 ^" u: C" V9 G" S$ [ - {
y$ X' r% a: g# r C4 V; v1 c - throw new IllegalArgumentException("Аргумент квеста не может быть null");
4 h! ?; U/ I+ A! A - }
8 K! \4 {$ c1 V/ \( _ - % y, T6 y$ e4 L& p* u+ @4 a9 k% G
- final Quest old = _quests.put(quest.getName(), quest);; k* U* J: q8 ]/ J+ C! ^! [
- if (old != null)' i* o$ D; P9 g: {
- {
8 \' o# Y) n0 n5 T - old.unload();' d p- M2 t: g1 h" g
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
& X+ m: t2 |7 |5 Z+ ~8 `7 k - }) I" H7 z8 _+ m5 h
- 0 d. ^0 I- a5 _( W. {' H
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)# O7 X; k5 ]0 q( K" u, T
- {
; f$ g! Q% @' o* ~+ f F - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
" q5 W" I! P% l6 ? - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + "."); b I1 D9 I( C- _& U- z, x
- }' P; B, K ]6 T3 k
- }
, I2 H ~6 f$ |, N5 n - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
; V6 X- A! G; kЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.; T, _8 R2 N/ F# v, V3 L. r
2 I" M4 b6 w: o( T& d d# b, D
. O( c. ^ w1 L2 E. u/ I0 V8 S: u& m! P
|