Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius8 v$ G) S/ A, B2 `
! M/ t8 Q+ c/ V8 ?, i/ b3 q" oРазбор файла QuestManager.java
$ E: o% t/ S, b- B, ~5 l' C# ]1 [( a6 }/ i7 Q6 O
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.. z- A0 \5 U7 }( G% j
Основные элементы
7 Y1 E C& n, e: Q" F9 l6 V1 D- Лицензия
. d8 A- L1 o. ?- {! s- `! g6 t- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
) F* g4 w/ ~& I0 b( } f
- Импорты0 P2 G; X( _5 _8 ?$ C& h
! A; n; R; R$ b5 y' Y& ]- EQuestManager.java — управление квестами и скриптами.
. U! S8 b. ?9 W+ \. e. lПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\% t2 g0 x" P! G7 w* `* H( W, L
* X6 r- l& E& }. C4 _" j
5 C3 i' o D, R3 O) qДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.4 N; X: a% s# R8 U; y, D$ [: ~; z6 p
1. Лицензионное соглашение6 A1 L, h5 e `4 L. `" G
- /*" L1 h, O+ r. t* J) ^
- * Этот файл является частью проекта L2J Mobius.
0 V2 c) h2 H; @: n( i" t" r4 Y - *
: ]$ Y# c$ H6 b6 i; \( n - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
- c. Y3 [) H1 v - * её в соответствии с условиями GNU General Public License, опубликованной+ X4 O4 R, s$ w7 C8 H4 T& }# D
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
8 i* ]7 w3 ]6 v8 S% E. n1 t( B - * - B9 X5 k/ \, A- G+ p0 X
- * Эта программа распространяется в надежде, что она будет полезной,
) v0 ]& F. K5 F2 U5 w3 G - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
2 o8 N* X4 p5 P p$ D* n# i# ^ - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
4 ^% w* k1 y! i, ?, u- v - * См. GNU General Public License для получения более подробной информации.% ?3 ?7 d% G& f5 A( c3 `
- *
. i( F N; B; d% s7 G4 x - * Вы должны были получить копию GNU General Public License
! T: t4 V$ m, c - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.' y* W* O1 x2 a5 `" Q
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.: t! [. u6 `7 M; x6 f5 L4 h
2 j* F, }. j$ \9 x& ~4 R
9 k4 m5 v& z- a6 T& ]! b+ D! D: p2. Импортируемые библиотеки
9 E3 a/ _1 F3 i) {% I& `
* C' b+ e6 l: h$ I4 F$ U* f' `- package org.l2jmobius.gameserver.instancemanager;' k4 s" T( A5 h7 |+ { A! b
! y1 `. H4 y# g, `/ `0 Z- import java.util.Map;% L2 |3 M! a' p% J! b; u" O
- import java.util.concurrent.ConcurrentHashMap;
. Y% c/ \4 Z- r( q, o - import java.util.logging.Level;" A4 O) [1 g" a/ P2 b
- import java.util.logging.Logger;
( S1 o- P* Q' @* ]5 d1 w `, @ - - g( s$ h0 k/ o( ]: P$ d& Y, \
- import org.l2jmobius.Config;
' J9 ~4 S) Y7 ?: L; g* v6 P - import org.l2jmobius.commons.util.CommonUtil; {6 d4 |; I5 }" E L5 }
- import org.l2jmobius.gameserver.model.quest.Quest;# z3 [. s& v. b$ 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 — менеджер для работы с игровыми скриптами.0 ^ L: ]! E& Y
: s( e7 V# @ C5 Q4 O; N, r
3. Описание класса QuestManager( E4 j: T" z3 l: u/ C) B
- /**, x/ S9 U$ Y& U8 ?: x
- * Менеджер квестов и скриптов.
) H W- M- p0 E - * Автор: Zoey76
' S. P7 _3 |% Y" h - *// Z/ O9 A2 V E
- public class QuestManager
0 r: p5 W- @# S$ B2 O. M8 c - {
2 ^+ w4 D8 V3 I, l9 v8 n, T% g - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
: y1 `: m: j7 Z( J5 w# X - $ x& `* }( R5 s9 x) e3 |2 x
- /** Карта, содержащая все квесты. */ `, g; D$ V/ w1 R% j. S1 d
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
( V; z( f" y) `3 _. T& o$ z) E7 | - /** Карта, содержащая все скрипты. */
) @5 R E0 m2 I) N - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
+ ^2 I; V1 s. I7 U( j | - 9 E0 C0 i( F& Q( l2 h8 H% i
- protected QuestManager()
- j: `& S5 m' c; h( z1 L8 B - {* B) s d" R+ p+ w0 X, \; y/ P
- }1 e1 {0 ~, C- C/ B G L
- }
Скопировать код 4. Методы; f0 c& I8 w/ d, y" K5 I6 S
Метод reload(String questFolder)& O% N1 r- D( q6 ~
- public boolean reload(String questFolder)
, g4 }4 R4 P1 ~$ {) v - {$ D3 k, \. E( h+ V6 _
- final Quest q = getQuest(questFolder);/ [' r5 [1 _) k7 b
- if (q == null). ]" T* s+ K1 m6 a9 x- x- O$ Z
- {
% z* r" B. G4 X$ I6 a - return false;; U# v: b+ Q. o6 \$ d
- }
# W% k( v- c1 o. M( J& R - return q.reload();
6 c7 G4 n$ S- c$ v - }
Скопировать код
* M' H$ b ^8 ~3 x2 g
" {$ h! h! z6 O; a: K$ w/ g5 cМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.( J& `+ ?, q6 U6 O. N- X9 X
Метод reload(int questId)
+ u3 J3 Z: B! B( t! r; h7 I2 { j* |: t4 ?* L) ?! R5 L7 P4 e
- /**$ r" G3 m4 {+ i) f Q! ]* P8 D
- * Перезагружает квест по ID.) S* Y8 |- J2 L" E: P
- * @param questId ID квеста для перезагрузки
! e* y1 c, B% G$ T - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
6 z7 k0 d' o2 u) L+ G# s- i - */" G) l; B* J# c
- public boolean reload(int questId)! q: q- ?: e7 ~! l
- {
% W* j; t, _) ^; A4 ~* Q1 z" b - final Quest q = getQuest(questId);
: S' T: j5 Q& [3 Y$ @3 n3 B - if (q == null)
* w- A( c7 l7 K+ n4 t% K - {( c" Z( U- n7 U/ P& S6 T; {
- return false;+ c5 c# |6 y* B/ N$ d# J1 q, v
- }3 k3 R2 u% V7 _! `
- return q.reload();
8 |) k& u0 c' |5 Y - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
/ ^ B7 v' w! p3 I
/ l' G% ?9 l9 [4 f/ o$ rМетод reloadAllScripts()( t. c( [( Y- L3 R0 M
, z$ b+ z6 l, z
- /**
$ h8 |2 ^) D! x! H& q - * Выгружает все квесты и скрипты, а затем перезагружает их.' j1 K/ B! B% R" d
- */4 T8 F9 `8 d2 Y5 z2 k1 b+ J9 H6 R
- public void reloadAllScripts()
, G1 t1 k+ a3 q - {
! O g# V6 n; W2 @5 z - unloadAllScripts();* n7 P/ o6 P S* N& x' k( I
-
, Z$ H3 W {* s3 K; x/ B2 @# k - LOGGER.info("Перезагрузка всех серверных скриптов.");5 w6 O& F- i& Z6 h) F. Q6 A; }
- try
! n8 [& a9 [3 i; G. h - {
; A4 y: J( ]1 j3 F$ n - ScriptEngineManager.getInstance().executeScriptList();
( p' c+ S" h) i& X9 B - }! n, G, M( I7 M7 }5 E+ z. b# A6 \
- catch (Exception e)! r) G/ F" K; i6 m
- {& L7 B4 l6 y8 h
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);2 ~' }8 C& D* e5 e; j7 C- X
- }8 Q, `( B! ?8 c% Q5 o
- 9 U2 J( h9 J0 A
- getInstance().report();
& @, v- Y/ u) u' F - }
Скопировать код Метод unloadAllScripts()
& H% e* K. u% F4 `( z( m: X# d5 z/ q1 H& z5 H% [6 h! ~0 L
- /**) O y0 H7 R. a9 |3 ]6 v1 g
- * Выгружает все квесты и скрипты.( V4 }" P7 h; ~# d: l& ]3 u7 V
- */0 l' ?, ^3 {& T& N, r" s+ q
- public void unloadAllScripts()7 S2 l2 {" D+ G: p
- {5 V, Q9 l, _, ]% k
- LOGGER.info("Выгрузка всех серверных скриптов.");
8 L( V8 e* {) V! F - 6 V4 l0 T; P- b7 b& z
- // Выгрузка квестов.
$ Q! u. r+ v1 ]; \! O/ ^ - for (Quest quest : _quests.values()) r1 J" M& M* b- y1 y& V
- {& I9 G( f) U, D
- if (quest != null)
8 F" _, g6 J! u4 k' K - {
5 ^/ M- B# _+ F2 r# E, p1 D2 S - quest.unload(false);
* ^( }% N3 I; N& {6 A% Q - }
1 {3 H: V" Z4 W7 L* Q C7 V8 g# x; {8 s - }: o! J$ ?6 Z8 c' D, Q3 I7 X
- _quests.clear();+ \# L I c4 z, k1 [0 G
- // Выгрузка скриптов.
7 C$ T: F$ Q% s1 N: E( p6 r - for (Quest script : _scripts.values())' C% x' C4 |! E [8 K3 w
- {
$ v' M5 Y/ R( r. g8 Y0 b3 R: j - if (script != null). \9 P5 W G$ n1 Z
- {
2 h8 v1 \0 N& s8 Z2 B/ _ - script.unload(false);
7 a; C* S& [) C( {0 ? - }
4 j4 n: b% y( S# y - }: @& J) v% T( h+ M- ^ f# L& i
- _scripts.clear();; S0 H( g+ m. L8 f$ x
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.4 Y1 }. L5 T9 h. G. I
5 Z% _0 z2 R' ?$ H% k. `1 \
Метод report()
6 \/ O8 b ?' o4 |9 X0 K A% W+ `
3 U6 L' j- s6 y! U0 j' @( I8 P- /**7 G. j h- T& ]2 C3 r/ c' J3 j
- * Логирует количество загруженных квестов и скриптов.9 q9 U+ O* Y# s$ M! ?5 R E' ^- @. i
- */2 C/ A1 ^) H3 g3 F: X% l+ r
- public void report()- b. [% k. V; A0 w0 v; \6 H
- {+ D4 |. P& a8 _6 Z' ^: \! s' d7 J
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");+ o/ q1 V/ O1 U, x) t0 d4 x c
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
1 h) f* z4 H3 _0 ] l6 }, A - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.& c7 J- U7 i) X6 n9 ^0 I
' ^. l& p8 d* A4 CМетод getQuest(String name)
8 D$ U, F7 f/ z6 b: R7 E$ k7 @6 s* T- A! B. z1 X. _) g
- /**
- H9 S: L6 \# K! E! { - * Получает квест по имени.! L0 C( g2 E% H ^' |) j6 ?" H
- * @param name имя квеста/ T: E4 r% u9 m$ G1 O5 V0 ~
- * @return квест- Y. V& B! ]7 I8 N$ [9 s2 Q+ M
- */
* x; A- J( O* X' H - public Quest getQuest(String name)
+ ~- a" @3 N4 P# } - {
, V: l9 X7 H+ l - if (_quests.containsKey(name))8 l1 z) J7 l0 K& C3 x
- {7 N$ z: \ _3 q( H; y
- return _quests.get(name);5 ]$ Q( q0 N5 o( U: V$ _, s
- }
7 |7 W- ^$ m; A$ s5 T% T - return _scripts.get(name);" v2 U& W) c. Y2 v. e; w. f/ A7 ~( ^
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
, j3 r; C; _' S+ L: {" F* K+ i 5 f9 N4 s0 u8 K7 a; V9 ?1 Y
Метод getQuest(int questId)& k- v+ R6 F; a: h- ~; h2 l D% X) Q
$ O3 k; r' l; ~1 {- /**7 }5 `7 u2 X9 k4 U Q
- * Получает квест по ID.
$ }8 f5 n2 J7 }1 o' _! G - * @param questId ID квеста0 i' f% \4 g& M% d4 d) s
- * @return квест, если найден, {@code null} в противном случае
+ V4 ^" D- I3 ^& { - */0 |$ O p4 I u
- public Quest getQuest(int questId)- Q3 `4 s) u# s
- {
7 u+ ^) I0 H4 r! R! B2 V% f - for (Quest q : _quests.values())0 w# a8 ~0 o# o- ^/ Z
- {
I! ^4 v' R3 D6 q& c - if (q.getId() == questId)
0 M n% A8 y: o) }- [; E3 Q1 { - {
/ H- G9 c* g! `7 R' X% l q! _ - return q;
# V; f' A# B0 U1 m& B1 \6 ]+ A$ E - }
d+ T+ Q, x+ @' l, i - }
! W( {* H% ]3 R6 _ - return null;
! j! q3 N0 U+ A( x1 Q - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.+ M2 H; ~+ Z8 x# p m
' y& e7 q; q3 g& wМетод addQuest(Quest quest)
0 L8 S) ]! O* A" ^# |
) o3 M/ t) L, v, L- /**3 J: {- `2 B+ P0 D! Y3 M: ?) O
- * Добавляет новый квест.
# e b {/ z c. C% H - * @param quest квест для добавления
( O N) P% h9 ]* X6 l9 o( I, o - */* S. I) x! Q t4 c9 ^0 w
- public void addQuest(Quest quest)) r$ g& `3 r- t1 O: Z' A& |
- {
9 k0 @' P! G8 B* a$ D# {7 b6 L - if (quest == null)
4 f! m( D& ]1 v0 h; P4 V - {, r( I% G0 ~& y
- throw new IllegalArgumentException("Аргумент квеста не может быть null");$ i0 x5 J3 h( i; ~1 e) u
- }
4 x' o1 i5 N; N9 i/ V& j/ r -
! A& Z0 G. L! j+ ]/ u& v - final Quest old = _quests.put(quest.getName(), quest);
3 D7 i% n. ~3 V. C3 q( p8 F - if (old != null)$ `7 Z3 X& C* y+ M y
- {$ X) G' h' o {* H! p9 B$ a
- old.unload();
8 B$ Y! ~ k7 s" ^, c% M - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
& s- D# v+ W P. h9 S - }: L3 R) o! P: s! F. i
-
4 U/ Y' c9 s4 H, ?0 C: H# u! N - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
- O7 i8 L. T4 M1 M - {
% q% I. v3 H/ T( b5 `- Y% b- A - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();% B: Y9 o% s& W/ m# x( b8 [
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
) T7 p( g, R) Y I - }# m+ h1 b( r& M6 }$ R" ]9 b
- }1 l, _9 e9 ]' [* Y3 @7 w
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
' I# l1 ^0 K$ X5 }ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.& X2 W; y% @- m/ [ r3 V6 U
+ \. ]& r% d- Q# x, w+ A" R3 `
6 m+ i& B7 t4 f& ]# y% {* R
$ Q% F @6 d" \2 ?. ~% e
|