Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius+ |4 |- [* G. s0 R L1 j3 Q
& Y. @- ~1 B2 J) c" u- U3 i- O5 B; @Разбор файла QuestManager.java
* A$ w/ U6 w* w9 n% _+ [ s' l$ P; W( {. G
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.: p& ~' s) r$ q8 H- w9 v# x/ t/ W! ~
Основные элементы
$ o2 R% j8 k: d! v7 r9 Q/ t- Лицензия3 n! N4 y/ U. {* { M
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии., G+ z9 j9 r( p% ~; x: L2 G
- Импорты9 P. M' w9 |* H
6 H4 W6 n& c( k1 B- ^4 v) gQuestManager.java — управление квестами и скриптами.% ~; G: }5 i- @% [0 u( }- C0 B
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
b; _$ G0 P, ?) j$ Z7 a s7 v1 q: u9 C' p1 D! W
5 h' a' r- D h% M
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.* O8 v% |* `" ?- C( n5 B/ r
1. Лицензионное соглашение
# c6 |) a/ k; D# V- /*# `* u; Q3 y w6 m m6 y3 C
- * Этот файл является частью проекта L2J Mobius.
7 r6 d$ d3 ^9 O: W% l2 X - * 2 D9 S* I5 m, t, w4 W @4 T/ H& {
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
' ^5 `% n, V5 G: k' }1 `- |) k - * её в соответствии с условиями GNU General Public License, опубликованной2 N2 q) i" X6 e; b: }
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.* g: f+ _5 R5 i( f
- *
0 n* g- l% ~& v% Q, a9 ? - * Эта программа распространяется в надежде, что она будет полезной,
- O! N* H5 j& r, ` - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
8 o" x. r/ \. R2 W! i& ^ - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
$ O0 J b4 y, T+ \2 M* w" X; k - * См. GNU General Public License для получения более подробной информации.
, M: N7 t/ w [* f$ D - * 0 s f. y. G* K9 S4 y$ W* D4 A4 {
- * Вы должны были получить копию GNU General Public License
8 w6 J# h% `/ V- E2 [! R) Q) U% F/ [ - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.- p1 o' e1 R; H: d
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
0 W; F; i, S5 @% q5 ^4 A
' E' P' c% ~8 o& Q2 n! t$ `
5 T: x4 f4 ]; F1 V2. Импортируемые библиотеки
9 B/ r$ q' b+ p! m2 ~( i0 A( F) u7 k3 V7 w
- package org.l2jmobius.gameserver.instancemanager; V/ c; d& _; Y9 b& y- N
7 d J1 T4 B/ s* @7 `% N- import java.util.Map;: G" Q+ S# |# }' W
- import java.util.concurrent.ConcurrentHashMap;
0 o( K$ W" m$ n4 v! @" T - import java.util.logging.Level;" m4 \4 k3 |7 t N
- import java.util.logging.Logger;
3 }2 I$ K: p. I* {! C, u
+ L5 ^" L+ |5 M# d9 V- d) I- import org.l2jmobius.Config;
, m3 |' E/ E; z - import org.l2jmobius.commons.util.CommonUtil;" M# P7 P, A6 n0 h, Q! N
- import org.l2jmobius.gameserver.model.quest.Quest;8 v! S. s' u3 V. N
- 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 — менеджер для работы с игровыми скриптами.- B# _2 |. h. }
% e; w% V% a( A4 Z. Y' X
3. Описание класса QuestManager. o% P6 n5 C4 x( ~; O* p6 [: q
- /**; g0 H3 s+ h) M) e
- * Менеджер квестов и скриптов.
+ W( L6 f) ]3 M3 W0 k$ H3 N l" R% T2 Y - * Автор: Zoey76. J8 Q' P5 A+ } g' P
- */9 y! x3 N+ w2 I
- public class QuestManager
# l c, _; G9 r4 U. O4 [ - {
9 Z- Y4 }1 @8 N( ~ - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());5 g% p" V# ~/ V) W* }4 R9 O& r
-
$ n, W7 @- g$ _. @4 _ - /** Карта, содержащая все квесты. */# c7 j7 e; k, L5 `. u
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
! J; ^' k1 R2 y6 l. X; O! M - /** Карта, содержащая все скрипты. */* R. o8 i8 i! a \" y4 c
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
2 U* i+ O" o+ g) L. h* Q& T- } E - / g1 ~1 K+ M+ |* B; w% ^7 w
- protected QuestManager()3 ]$ B% x8 u& U3 h% C
- {5 z9 U1 J8 B: o
- }
& F# d6 S+ ?: \8 z# e: _: x - }
Скопировать код 4. Методы
1 E9 f8 w J6 f- l7 uМетод reload(String questFolder)
2 o) x% x* W) w9 @( a! N- public boolean reload(String questFolder). P. a$ e) q9 x5 c, j
- {
4 Y" l: B/ X) Q9 ^9 O. ] - final Quest q = getQuest(questFolder);
! v' g* c4 E4 R0 o! o* v( n - if (q == null)! V- r! ~0 r% W
- {
3 b+ R) C6 S4 u' _9 S4 q# | - return false;
8 `& P. j) w7 l: N$ U. S1 J - }9 ^* ?6 L& D) N5 {
- return q.reload();% j* L0 q5 s6 N+ J }
- }
Скопировать код
8 x7 z( H% e1 j# H* ?3 ^- O, ]+ _4 R L7 h
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
7 T% C4 a, E* K, EМетод reload(int questId)- C( |, r& \8 e w* Q& x- Q& g
! k; l' G8 E, h- A- Z( b" x% b
- /**% {# x0 B0 ~& \3 L$ ^& c r+ O" e
- * Перезагружает квест по ID.
1 y$ z k! x$ M( ]( d. N7 y - * @param questId ID квеста для перезагрузки
8 ]( t# L- e% `9 ~- H d5 ^ - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае: X6 s- ?' l" i8 M' X/ H
- */
/ V9 }+ M( P1 l3 M6 }7 ~% W - public boolean reload(int questId)
3 `& K9 [8 W" T; H( F) O' ?; Z4 `* [+ x - {6 p. }% A& A$ ]9 i
- final Quest q = getQuest(questId);
4 |- H! t4 O3 ~ x m/ u' H8 j - if (q == null)# V* K: D: @9 j6 R. q4 ^
- {
# V- z. }& E+ d) o - return false;/ C% d* m/ O9 k) ]9 G. h& |, G
- }
4 v$ N! @% k- G# h% [+ s - return q.reload();( {* O# G. w2 {7 G2 D
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID. O/ X& |1 x9 Y8 q* h( p3 X
$ a3 k% ~: ?- T( k9 P9 o* VМетод reloadAllScripts()
1 G7 ~, h4 m* y M) @0 @' ^$ \, b
- /**
1 P- k8 L7 ^, X. ~4 B- N- C - * Выгружает все квесты и скрипты, а затем перезагружает их.
. n9 Q4 v9 |; r; h! W3 b( } - */' w0 w0 \7 D: U+ x' X
- public void reloadAllScripts()
3 ~9 N- a: y; ?) i- W - {
i' E6 W/ J" O - unloadAllScripts();
3 a* g, v- k2 \5 V/ q - 2 ~# \, a+ p, h1 i4 D
- LOGGER.info("Перезагрузка всех серверных скриптов.");0 Z ~" _; j" B& ?/ j ?
- try
- i m+ Q% ]2 @ - {/ E- r8 m( ^# b6 T( A* J8 A
- ScriptEngineManager.getInstance().executeScriptList();/ v; S8 Y, a$ E
- }! X4 ~# @' s% C: z, Z
- catch (Exception e)5 \7 A5 |1 G1 @- A# {
- {
' K3 g$ H: S9 v& V6 G - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
8 x1 m% t6 X4 F. t" e- U - }# t4 T0 s+ f8 A4 P
- / W6 y) f* i7 @
- getInstance().report();
0 F. Q; d( K" e/ m; P - }
Скопировать код Метод unloadAllScripts()
9 Q0 A" W _( \) c7 q3 b+ J# j A. B: H# ]' l: z5 e) J
- /**
5 u2 S# K1 y( o* g - * Выгружает все квесты и скрипты." b& E" o8 }/ D/ }
- */
1 n. D& u4 u0 o* h2 j0 i4 |% F, U8 c - public void unloadAllScripts()
% S8 U8 @3 }. ?3 k# r) I+ e( T& ]3 M - {
$ O' _/ Q D* ] - LOGGER.info("Выгрузка всех серверных скриптов.");) H; N9 e! h- _- \) ?
-
) ]& R) L4 n8 h+ N) }4 C - // Выгрузка квестов.4 r2 o. \+ C. d+ i# l
- for (Quest quest : _quests.values())! @' l& |$ b" e/ i. Z; U5 F
- {9 D* S+ W1 G" r) h) Q# Q# j3 r0 V2 d
- if (quest != null)
0 L( o" M& J3 W. p4 c - {
& H% J$ {/ \$ `; _ - quest.unload(false);; Y/ C- p7 K! I* T
- }
/ {/ W) b6 N5 l( N4 J" P% h - }
4 R& r2 s D% y# d5 ~/ E1 q! F - _quests.clear();) r) w* r+ i6 E4 F" n' D0 V% W% m
- // Выгрузка скриптов.
) D2 b. _& ^! \# y - for (Quest script : _scripts.values()), Q# @0 I3 }0 ~3 q4 o2 ?2 J
- {7 u1 T. w# f( x3 @. P! j
- if (script != null)/ W3 s' y; V( ~# M1 A
- {
0 Y! O% V5 W% J2 j2 ^ - script.unload(false);
/ ?8 N( q \0 _0 e/ z7 ~" ` - }
' _8 d' _6 ^1 u- o" G - }9 n0 t2 t8 }: Q; c# ]5 N
- _scripts.clear();! x& m9 t6 C& m+ W0 U* D
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.4 ^* ^) ^/ }* S8 |1 v9 V
$ ~& q- d* H* {9 Q0 \: QМетод report()# F4 n, N: O6 t( q
: `0 K8 {7 h8 q5 e- r: Y
- /**' G* u A( M# G& a C$ E* N
- * Логирует количество загруженных квестов и скриптов.
* }1 |" z( R9 e+ \: c" W' Z - */
' V6 ?1 l$ X+ q4 U+ X9 T& M - public void report()/ v7 S4 h/ S: Y; F% M' H
- {
, v% c1 Z8 C# B, l% \$ {8 { - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
' z2 ]- L: `* ~- c+ R7 ]: U - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
. j# z: n8 @9 P/ j7 M, _ - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
- k; m2 c2 ]: f# M9 E
& N, U) D4 E x. A/ yМетод getQuest(String name)
; k# h3 v' J3 i+ F' D( @
5 G% F; i" u4 K# g' g5 ^- /**
8 J, {& d( Z+ A: q; C: r - * Получает квест по имени.+ n$ |& {) K- M9 T4 w% A% I1 j5 T
- * @param name имя квеста
" s9 S" T& Q+ j* o - * @return квест- [+ n6 ~' Q1 s' s
- */
; q5 k: D/ L; S1 u. J - public Quest getQuest(String name)
5 z& h; h- L% c: e- K5 A - {
3 J: C4 p0 u* V/ j& ~3 B }$ j - if (_quests.containsKey(name))
: C' J( J) b* u - {
. u% p! y: t4 ^* C - return _quests.get(name);# y- e* o7 j R# Y. n
- }* b5 I/ D5 b/ {6 v
- return _scripts.get(name);
h1 J9 Z( h9 z4 ?# M - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
! n3 J4 @5 U* u: v0 n 3 h: l9 h9 Q) L" q/ J
Метод getQuest(int questId)+ C/ N1 L6 I3 K- U4 ]1 `
* }7 T+ W4 ?! C4 y5 U8 V' L
- /**
( b9 m# _! l6 ^; _- R - * Получает квест по ID.% `* {; }( A; o" |; c) N4 m
- * @param questId ID квеста
) S& F& v% U% i1 N7 N7 D. s1 T - * @return квест, если найден, {@code null} в противном случае! T) y; ~4 D6 t' t' C8 f9 |2 O
- */ U0 k6 K0 r0 r) H1 c
- public Quest getQuest(int questId)
6 u8 H' w9 I' K - {: i2 c" {8 `, C1 O7 D8 J
- for (Quest q : _quests.values())
+ c5 `2 Y) {( @& K- |5 U - {8 g* ^5 P1 h! q& c e2 o
- if (q.getId() == questId)9 K4 z$ o) x0 Z: `1 X: U; P" ]
- {! N8 Z' J0 h+ f$ Z5 ^
- return q;# Z8 X9 D( y. D% ?1 d
- }7 v3 l) E o7 x0 h" @4 w6 P
- }
5 l% X5 ]8 d/ E0 ^1 J - return null;
& g9 @0 `7 R3 b* x7 \. S - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
, m# v" L- g. E0 W0 a Z) t . Y$ Z; `% T I& {2 Q
Метод addQuest(Quest quest)
8 R$ y% n0 [# k4 {! t. y+ T2 H! \5 A
2 d/ ?- S" e, a8 R- /**! |9 W0 `# m& {
- * Добавляет новый квест. w, h% z& K7 N, v% E
- * @param quest квест для добавления: A* j/ `& l" S% p* h: A
- */# E4 t8 g8 t; r$ ?
- public void addQuest(Quest quest)
9 a5 H2 g3 S3 @8 M+ _ - {
- u- F/ `8 j6 k( ^2 f* T - if (quest == null)' \3 k+ j, [ \2 u# D. `9 V
- {6 ~) P4 g$ @7 W- Z/ ?8 r. O# q
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
N& Y# [1 z) ?# |; ` \+ X7 {" v2 S - }
1 M! G' {% B6 V; Z: h( Q -
3 ^* {6 G4 ?, V2 [1 w# C# s - final Quest old = _quests.put(quest.getName(), quest);0 `- q. B! Q& J/ K9 Z( v3 }( b
- if (old != null)
3 I9 G5 F$ j' y# ~ l - {: Q1 B) l5 \) N
- old.unload();' W3 m0 f4 s0 E% i4 _
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
8 j3 I! O) h* R4 z1 G - }
: P% }2 [% Z" ^ Z+ J- N4 ` -
2 n0 d* d7 L/ X - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)' U1 ^+ L. m& U: g) ]
- {5 C9 f2 D) r% t N5 ^' D
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
; D7 Z( P3 }. r" ^ - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");+ w% ?* Z! c. j/ B9 u' ~
- }
8 [2 H9 I/ g1 J. O+ E$ v) O3 j: I3 j - }
5 g# q2 h# z5 F, C* Y6 e: X. E5 m - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
7 J$ u) P. D: m: nЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.- b- J% C! ^3 Q
E+ \7 O/ H5 Q; k
9 J* L O8 l5 m7 u+ C4 {! l" H# d: g- x& j9 {! D0 B
|