Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
/ W# j/ [. R% c# U
- m6 |: S% T% }4 hРазбор файла QuestManager.java
+ a% b: o. B, l# F* H$ }' L( F3 L2 M; d% ^% p2 y
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.* W& V! O* V6 e+ ?3 r! t
Основные элементы2 o, z1 K) V: F, a! z7 n
- Лицензия
! z) j: h% x% b9 ]1 R- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
& f# O' `( t2 x1 e
- Импорты
4 m) T5 w2 O2 Q) Q
4 I; z4 p' a& }; H% C0 eQuestManager.java — управление квестами и скриптами.
. G" y0 L) s; v7 u4 |Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
" j) j* f- r J& O% Q8 }
7 `' f1 t! W y$ _
7 ^! N: e* B& ]& f! D# \Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.1 z. Y" q2 w$ w1 ~. e* S' S. r
1. Лицензионное соглашение$ J+ E! X7 |, F9 @
- /*
9 m ?, ]* r% o+ m - * Этот файл является частью проекта L2J Mobius.# z: F1 e( R* _) N
- * - x8 u, ^ H( g$ l- u1 O) i8 M
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
- e) O# j1 R' k8 P: ]& Z3 } - * её в соответствии с условиями GNU General Public License, опубликованной
$ k7 d/ D" L# W( `+ z! P - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.0 F9 J2 Y) n6 S
- *
1 Q0 u4 s7 ^9 ~! S* T - * Эта программа распространяется в надежде, что она будет полезной,
6 S" J+ g* d/ z2 H9 n - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
; |3 E; o. }& y" O - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
# y( j) Y" f: g' [' u - * См. GNU General Public License для получения более подробной информации.& F6 v4 r" e" t4 k! a$ S8 _
- *
: M$ |0 I: a# n g. p - * Вы должны были получить копию GNU General Public License
8 c- t, r& G* Y; Z - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
3 f9 O: S3 N/ L9 A: f/ V/ A - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3." `% J. P _( J) }( j5 Q2 k
- c8 E) o( w1 v" }9 L% g
6 s3 b" _& Q! ?6 q, k- G
2. Импортируемые библиотеки* ~) G1 s% F# A
/ \; l z1 |/ W
- package org.l2jmobius.gameserver.instancemanager;) x" r$ [' p! C3 R$ C9 U7 G- ~
- 9 ~9 V6 ?; o% e
- import java.util.Map;
5 O! H% e8 a$ j - import java.util.concurrent.ConcurrentHashMap;# L- d& g8 P, ^4 \* a5 \ Y
- import java.util.logging.Level;0 U# `% H5 ]! X
- import java.util.logging.Logger;, c' v) N% x; S7 T
& k1 {/ K' u/ F( D& D6 w- import org.l2jmobius.Config;( l/ f _) b3 f4 Z3 v1 z) a+ k' j
- import org.l2jmobius.commons.util.CommonUtil;
# j B# ^1 |: h+ w - import org.l2jmobius.gameserver.model.quest.Quest;
( `; \; M) R$ 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 — менеджер для работы с игровыми скриптами.* o* p1 z9 `1 h1 I6 q' h2 D
: M6 V& b3 h. S) `5 S5 V3. Описание класса QuestManager$ q% ]( D! }' A$ y
- /**
- W$ L6 d- o! V" O# L' k' ] Y' u - * Менеджер квестов и скриптов.
/ z* {! n* l- G2 H - * Автор: Zoey76! `3 J$ Z+ ?( S( D1 p2 E* V% J$ l
- */
" G, p" u# a3 ~1 A; U' O - public class QuestManager- c9 x4 `4 v+ @* y! D* B) y1 W, Q
- {
4 q# A, A3 r& y8 G- z) b7 Y; _ - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());4 M% O# S$ Q4 T5 b) n
-
; C( O0 p" V9 {' Q/ A* Y - /** Карта, содержащая все квесты. */' @( }% s$ U2 S& ^
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();. E" R$ E* e1 q2 K) L; O
- /** Карта, содержащая все скрипты. */
2 C% b. e6 {$ L5 U# ^. X4 [7 A4 ]- J2 W - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
: B1 k& b1 ]( h -
6 T5 Z/ p% j/ z - protected QuestManager()6 J' [) X2 G6 U
- {* @ R" G% i4 ]1 i0 x/ L
- }
- j+ z& u5 }2 u. L5 }$ ~, d, g - }
Скопировать код 4. Методы, F( L$ c# |4 |) M0 E
Метод reload(String questFolder)
. N0 }' z+ u1 y- public boolean reload(String questFolder)
& w1 @0 U+ E: z7 @- h - {, H p, O5 b3 k8 k5 P6 c/ |% q
- final Quest q = getQuest(questFolder);* Y$ U; Q( a3 b3 i ? V
- if (q == null)+ H2 F+ d- D1 v, s* C5 a0 S
- {
' L& c; X' i' c3 f! ~/ Z0 B - return false;
- A- R( n( @. l* Q - }
! ?- m+ H1 Y3 ]7 @* C8 ~( Q# p% r# o) m - return q.reload();
3 {% V7 y, `1 C9 P2 ? - }
Скопировать код 7 f: Y, ?1 u7 E8 K$ @" C0 k
. y- B4 R$ ]( S1 T* C9 fМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
& o2 K' I* l* Y% R" t: n" w2 sМетод reload(int questId)9 m* {1 C6 G- M9 k0 s ^& o( W. C
7 v( G" J/ f4 H3 ^3 v8 p
- /**
, ^* M% Z R; @% ^; i* t - * Перезагружает квест по ID.2 H) o. U5 l. F; _
- * @param questId ID квеста для перезагрузки3 y: C" b( u5 ]" N
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае8 X3 T7 G4 T, C, H. m/ @+ E
- *// A' L+ N F5 I" m. N3 O% ^5 ]& U
- public boolean reload(int questId)7 @/ E- `( e2 n( n; N
- {
6 Q! T/ v# Y0 m. b- @& Z7 ]9 b - final Quest q = getQuest(questId);
( g! E6 }0 g% b% x - if (q == null)) ]% Q' i# j* S$ {& n
- {
2 y, K5 Y7 Z- J J - return false;- m- O, Y1 g7 I
- }% X1 o: y3 b9 }/ d) P+ T" s
- return q.reload();
. a( N9 K' N8 [. ` - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
9 _8 o5 P* t! u
. ?+ J: D5 M/ I7 z9 \ h9 F/ g- {Метод reloadAllScripts()$ J2 `8 t. N5 _3 L: J+ }
9 [& d6 P- f- y( F$ w9 F
- /**
4 O5 W* W) Z' Q - * Выгружает все квесты и скрипты, а затем перезагружает их.
9 P) j, w. A. ~" C( A% R$ V - */+ a2 i! Z, f" m5 h \( Y4 r
- public void reloadAllScripts()+ E) u* E4 ]2 [4 p. d$ s6 P
- {. D2 H( A4 p, D+ W% ?- b
- unloadAllScripts();( U' ]+ @$ A/ ~6 }
-
/ ?- v5 @5 q; ]: z$ X - LOGGER.info("Перезагрузка всех серверных скриптов.");$ e( {8 w2 p' q/ h- x
- try, ?7 i9 t1 F! Y% v" |
- {
+ e, e, f }& k9 H! | K& d - ScriptEngineManager.getInstance().executeScriptList();) {+ N: Q- n* U. a
- }
9 g$ L+ ~' g5 t: w" j - catch (Exception e). M/ h( y; B V9 t# P4 o
- {9 N- ~5 E( B5 B) ]$ |( v9 w! I U
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);( w, }2 z7 R: d
- }/ f! p- L2 @* G7 |
-
3 E, w& w, u4 V# c, }8 T - getInstance().report();
& w0 J6 ]" J6 _& i( S, o - }
Скопировать код Метод unloadAllScripts()
{ y( o, ?( T8 ?8 w' _7 S0 f! R/ o- Y$ g5 D
- /**
. ~7 n7 ^4 ?; A: Y; U - * Выгружает все квесты и скрипты.. @0 d) i6 _; r8 a. d: x+ |
- */ `6 a0 v( Z# }9 d/ [: W6 X
- public void unloadAllScripts()
) F% v) W1 O* w - {/ B$ K; H7 F$ a! P
- LOGGER.info("Выгрузка всех серверных скриптов.");% N4 }8 o5 Q% [9 p: A+ @
- % |3 m: T4 z- G* p/ ~
- // Выгрузка квестов.3 `' j4 @1 p- _
- for (Quest quest : _quests.values())7 U! i4 z; }+ x4 Z5 x& P5 ?5 V
- {
$ A; ?/ a- n2 z - if (quest != null)
& p: X, i; _# \) S - {8 O. c1 k: @; N0 V0 G
- quest.unload(false);
& J/ z' }0 M& z3 O. e; V - }- @: m0 s) U" O& [9 S/ T1 R
- }6 {( X M/ V2 e) M' z3 z1 C5 Y$ N
- _quests.clear();! e" t) \8 t3 N; N' @, C5 E
- // Выгрузка скриптов.7 D3 z- ] U- f8 U% V3 r0 m: v3 \
- for (Quest script : _scripts.values())
2 P7 V7 P; l# ^, g* C T9 h - {, t& q; ] _% o ~' f# _
- if (script != null)
. w6 c) L5 s* _& o - {' w( h! ]! N7 c- u( |; u4 p
- script.unload(false);
2 y) D0 v7 h- P. b9 x - }
# @* N# \' a: \( C - }2 d% o! J1 N6 `; c/ a* G5 [
- _scripts.clear();
4 I E0 d* ]8 B6 A2 B, d6 Y# F - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
' p; Y4 @- O4 l/ n8 @$ p : {# B% G: S# ~" q* d7 v* y
Метод report()0 G6 w1 o" B7 J2 q& x. ]: |
) S8 A2 v j* C- /**' d* O2 i6 K$ E
- * Логирует количество загруженных квестов и скриптов.
/ U* ?( N# x9 o% I* W7 K - */% u F" l" h7 s5 Q- ^2 w$ o
- public void report()) _) f- t" }0 e: T, \- U+ k: H1 ^
- {9 i+ T" F0 m: g) K
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
' x; N" n, l- q4 D1 a" E3 \ - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");; g. B+ M; J0 T, t g
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.. R4 Q @; L$ U: ]$ O7 w
! J) n* i- J: ^! S' Q
Метод getQuest(String name): W) C5 d; p9 Q+ S9 \2 T6 @
! U: B- s5 u2 k5 ]- /**& w# C# j/ [/ I! F4 \/ v
- * Получает квест по имени., f# ?" P% |7 w, h! I
- * @param name имя квеста6 G- {" Z- t. z0 s( Z
- * @return квест
- A7 [( [) E j9 l) E; ] - */$ Q4 {: ?. m( c4 \; q5 q- x5 q
- public Quest getQuest(String name)* b) R/ f W$ J1 \
- {& @6 y/ v4 I: x* p2 N( |
- if (_quests.containsKey(name))
/ _$ Z& w3 U! \/ P( P - {
% k" @3 V9 [2 D( L) ~ - return _quests.get(name);( W* \! k0 E0 [& \+ f! ~9 c) O5 B
- }( A9 {' E% h v* {3 Q' Z; x
- return _scripts.get(name);
" l9 d! A% ]# @4 f' ]& ? - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
) _9 j- B% W4 g. o" R
( W6 v' L- ~, `, j8 E. [' V" KМетод getQuest(int questId)" j9 Q" V% Q7 c: c3 Q7 y
6 g* {! ^( q& y/ w; S1 a0 d
- /**
8 @, L2 [/ u- f- s - * Получает квест по ID.
1 m( Y) q# r* X: { Y! |0 C - * @param questId ID квеста
4 [; g+ I7 o9 E% W6 r$ n; G - * @return квест, если найден, {@code null} в противном случае
; S; c; U+ W. P5 ~( Z - */$ i1 S. |9 M5 |0 c
- public Quest getQuest(int questId)
8 Z) _$ R h" ~ ^3 \* |4 r - {
$ P& t/ ?) M& y% {. D l - for (Quest q : _quests.values())- c$ ]$ ~; K( G4 l
- {
; U) B( G) l# o e7 h' T - if (q.getId() == questId)' c' U; Y5 U: Z
- {' v. x4 R) t: j4 T* ~4 I
- return q;
9 j2 L D) T8 Y$ h: o. P4 m5 q - }+ q0 I# E) M$ T' F; n/ O9 k
- }
9 j* x( k/ H* {: y% n" p - return null;
" P: K9 U/ U+ l1 m - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.6 D! d) F2 f# R: I
# \" ~$ ?8 Z* i" `# WМетод addQuest(Quest quest)4 y7 }# X9 H* b4 [
1 F- D9 s" M0 d# ?& F6 N
- /**, o4 D) ]7 e1 ^' P# H4 u
- * Добавляет новый квест.. q9 @) O) T1 x0 u2 T& p# G" E8 e
- * @param quest квест для добавления
6 _. V. f1 [! | - */) I( v3 Y) p2 f/ A0 A7 i# F
- public void addQuest(Quest quest)- g- j+ ?' p, v! m# J
- {
) c$ M$ E: J& p! W - if (quest == null)8 F% j# f1 x% o% q
- {$ p# q, P7 [6 b3 e6 P+ K
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
3 ^+ F0 o z! ?/ Y& F3 G/ g# C - }
& I( v4 g" f, Y -
2 E+ ~! a( {8 ] - final Quest old = _quests.put(quest.getName(), quest);3 o- C E3 ^: D- a1 {
- if (old != null)
- Z2 r2 Q5 Y* b0 [3 Z$ @% ^ - {
$ K; O8 l4 D9 Z* U - old.unload();
! C9 ?3 f: H0 ?2 V. @ - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
C, U, p/ S; n. X' e+ L, L - }
5 i% [( K6 `4 j" J1 t, Q5 c - 0 K* F9 e9 Q$ B7 [
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)% A: p; T$ D* r. N( t& L" B
- {
2 _- z3 k8 I) S* Y - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();5 M$ x! Q/ G) \
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
$ Q$ t! q: T! m2 D9 ? - }
$ z8 P2 W, o9 K - }
; p- M9 w. x0 T! y ]" s3 v% {% j+ q - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера." S" Z0 S: P/ |
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
0 p1 ^' m% w! j5 {. J
9 P. c: l8 B; P& Q$ C0 k9 N7 h! l6 O* P$ \) L" p
" g1 ~& x% K2 m
|