Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
. U* B) @7 Q4 J2 @9 Y6 e: }4 ^, a) `) e f3 [4 I8 v/ I8 h$ t
Разбор файла QuestManager.java
7 ]4 n- z$ X* f* v* G- I
! z, s2 B5 @; [! f* Z- \$ @Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.5 \: F4 b2 X) Z1 y
Основные элементы: O3 S2 u# A4 M" R0 y
- Лицензия
* Z8 R9 d6 J' B _7 e2 E7 W& o' ?- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
8 O# w2 u' \. @: |: I; L
- Импорты* L& W! M/ O G0 Q' ~5 d
- S1 d3 B: s& X, I0 }QuestManager.java — управление квестами и скриптами.
8 E, y& B1 a/ c, o$ RПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\+ I" ^& c+ d4 b+ W: c+ {7 H" C
$ \( B9 n3 i" O
9 ~ u' g1 a; B' ~ }! tДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.8 F7 R1 z+ e$ g( d7 s. l3 L
1. Лицензионное соглашение7 m! g' r" J6 l1 a
- /*
0 _( E6 O, W$ x1 O# u) Q$ t, w - * Этот файл является частью проекта L2J Mobius.
" d3 c! P7 _- z% W4 q( C S - * / ?) ? k ^2 A; I$ ]3 c
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
" l: r# ~; Q; Q2 j5 B7 P& ] - * её в соответствии с условиями GNU General Public License, опубликованной! }; y. K5 Y: ?1 h3 W& Q0 L
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.- Q2 j/ h" {7 V4 t5 ]
- * 7 t7 K: J8 T: v3 p% [1 ?
- * Эта программа распространяется в надежде, что она будет полезной,- r8 c0 w: W# Y w, b& K
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
1 E+ a& ]" v8 o - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.6 E5 l; g" r: E
- * См. GNU General Public License для получения более подробной информации.
! O8 O7 Y2 S: L( P: L7 Y - * - t4 n# }, o4 X! u4 O5 y4 N
- * Вы должны были получить копию GNU General Public License& h, u ^8 B+ T: E6 {
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
6 V: s/ [" R" o# z - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.; U) Y; I* O9 _& u) I `" `, P
. o+ X/ D" P6 W k& @+ O) h: T. k; D/ i
2. Импортируемые библиотеки4 Q' J! \" j1 Q4 p' j
! o& F" y; j! f7 `- package org.l2jmobius.gameserver.instancemanager;
% X( q; D# e6 |* Q
3 w* c+ R* L# ?7 b! N- import java.util.Map;
$ |; j& a8 H& m9 U1 d- p. E( N - import java.util.concurrent.ConcurrentHashMap;
# c0 u% H5 @" b6 t& U7 W; [" d( ~ - import java.util.logging.Level;
6 D) D/ C' i3 p2 N: h9 X2 s, n5 N - import java.util.logging.Logger;. N& d) Z! g1 G) p# `7 U! ]# G
+ z; L0 o" c) O4 s- import org.l2jmobius.Config;
. {- I+ [" b' X$ H; Z' d6 R# a - import org.l2jmobius.commons.util.CommonUtil;
`; M, k8 b n* y - import org.l2jmobius.gameserver.model.quest.Quest;( w2 a* S' X4 `
- 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 — менеджер для работы с игровыми скриптами.* X9 q% M& [) x% \. x, c' ^3 p
) }7 E! I4 U9 d- d9 Y2 Q' V6 V3. Описание класса QuestManager- J- v; p. Q; Z8 N" z/ v, @
- /**; U+ |; I) H8 p) s' j* ~
- * Менеджер квестов и скриптов.
2 ?- c3 v/ B) f! a/ @- e, c - * Автор: Zoey76: R, {7 l' ]( s- W& w+ r, Y
- */
5 J- v( f9 |- k* v l - public class QuestManager) ?- g# y* B, l/ e
- {
& y: ]) m1 x: g* m4 \ - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
3 X2 K+ g" s7 m9 p- L" l - 2 L4 D' N% k' d' e2 F6 c& S
- /** Карта, содержащая все квесты. */
M3 M' `% P4 a/ Z3 s& O* | - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
. U+ E) J7 f* x+ B- x; g* |0 s - /** Карта, содержащая все скрипты. */
+ |, B4 z) ^. S6 I" h - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
: ~0 i6 n( F. I x - : p/ [. G& r& e/ i1 d: k( q ] \
- protected QuestManager()& y% t' A, J1 E* \3 E3 {
- {
. \8 u5 `0 _. I: W7 A2 A- M - }$ ?6 ^: i1 n: q* f' s8 ] }
- }
Скопировать код 4. Методы
/ F; l: W+ \2 D. d$ P5 f2 m8 J+ aМетод reload(String questFolder)/ M5 p) D8 P- x: N0 z1 q5 x: s
- public boolean reload(String questFolder)
! k# ?% o( n# C5 [ - {
$ G6 `+ H; Z, h! w7 J - final Quest q = getQuest(questFolder);, p* E* a( b* ?2 y
- if (q == null)
8 u; x9 D( j, T* W" B0 h - {' l/ T& n0 }3 o9 J; S5 z# d% B, Q
- return false;
7 n# }6 h2 w* V) Y( O* A' H- I9 V* I - }
2 ?6 N9 c: i( l4 e1 S - return q.reload();
% C$ l7 H7 w K2 m - }
Скопировать код D V" z7 f* q" l5 y
. X3 v% ^) i( v, ~# ~! X
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.- ^" V+ g5 O1 r! R. k" J5 U; ]
Метод reload(int questId)
3 ?- n. x" _+ w6 Y8 [+ X! |! {2 V# w0 L* s( @2 e# b' q
- /**
7 j# T) h6 h j# R - * Перезагружает квест по ID.
& ^9 h, @5 f3 h4 @' ]! K - * @param questId ID квеста для перезагрузки
3 l1 f$ f6 o2 {( @" u* q - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
' |5 K3 D% g2 C# @ - *// l8 a3 f- c# J( A) E1 e
- public boolean reload(int questId)
7 A6 t- F* o! R R" H( W - {
- [# g$ `; W. d i - final Quest q = getQuest(questId);
$ Y4 K: Q E# K) _ - if (q == null)! U$ F9 T& a8 l0 N, b
- {- R# U0 U1 D( p: O
- return false;
0 m* `# n, b p- f - }
4 ?4 ]2 Z" z* ?+ F2 L$ P: l7 k' |, K - return q.reload();
& F: y4 B, s. P+ Y! b - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
" |4 f% b0 ~- W. m+ K' c
; S3 M( z; }/ w ]( CМетод reloadAllScripts()
! L- y( l$ l) ^+ h8 E7 Y1 V. k1 B8 N7 n( t* H$ l/ m9 e
- /**
5 E$ \ G/ b) s2 }2 B - * Выгружает все квесты и скрипты, а затем перезагружает их.
& y3 ^" V3 _" T( ?: d! P - */
0 g0 g! I" S- m' z' y - public void reloadAllScripts()
& A+ f8 w+ }7 G+ s4 w$ x; r - {
" Z8 L# v% Y4 K! h4 r( c5 [ z - unloadAllScripts();: m& L, |' P+ q+ E0 s' [6 }1 B
- # b7 S9 ~1 W1 d0 G( B& G
- LOGGER.info("Перезагрузка всех серверных скриптов.");; O/ q2 l& {* ^/ @( W% ]1 {
- try
0 d+ o/ h" o7 f4 `: Y9 Z: B - {
) j, H ^- l' [: \# O; u& H! I/ U - ScriptEngineManager.getInstance().executeScriptList();
7 F4 d1 H2 x+ D3 U, O( y8 t* x - }4 n6 x: Z6 N# P% a7 H, f8 q* C
- catch (Exception e)
' F5 [4 i) l/ D - {
; y2 W- W! p b5 [, g: V - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);; |! `6 C# `1 b5 S/ A! Q
- }+ k& I9 |9 C- R! o' |' D
-
6 y: V3 B6 q" k: o1 j - getInstance().report();) _0 q, ^. P7 C2 n1 z( K; F' \
- }
Скопировать код Метод unloadAllScripts()
9 B- i+ @& y# N0 v# n2 C
2 c+ @) ]' w1 ?1 `$ k- /**9 I3 g" I% N# V( b
- * Выгружает все квесты и скрипты.# G6 h& M7 t8 W. k& }. n' z
- */
0 D( i4 z9 ^3 _7 y - public void unloadAllScripts()
' v. E% ]. y: y- F1 S. t - {1 U! u4 s6 R6 v. d
- LOGGER.info("Выгрузка всех серверных скриптов.");
* c ]: z D1 |+ K+ D3 o4 [% ?6 d9 o1 M' [ - # a+ `$ S; a( [
- // Выгрузка квестов.
5 |0 N1 S7 S8 {, ~ - for (Quest quest : _quests.values())
; V. ^% K( V9 w% Y - {& u8 r7 J! B1 [" z. u+ G7 ]4 ]
- if (quest != null). O* @. [) Q/ a9 [2 x
- {7 x/ n8 d( X7 ]. f
- quest.unload(false);
1 X7 q; m5 [0 c - }0 |2 R- K U8 F, ~# b, U3 `
- }6 K5 C) W: q2 D# p8 E
- _quests.clear();
0 D# M4 d a/ P. O1 h' y6 Y - // Выгрузка скриптов.
6 x% G: `; f; f( n5 B+ \# d - for (Quest script : _scripts.values())) V1 Z; C+ i" J& k
- {7 C1 J: E- `8 Q$ [3 T* _: K
- if (script != null)- f' ^$ \5 M' F
- {" @0 ?9 \. [. y* P( z8 n
- script.unload(false);* H! ~/ j8 s; a g$ z) o9 m. s
- }
, ~5 ^: a* A0 z' V - }
6 r) z7 W# q- E/ R7 N- ` - _scripts.clear();. g8 s: P Q: q9 }9 y
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.& s' D' a' h; \6 }) Q8 T4 P
4 ?# t* w/ [* M9 @& P$ Z# EМетод report()! S8 V. w3 w# t- @
/ F1 D7 I0 g G/ B$ o- /*** J: D. e* F3 _) |) @& f" ?. O
- * Логирует количество загруженных квестов и скриптов.7 z/ C+ {! D" p! f4 ~( n- q
- */
# M7 o, w3 L$ S8 i$ | - public void report()
- S: B$ U/ P8 d - {
3 B. ?+ o4 \0 O5 C6 x* V0 F - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
N. E! E4 h9 y6 T$ I' E+ z - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");( l3 O: X8 }/ A7 X4 n
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов./ R9 e/ ]" R1 X6 ?$ T
! \( s+ Y# u$ r6 m; h, n8 R! xМетод getQuest(String name)
7 G0 o. ^) v" f
: u( Q7 e- C ]- d& z( J7 u' [- /**" Y( y8 ~3 d- L' |
- * Получает квест по имени.
8 Z6 x) C n7 K8 d! C - * @param name имя квеста
. e' M) ~# ^7 k - * @return квест: \1 v; Z! p: {1 t
- */7 m' x( D1 t6 y6 B
- public Quest getQuest(String name)
. v: W+ H) q4 S8 u, W. C! s - {
4 p- e; d1 E Q- E- R - if (_quests.containsKey(name))3 p' L" Q0 }; x1 @+ K' Z K$ L
- {
C ~# `- K& c' X3 K+ G5 T - return _quests.get(name);* Z2 c; C( _0 G- U/ ~7 I
- }
+ e) J% E, O9 b, Y - return _scripts.get(name);
1 z" b0 Q9 c; p9 e6 s1 v - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
0 i1 }1 D. A, _9 O, }1 ?9 g& u/ r
7 \4 I0 R8 M7 Q) I# iМетод getQuest(int questId)8 [+ ]) G6 I9 e2 g* R+ I9 P
1 W$ E5 f" [3 Y! w: [& o: q4 X" \- /**5 A+ I1 \ N" J* }! f2 f5 s7 |
- * Получает квест по ID. C) r) ]" n/ W: ~7 B
- * @param questId ID квеста
# u& h4 F4 K& ]7 N: [) r' F - * @return квест, если найден, {@code null} в противном случае
2 P' p/ s% z) a7 u1 D Z( B - */
$ a" j3 s% G H' f$ z) H* V - public Quest getQuest(int questId), w4 w' b) s0 ~/ s n" _1 r
- {
& a. ]. _. E' ?( ? - for (Quest q : _quests.values())
' k& N B3 R: Z, F+ x - { W' Q5 A( y$ ~4 p+ I
- if (q.getId() == questId)
: A& }4 [7 s! w% h - {. w% H1 G2 Y8 w/ F6 Z
- return q;
3 K9 W7 c7 v0 z2 M! ^6 y - }
. R2 l. E, i3 g2 V0 [2 u0 O, F - }
6 \: V+ T* f5 B - return null;: s+ N) d; k: @# y' F' n" l
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.4 u/ J% y% v- {' c g3 y1 d3 C
# O% K5 z! A yМетод addQuest(Quest quest)
' k4 C5 O4 [9 A4 I* X" g) t! M, T) v& n7 \1 T( r' W& X2 V
- /**
1 H ]/ u8 L; S/ U% _4 Y% y% r5 @ - * Добавляет новый квест.
, O. N' I5 J# \ - * @param quest квест для добавления
6 C0 m' R) B# F& S - */
& U4 G7 C% M5 Z: z* ^1 e& h% Q$ ~3 \ - public void addQuest(Quest quest)
- ^" Z/ I# Q8 w - {
% a8 a8 j* Z- B2 c! ]; _ - if (quest == null)
& U! \; n1 U- w: [ - {
+ f& O6 z O% H5 G - throw new IllegalArgumentException("Аргумент квеста не может быть null");
6 k: p7 m$ A) ?# C6 b* b - }0 I: t8 o+ m1 c% s2 V
- : P m/ z- L' e9 G/ q6 z, J9 Y& H" I( g
- final Quest old = _quests.put(quest.getName(), quest);$ x3 I7 O! z3 p: ?
- if (old != null)
- h7 y9 C, T+ M& e6 J( S - {
$ b; }/ }; l1 s6 ~6 S' K Z' G# m - old.unload();+ l; n. M2 n2 _% W
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
1 Z5 z/ }2 u. [! A - }& ]* \) F7 D7 {( j: D. V3 Q' `
-
0 c$ T# S; z2 g4 Q5 l7 o: V9 T7 ~# N - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)3 E/ F3 v; T" @" ~ G' ~
- {0 E7 @/ z8 W- p
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
7 X. B, G m8 c. [ - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");' t: C" M* A9 H
- }
0 p* p, ?6 b4 J6 X. T. D: N* u - }6 S& b ]6 V% \
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.' a. D# r; N1 W. Z' S1 T' J
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере. w! m# S: t3 G9 V( N9 [/ A
& a4 L. F. A. W
7 h: m3 L5 h, Z* T* m% P8 \" { B
- K: B) [) q& b0 q
|