Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
3 |2 j8 @$ V4 q' M6 P+ a: V; G2 s6 {( u/ k
Разбор файла QuestManager.java( ~6 X5 ~2 c L, y. N4 Q8 v) R
, d2 J1 D: n) v8 Y+ h0 t
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
% X7 h3 Y- N( v' pОсновные элементы
~# p3 W# b' a9 x# h5 N- Лицензия
' T4 [& U5 k& m' E- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.7 e8 \: ]8 ~+ P+ Q& Y$ q
- Импорты
; Z S: c- r2 K% U# n7 Z! p* F % o+ G( M0 t. {, G5 J; s, W
QuestManager.java — управление квестами и скриптами.; _2 A7 C) o, `2 C+ y3 I
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
2 B- L9 @9 I- T) Q) C( t3 Q% M5 l
1 _# c! `9 B+ S s" e2 W
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.* D: c4 z5 \; H3 i6 \/ r8 u8 m
1. Лицензионное соглашение: @" r: J+ h+ m- {; c, G
- /*
O% @* T- \' l; k; d( A* h - * Этот файл является частью проекта L2J Mobius.' V% u* d" E: }! `
- *
0 \3 V* j2 e% Z& Q2 W6 [ - * Эта программа является свободным ПО: вы можете распространять её и/или изменять& b8 ]( T$ B6 v
- * её в соответствии с условиями GNU General Public License, опубликованной
, x! O: x. B6 k+ Q9 P( z - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
2 k& ]9 P' h% W [" j8 R Z! D; ` - * * ?, {. o0 k- b3 q9 L
- * Эта программа распространяется в надежде, что она будет полезной,
& W9 H+ Q1 T3 i7 E7 |$ w - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии9 F D& u. H9 S' z
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
. A' Q+ K* l" v- E3 ~8 n. a- r% n - * См. GNU General Public License для получения более подробной информации.0 X9 K( c5 S0 V. v3 F
- * ' z, D! Z; \8 W# |2 P
- * Вы должны были получить копию GNU General Public License
+ W+ }- `1 |% r( u2 S5 ~+ H - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.5 L, n# r! f' m% L5 x' g* r
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
) l$ a( x v) p8 {+ C* ~2 ^: N
P/ q0 t1 F( G- b( J. O8 d2 ^7 t$ V
2. Импортируемые библиотеки
5 I: Q3 h! T/ Q. t% W' y: w) G- i& ^5 l& \
- package org.l2jmobius.gameserver.instancemanager;4 s. R2 Q- a7 B
* _, V1 `7 j8 o6 Z$ k8 N6 l- import java.util.Map;
; W1 y+ ^5 _8 e/ l7 a4 s- j - import java.util.concurrent.ConcurrentHashMap;
4 B C( w2 J6 Q; a, w' B - import java.util.logging.Level;+ v# ~ n; d- z% |
- import java.util.logging.Logger;4 J% T0 L* c$ v8 A9 Z% I. F
- ' f1 z) I+ ]) m% U3 s# G t+ Q
- import org.l2jmobius.Config;5 g- O b- m7 a2 X
- import org.l2jmobius.commons.util.CommonUtil;
' ~: Z, o4 h3 c8 Y - import org.l2jmobius.gameserver.model.quest.Quest;
9 P0 c) I5 Y1 M/ l/ z; G5 y) q - 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 — менеджер для работы с игровыми скриптами.( w* }( `5 ~2 I6 z2 ?
; `# E! P8 `7 O- N
3. Описание класса QuestManager
, R0 N; t8 S( u' @1 W d- /**& H# d6 e# j3 Y$ Z- A& o
- * Менеджер квестов и скриптов.
2 \+ w/ w4 F' A - * Автор: Zoey76
% M: y9 G/ m& d. U- o, U2 L! O - */7 \) y# @4 X+ ]# x$ F: J3 X
- public class QuestManager0 F: `4 P& l, C/ ]* \; }/ b' Y
- {7 K, o+ f, ~, q8 a
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
Z. v% C z* |" s6 N% `' W9 f6 I -
5 f9 \! P: y3 R/ L. E - /** Карта, содержащая все квесты. */
( B7 X0 f9 Z O! g9 f, I" { - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
- g% I$ X9 B g9 G7 @ - /** Карта, содержащая все скрипты. */
' o3 a: x( u# A0 P( q - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();0 ?, X4 _: K: t2 R3 O l
-
* P/ u' y& T1 e - protected QuestManager()
4 ?1 q2 Z9 P8 }" H8 Q4 a - {; z7 j% K' N9 R. v5 o% t( A
- }' `$ j* x! g! a- U7 J* ~
- }
Скопировать код 4. Методы* b9 F7 @6 f' T: U# O1 ^, {
Метод reload(String questFolder)7 U7 k% f% t% {9 o; R) Q
- public boolean reload(String questFolder)5 R% c1 g- M9 d5 q B
- {) f9 P+ D7 X4 N1 V/ X' }% \
- final Quest q = getQuest(questFolder);
7 n9 C' n* u, |; f0 Y+ P3 L7 R) c - if (q == null)- q% s0 A- @3 Q- h T- z7 A$ B6 R8 X
- {% m$ M, j) }$ i) B( ^9 G
- return false;! G$ a. S; f. L: E+ l7 {
- }
; V& z" }" X; n6 e9 x - return q.reload();) l7 r A, f7 H8 z1 T
- }
Скопировать код
* `, U- |; |& I+ k9 j- I2 `2 H, S
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
8 x* ?- f& _% A& @8 F+ XМетод reload(int questId)5 M! m+ q3 M$ S3 f( j6 K
7 i8 D$ R# ]7 P
- /**- l& N& d1 _, ~! [9 s) L0 h
- * Перезагружает квест по ID.
8 Z; _; Y$ Z: T - * @param questId ID квеста для перезагрузки
3 u2 ^3 [" R8 N" l8 U& T# U - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
2 D8 @' V/ P% V. n& a0 i( e - */4 Z4 m+ q' B. H7 k: l4 b
- public boolean reload(int questId)
, v- N$ z3 A# V( \8 } - {
1 C' p9 ]) i# w2 o - final Quest q = getQuest(questId);
" t: j2 h: T8 H( C% a - if (q == null)
5 A" Y n' v7 t - {
" Z' `7 _. J5 T! x+ } - return false;) x* q, K2 H2 v9 E- W" z$ j
- }3 t! e8 t( M2 k& q
- return q.reload();
& I) }4 t8 c5 i. q" A. u1 n - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.4 K; U4 I' O! b8 Y `% y, m
# P% `1 y! I/ ~' W/ J& Q- m: H# F- |
Метод reloadAllScripts(), b$ `1 z( X$ g9 s |
' g/ V# d3 ^. a- T1 T2 o- /*** D6 m* B% t) m% y% B
- * Выгружает все квесты и скрипты, а затем перезагружает их.
2 O) W& y9 Q% Z - */% D7 C' v& @: M# U+ D8 v
- public void reloadAllScripts()$ U1 Y6 _* u' u& c
- {* m9 r$ q( I# ~# @! t f0 v8 M
- unloadAllScripts();
: P. a6 C: A: f) k5 O+ Z; O -
6 t9 C6 u5 A: h( C3 u$ w - LOGGER.info("Перезагрузка всех серверных скриптов.");
! A- k' g; k- E# t. e) z - try
8 ^' D6 N6 l Y4 X( e; {1 Z - {
8 e Z+ I) i6 \3 t7 v - ScriptEngineManager.getInstance().executeScriptList();
! @% x3 x* y, r- | - }
( I2 w3 }5 H/ R1 \$ R J* s# ]( \ - catch (Exception e): w6 M& t1 D- j/ V: j2 \% {
- {
' Q3 Y3 w5 ?) h, G - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
/ w l6 M) }7 {9 j- g D" k - }
& e, e9 g$ Z+ o+ m) { - # s2 h. X: t# M" s
- getInstance().report();5 w9 n# e5 U% q& z' [9 M
- }
Скопировать код Метод unloadAllScripts() l" S& P+ ^+ @# h* n& A6 K3 ~
7 a# ?& U6 k, \! u. l0 l0 s- /**
3 `# T' v! h2 k" A - * Выгружает все квесты и скрипты.- y7 t% S9 F! G$ X4 v+ E- M
- */
: U) C& Q* B5 ?0 F - public void unloadAllScripts()4 Y# _* L' g' ]/ s! X# A
- {9 C$ l- I0 R6 B* w- D$ [
- LOGGER.info("Выгрузка всех серверных скриптов.");
# [' c! X* c! c7 z- E3 j - . e1 }: o* ~$ s. x1 y R0 z9 Y
- // Выгрузка квестов.
, B% E9 O' L) u, L' @9 S- Q - for (Quest quest : _quests.values())3 N9 m% g$ g- ]$ Q& I$ u
- {; i/ N+ n5 p$ _
- if (quest != null)
/ K8 j6 a8 {: F1 e" v0 }" H3 Y; T3 ` - {( Q$ R: W/ B$ H) ^/ T6 t# ~
- quest.unload(false);, F$ W. O1 t$ E8 ~
- }
. S" e% k {5 [% `/ K - }5 j& m ?# k; B, ~6 \" a
- _quests.clear();- n, @6 @5 ]# s/ m9 |' }
- // Выгрузка скриптов.' Z# Y) h4 ~" S& y7 F& T
- for (Quest script : _scripts.values())$ r2 A7 _0 w- }; ` e, p
- {& `$ _$ y9 X6 f( X
- if (script != null)8 t' s0 X8 A& H( d% ]
- {
* u3 I. v% O5 _. g - script.unload(false);, B8 \ T* e2 j$ ` R& j
- }
/ w" x/ `9 b% U3 N* t - }
/ r2 X: N& d. Q - _scripts.clear();
9 z2 s+ g; U. j8 E" Z% t - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts./ N2 B+ f' B$ K$ @1 J4 K
3 @. x4 }/ m4 X5 d, N
Метод report()
( l$ n2 p0 w9 M. m( [* T. D4 Y8 \
3 J' a( U: D* E) I- /**
6 Q; }7 ^7 `$ M) e6 i8 N) y- C, C) n - * Логирует количество загруженных квестов и скриптов.
; k1 B+ j1 p9 V: I# G4 E - */
1 k9 G8 D- }9 R8 ]1 S5 q5 P5 t: J - public void report()5 k1 n2 c0 q( x! Q4 A3 c* A0 b* t
- {, k c# C* ^* F9 c5 _
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
7 G4 ^. V4 ]! |# ~9 ~* O - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
& { V# U( Y+ e4 Z8 k1 N - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
$ \ R) S. V& v* @" k! p- D5 b + t. e* @! V) A2 U& S( M
Метод getQuest(String name)& k9 l5 F9 J: X: b5 p
3 N6 K" k3 ]0 B3 c6 L" e
- /**
) k& w$ n' Y; x$ Q" s! y - * Получает квест по имени.2 i& y- Y5 P& t9 T+ h2 R1 ~& T/ O
- * @param name имя квеста" y) s$ f! c! \+ S
- * @return квест0 s* c L P8 l4 l. i/ |
- */, T+ }5 x- q1 [+ J. G& \- a
- public Quest getQuest(String name)
0 E3 U. q( I% b7 x+ ~ - {$ q7 ~- a$ F$ a) e: P5 C* m8 }
- if (_quests.containsKey(name))+ N0 Z- _' |) [& p, S$ ?
- {
0 Y; o: A+ y3 E) [$ g - return _quests.get(name);
( g2 l+ E3 e4 s. | - }1 j4 \ E7 Q9 N. w( L# C7 E
- return _scripts.get(name);7 v1 k1 _: h a: N. _/ |/ u3 a5 }' s* ]
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
# M) K4 Z/ d" l7 p6 K- h8 R
6 f! j/ C3 q5 H% N, n7 f8 ~Метод getQuest(int questId)
) b- n3 u' ^- @# a( G8 H& Y% y
! O2 g" h7 E" z5 B* ?2 y- /**
$ W5 b/ [* ^$ x& F3 l4 U - * Получает квест по ID.% ~ o' A3 o7 ]
- * @param questId ID квеста1 j8 S- G6 X" u
- * @return квест, если найден, {@code null} в противном случае- {# ~( B3 L- x, _. z, U
- */# `4 C2 S) ]1 W* G& g
- public Quest getQuest(int questId)3 R3 H8 F1 j2 Y4 P/ x
- {# b* N4 z9 [( B% i8 n0 N0 o. W. U
- for (Quest q : _quests.values())( D/ t6 D; g' L% G( {7 _+ d
- {
4 B4 d! N5 p) n" ? - if (q.getId() == questId)6 U; Z* e6 {+ ?
- {
- |1 Z) }' e( d6 Q6 T+ W3 V) N; Y$ } - return q;
3 c4 D( C: I5 J1 _4 L- t0 \2 } - }
+ S( C4 X/ E- r0 T- W$ G3 e - }
H- m, e3 u$ z! `" F - return null;- `/ w: |+ Q1 a) E
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
7 _, V; [/ r3 s+ I* T: N t # ]) b6 _0 _5 N) s' Q3 ?
Метод addQuest(Quest quest)
6 J. C) k6 N# n5 x4 y
3 w& G) _; ^# y- /**3 T; o7 P4 D! z7 i- Z6 r# e
- * Добавляет новый квест.
7 Q! c: a, I J0 A( ~ - * @param quest квест для добавления
9 H0 a3 {* `4 `4 W, W - */
& \* |; i4 E2 l; T - public void addQuest(Quest quest)
3 F* X! y& h6 X0 j- Z6 |2 t q - {2 [/ p- p( m5 p) O! `# c, M
- if (quest == null)3 t. D5 U; J& p' x7 m& _4 D
- {
. o+ S8 g8 g4 [* c6 |8 K$ K - throw new IllegalArgumentException("Аргумент квеста не может быть null");; d( L; U$ ?' Y- R( Z6 s
- }) v2 x3 C( }1 g- }% [' h7 n% ]5 G- y
- : d9 S3 K* g4 T% y/ N" A9 C: q c
- final Quest old = _quests.put(quest.getName(), quest);
3 ]8 G+ c7 l' u5 [ - if (old != null)+ ?. g( @6 o# ]2 b" Z+ p% r7 m- S
- {
+ m3 f }0 J( |* X5 B& a - old.unload();- }3 L6 j& q6 \
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");# n+ C0 m+ t7 s
- }8 j/ A& ]0 c8 w8 z
-
6 W4 @; ?$ o6 G/ a/ a3 A - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS) g, z" z+ o+ j0 }) \) f
- {# z9 e7 N. ~( p3 E( }' z- {
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();0 ^1 ?+ W7 j' c' p
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
' U+ a% c* K9 w - }
# k' D1 u8 A7 w/ X/ c1 w1 N: G: I - }. n1 ^7 G- E5 G$ g8 Y
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера." n& l6 B3 E4 p8 w. M+ Z$ T
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.9 b2 D( V* h. d
: M9 W8 b# h7 F" q" M+ e; o# n) y# I! y J. f
0 g% S' X L$ R
|