Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius! j: {' V# z% w: q; t
" z' o J6 p; G) v5 ~* xРазбор файла QuestManager.java3 g" Z& ?7 A# E7 R
+ |2 f' S7 F+ y/ I; V/ e& _/ tЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов., ]& t2 [9 p) P1 s" \
Основные элементы
) |# H2 E V0 p- Лицензия
/ b) K9 h3 q5 e2 I7 d$ I6 m- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.: m" I, O g* V1 ]( u {: x
- Импорты! G" e6 g6 D0 }
7 h7 n' k" W$ q/ ]: H+ g
QuestManager.java — управление квестами и скриптами.3 Q# L( a% i/ g: n/ {
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
" o1 l6 P4 [0 F% Z4 z( n
. o! C3 ]* x T& z. ?% W! k6 V9 s. e' M! F/ Z
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
6 G/ A! [7 V# }2 n! f1. Лицензионное соглашение
1 W* ]' M0 ~% U. o8 n, Q" q- /** l+ n3 ~4 Y5 S: Q5 b
- * Этот файл является частью проекта L2J Mobius.3 T9 {, F A! l6 }& m
- * ! D( c. p* @6 W5 q, V$ R
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять' ^ |% r7 x* V! z' z$ c' R
- * её в соответствии с условиями GNU General Public License, опубликованной
5 r. X' W. h" r a% R Y - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
5 g7 i7 l; {- |/ [0 J9 F2 h - *
3 T! R# O; o7 P - * Эта программа распространяется в надежде, что она будет полезной,1 D9 E9 G5 ], v( O, x" K8 y
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
1 y7 U3 W7 y& t+ ` v - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
/ w7 L2 @# r- f" [4 G - * См. GNU General Public License для получения более подробной информации.
% p" D! D. M- ^- l* W/ Y4 c - *
6 c- H5 }+ U% c u- u' d m6 F - * Вы должны были получить копию GNU General Public License
0 t1 N8 `1 e$ B) y1 F0 M7 S* ` - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
/ j5 l6 r5 [4 O' I0 v X v - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.1 T9 a& C3 k& X' z" A
S& h8 `$ u! W+ h
' d8 O6 Y- s" L5 N2. Импортируемые библиотеки
8 ^4 V" v# P/ E9 q; ^4 W1 n# f0 G5 [
$ Y+ z7 R( x7 q1 f& D- package org.l2jmobius.gameserver.instancemanager;3 o3 f5 Y) Q: j
/ U9 E% t1 L# @3 {4 j1 p4 |) \4 ?- import java.util.Map;
6 S, V. C5 T- l) s2 F - import java.util.concurrent.ConcurrentHashMap;
9 S" Z3 b% s. O. d/ o! L3 J' m - import java.util.logging.Level;7 _8 p- w7 P, Q$ N* r
- import java.util.logging.Logger;; U" ]: X0 H0 m- ?, S s# v
- # N @1 B% K* h c& F( o) a
- import org.l2jmobius.Config;
7 y V: ?/ D3 f- j( l) a - import org.l2jmobius.commons.util.CommonUtil;
: ~; J) x0 Q7 Y0 F$ Q3 |5 g - import org.l2jmobius.gameserver.model.quest.Quest;
* C1 \. O$ J2 A; ` - 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 — менеджер для работы с игровыми скриптами.
. s8 {( D) ]$ `, h
, \' W# }( }2 j3. Описание класса QuestManager
0 y& ~3 t9 z4 n! Y( f9 Z8 V+ |- /**& d; T* f9 x) E
- * Менеджер квестов и скриптов.
8 _9 x9 t4 H! d% I# H7 p - * Автор: Zoey769 s5 U- K0 I6 n5 x$ }1 W: l
- */' i& F7 L/ F" t1 D; C9 z! X
- public class QuestManager
* V: D. Z% k0 {8 K7 p4 q9 J - {' L9 Q9 a m/ F
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());& _$ q, c( b6 ~
-
% u8 X8 l' E( M' {0 S - /** Карта, содержащая все квесты. */
, V* A- e# p: D - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();7 Y1 X/ ^! n6 z* v* Y
- /** Карта, содержащая все скрипты. */
- [/ ` f0 }7 B; q0 f; o) s. Q9 K - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
7 e3 S- F4 x4 @/ i; r B: y$ c -
1 p% Y: v( P3 V. t - protected QuestManager()
. _( C- H/ {7 Q' ]1 ^9 N! k M - {
: b( C- P1 Y2 J; K6 n - }! X- u. N2 d0 J6 \
- }
Скопировать код 4. Методы( F5 w* [, L: l+ J& r! u- Y1 g9 ?# M2 ^
Метод reload(String questFolder). t; u2 n. s( x O& j8 P2 y# ~2 C
- public boolean reload(String questFolder)- u; k& Y6 N3 V* C5 L
- {6 g+ ^7 J. p4 f) F; M
- final Quest q = getQuest(questFolder);
. i: f5 ]; ]. d8 Y u - if (q == null)
n9 ?8 O* [/ _: N/ D - {
9 E2 A( {3 a2 W% u" l6 _ - return false;8 y W% s& e3 w" ?/ c5 Z. m& y: j
- }
/ k# g3 q1 a4 O* J! ?* y, t. x - return q.reload();
6 R( p0 \) J3 m; p0 ^ - }
Скопировать код ! B; \: n1 ]$ ^6 w2 v
$ X+ w$ x# J) ?' f% |Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.1 B1 R8 W/ C+ x. k; W* \
Метод reload(int questId)
9 ^8 w/ k) A G3 }
# w8 X4 @9 y3 j8 t/ m- /**
. B* m" `# [, C5 U - * Перезагружает квест по ID.
w1 U) {# u# u4 y- \' R8 y; ~( k - * @param questId ID квеста для перезагрузки
# {- l2 V$ x& z- c; d4 P! N - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае1 }) a7 O3 l4 U% t* B. @
- */
/ d9 v! O0 \( L: \- r - public boolean reload(int questId)0 m& t. g, o8 b. P8 b# a2 P+ z
- {
- C8 |& [7 A8 n+ q& e; Z - final Quest q = getQuest(questId);5 e5 D4 P- P1 M2 T M9 S5 z/ }
- if (q == null)% a& `* @% S) F0 C
- {
) W3 O6 p, M$ W - return false;4 b& f# I1 w4 X
- }% Y3 i% V+ x) L `0 a# r
- return q.reload();/ e' K( h, H, s4 ]$ M A
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.3 p: X; Z8 y) P
7 D- W2 S8 w3 K3 H- S
Метод reloadAllScripts()
" D7 j' K4 ^4 W* X" b. o9 A1 j* o P9 @6 w; d3 [9 _) s4 |7 s# f
- /**
5 ?+ q. }, U |/ E - * Выгружает все квесты и скрипты, а затем перезагружает их.
8 t8 k7 g9 ]8 V" _6 G( [& X - */
6 X/ P8 y* @* y/ x. e& \# l - public void reloadAllScripts()
# e- y) y5 p" u/ R3 Q, p - {3 W/ T- m) b9 Q' S3 h* f
- unloadAllScripts();6 T' }8 t$ T4 X5 X; `' I; M
- 4 @/ M. i4 ^# f, \
- LOGGER.info("Перезагрузка всех серверных скриптов.");/ Z: z( T/ ?. @8 x& I% W# b2 a; Q* o' s
- try
: { r9 R9 ]/ `4 _ - {
% q0 N% c) v8 Z. X( T" } - ScriptEngineManager.getInstance().executeScriptList();7 i4 q( X1 M' d) m/ z8 N2 i
- }
' g) A! g: Z' {# b2 a - catch (Exception e)/ Q6 x* F& b. s F
- { S( B' N0 H; I3 _* ?
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
: }5 e6 z( M; n) W/ s+ W( Y - }
5 E$ [9 s7 L) D& ~3 W - / r5 l' G, X4 j
- getInstance().report();3 Z8 r" A$ d+ ^% R1 N3 @
- }
Скопировать код Метод unloadAllScripts()1 e+ r5 e; c+ t2 g! M
8 W! h( M g# f" s0 N- /**
$ v9 ^0 W0 T. L - * Выгружает все квесты и скрипты.
- o. P3 U9 ~ s/ z3 {1 [6 N- p - */
3 r- W0 P# a4 Y0 J, K6 `5 ]9 ~ - public void unloadAllScripts()
" \# h7 a2 W; d9 N" e) D/ ~ - {. n2 M8 U" k" n: \3 \
- LOGGER.info("Выгрузка всех серверных скриптов.");( t) h3 B% v3 s& ]$ _8 }
-
; I, t, }8 h+ U) K4 f - // Выгрузка квестов.
3 y& Z5 Z+ [* {6 R - for (Quest quest : _quests.values())! I7 H m4 b5 M0 C
- {
4 U! ]( o1 I' W - if (quest != null). p' j/ f* U: ]( _, j& M3 [- h
- {8 m8 p& }- j/ u" V9 R( W% D" Q
- quest.unload(false);
! G: v/ e4 f0 u: M* |/ b - }" F$ s5 S: B5 G+ w7 B4 ?
- }& f* F) K; M3 ^( V8 ~
- _quests.clear();
' I6 W0 M/ w2 m7 z - // Выгрузка скриптов.
& ~2 T$ n% V2 r6 O - for (Quest script : _scripts.values())
" D( K' q5 A0 F. k6 B - {
3 O$ I5 ?) p+ Q2 c, A% \! { - if (script != null)/ }9 t# M( Q4 i4 Z/ C( F
- {% a+ h+ J, N N4 t# S8 U
- script.unload(false);
2 A" v+ m: p6 W - }
' S0 q# f7 n% z5 B& r8 G$ O& O9 G - }9 @7 v4 c8 ~" ?/ B- m' x& t7 j# p
- _scripts.clear();! i; B: r5 V2 F: b: R
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts. z& `/ y+ M5 t" f
0 F" s0 d0 k: i. y, h6 t8 `: XМетод report()
8 @0 O4 }" h& D4 A
+ A) z2 f3 J. d4 x6 K! g- /**
0 s) A3 a. z% P* D+ \# C! d) F - * Логирует количество загруженных квестов и скриптов.# C1 l/ p/ C& ]3 v* T+ h
- */
- q# k2 R1 W) P, A# v$ w - public void report(): m5 K, h% n. B8 n5 m6 m. d
- {4 k& m( W, E- H, ^5 ]: c
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
' |5 K" q+ H; m - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
: a- m% r" O& e3 [ - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов." E$ h1 _! Y" |" p
# ], Y2 a! ?$ ?3 y( O; ^' y3 s5 `Метод getQuest(String name)/ y9 ]: M% k- U+ z: G" b
! p# E) x2 z7 k' l4 p) p- /**
7 o( v8 k! J ]$ Y6 ~8 b# X - * Получает квест по имени.9 |/ F5 v i& x8 _; ~/ a$ `
- * @param name имя квеста" c l: ~3 K7 B
- * @return квест* {8 K2 s- }9 B" F; T
- */9 I: Z4 V6 `! a" y6 }
- public Quest getQuest(String name)
- q9 ` W$ N% j; F; H8 ] - {7 p8 {+ p% q" _0 n7 v: E$ ]& W( o
- if (_quests.containsKey(name))% o6 R2 i& E) O
- {, g7 \# y% z# ]
- return _quests.get(name);: H* L! O+ G; G6 J; v
- }. ?4 c2 A3 D( N$ ^4 e* Z
- return _scripts.get(name);: W+ H: O* v- V7 q
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
* m, M9 L1 L4 R9 }- Y+ Z" L) I
/ O2 Y7 M( E9 P- h% b2 _. VМетод getQuest(int questId)
8 n" b. z; Z$ v- H
2 Z) \$ T7 ]9 S0 \ }7 \0 b: ]" R- /**
8 {9 O/ W' i. p, Z! t! u* i - * Получает квест по ID.
) r! y' ~: h9 K8 h F - * @param questId ID квеста2 f! R& W) n0 x
- * @return квест, если найден, {@code null} в противном случае
( b' p' G, C! f; a - */- R* B* q: m/ z# o
- public Quest getQuest(int questId)
0 _) U' b$ s. P/ y7 T* y; U - {/ G! h8 \' t) g8 a* A- I
- for (Quest q : _quests.values())
' c2 K' _& |( R1 N1 z5 { - {9 s% {) k3 f* R
- if (q.getId() == questId)6 S9 A% p& e1 C. h( s
- {. W. [/ C- D" o; s
- return q;
; a, a( u; B$ h( I4 Y2 G1 K - }7 o( P* O+ V/ R, p+ `" N( o: l
- }
9 @! _0 \2 g7 o7 S% \! |/ ]1 j) X - return null;$ O( d) z- e$ x1 Y4 ~# a
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.9 S0 g r( G' U# L$ j: m
7 D7 d$ d$ s0 w& h. v
Метод addQuest(Quest quest)7 G. |. x9 V6 U1 w
$ O: D8 N) @0 ^3 r
- /**
# f. m! h- o+ W; m' Q* W! Q - * Добавляет новый квест.
8 {! R+ T# p3 J - * @param quest квест для добавления9 I9 Y& H9 {$ w7 X# D9 j$ D- t
- */
# j( G0 h6 e- r" Z$ E" `. z2 _ - public void addQuest(Quest quest): G* r1 P% S1 w; b1 w3 |1 Q
- {& y5 R# E4 m/ J k+ a
- if (quest == null)
4 W) [ F3 J0 v% V7 ?' w - {8 ]& _& s* E2 x4 S3 o7 h9 h- d
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
5 X4 R$ X' L; R- S4 I7 ^8 N - }
0 e+ E9 J& a- d, y: W+ Q% L% v - 6 `4 F1 b) l# l' X, C1 e
- final Quest old = _quests.put(quest.getName(), quest);5 M3 J6 _) f G# d" y2 Q2 X
- if (old != null)8 L2 Y" H1 C2 H
- {
9 W0 C% b& @* e. M8 H - old.unload();
& \; X' Z# D; N- l$ V \% c - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");3 R A% k, V# D2 q
- }. E. R. w$ p$ D
-
. V1 F$ k: l2 j. |, X; X2 ]! _ - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
2 K! I5 m, g9 A6 j - {
5 ?% `1 s( E1 Y! B - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
" n! t" Q9 a/ s+ m e - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");4 J% M7 z3 F* ?% R. d
- }8 B$ ]' z9 w* c! V; K' |6 ^3 b
- }
1 Q* p \; X j, u4 X0 I; X - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.4 j( R) e! a T1 U
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
6 M) u. t5 o1 i4 f$ y
# ^; Y s. _! }# @: F. H: ?+ i, |2 K8 \) y' C
! v9 Z" G; Z9 D- N* s |