Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius& k$ O' y7 T3 M1 e
7 r. @" U/ _( k3 |Разбор файла QuestManager.java L- C+ c# Y' ^7 o8 z* Y
) Z4 U2 s& [) B, C1 k" r
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
. W9 P6 z t3 D' k# X1 V6 {Основные элементы
8 [& y3 P2 |- w% b- Лицензия
6 i0 [- @4 k% s- @7 `- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.7 \/ V% P+ X" b J: q
- Импорты" P4 X1 O5 F# q% b7 m: r; C1 f; A' [
- c/ l. x4 g8 dQuestManager.java — управление квестами и скриптами.
6 D6 c& _) n! b2 t* ZПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\8 k' m6 q: a/ O
3 d% ^' o( E( n5 P
8 i: p- g/ H# [, ^/ m+ {3 }, }3 aДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
0 {* t/ W# a& a. M1 V, A7 B% g: |1. Лицензионное соглашение
( `% B. J' K+ L! K/ p5 w; s1 N( y9 [- /*
' [" Y$ O/ ?; R1 S - * Этот файл является частью проекта L2J Mobius.+ r- p6 b1 b6 J8 P
- *
( R5 m! d' d) G6 w, d! T8 v - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
1 L) @. O' M/ n4 ]5 n% z' s: Y - * её в соответствии с условиями GNU General Public License, опубликованной
5 l# p+ f' O, a. f - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
1 x' Q; w( G8 Y- I& o3 U+ G1 w - *
5 G7 _/ p9 ~- a7 N - * Эта программа распространяется в надежде, что она будет полезной,
: y+ D, p( D& ]# o0 {: {/ y5 s- V - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
, y3 Q4 R4 ^! i4 w - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.* L" Y, r( L0 `- \* {
- * См. GNU General Public License для получения более подробной информации.
( t7 K+ b0 y' L% R& _) w( r - * ( L3 r0 i: h* E3 _) i* F C- Z. V
- * Вы должны были получить копию GNU General Public License; H, u, q" |" v9 |! }
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
3 l, _" \$ X0 p& u; P; @ - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3." G" l6 l! |( O0 c0 m& A8 u4 U
8 f V- r6 h/ p6 u0 H
+ V+ G1 q2 a$ A& r) C2. Импортируемые библиотеки
/ X: U2 R/ W) _4 `0 M+ S
5 ~8 V6 l7 s% b. [8 J! v6 `" t- package org.l2jmobius.gameserver.instancemanager;) `7 d7 y/ d( X8 W5 u& C! v E1 ?: s9 w
- " A6 Z; V2 F3 s1 ^0 v
- import java.util.Map;4 `+ V# y" i3 k! n; p
- import java.util.concurrent.ConcurrentHashMap;1 `9 _+ O' u7 m# h( B, x
- import java.util.logging.Level;
6 g1 `. y, N, j6 F7 ~ - import java.util.logging.Logger;
/ {! {6 E( I% Z1 P' t. J - ! Q$ ?6 U8 e% p! v
- import org.l2jmobius.Config;
; c( G; D. J1 D3 V, b - import org.l2jmobius.commons.util.CommonUtil;
8 a2 b! _( }0 K% X- E- h F - import org.l2jmobius.gameserver.model.quest.Quest;5 E7 V, s+ P2 y* w' [( a& I* L
- 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 — менеджер для работы с игровыми скриптами. M) X6 ^' E9 n) L1 I3 U) g
! ^, r; D! i3 R- o8 G$ B) h; j3. Описание класса QuestManager
4 S( u: a$ ~, c" ~" }0 I- /**
3 z3 Y7 o- Y4 i* q - * Менеджер квестов и скриптов.
* {, h) |5 _7 F0 b: O" Q. g9 b - * Автор: Zoey76, c5 Q& K, ]. }# X; P6 b+ s6 m
- */- p% F' a8 f2 |& Y- K% u
- public class QuestManager% o( B/ V5 B8 h$ }% F, j' F
- {1 \3 D/ E, q6 D+ c" h+ D6 P/ S3 {: K) c
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
4 m5 E9 D; y! r: ?, S -
% k% G/ `) _- C, v - /** Карта, содержащая все квесты. */
* O! I5 }% }, o P - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();! M3 t O" I9 H
- /** Карта, содержащая все скрипты. */" M, t" @7 }# I$ [5 r/ Q
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
$ ~9 g+ H4 ?! c+ I; t4 h8 @ -
6 p: |: H* @. o D - protected QuestManager()/ \: a% W; O4 E
- {
" e; P0 g" \' Z% w' ?2 O% p9 ^4 w - }
8 Z, N8 p! ~9 J1 @ v) ?( @% x) y - }
Скопировать код 4. Методы
+ z3 F$ `1 P+ l" g; R& z# ]: vМетод reload(String questFolder) t- F$ k! [; @* p
- public boolean reload(String questFolder)! {: o( f- Y# w
- {
& ]* Q, h+ w0 }4 X. c8 ~ - final Quest q = getQuest(questFolder);
* F+ ?/ e$ o$ g/ I9 v3 V - if (q == null)
$ @; D( B/ r8 h8 K2 a# U/ L - {5 i2 x& n$ G( A# l
- return false;# C' c+ }/ b2 C$ A' ]* _
- }+ ?. _, w, i; N" l$ D
- return q.reload();# j1 D P; F6 `9 f. I( Z! z$ U
- }
Скопировать код 5 N+ c& i0 D; R6 Q' k, t& G
% O! G0 A- E0 V' ]3 ]. O5 jМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.. j' g( Q, ^. u5 ^5 i
Метод reload(int questId)7 a4 v# `- d; P, l
- L! z: k$ {7 [! t8 {- /**
# L4 e( a% x. G x - * Перезагружает квест по ID. D9 T- C" G3 E7 C1 {
- * @param questId ID квеста для перезагрузки
0 l( g% X/ \6 F- l# n. X3 _ - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
) K" }$ b4 ?" g" C. ~ b3 W* j - */
% y, f4 F: g U& o - public boolean reload(int questId)
3 H+ h. L, L& w$ Y% R& \- g4 L - {
( u6 u Y2 j) X$ G W7 q& A1 N& n - final Quest q = getQuest(questId);9 A5 W- h; E9 d. b# w
- if (q == null)
; n1 g" B! Z% s0 U( N - {' |3 ^+ |; M+ q; w
- return false;$ J" t& z% I+ M& R% E
- }2 G2 m. O W- [9 J: t
- return q.reload();
( p# a2 M, C# V/ g" H2 b - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
; s0 K9 b, y+ G; i5 h# Y8 O' n
$ e5 D* d9 j6 X# h9 aМетод reloadAllScripts()* e) e- p/ T5 b( ]6 w
' F5 o( m7 W2 x7 d7 l- /**
P6 d, a9 ?$ s, _/ X- v/ ?/ u - * Выгружает все квесты и скрипты, а затем перезагружает их.5 _% {* h$ _* y1 I
- */
7 E, s/ Y. K" ~3 C k4 \ - public void reloadAllScripts()
) |7 N$ U+ a0 A/ v' Y {% a - {
# R9 h' S7 O4 n7 R1 h" m - unloadAllScripts();3 X0 K# _0 r. m# }2 v+ J
-
$ ] a: M; }. t1 F+ `' P* C5 t - LOGGER.info("Перезагрузка всех серверных скриптов.");2 z( K& s- L* F2 _4 D
- try
* @) Z/ b' }7 O4 Z6 i) x - {, d% O0 q) Z8 g) ^
- ScriptEngineManager.getInstance().executeScriptList();; x2 q7 \0 y2 Q8 c; {; j7 L. a
- }- |, w9 A7 |3 ?) ]/ x( }
- catch (Exception e)
# g+ L3 X+ A' \ - {
& z. H! s4 e3 t) s$ J t - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
; [: U# `% i; e& D7 { - }
1 _, ]9 J( \4 i" q' A+ Q$ g& ?+ j -
+ E [7 m- B6 T. k0 T* \0 | - getInstance().report();6 M5 _! J& @! g# L
- }
Скопировать код Метод unloadAllScripts()
1 V/ m( ]8 D# T! k) G; D
9 L7 t1 g& q) z% w' q' A- j1 x6 w- /**) c2 R8 }: P( R, S/ [
- * Выгружает все квесты и скрипты.4 D8 f$ u$ R# B! S" F
- */7 |" W% f8 ~6 \
- public void unloadAllScripts(). C1 _$ x! h% `, K
- {
3 Y5 p3 g: E) G0 \' v - LOGGER.info("Выгрузка всех серверных скриптов.");
% z+ T& e3 N- u2 V% X0 { - ; l- g3 s8 ]8 L% z7 G" h4 h
- // Выгрузка квестов.7 I. z, \! @" t
- for (Quest quest : _quests.values())" I2 R$ `; p" e1 Q) U9 x6 k" k! o& J
- {9 n" m o% T1 K+ Y
- if (quest != null)
: R5 L: j: A$ u) H' @" P( c - {
0 L* ~% t. t( L - quest.unload(false);
1 Q/ @$ f0 h4 _9 Y; e' S - } o/ {9 u" x; U8 m
- }
/ h2 H1 s# C8 K - _quests.clear();
; ?$ I: ]8 C& I8 t) ? - // Выгрузка скриптов.7 T' }8 q' I2 l9 e. A' o1 V
- for (Quest script : _scripts.values())
. w5 G% s& s& r, @5 j4 P - {( x7 f+ m7 A% L$ L# {
- if (script != null) ~, L7 W6 G) X. k
- {& h* F3 J L/ D1 l) K, A$ O
- script.unload(false);
. s! Y; i# H1 V9 U# S - }7 w8 a% z6 f) ~. U
- }6 |0 m5 y0 y/ x2 |2 \
- _scripts.clear();, E' u; j2 R) ]# C2 Q
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.4 a4 m6 ?3 [6 h8 R
& F) _5 X3 d- D0 j; H3 V; V3 @$ y
Метод report()
. S& ?2 \! L9 ~+ w6 ]: D" H3 o& |' C+ m- J+ m* Q
- /**
2 |. B8 m) x1 a- w8 }2 g4 ]1 f - * Логирует количество загруженных квестов и скриптов.. f* F7 X* k+ F- I: S
- */
6 c% r2 s( @+ u, z! W- I0 U - public void report()/ M4 |' n! u3 c' w" G5 B
- {
0 h" R- V+ `3 E- ~. N - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");* e( s0 q5 h" [' Q: a$ x) y
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");: p$ n7 q& ]1 `1 _
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
0 Y u* d8 r+ Y
; b9 O* a" F1 i& TМетод getQuest(String name)
2 O9 Q7 h a: I r' h9 F
, D6 R1 }4 ]1 V; f4 |5 `- /**+ U5 X+ S1 v! ?0 i& L
- * Получает квест по имени.
p, u5 }$ H- T) k - * @param name имя квеста
* f* h* d& m( b7 e3 o9 E - * @return квест: }; v& R8 }. Q- a) O2 v; b9 w
- */
/ |" s+ Z& i$ i) @$ n# J - public Quest getQuest(String name)
. l. X8 {5 p6 E& x w3 p - {
$ q, d) a9 y# [ h6 F" B - if (_quests.containsKey(name))1 d* K# l5 S1 ^6 D' P/ l' [
- {- n) \/ p+ o$ o; X" V, d
- return _quests.get(name);7 a9 d- h( h6 C& q6 ^, w
- }8 P5 B. E) t. P
- return _scripts.get(name);/ j0 D) P" y9 r4 A! r2 o5 M
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.1 O2 u6 ]1 Z4 k
; L0 _9 |; p; u5 J/ R, B( ^: }0 xМетод getQuest(int questId)
0 [0 N1 d* y' T" D
6 b4 O# _6 Q! h0 T7 E' R8 I+ C$ `( b- /**4 p: i( d2 _5 E1 p% O* Y+ x% q
- * Получает квест по ID.
) _! l% o0 c9 ?8 {# c$ ] - * @param questId ID квеста
8 B3 p5 ~4 Z+ @: [: Y - * @return квест, если найден, {@code null} в противном случае
+ w- s" s, ]$ M4 J - */
- w3 r7 N) u! m5 x - public Quest getQuest(int questId)
' [9 E3 W" `9 I- ?2 W - {
. U5 \. L4 E8 m5 v1 b# ]+ x - for (Quest q : _quests.values())
( p1 q4 Q F1 o+ X" Y- | - {7 W+ {. L ]# s5 B; h$ |
- if (q.getId() == questId)3 x" ]+ F1 q& r. O. C7 z
- {. }' j! X" l' J* H5 C7 L( R0 N$ ~3 S
- return q;, L ~. n( \4 v
- }; A4 y3 h: ]7 [
- }5 d0 V O1 e9 J2 s
- return null;
2 e$ w, Y6 P' c" r" z$ m - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
" ^% Z& t) P1 w0 f# F, ]* F! Z # s1 s! [* L0 a6 p1 d0 u
Метод addQuest(Quest quest)
% A3 K. ?. }* }" z2 ?: |" v+ ?( z$ Z9 r, j$ J
- /**
E& j# q K5 E! ?# {+ _ - * Добавляет новый квест.
' w3 p% Q- m+ C. U - * @param quest квест для добавления
4 \' p2 j5 w/ M3 x3 _2 z2 m( B - */0 r( J# i5 o! d- C& g. o* X
- public void addQuest(Quest quest)
3 I9 z J; h# \. N. Q2 m1 D - {4 r" [' a/ Z5 }% p
- if (quest == null)
4 L7 S, E: I5 c9 j4 G( f! ^* _# W - {
0 r- ^: X7 x! z7 L4 m - throw new IllegalArgumentException("Аргумент квеста не может быть null");0 u2 d3 X8 \2 V* ?* v. p
- }1 J" g2 L, D: Q9 M
-
& k3 q6 y; m, R' c8 d5 B - final Quest old = _quests.put(quest.getName(), quest);
& ?( w9 i. r9 [( q - if (old != null)
( \" m4 D7 _) G8 q% y7 h - {
7 ~9 S5 P' |' Y - old.unload(); k: I1 U+ l! K. e! l* Q4 f7 L
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");# E( F% E, V3 A! B5 s: d
- }
) c h5 \3 B9 I: S - / _8 U+ g0 F2 j( W m
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
8 c3 |8 E$ ^+ t6 a. Z$ R1 d - {$ s5 I0 a7 y6 y
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
+ S+ ^: r3 @2 R6 h7 j. U, s% I. b) d - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
/ F0 ^* M9 s {4 ` b - }
; w e1 z9 H$ d; [+ Y3 S! c3 u - }
& B! V, Z7 X% i. e - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.* ^+ h1 R. H! a _4 ?' ]
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.9 s+ p! x/ U1 Z, g! U% u) I
2 y' O# v# A& z- w( n
* p/ }6 b( r9 u& ^- k2 M* j8 t/ O
9 n, }" G0 ]) ^& `+ Z
|