Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius- O$ z& f; l. p% g% u
: P z4 h5 E. n# v5 X0 tРазбор файла QuestManager.java
! _" W9 v0 r+ p) k: `
& P' A2 e2 X {$ D, ~Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.( O( c3 o/ Q3 V6 l, c; `4 i
Основные элементы9 ^' \1 C; L7 j8 y
- Лицензия
) M) t; {' K5 r6 A8 p/ d- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.! q. x9 ~. {, ^1 y) v
- Импорты
. U" D8 N% A0 x1 L% r
4 Y/ r8 ^3 Y, e3 m$ ?2 xQuestManager.java — управление квестами и скриптами.
. \3 ^0 @8 u5 D7 d7 L1 U" \* \Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
( ]' I8 w1 j. J0 B J
% F) B; Y: H, Z; [
5 V+ ]: S r- x% r# GДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
& O5 r! M& g2 p% `& Y1. Лицензионное соглашение( [3 G% z9 M4 u7 c4 w
- /*/ H2 w) K2 I& f* ^" ?8 F& M1 E; M6 ~) J- D
- * Этот файл является частью проекта L2J Mobius. D3 w! N R Y% `
- *
) b: B7 C8 v( I1 i% `7 D3 ? - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
( R5 G) i& F- p" H8 z. \ - * её в соответствии с условиями GNU General Public License, опубликованной
8 ~& U( \: G. U2 Z: o: | - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
, {1 F& l2 d% W& ` {8 y2 A4 f9 J - *
6 U" ~* W) L& P' i, Q0 X0 c - * Эта программа распространяется в надежде, что она будет полезной,8 t. m0 f$ x, }) a: n( |
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии4 \& w c1 p; a3 W; L1 @
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
. V' |6 Z# b8 M/ H4 P - * См. GNU General Public License для получения более подробной информации.$ V% {4 }( r, ?& E/ y6 J. B! J2 u. C
- * - G# f$ [* q. A9 r
- * Вы должны были получить копию GNU General Public License9 M' c$ M6 L; D, J+ }
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.: s8 q1 N8 ] y r* d% a
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.1 d) X) S" P- c0 F; X
+ P) Q5 ~/ K* p# r
, ~3 j% ]) B6 W
2. Импортируемые библиотеки0 S. N( D) A6 d; j2 `! o
3 L0 R2 q+ m9 c- T( K# e h- package org.l2jmobius.gameserver.instancemanager;" {2 c8 N) Z0 |- `" w. b. Z
# ~' {" Z: O9 F; r- import java.util.Map;
& r( A( g2 f! p2 x1 W2 z - import java.util.concurrent.ConcurrentHashMap;
) Q, \, ~/ l* `8 g s& P - import java.util.logging.Level;
; z$ D( {/ e. U3 f5 {; T( e - import java.util.logging.Logger;
% Y4 n; V! F; q - 5 X7 j' ?; _& T2 s$ J
- import org.l2jmobius.Config;
5 i6 }2 W; \! s7 x5 _/ r( Y4 t - import org.l2jmobius.commons.util.CommonUtil;
' c1 R% k- q$ v) U) U, j4 { - import org.l2jmobius.gameserver.model.quest.Quest;1 s) H6 y& w: @. T$ N$ ^8 K7 p0 F
- 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 — менеджер для работы с игровыми скриптами.
* q/ O( j+ E) Y8 P: d
2 A4 I" P2 w" N# N+ a3. Описание класса QuestManager
2 w- _) d! G0 D' [5 D$ ?+ `7 V8 G- /**5 W' H4 ~2 U. b/ x9 y7 X1 O: s5 u
- * Менеджер квестов и скриптов.: M7 R! y$ I7 [$ i9 U
- * Автор: Zoey76. m$ Y2 u" p8 A
- */$ P: ]3 d4 i, _3 L
- public class QuestManager
5 E' L' {2 ~% l" c8 ] m - {1 W8 s- w5 w y7 V+ u+ R i. b
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName()); O o0 J7 h0 ^ ~
- ; l" Y4 ]. |2 v* A$ e2 Z
- /** Карта, содержащая все квесты. */1 u: _/ Q( d$ m6 x" ]8 K, \
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
. w: l) l" ]) [& L, v, g8 U - /** Карта, содержащая все скрипты. */7 k% D+ p, X" C! ~+ }. e( S" H
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
! a; @% R) a9 {; \ - + |7 |6 f- Z+ o! J/ A4 d1 X
- protected QuestManager()
& |& h! H4 Z! l* p - {* D/ m; m% d/ G, B# y$ D1 z
- }. Y' ]5 `' M6 a# a8 |
- }
Скопировать код 4. Методы
4 H% A6 ?3 G1 t8 |7 D9 MМетод reload(String questFolder)8 D" Y) S+ D* m# L \
- public boolean reload(String questFolder)
# F3 H; B4 S: B# q - {
1 j3 y# E% M3 k/ N5 o - final Quest q = getQuest(questFolder);
' A$ g6 {3 t9 [! \8 Y6 R9 M - if (q == null)
2 _/ ^9 @& U- n T( r4 C) P' I - {1 H! K( G& ?: d# x: N8 W& k
- return false;" ~( n: H- M X* \* U" j
- }% k3 @2 H. ]' t$ d) u
- return q.reload();; n: `" Q' r& p
- }
Скопировать код * a' A# |9 I- H( {/ n
" u/ L5 x) k4 U8 q/ ZМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.2 x b" u: o- r
Метод reload(int questId)
5 i4 s8 O2 O6 ^: }' S1 R$ v+ p' Y8 ]# T9 `
- /**
+ q0 s, t |0 R( O% d# k A. r - * Перезагружает квест по ID.
" v8 q* ^) L/ O0 ]9 o4 t - * @param questId ID квеста для перезагрузки
% g0 R3 _& `1 Q7 C) {7 ~ - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае# V2 r7 W% p& q7 Q# D
- */7 g; v7 |( y) P y% ?. k5 q% v
- public boolean reload(int questId)5 _3 O3 a) ?4 b2 c" {
- {
! I- Q! G' a/ L& U! C - final Quest q = getQuest(questId);
# x: Q8 w) W6 E - if (q == null)- g/ U/ v! T! P% S$ ~+ p
- {6 n5 L: H8 U. J1 z: M; z8 P
- return false;
% l9 L1 A0 ^, a- c; M, y# N1 B - }
! Q C/ V+ P* E, U- e - return q.reload();0 P* ~6 }( K- `% {
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.2 O0 ?: J2 g" E6 e% H' H# Z: b, |
6 u, N$ u; q) h8 f; n2 T# P
Метод reloadAllScripts()
8 I" a8 Y- B$ o0 h1 H! P8 d1 |2 V2 p7 X4 _9 V, x+ r
- /**
1 Y& z" X: G/ o - * Выгружает все квесты и скрипты, а затем перезагружает их., z6 {% x/ ]" d: T6 R
- */
% j+ F* W2 R- ?, Q% U& z2 g - public void reloadAllScripts()
% A4 U: q2 e+ Y/ j! j" _8 v( L - {
1 t/ b# k8 ^' G% A* |; j6 C - unloadAllScripts();' y6 C9 p! Q7 ^/ k% Y
-
: w! ^3 g8 X0 }7 x/ C8 M, g* c8 K+ m - LOGGER.info("Перезагрузка всех серверных скриптов.");+ k9 A- ]2 l( }* h9 A6 F: F
- try k6 [ ] ]. ^& f
- {$ a% K/ v$ N8 e( D; j' P
- ScriptEngineManager.getInstance().executeScriptList();) v/ R1 E( N0 P. s
- }! |* M! R6 u& b1 d
- catch (Exception e), E: i8 B: W9 m6 s; m. c; R
- {1 ?3 D: Z5 d" m# ~$ q" `: t+ l
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);/ P) c/ e- h2 d+ s
- }3 ~/ H' I6 u1 c' o
- + k) [/ v1 R& J/ y9 d
- getInstance().report();
, Z$ \6 V, x! ?! p& `4 F - }
Скопировать код Метод unloadAllScripts()
/ ?5 C! _. M2 b/ p! l. ^$ `( g
9 N* z/ o% m9 H- L3 _4 D' \$ p- /**
! W0 r2 {6 ]: t - * Выгружает все квесты и скрипты.8 _" w/ \% Q, B8 P
- */# A( [! l) C, k* \+ \
- public void unloadAllScripts()
5 p+ B5 a# S i0 _# f% r - {" y8 B/ D; |+ R: a# a
- LOGGER.info("Выгрузка всех серверных скриптов.");1 O: Y- w# S# R' ?! [ y5 ~% C# j
- 3 P G( |0 L& a& w: o
- // Выгрузка квестов.' W- [. N" Z% K
- for (Quest quest : _quests.values())9 X O2 [& B! e1 s3 W( \
- {
* x7 ~8 A8 X6 S7 @# ^7 j) N2 \ - if (quest != null)% _9 ?2 e7 O. U. `
- {
5 W+ G6 Y1 f( Y* z5 _# Z - quest.unload(false);8 h* F/ m1 g& C3 L. P5 V
- }
6 [9 u/ |& ]' I N5 l - }& s, v. }( \0 P7 H9 n6 z
- _quests.clear();
( j& W8 y. @6 K. W - // Выгрузка скриптов.
, M" ~+ @/ H! d9 \4 l# u8 G - for (Quest script : _scripts.values()), p; ^% j+ _6 O, ^- W4 M& z$ Y
- {3 \6 m: }) o# I: Y# e4 J$ @$ O, L
- if (script != null)
/ Z! }# x7 ?5 U5 g8 H/ X. R+ Z% | - {
) J( N7 K/ \8 v2 C+ M- d5 y - script.unload(false);" L8 \, {# A& f, ?
- }+ V) f, F/ O. O3 W( M1 \7 y
- }
: t- c) d6 N# C2 k. G2 x7 }& `, A3 B - _scripts.clear();. {& e3 k+ {, M, o( [# }
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.7 }6 R6 L& r( M; C Y$ o
0 H; W. O0 L4 W$ Y, M9 S
Метод report()
3 ]. _- y( U% g" W2 Q3 d! T9 L9 \# [! p$ A! z! y) j
- /**+ \# [) g: ^3 i1 ]
- * Логирует количество загруженных квестов и скриптов.
4 `8 y; R: F0 O! }, [ - */; h( J# R1 k" V. h& e
- public void report()- z" ?, f. M6 M# \( `
- {
& `6 j) K6 Z8 P: w! Y4 V; K - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");& s+ p$ T' Z/ `9 b1 [$ n; W, V1 @
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");" n9 U/ @, {7 r3 N0 S3 }# v s
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
9 t5 l8 N9 G# N0 y 0 i) z$ ^ ]3 Z' |1 F" `
Метод getQuest(String name)% c* o/ S$ E9 P+ T
0 B3 ?8 U4 u2 R% ^1 \2 P- /**
; U r8 o) c+ C9 w( Q - * Получает квест по имени.
$ H: K) `5 \9 G" A4 X* f - * @param name имя квеста
l/ v3 k& d" M; d3 M( C5 @ - * @return квест% Q3 w; @% {2 U- W3 ~. g
- *// |$ o' \$ w+ [! w) l
- public Quest getQuest(String name)% I3 |9 E, S: u* C2 M. G5 y) n
- {
& Y2 _3 x( `, O - if (_quests.containsKey(name))
7 Y C% V+ f% m( ?# `" S% B5 R - {2 x. W6 P3 J( d s1 N# w
- return _quests.get(name);
) f+ @% d& e3 m; w1 i% y - }. B8 B+ J) s0 s$ I
- return _scripts.get(name);" D+ z3 K/ V& u: T* E. C* J( z
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
& ~( R4 T, [' g% i
9 R A8 F1 Y7 y7 O. A; vМетод getQuest(int questId). k! R- k+ j% g+ F' W" f8 F% H
2 [! j! O* o6 a
- /**$ f, F [, ^7 @, C% t$ [$ n
- * Получает квест по ID.
. L! Z1 L, G5 ]4 l - * @param questId ID квеста
( P4 \* D3 \3 Y. N - * @return квест, если найден, {@code null} в противном случае3 V0 f7 g. G& w' D* ]
- */
, M& M$ C! X) d$ W0 P+ |4 u& Y - public Quest getQuest(int questId)9 i8 G3 u$ ^4 I" B4 q
- {
" Q _4 e/ ~) [# \9 Z2 E - for (Quest q : _quests.values()): |- m& J; D. i c
- {/ L0 t, z' x% a4 O! f0 O& w0 O! ^
- if (q.getId() == questId): A% z/ }( j# T( o b* ^: |0 c: _
- {
" h; @5 ?! F7 n2 O - return q;
) n6 ?$ r4 u7 w1 X& Q - }
2 L5 _# X) Z r4 C - }
# C; Y: \, P% T- |9 u" U# b - return null;
5 w9 F. J, [( F5 u% P) f: b - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
1 f/ o% O1 Z; S$ \7 M/ _5 `1 O3 p ; R: ^, @; T2 J! k
Метод addQuest(Quest quest)
4 q- C* J) E i6 j- ~
8 E/ t5 A0 W& G3 L6 v6 `( v- /**! N8 k: T o( ]8 |* S1 M# K8 |
- * Добавляет новый квест.
4 P4 A% ]9 z$ g: F# f - * @param quest квест для добавления; |; @$ c4 P3 Y% P- K4 V
- */
& w/ Q' |* n9 Y - public void addQuest(Quest quest)6 W' e$ u8 j% U) E7 A8 Z" N4 y
- {$ e5 @, H1 f" t6 H. u! e( S
- if (quest == null)' F! \ a* A* D0 f
- {
8 a" i& {9 @6 O - throw new IllegalArgumentException("Аргумент квеста не может быть null");
+ b& k! |" {" }% E! M5 w - }
c+ v4 e8 I4 X# Y- z5 D" x0 y - / b5 W6 k. S$ N( I
- final Quest old = _quests.put(quest.getName(), quest);
8 i4 \' K4 g8 A) n - if (old != null)/ X6 F; a9 L- M+ K! Z2 d0 d
- {( C+ i5 N E& `. e) _* t6 k2 B
- old.unload();' ]+ W/ }; z2 b8 l+ O# `
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!"); W) f( h& \8 @) V' A; h9 f
- }
5 {- O" }' d6 k+ x, n% ~ - / l# q$ L- D$ S/ _ O# n
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)$ l, p D/ o% r; S' D& v+ k
- {
: P5 r0 j- [6 l. f; z5 ] - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();, z" I6 V6 d: y: ?; o9 ^0 a! W& Z/ y u7 O
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
0 ~* X+ E$ B h( v: B) D5 k - }1 n& Q1 O& r0 `3 b
- }2 A. E3 O) U/ p4 c+ `/ s% F* C2 z
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.. ^( {$ ?: }# \ k# \
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
) q `; n; r! y1 ], h: J P, a
% ]) _! ~/ b5 o2 t5 b; I9 _4 I1 z! Z. e; W8 p/ u% ~. l
. b& z! O" C. R& A) `6 G
|