Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius. @2 p {- l9 i
# f: Z+ B# o9 K; t! ]4 c5 V/ N6 s# r/ ^
Разбор файла QuestManager.java! U. V1 {/ W) E v: F- N4 o7 O' m! `# j
" H* `2 e7 |1 h& [1 e
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.5 | I% [- U& W3 F* [1 j& u
Основные элементы+ `/ P9 u; T4 Q$ V
- Лицензия
- L8 S* Q) D4 I6 c6 ~- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.7 W9 \# W+ k2 F4 n
- Импорты
! e6 @. P9 ^0 i) a3 t% y/ Y
3 o' I( @% N- S8 E& x) TQuestManager.java — управление квестами и скриптами.
% y% L" [, b$ E6 t$ \/ ?Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
' V; w' l. P" V) E% B" h9 e6 `$ p z. g/ N( i6 ~& g
. B6 a4 B0 W! B1 b
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.% r/ L8 e9 J9 ]& Y+ m9 {7 }
1. Лицензионное соглашение% U8 ~& j# j4 f
- /*
$ R l, I/ u8 g6 H# L - * Этот файл является частью проекта L2J Mobius.* X+ V! F! V/ g* T w
- * : Y& G1 j) ~, r0 E4 d; }: o# ^
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять8 d0 O! f5 h$ Q9 n6 Y' k
- * её в соответствии с условиями GNU General Public License, опубликованной
) X3 K% D' D. S" E4 j; C - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.3 w5 r" ^( l1 I% X+ n7 O
- * / y7 I) i5 m, L9 o
- * Эта программа распространяется в надежде, что она будет полезной,
1 @/ k! C+ |1 }. a# }" l# j - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
) |0 X: E# v- M. V8 U, f% z - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
6 S9 T/ u S% G7 N) p, w - * См. GNU General Public License для получения более подробной информации.( ?, ^8 E+ w% n! W8 L, y1 L4 D. u% s
- * 1 W7 s& Z$ X/ u/ K1 W
- * Вы должны были получить копию GNU General Public License( R: B( [/ F1 p- t0 H3 }
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.9 g5 q& _- L- _; H( P* W% [5 M
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
+ \8 _, h% d I+ a5 I+ e$ r
* {# g. k0 s6 e
6 O" {6 j( x' m$ v2. Импортируемые библиотеки
1 ^: V6 ]3 ^/ {8 }2 G0 y
2 @$ f; V, k1 i2 V. ?* k4 Z- package org.l2jmobius.gameserver.instancemanager;
# ]# N$ w: ~% l - * K5 J! r) y% g7 S- P
- import java.util.Map;
3 G3 p5 y! e1 m f* t - import java.util.concurrent.ConcurrentHashMap;: W# m9 c1 A' q# z' i9 `: R
- import java.util.logging.Level;
4 }0 n& z" J, Z$ A - import java.util.logging.Logger;
3 T$ [3 e/ u9 `+ W
* o" A1 |$ R* i& k9 A* w- import org.l2jmobius.Config;
0 n1 D1 z4 }& y! X& L2 n* s& n - import org.l2jmobius.commons.util.CommonUtil;! L E5 P6 ?1 y) V
- import org.l2jmobius.gameserver.model.quest.Quest;' A- j5 y, j5 R" _, O% \- 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 — менеджер для работы с игровыми скриптами.
' ~* C7 v8 U! |2 J8 S0 B- M- F, i2 L7 S4 L, t7 K" g
3. Описание класса QuestManager3 l1 r8 o# j0 l( `- H0 x
- /**/ B5 }$ M& r; q6 q& J/ o$ O3 s! Z
- * Менеджер квестов и скриптов.
! u: ]8 k$ l" I+ E4 T Y - * Автор: Zoey762 ]5 z9 M5 ?; |. n: l$ z+ P
- */" s7 Y. J7 b7 s6 A6 y, f* X8 `
- public class QuestManager
* @' ~. a& ?/ I' m7 ^ - {& p+ S9 d" u" K/ q7 `$ k5 L
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());0 g9 T# W! l8 Z0 t( l5 y' \. R2 A( J
- 3 |9 G% H3 y5 s
- /** Карта, содержащая все квесты. */9 F: g" r+ G6 D. D* X7 J
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();0 b% H l3 i) t
- /** Карта, содержащая все скрипты. */
5 M; @ y) s$ q - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
. w* ` b9 x* x; h$ H0 X+ l -
) l$ }+ d' o3 Q- U - protected QuestManager()
& a0 c, G' w) J) R' D - { M* C2 }& a/ N5 Q, k/ M
- }: b" ^/ o% C9 n) w
- }
Скопировать код 4. Методы
) r: i1 u: F4 k* P2 QМетод reload(String questFolder)/ A7 O9 ?* X* o4 P6 B! N5 E8 W
- public boolean reload(String questFolder)( M1 x- d2 @7 u8 F" w$ M8 C( B
- {6 t; _4 \# F- ?2 X
- final Quest q = getQuest(questFolder); I) }: M6 L4 n1 G! ~* F
- if (q == null)
0 [9 Z2 @6 _' n) ]) L - {: F* D# l9 b+ M! e/ e
- return false;0 s" v1 N* d3 G/ J$ D
- }
) \) K/ ]; G+ G R - return q.reload();
y. m0 m9 |2 D" a - }
Скопировать код
* P9 y. j" I0 p* W
( D" ^8 @8 f! vМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
! n$ j5 h% b: IМетод reload(int questId): }7 p2 E3 H- S4 I' r% C
) s" a) k. Q* c; s
- /**
# ~% A5 u& u; `0 Q - * Перезагружает квест по ID.
4 O' y: G( K( @- C( ^ - * @param questId ID квеста для перезагрузки
, Y7 h' ?& _: M0 @9 j+ D V2 Y - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае; g; Y2 [8 F" h3 f% K P& Q! V
- */5 o3 c4 p. W) S# [
- public boolean reload(int questId)
- U. `2 E; P: l5 D# ?8 O0 o& ] - {% {2 t$ z% d* r, }) ^7 I Z8 ?
- final Quest q = getQuest(questId);
* B8 J) L( r. j3 H4 |" E5 d; K& q - if (q == null)
$ d' @; x; z# ]% U6 t' q2 H - {* z C0 M" m% w6 ^+ a2 s* a- S
- return false;
4 B1 t1 v1 E5 w9 D5 T - }: _) N7 Y2 b) r g/ t2 X
- return q.reload();
- V; t4 o6 @/ L5 Z% K* j - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
. W; s* _1 b6 {) g$ B% [6 h
/ g& }/ ~* S. ~7 r% _4 [; _Метод reloadAllScripts()
* e. x5 z4 x) G+ |3 c) p& a3 I0 i# O: q
$ S# K+ V# E: [7 h) E# Y; N0 h- /**: m2 ^) @' c. h6 b
- * Выгружает все квесты и скрипты, а затем перезагружает их.& w. x2 n5 N8 z) W V
- */
* U p# f3 q$ b' r0 w5 D7 T - public void reloadAllScripts()
0 L% o2 G( b2 K! Z2 T - {! x! Y& @9 e! n0 G' r2 d
- unloadAllScripts();' Y; W- ~8 Z* i& n
- ' S+ V( }# p/ M/ d' z
- LOGGER.info("Перезагрузка всех серверных скриптов.");
+ i6 J1 b9 M. A" b - try
& R) M+ t+ A) y: L- G, p1 q# m - {
2 k7 A8 I6 ~ V; J" z7 m5 [ - ScriptEngineManager.getInstance().executeScriptList();
$ \3 b8 B( j: I* i - }2 A' h1 G1 h8 t0 X" b. g
- catch (Exception e)
" G# x+ I. a- ]" D* ^: o - {. Y; f4 Y# l8 W& L( i$ a
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);8 I* W! U- } Z9 J& O
- }# y7 o. V" |7 z/ v" a; e
-
' T" k; R) k9 Y! Y o - getInstance().report();
: N2 C+ k" [$ T% k0 N4 o) a1 f4 s - }
Скопировать код Метод unloadAllScripts()% }( a/ l* K0 m6 a/ l( F6 t. `
2 O8 c% c+ N' E" z. s! C3 j
- /**
- W3 q8 j) j0 }# i- i% b; } - * Выгружает все квесты и скрипты.
- J# B Y* Y$ a# u$ o5 v& Z+ q - */0 X6 K' X5 g' M% Y% D- n
- public void unloadAllScripts()
- [* M2 I/ c# B3 |& D% r( ~ - {
% w" M. ~- s# R% k8 t) e - LOGGER.info("Выгрузка всех серверных скриптов.");
/ r( k: ?9 k3 A2 E) ]* @ - 6 w0 W) P, l. i" q7 D
- // Выгрузка квестов.$ j, Q2 O$ A5 }8 b* @
- for (Quest quest : _quests.values())! P# k9 d u4 f/ |. D: P1 P8 y; U
- {2 A, j8 W# g5 `9 o) o# g. h
- if (quest != null)
. o7 e1 f6 E" w - {1 E! J2 l! }2 @! v( h9 L" A' {
- quest.unload(false);
) B0 R0 t# Y/ x" h. k% D - }- }8 d3 G! N; ^: ~" z5 B/ z. `- E
- }
/ t! b: y+ {) S/ m - _quests.clear();( t5 [( i W/ G. E+ W* x ^
- // Выгрузка скриптов.; C- H" S( O" g6 c+ `' P3 Z7 v
- for (Quest script : _scripts.values())# s. e9 c; |5 S V' t0 M
- {( `$ `+ A0 z0 L4 _
- if (script != null)
* S& y- b8 Q/ a3 |2 ~ F - {
: O! ^) Y/ N7 }3 r' |( f9 I& y - script.unload(false);& v8 t; R+ \- V8 o1 Z: _
- }% q6 E( Y* U; ~) I% V
- }* O) Z" t) ?. v* `; ?: m8 v% s' f
- _scripts.clear();
H$ W% l' _9 H- b2 K% H" L/ L - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
5 d- |. H) z1 K/ q 1 z. T' ^+ d" P4 ?3 a
Метод report()
* m5 L# ^& f9 t0 a1 I
- f/ Y6 ~# n( }% Z, {- /**
+ p }7 _! n" A - * Логирует количество загруженных квестов и скриптов.
* v% i7 a' Z7 G& V$ E! ? - */. W( P! q6 n* ]' ~
- public void report()
0 F h' q5 w( n7 L" X% c/ j: M - {
/ y% P4 [1 M3 [4 Q2 `0 ]5 t - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");7 g. N+ I3 {1 Y& N0 |' h+ _: i3 x' O
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");# ~; k4 p# ]" {2 x, P* z
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
: X7 B/ c7 o1 g( Q. E; K( g
7 D2 b$ {% A/ t7 [# D5 ~Метод getQuest(String name)+ H! c- N& C- }8 K: s c9 {5 ^! I
. }6 G: p7 S, K( f- /**
/ y! Q7 }6 L# O- K& \8 t - * Получает квест по имени.
8 D! B' \7 w0 G. | - * @param name имя квеста: X/ Q" f, y: Y$ p" r
- * @return квест% \: {6 G. u" x" p
- */
1 D2 `# q$ s1 g, G; e - public Quest getQuest(String name)% a6 P7 |; p% x! I/ G/ b
- {
2 J, Z! d" c6 [ - if (_quests.containsKey(name)), T2 d, Y2 t# f; H3 J
- {
b! y" _$ n* Z: d6 B3 P) q - return _quests.get(name);
' o5 S# V* y V - }0 O# B, i. h' r: P
- return _scripts.get(name);6 Q& a; S0 E0 r# G/ A6 x" g6 r! ^: c
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.% H& @# b5 c6 O0 e3 H
1 `9 I0 _1 b3 C+ ^( EМетод getQuest(int questId)
1 Z; W2 h ]6 {3 a+ i
8 W- r1 ?4 O0 b; Q6 J. j4 A- /** U* w$ p' ^; @( Y
- * Получает квест по ID.1 r# C/ Y, Q3 L' T" h3 Y
- * @param questId ID квеста% X) \4 X9 ^/ `+ q( ~' i% p' a
- * @return квест, если найден, {@code null} в противном случае
3 V X7 I% d1 j - */, o' e2 U% R8 s+ Z
- public Quest getQuest(int questId)- p. [! q2 T2 c w+ d# s$ ^% Z
- {
* f) o) L" m4 g& V. b: P - for (Quest q : _quests.values())5 s- s! [; {2 B6 X
- {6 b: ?) T7 h$ [3 }# ^5 ^. P
- if (q.getId() == questId) c1 Z/ L6 \1 V2 g: F2 w2 w
- {
* t9 C* N" J$ _+ G. N9 I0 i - return q;
+ q* t7 W# @" {) l! `7 W - }8 F. i& S( f$ g# K4 {0 k/ ]: }3 l M3 ] H3 u
- }0 ?9 Q0 y+ D; U7 q9 b7 ~% s, @6 x
- return null;3 O: n9 x5 v9 `2 r
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
* |' C9 V2 V& i& z! ?1 `2 x9 R
' J6 G- Z* n# {& h7 b" qМетод addQuest(Quest quest)8 K8 z/ c) x- D6 p* i
2 p5 a$ ?. [% O Q
- /**
/ p5 M: b% N$ l' ? - * Добавляет новый квест.
* y* R8 M M p; |' V - * @param quest квест для добавления
0 Z: F& v/ \8 f( Y: N- I2 G. Q - */
& {0 r& E* S# e2 ?/ J - public void addQuest(Quest quest)1 n2 d7 p. j+ M; P
- {
9 H7 o& O$ E8 T: R* R - if (quest == null)" c" W8 P) r) R
- {
( K) M7 L3 G* f, @5 g: ` - throw new IllegalArgumentException("Аргумент квеста не может быть null");5 H/ Y2 u. m, h0 E4 y$ X
- }
8 f/ d {/ Y8 A - 9 M- W% f+ O" p$ W9 w2 Q$ _7 e
- final Quest old = _quests.put(quest.getName(), quest);2 T# ?6 l* v" R4 g( B' U
- if (old != null) x$ o. c4 C0 d" h f; i$ j
- {9 B# h" e3 H7 A* e0 @) b+ r9 W
- old.unload();
! A$ B& T5 D; W% n% z5 u6 {% U - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
$ q% f( K6 o3 c1 w- H - }
* O# @/ L0 r' i- I L- M7 u7 ]3 h -
! O" Q+ `$ i2 u2 ], N# e - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)# H2 ~5 J$ B' s" z9 O) A- }5 R7 k- D
- {, Q% g! t, k- B
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
9 T8 R1 P. j, u1 r - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
% U8 P$ m" F8 E) W - }
- t+ N6 B" X6 z/ `. G - }: F* ]. x, q" [1 l2 u. ]
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.- y" H9 A" H4 h, G7 v* Z
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.4 ^, M4 C u7 }9 R
( e1 }: {- W7 w3 V. p1 o7 }
% t7 s$ A! X1 i8 i5 @' m
q3 @; s6 D. s! u: {4 W( T- t |