Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius4 B. C9 Y6 Y9 \
* x9 Q- j8 [. i
Разбор файла QuestManager.java, B9 O6 u' R5 Q. P$ a$ s( _
) c$ K% _' O: w3 i+ d: sЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
7 f; H6 O" Z7 ]+ y) g2 \$ iОсновные элементы; |% g+ o- k- T. g; y p# @
- Лицензия
8 H+ [+ u- D7 V- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии./ ]2 U9 }, v2 x
- Импорты
1 `" ~! v! d4 x6 e a5 K
# b6 ?+ f% z% y9 H2 F; k( G* R5 NQuestManager.java — управление квестами и скриптами.
8 n$ n9 \ [6 F, n% P* FПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
, U8 a# W* p) B1 F' r& r- ?: ` A+ e* W
& G7 _" c9 [0 Q; n! F# H
5 I3 W0 j% L A+ jДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.4 s5 F% m4 `8 ]/ |) c9 ]- q
1. Лицензионное соглашение
, I' u- R4 T3 A, J$ m( V! V- /*
4 s, I" h" p* ^( Y - * Этот файл является частью проекта L2J Mobius.
$ R, R F! A* c - * & X; v( X( ]/ v. S( g @+ O
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
$ S2 @ D. b" W/ Q, ] - * её в соответствии с условиями GNU General Public License, опубликованной
" B- d' d$ Y6 m/ `% O- N) Z# b9 N! H8 R - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.2 X6 x# `9 _! X5 @$ W
- * ! Y" B0 c& f* P$ j
- * Эта программа распространяется в надежде, что она будет полезной,) F8 [! c, b' ^8 f* S
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
1 l. A0 B5 A0 i+ \- e+ q" g2 Q - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.. S, e7 h; e- Q3 K5 i: s
- * См. GNU General Public License для получения более подробной информации.2 ~+ c' Z+ }, G E7 j0 ^9 H
- * + f" k0 C- ]( v" ~: U F+ b
- * Вы должны были получить копию GNU General Public License- \+ v) X$ j# M* B
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
& S3 E2 w2 F2 A6 g$ M - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.' E: s% g" t! A8 s. n5 ^0 i% ~
5 A3 T6 k, w9 b8 S: d- e
! Z# q4 @# Z9 W* O i. n
2. Импортируемые библиотеки7 v: Z/ ~. M G3 P( c0 Q6 U: p9 U
7 @5 Y/ R \6 w: ?3 r; V5 v% W
- package org.l2jmobius.gameserver.instancemanager;
( B/ ?' Z+ P9 O5 v4 A - # w. F5 S: F9 j2 m& G* y3 O' U6 d
- import java.util.Map;
; i! \* ^6 t% E6 G* J - import java.util.concurrent.ConcurrentHashMap;
. P! J: U+ F* U - import java.util.logging.Level;
$ Y* V; [& s) g/ y% A - import java.util.logging.Logger;. O( f2 Z1 |. v( }0 p
; q. X! K& G7 P- import org.l2jmobius.Config;
( L! ^* q# F3 r - import org.l2jmobius.commons.util.CommonUtil;7 @- g. M4 @% Q5 V0 `: G% b& e2 @8 @
- import org.l2jmobius.gameserver.model.quest.Quest;
, J* f: R0 }9 X" {" r q9 I - 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 — менеджер для работы с игровыми скриптами.+ |% J9 @% l. \! h. ^* z
2 ]' s5 O/ |3 v
3. Описание класса QuestManager
" z8 j6 Q9 @% Z2 N! o" J; o; f2 n- /**
% ~( I- u- W0 l7 u - * Менеджер квестов и скриптов.2 H, G8 i6 M+ y, \" a) m& C. u: ~
- * Автор: Zoey76: U( Q3 K" Q; o) |: r. o4 ]
- *// `/ j7 ?3 D! Z" `
- public class QuestManager
2 W% _6 B( s" C6 y( e: @( q - {( U# g* I" D+ }
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
6 `+ S# J6 N: W' ]9 L# @1 v -
" k1 u4 [" V0 p' \0 ~# i! z+ t - /** Карта, содержащая все квесты. */ }2 j. t* k8 g+ ?7 X2 Z
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
( h5 n( r+ a O1 o- _ - /** Карта, содержащая все скрипты. */
$ d/ K9 V2 r; c% f - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();; {' u1 j5 q, x! n/ U3 ]4 M
- + }* w4 a3 {: A5 m4 h0 b* x, K
- protected QuestManager()
9 e! y; X# A+ }9 Z6 v6 C - {$ M: h. \% i. Y4 ^# v) e5 s
- }
! m! Q; C2 E: }8 i - }
Скопировать код 4. Методы) ?+ ?/ ?& g( u h
Метод reload(String questFolder)8 ^8 a+ ~8 g# {+ V
- public boolean reload(String questFolder)
0 Q: O/ W3 S( d/ o9 c- t% C - {& S7 ]# l3 C8 y+ ]
- final Quest q = getQuest(questFolder);
7 W4 o3 W4 a: @* O1 ^( @9 } - if (q == null)0 B6 @# I: b; X
- {
7 @' M2 s4 b+ s! x - return false;
. {( p$ D/ h0 R$ I: R" R7 s - }
- P8 w" v' G7 Y$ t2 [5 m, @ - return q.reload();
, P+ o. N$ X9 K6 u3 e - }
Скопировать код
$ ^& s: A# Z! X6 q8 n3 I: i6 E s" ?; Q# G: J( ?' e
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.( |: H2 W; ^7 r+ o
Метод reload(int questId)
9 D* d8 l6 h I) N+ P' Z" a
8 ^0 b/ p; S; T. r7 i* U; ~3 Y- /**
0 R4 G0 l+ D% ?* J- Y( } p7 p0 D8 i2 Y- _ - * Перезагружает квест по ID./ t% X( I" d% I" j3 f
- * @param questId ID квеста для перезагрузки; o% P7 B/ P# K: k' r( V
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае# A5 b+ b) i& @0 x4 q, c0 g
- */
" j0 Q$ M( M' i( j! _" m: y& K - public boolean reload(int questId)
( P: k: y# U' }& L - {
5 l# O3 c' b" k2 ?) n3 H7 Q: |8 w - final Quest q = getQuest(questId);
# T/ e: _& j+ g, E5 j& O' l r6 h - if (q == null)
# D1 z. N6 ^* k% c$ I! q( | - {* E0 X# T" i7 b) F0 w
- return false;; p1 @# r% R( ~$ w7 a
- }
2 K' Q, G% W' M8 X% b0 D$ w - return q.reload();3 }6 K" I" j4 \* s
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID. g. P9 j& K! E+ [* B* y, Z; g5 R- V
6 R1 v8 S4 k* f; wМетод reloadAllScripts()
4 I5 ^9 Y( a; {. W8 F" p# _$ v" S- w- U9 l y! i, J! |, C8 @
- /**( n9 U1 N+ M" O: w* Z' l
- * Выгружает все квесты и скрипты, а затем перезагружает их.
. U e$ }( W: M! R1 @! ? - */
3 u! e0 m# o" @0 p* ~% b$ L - public void reloadAllScripts()
& v# D" v) F0 w: Q6 G7 }' k$ s - {
) u/ ^" m- T: Z: u |) U3 E - unloadAllScripts();
o% k2 x$ \5 o1 S3 U -
c7 s5 Q4 i. y - LOGGER.info("Перезагрузка всех серверных скриптов.");
! k4 E- s5 ~( r$ x3 X( K# V5 I - try
5 }2 j" W- S. M5 N3 _) v4 b - {: W9 V& F: y1 w. C6 e) C: n. G3 h
- ScriptEngineManager.getInstance().executeScriptList();
* p9 a7 I3 @# d, F7 L5 `0 @4 n9 ^4 h - }9 Y/ A/ N: l: L7 G7 r& R
- catch (Exception e)6 @% J7 v# S/ X8 x
- {( F* g% Z3 I% Y/ u1 s: y
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
8 F* C$ p* h' O: `! h - }
" g. @0 {1 ?) e C& E -
+ ~6 e0 j4 n/ |( D& s/ F - getInstance().report();
- L) J( M* I1 ^. M4 M$ f& ^0 o- }( J: I - }
Скопировать код Метод unloadAllScripts()
+ y; r; T# U/ F: @( V- o
4 c" y, L$ K( h. u- w$ \- /**
4 N4 M% K3 G, [3 h. n* g$ [ - * Выгружает все квесты и скрипты.
1 P4 l' V+ n6 r" ]7 `9 X - */
- W* y5 D+ {( S; ~ - public void unloadAllScripts()- {4 D7 B: r0 a8 I' g
- {, u) ]9 A# b0 c
- LOGGER.info("Выгрузка всех серверных скриптов.");
3 N% \) F# F9 t8 i' Y4 X -
5 `% x5 f; \5 b, {! c6 _ - // Выгрузка квестов.
% f' K Y$ c& F/ P( u1 n2 z' j - for (Quest quest : _quests.values())/ }4 s3 x4 {' x( m- e; b& R( [9 S
- {
+ c3 O$ v+ j. T# U: e. g - if (quest != null)
3 S3 v) p: s: T& m( A) Y. V0 ^ - {: B* h4 F0 ^5 v* q( v
- quest.unload(false);
6 p, ~8 ~5 s$ L* o" f( E; N3 V% U - }$ Q' b( p2 R$ J" i
- }
" N2 u* e9 b q4 ~ - _quests.clear();8 k" I+ y, Q; ^# F
- // Выгрузка скриптов.
0 Z% v3 p' z$ t& I, f' K. S1 A - for (Quest script : _scripts.values())
1 P& j) I, z3 e0 z - {
% j5 e# G5 g+ o1 u* z+ {, N: l- C! u - if (script != null)
" H6 N0 l+ p( H3 t: N9 } - {
" y! n. S3 a& V! e. e* S - script.unload(false);
+ }7 X9 U5 I( O' B8 @ - }0 w( |. u- a/ ]: C9 g7 y
- }
8 p* }- J% J' ?2 Q( c+ U+ G - _scripts.clear();9 ?& P: e; F. n, s& M* j: X
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
' }. `8 l6 k0 ?. z: l) G0 I* _4 M
! `4 g+ t3 R( `4 JМетод report(); y9 o* W+ u7 ^, u# G" }
( G' ? C& N p- /**0 D2 F0 q% ~1 e2 D3 `- N+ ]0 [* T* d
- * Логирует количество загруженных квестов и скриптов.9 \& f. U4 {( s8 w. S. g
- */
$ f2 Y* ^! f4 n7 V( w- p - public void report()' a# g# j( ]' f; Y2 w
- {9 i1 B+ v4 t) }5 Q
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
7 g4 b; k& X5 n' a, n - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");1 P4 T& r# g6 t1 Q
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.$ X @" Z' ]9 |8 W7 c. S2 K' ?
- w, v4 Z8 ?" e% ]* B; \
Метод getQuest(String name): j( m6 v. {4 G3 _# u, v- d
9 k. H) K S/ }- }2 X6 P- /**4 f% [" B* t e; w
- * Получает квест по имени.
y; @, e- J. A4 s0 {6 ]4 K - * @param name имя квеста
4 S4 E; a2 N, {+ ~$ }( y$ K - * @return квест' f5 _7 Z$ F& p
- */- Q( @, W: k, ~8 N, ^5 [) I" h
- public Quest getQuest(String name)+ z; i7 e9 n( Q; H, p
- {1 J- j5 K' R1 K5 h: u2 d) z- J
- if (_quests.containsKey(name))
8 v) V+ F: F3 }$ O* ?$ L6 @/ L - {# o# G: j2 U9 ^8 o* ^$ p% o
- return _quests.get(name);9 i2 L! X, q" ]" q
- }3 p, `+ o( S! v& F9 o: W
- return _scripts.get(name);: x/ c+ P# A6 O9 d: _
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
) b% ]" v( N" J' T5 C2 a9 r8 Y 1 T: M9 U9 U7 w: t* \0 ]9 Y
Метод getQuest(int questId)
, I7 [2 d( a; `) ?
1 l* o6 K: T- \' r' F, K; P7 @! w0 B- /**
! i2 j4 t' i7 I5 _" p1 r+ | - * Получает квест по ID. l K5 O9 S( o- A5 T
- * @param questId ID квеста7 Y& Z# @1 ~' t' J* @* U
- * @return квест, если найден, {@code null} в противном случае, D9 n, Q9 r2 n6 d6 C$ A
- */
5 `1 H9 r5 N, ?6 ]5 e6 ^/ G- o - public Quest getQuest(int questId)) T( y, X0 m2 I* E; L( [; W9 u1 i7 P( I) H. \
- {) E+ |7 _. C' t8 K
- for (Quest q : _quests.values())( p$ ]/ ?5 ]2 N: R
- {: ?! t: C2 N: F( k; {
- if (q.getId() == questId)* {. H6 q1 q' [& Z3 n
- {% N2 N/ y- E. p1 q' g6 y& a
- return q;# w& l, D/ t, Z9 x) C5 Z% K w
- }
! j. `7 e# O; r - }4 @0 {) z+ m0 i' [8 Y8 m* ]+ Z
- return null;
! t$ c1 j N) m9 @* X3 \ - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
4 O# b' I& a) h" X2 ^
: I( u7 L5 n( y0 `/ f7 w* ?$ `Метод addQuest(Quest quest)
) M. Z3 f1 }- ?. s4 C4 B$ r9 D6 [) k0 m B' ?5 c, A \1 H
- /** w: A( O2 r' q [2 U" t
- * Добавляет новый квест.
" K' Z$ g6 z8 \- P: J% t - * @param quest квест для добавления
& D% U% _# @) S: g0 h# j - *// X3 ]8 c, Y1 Z+ ]6 B3 P
- public void addQuest(Quest quest)
' u" W) ? P+ a8 `+ s: b - {. L: U6 | @" U H8 O
- if (quest == null) q& J& Z% G( D! n8 {+ o
- {
: t% J' j; v. ` - throw new IllegalArgumentException("Аргумент квеста не может быть null");7 ^& _% k5 G1 Z: j* {
- }
6 U5 Q9 F$ i! c3 ^ - 8 `) c4 C+ B3 y* b9 T6 @0 @
- final Quest old = _quests.put(quest.getName(), quest);
7 }' z' F+ u# i h( a- c - if (old != null)4 B- ^9 L3 ~ ~' N
- {0 p4 @) I3 y/ F) Z- w
- old.unload();# k _1 F1 J0 r+ y7 K- ~5 E3 h1 \
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");6 n7 k2 G+ \5 B2 J( m8 {' X$ ]9 s( Z
- }
& V( G% [9 K* v7 `* a -
" D# ^: T" k/ x; `: K# q+ S - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
# B) S; D: m9 t. d - {
1 a) s' Y0 K; o0 b. q; p+ s - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
& ^6 G" o, Y9 d7 M7 h; C) Q - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
! y/ j, H' y& o- ^* y - }
9 E& X4 q# ^( J# Q3 [1 j" ^ - }% r% q0 R/ ]1 h; s6 o. t4 f
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера. r* r b0 q" O- C J0 ?% I1 x; {
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
; h L: k y/ \' b2 n
' Q# ~8 |& u% b9 k# _) C
/ n& t% E) Y( \" O5 L4 |
) Y/ _2 ]4 k0 t n+ H y |