Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
$ a3 Q) F- k$ ~9 T9 m0 Y+ [; Q6 H5 c! H# h$ A
Разбор файла QuestManager.java9 u3 W: S, D0 s5 B4 \( v7 o
8 G. w6 t0 V/ h. H
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.! [8 a) Q# E- s L: `1 ~1 K
Основные элементы. S: B" U4 j- C7 f, z( f2 G1 u5 b
- Лицензия2 z5 n g" k' {; L
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.* R# w. c8 K* m. x. J
- Импорты
1 S# d+ t' |, S. H4 y 5 A! i8 d8 |- I+ a9 [
QuestManager.java — управление квестами и скриптами.
$ B# `0 _' _: aПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
% f6 m0 M `: b( }; j$ F" O: T. E+ E' I2 ~/ W G
* T: |5 l) a( W1 t% K7 IДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.& W" G+ O% ^" f7 U' c/ Y" b
1. Лицензионное соглашение
8 _+ m& D# l( u9 U0 X4 A$ a- /*
% S0 L8 }5 N6 ^3 r; l4 C3 c( o2 ^ - * Этот файл является частью проекта L2J Mobius.
" i& \- d) c& w( `5 b - * 2 E+ o9 b( N4 a& M6 D
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
8 h; f: [' y: e6 i. p: z- j - * её в соответствии с условиями GNU General Public License, опубликованной* N, B* A- N+ @. m6 s( O% f! f
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
) K) Q* x. h& T* {6 |4 q - *
5 g+ ]' c0 W) q; V - * Эта программа распространяется в надежде, что она будет полезной,$ U* X6 T; q) R8 M# V$ |- U
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
4 |. S- z* a& |/ X7 U' k7 L - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.) G9 H& R* L) G( Z
- * См. GNU General Public License для получения более подробной информации.( R$ s! W5 P4 x
- *
! K; [% |% k$ Q$ [- ]( {' Z - * Вы должны были получить копию GNU General Public License9 d }* E& \9 Q7 X
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
) q) j( g1 C7 K7 [" I4 j; V. B - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3., S4 H! [. F/ {6 n
7 K: i7 k6 B9 S5 J4 K" O) N8 p: }6 Y/ Q4 j- b! x8 `
2. Импортируемые библиотеки
2 `$ O8 L q+ ?+ e+ N. h+ {
& ]) t/ s7 P; i2 [, k2 T- package org.l2jmobius.gameserver.instancemanager;& Q$ i5 }/ n0 [: a1 ?3 ?6 Z
9 m0 L' W- X; ^7 T: f- import java.util.Map;* Z1 n- E5 m" }7 C: O" j- |
- import java.util.concurrent.ConcurrentHashMap;" B& {2 l' g$ d" P; ^2 b
- import java.util.logging.Level;
\( `$ K. A& X( O/ u& S) ~! T - import java.util.logging.Logger;
A* N. X# T! a. F3 P; B
" H0 {9 g: Y% v5 u- import org.l2jmobius.Config;+ ~( k' Y5 `3 a% Q9 }7 P8 C2 L V5 D
- import org.l2jmobius.commons.util.CommonUtil;
) w" D: ?7 A/ N7 R# r* J" ^$ q6 P - import org.l2jmobius.gameserver.model.quest.Quest;/ ~7 t1 q D& [1 G3 c1 \
- 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 [, i( C3 ?- U+ M) ? R% z
/ g5 D# p C! D- A5 Q3. Описание класса QuestManager0 [4 V4 s `+ p/ ]
- /**, J2 |7 |/ P3 }4 u. c3 c
- * Менеджер квестов и скриптов.
9 t2 Q" A! O5 J$ r! O. C - * Автор: Zoey76
" F2 n) g6 P+ S% n. a% M: u. J1 E - */6 V9 X! o2 G9 O$ B7 l7 L3 ?
- public class QuestManager8 E1 R M, ?7 `
- {8 v. L5 \7 r2 S0 B$ I+ O
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
1 {( e# L5 D$ S( O, h2 V9 l1 _ - . z1 Z- V- q0 \8 n* Z0 P& j! B- O: r
- /** Карта, содержащая все квесты. */
' V v5 M5 y: R9 C/ t% ^ - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();$ C: C2 T7 u6 H1 c* B3 _
- /** Карта, содержащая все скрипты. */ J/ o3 X- X# X- A/ i4 l. C
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();7 N4 z2 z2 o/ b: U
- - z% Y1 m5 D, x6 X
- protected QuestManager()
# I0 A$ V# ^) F8 W- m - {* z: g, ]; F! C6 {
- }
" H8 ^ z8 l( r V0 n1 G - }
Скопировать код 4. Методы
0 C/ I- x1 F) XМетод reload(String questFolder)5 }6 T5 A+ ?; j4 b: X3 K: g, _. {
- public boolean reload(String questFolder)( j) }7 }- Z# f3 a' g
- {/ M) ~+ r% c$ F) c
- final Quest q = getQuest(questFolder);
) {1 c1 @' A, u; ?" O - if (q == null)3 I. Y0 D0 |) h
- {
% V* o3 K6 P" x$ |9 _# u - return false;
) m5 J& n! u2 L9 j* E - }' a4 u' i! z% R+ H+ \9 o
- return q.reload();7 \. f9 S9 |5 C
- }
Скопировать код 1 q+ W$ Z3 X7 P- E
. A- B' G5 P% aМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста." s: u, x3 b5 S7 N
Метод reload(int questId)
y. s8 W( j% z) f; d" d7 i2 K
! y2 X/ w/ k v" S- /**# A( ~6 L; W% j1 X( J3 ?( J3 M
- * Перезагружает квест по ID.; y: h. j" }5 R( J3 m5 a
- * @param questId ID квеста для перезагрузки
$ q2 l% q$ a) K3 C* |' I - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае1 Z1 v* j, Y7 |0 K9 M3 \
- */7 w: w5 o# f) R
- public boolean reload(int questId)
: w) |$ V& l- B `: e, D) g - {
7 V8 \7 o5 m$ [) f - final Quest q = getQuest(questId);
0 T4 U+ c8 f; r! N - if (q == null): z8 [6 v/ _, n# V
- {
3 }1 `7 `; T# F2 _2 s - return false;
2 a8 g- q) l$ h$ e2 y& t - }! z# l' y+ T4 K5 i$ u q/ a8 Y& o0 o
- return q.reload();
* Q& C0 J+ n: @% N# f - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
) G9 f/ x3 m0 O# r% L: q. Y ' N8 _" r$ J" d( H4 K
Метод reloadAllScripts()
8 d5 o- \+ [$ J* G6 G
/ B: }+ |# [1 D' b& g& }* S- /**( r8 H) F3 U* {, v. n+ ?. `' X
- * Выгружает все квесты и скрипты, а затем перезагружает их.; F2 O4 l }; r3 q3 Z
- */
' M3 t1 K O |" G9 L3 W - public void reloadAllScripts()
2 z! k0 i9 L Q/ b" ~: Q' w3 U - {# u0 h" P k. p, f
- unloadAllScripts();
0 w u: q4 p! F* o6 S8 e -
' G: ?9 j6 S! |. U* l1 J8 b2 \3 ~ - LOGGER.info("Перезагрузка всех серверных скриптов.");3 K) `7 {# V- W
- try# f$ ]/ Y( \( Z. A$ y/ q
- { Q! W- E# G# ^& N& Z4 B+ t7 a
- ScriptEngineManager.getInstance().executeScriptList();( ?* J8 p; O! ]
- }
0 q! G1 \ W9 E. {, c - catch (Exception e)) l* u6 n) s8 H; p, b
- {
9 n5 o5 S( s* R/ k/ O8 X# v: F$ m - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
4 Z0 f! ^1 S8 @. \4 u* T8 J - }' e0 ?2 Y; @8 X3 [: T1 _6 C' v: V* h
-
$ ]" S5 z5 j$ z6 T - getInstance().report();
7 m. q# j* F) t# n - }
Скопировать код Метод unloadAllScripts()2 {7 I' M/ N5 a: j8 G- H1 Q2 q' I
* i9 |/ Q, f `6 n4 v1 K- /**; Y- x0 |8 l3 n& j$ G4 H
- * Выгружает все квесты и скрипты. s d2 p* \# y$ \! Z2 l2 n9 C# u
- */6 t7 a; m) H5 v
- public void unloadAllScripts()
7 |% T+ g+ ]0 M, D - {
8 a7 n$ f# R4 Q! L, E: b( v - LOGGER.info("Выгрузка всех серверных скриптов."); B: O# m3 _) b6 w- @/ ?' i4 R/ v
-
4 d6 P5 c3 C- ^ P# @ - // Выгрузка квестов.; w0 R" I6 ?4 T7 a& r8 ]0 G7 h
- for (Quest quest : _quests.values())' q% Y1 `: S- Q6 {' F
- {- c9 ^- M# u+ Q3 ?( U0 E- n
- if (quest != null)- c2 D% v4 H( _; Y5 P, G
- {
g3 ]) g) ?$ R$ a* P2 z4 g: A - quest.unload(false);' d8 j! |, M0 U1 j$ t
- }
" I' x: S7 z( O O0 m$ G - }
8 W' H; h3 O/ Q! s! o - _quests.clear();$ x/ l: M4 G) L4 d' d
- // Выгрузка скриптов.
* `4 ]% f _% O9 b" W - for (Quest script : _scripts.values())
3 x" A# G3 U6 P2 ^- B0 ~# a" ^8 } - {
" {9 q$ D" T9 I/ } - if (script != null) J6 g# L* d3 H4 B9 n1 a
- {7 l9 X* L& ?: v( W+ o
- script.unload(false);
' P1 A) o2 D' R - }2 D4 k8 x" F! Y, h' |. V8 r6 {
- }
' b# b: S6 a- F6 g/ S" L2 X2 f8 k, E - _scripts.clear();; t. v! u4 l$ O, }- j2 \+ @
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts./ [' k0 G) e7 [$ w2 O7 f8 O
: L$ q2 F$ F2 m8 ]
Метод report()
+ f4 v: Y, A7 D- T; O" f# Z4 R2 H8 d, H8 N3 u3 [8 S
- /**% v$ \5 M+ P9 Z2 X' S6 k" Q
- * Логирует количество загруженных квестов и скриптов.
6 P5 X' B( \1 P) l3 L% u% s3 Q - */+ [/ c5 o. e; a0 @3 q7 [
- public void report()
4 y* P8 a# o( o! E2 x* X - {- L9 a$ j, R' S
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
' Q: d. w' m( a% J4 Q# H - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
4 S- c9 _( ?3 o4 t; T( V, \ - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.* c" r- b1 D! `9 o* |; ^/ Y2 ~: T! Z
0 ]! a! E( d" t
Метод getQuest(String name)5 [+ V* n( ~% f
8 ?4 {+ j2 |+ x, R8 T+ M- /**$ o) R1 n6 i& R. B& @& O4 O; y% |
- * Получает квест по имени.) i% q+ i4 `5 f' ^) j$ f
- * @param name имя квеста" l) l3 b8 I2 ]1 l
- * @return квест! z6 {% V2 T8 h1 u! T
- */
. J: I( T: l& f% ^/ E1 g$ A- n - public Quest getQuest(String name)
8 h, X0 ^/ j4 {1 c - {
8 q3 e" B( P) F/ W8 j1 e - if (_quests.containsKey(name))
; c$ g, _% S X$ h' V! n6 g - {
9 }& T8 k, C& p2 @4 s - return _quests.get(name);
b0 @' ^- q9 b" T3 G$ Q& ], U - }
: s8 p1 J" X! B* L" B) ^; D: I$ g V - return _scripts.get(name);6 B4 D1 _, s; v3 ]/ U- J: n
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
1 F2 i; }+ t: h# G$ d5 V
6 s& _& [/ a, U5 X- S |Метод getQuest(int questId)
, D( S. X5 b7 t% g4 M* j0 R9 f$ E5 Z2 X2 P1 q. f3 A2 z \
- /** _1 T7 O# e) o# N: v1 f* x6 K P, ]
- * Получает квест по ID.
1 _2 Y; D( k5 V0 h - * @param questId ID квеста* ~2 {/ b r4 g5 r( B5 g4 g
- * @return квест, если найден, {@code null} в противном случае
0 J2 R9 C; s5 W: H - */
/ ~5 }3 K. `3 D3 p* D2 M - public Quest getQuest(int questId)
2 f) U8 a1 [& P - {! J8 U2 u- L, {' S5 v
- for (Quest q : _quests.values())- K) X1 C+ |) M" a% `' k7 J+ B
- {" G1 z' i; i( {; W( |* t$ c* U
- if (q.getId() == questId)
: u" W$ d5 }% a- C - {# F/ g2 W& l2 x3 B% {& z
- return q;
) ]& H, N7 V0 x6 b3 w9 e - }
0 O/ d, i0 p$ F' a. U - }! E, G G6 H: F' K k3 X
- return null;' S; v- S- A8 p e8 U
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
0 K* v/ ?5 y6 X- {0 ]9 g# b
8 I. f, N# ~, m$ }% u4 TМетод addQuest(Quest quest)
$ C5 R1 R: n" M/ o* {5 h5 D+ z# c
- /**! Z4 k9 E) y a4 i! @
- * Добавляет новый квест.) k; h) b8 w% i( U5 S; {3 x
- * @param quest квест для добавления- ^5 }( @8 Y$ v8 T
- */+ |! s; w% d* p6 N
- public void addQuest(Quest quest)8 ^8 v1 N9 W/ ~0 o7 Z; O, L
- {* j. k5 p9 l) d
- if (quest == null)- B9 i2 F5 g% B( `! v3 R8 T; n1 l
- {
0 ^9 m- N( I$ X9 k - throw new IllegalArgumentException("Аргумент квеста не может быть null");
' N: j7 U6 C& j$ b1 ~6 J2 \ - }7 x- W" B9 P1 y5 h8 ?
- 9 I) ^* B) W8 z7 }+ Z+ @, |. |
- final Quest old = _quests.put(quest.getName(), quest);
9 ~0 i9 \, n( A; n$ D6 E$ ^& Y: }0 ` - if (old != null)
, a D; e6 q. n9 @1 o: N7 T - {- F# |& _3 O V1 p8 _
- old.unload();9 w% A! u, q( W- r% B" J
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");$ a- H- X) V2 |% s
- }+ W$ {; Z9 {0 H- u0 t3 u5 T9 ]+ L
- 6 ?/ p5 V, \0 t% Q( v. r2 B
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
9 V2 K! q$ f$ A) A2 N6 i( P& p - {
+ l$ @$ e e3 ^) [1 Z7 _ - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();+ `, Z# M9 ^: K' h, N
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");( Y, L) \( y/ }. B6 G( c m
- }8 k1 W* Z" ?) w6 H
- }$ B$ t8 E' ]$ C+ Q" g* @4 j* Y
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.& `$ j/ ?/ V. R9 M) x$ a
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.! k- h; o9 J7 ]
4 P0 J9 T4 p; I5 p" a$ x
9 h" @( y) K: V Q9 ~* ~
/ {3 E1 O! F! |- c# S% O9 k h |