Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius$ `3 Z6 e8 i7 B- X( T# K' S t
" y2 L- M1 k) [# ZРазбор файла QuestManager.java% |. `- B, g; ~& t
5 W2 E' t% O5 j2 v# B$ t* B
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.# g( z8 _/ z' \/ a+ T
Основные элементы
J3 @; l- q9 s- Лицензия
' o. ~- B5 U1 \& X- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.) w" |4 T" f; l% Z- {
- Импорты: I6 g4 X6 C- [4 q6 f9 r
6 _/ q! F4 l: O- nQuestManager.java — управление квестами и скриптами.
0 E- @7 ?+ u0 jПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\6 V: q7 r" K+ C# i) y$ k
9 S( T( T. ?8 ~. ?. L& ]8 E: R
/ F B2 q. k* o* E% P% I( p) y
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
! y% R$ z* q! ] h- I1. Лицензионное соглашение
; m) G% z5 v+ [- /*
% z8 q1 W( x/ G4 N2 ^3 \0 S- y" c - * Этот файл является частью проекта L2J Mobius.0 U0 Y# R6 d0 e% t- r1 a
- *
) o% Z4 J% L/ r' z% q - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
/ ]3 d0 g& b9 F, H' \- W1 Q) @ - * её в соответствии с условиями GNU General Public License, опубликованной2 w" O" G7 C% Z! }8 ?( d4 {% ^
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
& V1 O4 U' _ b$ Q) ]3 P - * / m/ i+ L( h0 ]! o7 A1 Z
- * Эта программа распространяется в надежде, что она будет полезной,
: A0 p/ S0 s: u, Z - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
' _' T f, X7 L* W - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
g. I! w- R& c$ V; { - * См. GNU General Public License для получения более подробной информации., @) x8 {8 t1 y" o- y
- * ; u/ f8 Z; W- Z7 [7 E. `! B; l7 e
- * Вы должны были получить копию GNU General Public License0 q s# u: n: c; C
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.) t" o, Z$ P" T( n: M1 k1 j
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.( \' z! x/ X* g8 J7 ?0 s0 H
! U$ e9 v9 Q$ z6 W2 O$ \
' J+ L% ~) `' T: L9 k8 {2. Импортируемые библиотеки
; [! `3 r' P" y7 [( e) a, @# {
x7 K: j; X0 R3 N4 V- package org.l2jmobius.gameserver.instancemanager;8 a: j; V: d, n
; `$ d0 q: y+ P- import java.util.Map;' o2 d a2 j; i+ L1 i! x4 p* w8 C
- import java.util.concurrent.ConcurrentHashMap;6 r" I( B* ?1 a+ V" p3 N% L5 g; \
- import java.util.logging.Level;7 D; ?* X+ b+ R' h A( t$ \
- import java.util.logging.Logger;' @. ]5 O0 x6 i4 b2 c
: T5 t) s6 [& Q! Z/ ]8 }3 [- import org.l2jmobius.Config;. N3 h8 j& A, [" M" s6 z* K
- import org.l2jmobius.commons.util.CommonUtil;
, M1 K! \, d' T2 ? - import org.l2jmobius.gameserver.model.quest.Quest;
) A& a7 w- h& F5 x - 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 — менеджер для работы с игровыми скриптами.
1 w& f# m; R! r2 B4 n7 f
6 {: t2 K: {6 N; W0 p3 P4 \+ {3. Описание класса QuestManager
) V5 _9 Y9 d7 P4 X. z# |, g4 v- /**+ C4 T2 i% ]5 T5 `: d- j
- * Менеджер квестов и скриптов.: p3 a8 f! o# o% w& G' L: o
- * Автор: Zoey767 ^# P0 Q) e3 b$ @, I3 L7 I
- */" o1 H! k9 C, G2 e
- public class QuestManager
! J# O: @0 ?( U5 Y% O - {
; l( k% |4 I, g i - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());3 l8 y. V( H* _& b$ w# _5 n* X
- 4 J' n5 A9 B, x- s
- /** Карта, содержащая все квесты. */
0 Z. W- b5 m0 V8 ]3 g - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
0 Z8 m" } Z G: w" j' o( f - /** Карта, содержащая все скрипты. */
0 F- i% S% U$ i. S - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();5 @" V6 E5 {; f0 h5 E8 W
- + c1 r+ A s% w! p' B
- protected QuestManager()+ y+ O; S g: T$ b3 `; C' v6 [& A. }/ ^
- {* s6 g. c/ J" U' }( p% u% G
- }
8 A" s4 v' h8 y2 ]# S - }
Скопировать код 4. Методы
. q' p( L" @! m* J/ \$ {( u, IМетод reload(String questFolder); u! Q6 W# x9 u
- public boolean reload(String questFolder)
) M- g$ T m# V, J) O2 Z - {8 C$ N& a+ [+ V3 @6 B
- final Quest q = getQuest(questFolder);
; X F0 q: N. j7 I3 | - if (q == null)" S! U2 s* {% Q$ ]* a
- {7 Q, I/ a9 S! Y/ S! f+ E
- return false;- P- V" w3 H: n: F- k1 t$ V# } T
- }% {" p( S- v/ w, v8 C8 B1 i$ p$ ~% M& N8 n
- return q.reload();) B! w* j v' n p' _, O. Z& y$ J
- }
Скопировать код
' Q1 @7 C) j6 l. ?. X- C
9 |. O* R( Q; N+ \1 `Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.9 r# v/ p# S% z7 D8 }& p* [
Метод reload(int questId)( i) w* \. J# \: O7 B$ R
5 H4 l: m3 R; N2 {
- /**
( b" V' b: |( U# W7 |' r - * Перезагружает квест по ID.2 m. S' z8 [# n: X4 b7 O
- * @param questId ID квеста для перезагрузки
" V7 @# _+ A0 P) ]0 m" \ G) D: W8 f - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае6 D8 B1 c C1 S( i- e: F v5 e, `
- */1 P( J" N! K. I/ t) w
- public boolean reload(int questId) O3 n7 s: {/ O8 l, g
- {& r( y! D0 q$ ~1 Q* n
- final Quest q = getQuest(questId);
$ i0 { M8 m8 m9 t: Q - if (q == null)
/ C- h0 K, ?2 {% D. _1 E9 m! [ x - {, V4 g0 ]1 y0 B
- return false;
+ y1 v+ V4 C& h0 X' t" R - }6 W+ s0 b# P2 G- Q" {% |( v
- return q.reload();
! e! {9 z7 {( |0 L - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.' u5 C! Q$ ^$ G# `1 m' G
/ @! R$ ?* F2 {/ i
Метод reloadAllScripts()
2 c1 |1 J U* U: m9 P! }; V4 B' z& A* x# c
- /**
2 J) e7 q( C* U% Z" U9 j% ` - * Выгружает все квесты и скрипты, а затем перезагружает их./ N9 a: x( F9 Z# m; Y8 Y
- */, q5 N0 a1 z$ Q% [' n
- public void reloadAllScripts()* H: y' ^9 c2 d* S q/ R! y
- {. _" K; K3 Z5 T& q* a& Q9 d
- unloadAllScripts();2 B/ a0 P; r: L
-
4 g1 F0 P, Z9 e M - LOGGER.info("Перезагрузка всех серверных скриптов.");2 o: @5 w0 I; P- }( S3 N3 e
- try r+ Q7 M) |. p, ]
- {- @8 P7 z( N$ y& Y8 r3 k
- ScriptEngineManager.getInstance().executeScriptList();9 y9 E- e0 Z5 O1 q6 x% C
- }; u; i" ?$ J2 g! I0 k% }- b# T
- catch (Exception e)4 k3 y$ ^: S2 B g
- {6 m! A# d' G( E# g0 M$ @5 o0 C3 p( @1 E
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);% ^" `0 |8 v, ]2 C+ A5 J( @
- }4 B' J' v& i$ G4 W( S; Y3 t
- 4 I* s% J1 d$ J, n I: n
- getInstance().report();
5 J9 y/ D/ S% T S N2 _3 n - }
Скопировать код Метод unloadAllScripts()
4 ], T% O( h; Q( h# q) S! d5 e
7 [* i& c7 u; `* `1 a' A4 w" O- /**
; R; y# n- K+ P - * Выгружает все квесты и скрипты. `# S- u7 F: b; J6 S
- */) M- e* D" C6 `4 G2 C& x2 E$ Z! K
- public void unloadAllScripts()/ i8 S/ Z+ _6 `, w) ~8 f
- {
- e4 Q7 N2 r2 j, }: ~/ r5 ^; [ - LOGGER.info("Выгрузка всех серверных скриптов.");
, M5 k' [$ F, w/ v, _2 I0 T* ~ - 7 U6 l7 y1 j$ R8 [6 Z: v. J; w
- // Выгрузка квестов.
; c& y- b% i7 P6 E7 c - for (Quest quest : _quests.values())# Q" K+ \; Q6 Z0 q
- {1 j ~. t7 M' Y* g6 j
- if (quest != null)+ d: F4 ^# F9 j) \* l
- {0 o. L5 ^( w: A8 ^
- quest.unload(false);
4 F7 P8 x! G- V- V0 y5 z - }
* M; d$ s3 w. R& f; \# ~ - }
! h" n% ]/ V: h1 i/ B. B- l% c - _quests.clear();6 ~# Z4 n4 N$ A4 ^3 O
- // Выгрузка скриптов.& `* G( O# I. h6 ?+ N9 p9 t; g" H9 s
- for (Quest script : _scripts.values())
" C# ^( e: [3 i" u - {
b# P* |5 ~* | d8 B; }* d - if (script != null)
( D) {, o$ C. T - {
) L( t [) A( Z9 I- y2 [" Y - script.unload(false);. b/ x1 |+ R) w S4 x
- }, y }8 t# n" b* p, O) F+ r
- }" V: E( I3 Q9 `$ W* k
- _scripts.clear();
( X* R) l! E) n - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.5 j* W g& S: ~+ X
9 E4 d: o- t( `7 s! o7 Q% kМетод report()
2 P3 n3 ^; d. X# p. f$ o( w! f+ \3 `0 \7 P# o
- /**
4 c# [2 @! N ] - * Логирует количество загруженных квестов и скриптов.
( T5 ~9 C* H/ n - */
1 o+ u- i! E1 T - public void report()
; H7 k% d/ P& N - {
# D# \& B/ v& r - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");& Q4 p G* r a& U
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");' m8 |5 p& E! ^6 T; Z
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.3 | o6 v" B0 d4 Y/ `4 N& P
& a" i- Z4 F `! O1 }Метод getQuest(String name)! T0 S& I% p1 ~& s/ q
, q, d' N" s) P$ `8 K! n. G- /**1 K. I/ M* I, O& Q; L
- * Получает квест по имени.
- q& u: G5 A* F8 X2 X - * @param name имя квеста
- e% _ [" v+ y* _. P% n* K3 [ - * @return квест
: W# \8 u2 ?. `" a! m6 O# \1 W% b - */+ P9 U H) Q2 X; w7 H' O
- public Quest getQuest(String name)% U" D# I, D3 ~
- {8 l& }3 _5 }+ G4 |
- if (_quests.containsKey(name))
/ {. L9 [! S7 J5 N - {
+ @ |: v( P) b) c" c - return _quests.get(name);
- y9 O) W0 A) S6 ~- q1 B/ e& L - }0 V+ C4 D6 z6 O+ s% Y4 a0 L
- return _scripts.get(name);
* U+ ]2 w, V" x$ b) a) Y4 g, ~4 {- _ - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.7 g6 P1 W3 X9 v% N/ p
6 n* ?% E3 T5 K$ b- IМетод getQuest(int questId)
# N! V1 r4 s; y' [. Z$ M, H$ Z
$ K3 h1 j: S: X# T- /**
# f) W7 y8 I& E+ x* y$ ? - * Получает квест по ID.
8 q/ n7 i0 a5 }) ?$ b9 c; _ - * @param questId ID квеста
% R# Q5 @9 b/ H; ^ - * @return квест, если найден, {@code null} в противном случае
; R' c5 z/ @$ ]. I - */
( T2 x& F/ j# ^: J; ~1 H - public Quest getQuest(int questId)* _- Q* f5 c K5 y) {
- {
6 ?" n, n+ G& t - for (Quest q : _quests.values())0 l! N4 E2 |. N6 z F
- {
, o+ t9 n* r! ^$ t3 W: N4 s w - if (q.getId() == questId), w/ i6 Y, N. C* X# S& W
- {* R8 z% {, _ G$ Q
- return q;! p" P" U4 C6 D# F9 ?5 _9 d
- }# Q5 g% ]$ p# [
- }8 s7 z9 ^" W+ O. N3 t9 {/ i
- return null;% C/ L% A3 G* M# o4 f- q$ `
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.9 R7 J$ V) f8 [0 P3 N; T
% {! h( N5 O' S, a* z( H4 gМетод addQuest(Quest quest)
% L! ]7 H# r' q3 \' b' b) {- v$ P5 M
/ u) O8 B5 y: h6 ^- /**, U: Z6 |* L4 @$ Q3 h( w
- * Добавляет новый квест.
- B$ x$ F( O1 R! \4 i; \2 P - * @param quest квест для добавления
' Q7 Q, ]" j' L! f9 H" L - */3 G+ N6 Q6 G4 u8 S* M) e3 O
- public void addQuest(Quest quest)
3 w* Q2 ]3 C. R' {- O - {) G2 }+ t" _) v4 e
- if (quest == null)8 r+ W" I7 t- a* a8 s' v Z1 w
- {
K" S4 s: \, P - throw new IllegalArgumentException("Аргумент квеста не может быть null");" \& z1 ]+ p' s. T
- }
! [$ M- H7 Q" b -
( ~7 y [& w$ P' g6 p - final Quest old = _quests.put(quest.getName(), quest);/ ~( T' l5 j3 P$ t f" X3 @
- if (old != null)
# i! B& H& a5 s7 ? - {
3 A; G/ @& y w0 n - old.unload();
; b! z5 D3 F9 r0 [9 @ i - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");% O1 P7 O! {* p9 b4 ^( p
- } P' T* n0 w$ @" k# n7 n* Q8 ~
-
! ]* J4 x- r7 w+ _6 V - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
$ l/ b( @5 S/ K9 z, n - {
0 w9 e& r! [6 ^ o* m - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();$ Z# ^9 Z) B% k7 t( }
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
" A- `6 q) j. m+ o. | - }
/ e& w6 Q7 h7 D9 v! z4 G# b. R7 @ - }
1 N/ P- L- s2 Z) n0 T) f4 \5 ? - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера. L* }) ~( k! F3 x2 l/ K
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.2 n+ j$ s7 y: q2 S3 A
) S& K' o' a# m
; I' k0 t3 G$ ?0 D. `5 ]- t9 [/ P6 u" \) N
|