Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius" }4 s& P. A$ s0 G7 y& T1 ~% A: `
* m5 j% ~3 U* X7 h+ k2 }7 o
Разбор файла QuestManager.java
9 S* U+ G) R0 T2 ]! m8 j' M4 i# _
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
; Z% z3 ]/ c( |2 m/ }- kОсновные элементы6 v/ B6 B4 w1 {
- Лицензия0 N" g; h: P" W7 i$ N: Q
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.9 E% I7 z+ C W/ x+ Z. f F
- Импорты7 m* e" ~; w3 t, T/ e' x2 q6 n7 @5 b
" t# M$ ^2 p5 d8 J" tQuestManager.java — управление квестами и скриптами.
* U; L& c, W+ I4 _) }5 O; K0 xПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
3 w2 } s8 |9 A2 a( ~+ e- V5 M1 t' {# a! C( Z
- |" Z5 T! }6 Z! Z z6 p& kДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
0 i3 j" y2 {2 c9 n C; P1. Лицензионное соглашение, `/ B$ u) |' V9 ?
- /*
5 x3 }9 N/ y8 D9 R) e - * Этот файл является частью проекта L2J Mobius.3 I# x9 l X+ V, {6 q
- *
. Z% t' O+ c" C! P0 H2 u" }# q - * Эта программа является свободным ПО: вы можете распространять её и/или изменять; M8 ]7 O7 w1 Z. b
- * её в соответствии с условиями GNU General Public License, опубликованной1 |! O6 }1 F2 `5 Z& v4 U
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
- c7 p% Y: D$ v6 a - * 4 e4 b' E9 E3 h
- * Эта программа распространяется в надежде, что она будет полезной,% Y3 E& l# f, h! x5 `5 k, ` W- G
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
5 H7 a( q4 a$ M$ n5 ~& D( J - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.9 k5 z2 D8 x: X3 ^5 m2 R
- * См. GNU General Public License для получения более подробной информации.
# a- I+ c! P2 P- @0 A: o- ~! K - *
# J2 K6 ^6 \" y: ` - * Вы должны были получить копию GNU General Public License
' S% R! E! ]6 K8 ]5 A - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>., O2 M1 [# [2 e- c1 ^+ M- o
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.0 O4 H: }) _4 j# i B% F. p
3 Q0 q/ h* n9 Y' B( ] _- ?, h) ?* ?
2. Импортируемые библиотеки% B: M! p2 m7 E/ O8 f9 O; s# y
% x! _- d- M2 P2 b" w2 Q- package org.l2jmobius.gameserver.instancemanager;
3 E$ p, a$ p4 Y8 \! V4 i. ^ - " ~: w' b) B% i0 R# _
- import java.util.Map;3 ~# o1 E$ B: ]* N5 j& z& d
- import java.util.concurrent.ConcurrentHashMap;- V! j: g! J2 [* z# Y! V. ~/ O) x
- import java.util.logging.Level;) I9 ?" j; v" N, D( B+ _
- import java.util.logging.Logger;1 U6 |" n) q1 d, `. D( `6 h T
- ) q+ Z. Y' a# m+ t* C+ j
- import org.l2jmobius.Config; j; J Y. Y& T
- import org.l2jmobius.commons.util.CommonUtil;- F. {5 P' U3 y( Z, u) ~9 z* ?
- import org.l2jmobius.gameserver.model.quest.Quest;' C! m1 O1 ?5 M" c
- 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 — менеджер для работы с игровыми скриптами.3 ~& n, r: t9 H+ N
% d# |1 n, E7 D
3. Описание класса QuestManager
! ] a. Z {# t9 f+ R, Z# W: y0 n- /**0 u4 Z( |, _ [3 y' G9 m0 @
- * Менеджер квестов и скриптов.
o$ f2 Y9 d5 d" F p - * Автор: Zoey76
4 S, l+ l% A+ ]7 f6 \ - */6 E0 m! w3 |" A r+ r
- public class QuestManager+ S& S, D9 q! @( i6 }2 e
- {
- N$ x- I4 c4 G% }5 i/ E+ V - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());0 y3 p! r1 W1 t5 M
-
0 z1 W$ `: E9 m$ R" R0 J- E6 F - /** Карта, содержащая все квесты. */
7 J5 Q# |9 c: {, |3 J - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();: ^( E3 d I2 h9 x* Y
- /** Карта, содержащая все скрипты. */
3 s7 |- \% _$ h- a" g - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>(); W* y6 B, M. Q9 Z
- # E* b }5 m, ~
- protected QuestManager()6 s; v8 w9 p$ N7 s: a
- {& c5 z) f- J Q. B1 m$ E" O
- }
+ n2 R6 s& w* R' V9 b2 Y6 ^( _ - }
Скопировать код 4. Методы) T3 B1 k0 A! x" ~# v: I
Метод reload(String questFolder)
; X/ \! g' K: z- e' p( R- public boolean reload(String questFolder)7 Y: U9 f1 s0 ~. ~" {
- {
4 ~; z2 h: `; g3 V9 ] - final Quest q = getQuest(questFolder);! q$ ~5 I% W( z. b+ u b1 U
- if (q == null)
8 u) j* Y8 u- V# [; z - {
! j3 @7 o! R- ], _ - return false;
( Y$ c ^" R b9 f1 J/ u - }
9 k* ]0 F; ~" o# G0 s7 W6 a8 A - return q.reload();- u* T R7 D* e( C& E
- }
Скопировать код 9 Y, Z% f, h# b
, Z. U- f6 c B: e+ u
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
. W1 b$ q6 f/ A1 nМетод reload(int questId)
4 K$ e$ \2 t$ L* i) U3 [' n1 l7 X* T# z
- /**
1 G* f6 k! B) j2 N - * Перезагружает квест по ID.7 \- P6 D# b3 V- @3 a
- * @param questId ID квеста для перезагрузки, r& n! {: l; ~# ?
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
m& o3 r% D" ~4 @ - */+ e& k3 r) Q% f5 w" U
- public boolean reload(int questId)- P: W* U9 O9 s) j
- {
{8 i+ \% \ S1 a8 Q9 L9 m- q- E - final Quest q = getQuest(questId);
2 O/ H( A; P& q4 y" C7 F - if (q == null)
9 O3 H* M0 Z @# t) e2 U u' H - {; N5 C1 R$ k- E _1 C; W; U# N# r
- return false; K0 _+ V& J3 v( X5 s8 p
- }
: j, Z/ e# Q5 D' Y$ y, A" T - return q.reload(); C! B6 A3 {0 n( {, j' W& F
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.+ K' _8 X7 Q) n5 n6 p5 J% ^/ z) R
9 c4 C+ o( O" D8 ]Метод reloadAllScripts()0 M( } ]/ c8 ~" O( }) c6 K7 ]6 q
7 z+ A" E% y1 N* Q% X! I- /**
- ^/ p2 b- S/ @1 v; [9 s0 Y - * Выгружает все квесты и скрипты, а затем перезагружает их.! e. _: n4 {& h2 N3 Z+ @
- */
( N9 ]7 C1 Y- r$ U6 e" ^3 ~ - public void reloadAllScripts()
. @' t, R P4 c, H* n: x. q - {
& D' o1 w# a3 V& D! }& Y+ V - unloadAllScripts();
) O, Y4 \4 k) B4 z1 h4 E - ) u/ m4 {7 l2 k7 o7 v! u* Z
- LOGGER.info("Перезагрузка всех серверных скриптов.");: G& q; ]% H$ l. _$ `
- try c) K, L; \. J9 Q+ z# ?
- {% p# T0 t8 A3 u+ O2 |" r- i
- ScriptEngineManager.getInstance().executeScriptList();
. b0 E6 O }8 U2 W+ d& d* M - }
3 z& V9 D) Z M" w- S - catch (Exception e)$ W" u' M U* [& @0 l: `* E
- {
& O$ ~( i' Q { - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
7 u, B9 q/ d+ A9 q - }# H8 d h8 ~0 G; J: o8 D
-
" f' y' M- {; { H" Z - getInstance().report();
3 d! _" J: O3 q. U - }
Скопировать код Метод unloadAllScripts()
" C: J6 A0 B/ h9 t4 @: e/ s! O
+ e# R- P: n# V% g5 M0 r0 s7 t N- /**" N# h; M1 S/ F: k! A+ C2 d6 E/ O) y
- * Выгружает все квесты и скрипты.
3 v& a" ~( M" w - */
$ u7 b9 @# W' `7 h - public void unloadAllScripts()
4 l6 z' u. u( j6 N- n& f - {+ d! t7 X/ J3 ?5 H8 S6 b& Y& H
- LOGGER.info("Выгрузка всех серверных скриптов.");- R: h7 T) l) e& U* Q3 f+ d# E$ q
- ! l# e: J3 r# @% w2 o5 i
- // Выгрузка квестов.+ z" V7 t- U4 V% n% h( q
- for (Quest quest : _quests.values())
' E) F% m; u8 D a# t: u - {
- V- u* b6 L! |+ Y8 \# f" s) M( n; H - if (quest != null)3 M' {, D* i- J
- {# m- Q& x8 {! J. p. x7 I! G- I
- quest.unload(false);3 d6 H& F( r5 m, I1 \0 M7 A
- }$ D& H: _8 ^% B5 A
- }( F( }1 D- s" e
- _quests.clear();
( V! Y% i& g3 v: ? - // Выгрузка скриптов.7 k+ j4 p$ j2 M
- for (Quest script : _scripts.values())6 H4 t5 _9 v5 t9 K! s7 \. \
- {: x- o, }+ }5 N$ v3 F
- if (script != null)
5 F0 {2 l% O1 ^5 z5 K6 V' b - {: n& a8 v8 [6 V) R$ ~' B* z
- script.unload(false);7 |5 U+ o- ?$ Z) I, S
- }
: B9 d/ H+ s6 m. |( ?4 I - }& Z1 ]; `8 n' M' X) [
- _scripts.clear();
6 `% q3 T" L3 t6 w# _/ J' D6 ? - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
/ U/ ^ Y8 C1 m2 D. S% d & Z. j- x: d2 c M4 U
Метод report()5 @ H8 g9 p" i
# j8 j) b) q; K; l6 u* ~
- /**2 e9 s; k3 S& c; z/ I
- * Логирует количество загруженных квестов и скриптов.# Z% f b2 V3 h6 M0 q: `* \/ Z
- *// o* }1 N# n. N; H& s: A
- public void report()
7 H5 ]1 W6 k3 N& e$ Q4 p - {
2 b. |, P l, {! N% c1 b6 e - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
! q8 J' U( G! u" \( a& Y a - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
7 x# Q1 H: @8 I e! ~ - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.8 H" N _- a; s! F( M4 E% Z5 _
" ^$ ~8 d& m" |0 L6 FМетод getQuest(String name)
7 S: y) c x6 ?% }; n _, y7 T1 o
4 e1 Z# q) I$ i' B- S8 K w9 i- /**6 {5 U% P6 A7 b2 d
- * Получает квест по имени.
7 x9 W1 F* ?% @ - * @param name имя квеста
& y; \9 H$ Y! S, A - * @return квест
, W' \; g3 [; s - */
9 q- U/ g5 D9 @ - public Quest getQuest(String name), O7 {- I. `/ C* y# N' m
- { R$ D2 \5 ?- Z/ i) U; `: O w
- if (_quests.containsKey(name))
& J2 U! S: ]! }" G - {
( l0 t7 ~% Y$ _6 s5 C- N' T - return _quests.get(name);
0 W0 h: Y' a+ f5 K - }
; O4 n% j, h ~* J. ?: [3 Z - return _scripts.get(name);- v% i+ M$ S. t4 _+ f1 W
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
" _& l& s. S" c! g' X ' G& b1 i0 h! t; S6 j
Метод getQuest(int questId)/ \1 n5 p$ Q2 ]/ @9 S9 y t
% w/ d& {0 |3 m) e- /**
; v3 ~! `( ^/ u; l4 o - * Получает квест по ID.4 b3 s( |9 S" {7 s( Q
- * @param questId ID квеста
" k& d+ b; }% Y5 u - * @return квест, если найден, {@code null} в противном случае6 l" m/ q% w% ?: Y
- */
( \' u H- B; X - public Quest getQuest(int questId)' _6 X" ~: p/ }9 u, m
- {
1 S7 {: O3 X' | ^ w0 p) V - for (Quest q : _quests.values())
8 H" M7 b7 C) Q- M8 p - {
2 I9 G& k* f' o$ H+ n - if (q.getId() == questId) v4 A9 { S5 W
- {
[$ t: l; ^3 P3 ^! m - return q;! X! K3 j9 X1 e6 H$ t8 |6 k: E
- }3 h8 g0 d9 m. a" U, w
- }
0 `+ y$ A6 W( N, d - return null;
3 q: q3 l4 O3 @( F - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
# T3 B- f4 I4 U# } }' ] ) e5 s6 _3 x& ?& b( X" F- A8 v' c
Метод addQuest(Quest quest)* Y+ R, {3 V4 z9 V+ K- C
8 b( a, V: L1 o$ A% R3 S* X- /**4 T, m6 C6 n# B. J1 {4 h
- * Добавляет новый квест.2 f+ n5 D4 F& u9 M* i6 {2 \
- * @param quest квест для добавления6 |7 o. A% I9 ^1 D% g, I" d/ c
- */
, c1 D9 U2 W9 s - public void addQuest(Quest quest)* i4 {8 `) m1 e q9 n: a+ }3 ^
- {
- ^; n) |5 T- q& M( C - if (quest == null)
% ?) I9 |: i( u' H; m8 n5 L/ N - {
$ }$ O4 l, b1 {4 V% v; U - throw new IllegalArgumentException("Аргумент квеста не может быть null");
/ ^1 W$ ^0 J* r) R - }" q4 s+ c8 h4 ^3 n& N1 U
- . P6 v/ B& _) t8 ~
- final Quest old = _quests.put(quest.getName(), quest);
9 W$ i/ L6 G9 L3 F6 E - if (old != null)' r4 k; j1 s& }3 G* N# ?. ^
- {# _) R2 }% S2 ~4 p! o
- old.unload();6 a6 n1 e+ e! w0 |. ~' v
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");( z7 F' a& P' t/ C2 s
- }
3 ^6 Y7 d* d' Y - 7 t( x5 J+ Z8 ^9 N: @9 h4 `% N
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)1 G, w b! O+ X* ]
- {( C4 O" F' g% ?' n
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();# f, b4 _( \3 I* r0 E; O, D- M
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
3 j7 @: i6 V$ u' L2 l - }8 f- ?! F& Y R8 P9 }% D
- }
8 ~! ]0 f' F( Q$ D - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
8 E) H- n$ S2 t4 E' i" D2 M8 p6 YЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
' X# f+ }, t' }4 N# |( G2 n3 l; Q0 L, V" k0 V t+ \
( X) O1 _' u2 h1 |0 O1 b5 w# j: [0 K7 P0 F1 A' F# E; Q* a
|