Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
* l" ^0 s' m2 _& u8 [2 _1 v; y
: i8 n9 i0 {( P$ x/ x; }3 d8 VРазбор файла QuestManager.java1 _8 _9 q6 E$ w4 V& ?1 E: p: P
9 b* K. q& F( _1 I: F
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
! }- m' r% [: Z( r- w9 J9 g5 H: x4 mОсновные элементы
) F) X' f" T- [- B- Лицензия+ ?. g* ~+ l3 O' f& w k" ^
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
5 a2 B% N4 }; t* G! [9 Q
- Импорты0 L' J) [- A& Z" U
/ K( L$ ?3 B% F- d+ iQuestManager.java — управление квестами и скриптами.
* s5 x: W* a7 u5 k( L! oПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\0 s+ t6 G5 f# x. x: p
\% T6 _8 e1 m& h% y9 x) b
8 |/ h8 m# c/ S5 Z$ ]; _' j+ SДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.7 C6 l& v4 Z2 }
1. Лицензионное соглашение
+ t( Q5 Y) C4 x9 { J6 [- /*; Q6 T4 g! H9 w2 W j
- * Этот файл является частью проекта L2J Mobius.
% ?5 v0 }! H6 L$ m/ C9 N/ N - *
- H0 s2 A7 k7 r% O - * Эта программа является свободным ПО: вы можете распространять её и/или изменять& Q/ Q2 W5 b: l# r
- * её в соответствии с условиями GNU General Public License, опубликованной+ I7 j8 g' c4 u/ r$ a; l
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.3 B* `2 r F9 o
- * 5 ]( W5 \4 F( l! s" i$ K8 u
- * Эта программа распространяется в надежде, что она будет полезной,
4 v( l! ^* ?# ^' g - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
5 Y; u7 W5 ^, ^/ q0 x) ]+ Z+ g - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
% P, T, }5 T% i3 m1 f' f - * См. GNU General Public License для получения более подробной информации.
% @1 ~* H+ v& n) v6 v2 L3 `2 u - *
& U D6 n/ L0 ^- _- U G5 v) K9 ` - * Вы должны были получить копию GNU General Public License
, [/ {* i9 {* |% H" M - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.# ]# ]/ I# @/ b2 X; j
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
+ f! }- u$ l, y* @6 \+ [3 j$ Y! P7 G0 \% H/ ?
8 s( S8 h' w/ p8 G) a( d3 j
2. Импортируемые библиотеки& E: l9 v. F7 ~) W
1 i- M9 ^; _ e& r4 m; |" ~
- package org.l2jmobius.gameserver.instancemanager;
* f) V, M, M9 |" }% Y7 f
# d% F4 U) A, G8 [" D) k- import java.util.Map;
" c, K; ?9 n6 F8 u# L3 o - import java.util.concurrent.ConcurrentHashMap;/ i/ G4 g' _! J6 K) i5 ~2 M
- import java.util.logging.Level;
& c9 V% J3 D0 `( x: \ - import java.util.logging.Logger;
+ y6 {- i8 G& F9 g1 m - x. a+ h" B& s8 f+ y
- import org.l2jmobius.Config;
4 k+ X1 t% a0 ~+ P- s2 } - import org.l2jmobius.commons.util.CommonUtil;
$ }% {( S: C* V% A0 j, I. {/ k; Q - import org.l2jmobius.gameserver.model.quest.Quest;
$ E* a+ H, f0 y0 J h+ |8 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 — менеджер для работы с игровыми скриптами.7 e# C% J: z7 ~
3 ?0 S- q: n/ E6 h3. Описание класса QuestManager8 l s& Y# ^; b% B+ ~
- /**) ?) d5 Z5 X" f) ?) k. ~
- * Менеджер квестов и скриптов./ F/ H; O" O8 ]& p4 x; P
- * Автор: Zoey76) F. o/ P; E% v
- */. n- H! j% h- D6 O, D. C& B
- public class QuestManager
7 |: j; ?- R# }& Z - {
/ v! r5 L% J, G! j - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());3 Q9 G M/ ~; v, e
- 1 l) J5 Y9 x' A
- /** Карта, содержащая все квесты. */6 k3 o5 B6 W0 `" I8 O3 W
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();$ l( V! ~) L- L3 F% t0 l
- /** Карта, содержащая все скрипты. */
; J& q7 S- `3 i* i/ S - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();, m6 p3 F0 p9 r R( F* v8 E
- / r& a' j) O% \) r
- protected QuestManager() t4 K; J5 j' ]) ]
- {
3 n" ~9 }, ~: ]8 a - }
# i" x8 D! b% @% s7 z - }
Скопировать код 4. Методы
; H* v& s, K7 l5 [. B2 l2 HМетод reload(String questFolder)1 F7 s" k: O/ ~ k3 O( R$ r- Z
- public boolean reload(String questFolder)# K, ~& X+ L( T5 [
- {/ c+ M. o/ O9 n% H4 G& h2 r
- final Quest q = getQuest(questFolder);
/ r* @' V4 x8 p8 f! |" H - if (q == null) C# x' x" U8 ^4 _( Z
- {
6 }& V$ w: R# W# E* u+ v - return false;
- b, G. u6 }. _* {/ ?$ o - }& B( w8 n: [, n
- return q.reload();
. v- y' H @1 a" @4 [' p - }
Скопировать код # _1 a2 t" G3 `
- C' f2 g: H* e
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.' f, {8 Z- m- }
Метод reload(int questId)
# p" q9 p6 C& {3 B' H. n* s) C: K
- /**
% F) f1 M2 ?7 M( W. O - * Перезагружает квест по ID.
. Q6 K' c. c+ x+ _ - * @param questId ID квеста для перезагрузки
' ^' I5 J$ \9 b( b$ [8 P% \) D - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
, s# Q- {( f3 l1 K; F* S - *// s1 G( i+ m2 V( s3 C
- public boolean reload(int questId)
1 x: w& u8 L2 @1 j - {0 y a3 u' m" [! T k' O
- final Quest q = getQuest(questId);% f3 ^* Y, X7 S$ G
- if (q == null)
4 c5 @9 o. V% a, u! v# T - {
6 H% ^% v0 ?$ d% q" [ - return false;5 j7 v$ C- T2 F$ ^
- }$ q" S9 D4 T/ G) q
- return q.reload();% l# D0 N! Y; k s; S- O5 Q8 x
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.' j" J/ D( C3 W( C: O
) ~% e0 u2 ]! b; G! o, N# N
Метод reloadAllScripts()% N8 n" t# S2 E" J. U
, w5 s) A8 D6 l; t7 {7 s3 }2 @
- /**$ p% L, v/ ~- i% D% |% X" L6 r6 c
- * Выгружает все квесты и скрипты, а затем перезагружает их.
+ F6 u1 _1 e3 b/ T" V - */# b: R: M9 S5 {& p2 [' I: e
- public void reloadAllScripts()3 r. h' [$ D* n" G. k
- {6 q' ^2 s+ j6 g" m3 r
- unloadAllScripts();
9 Q m, R8 A0 x! I -
% y1 L+ R) [& V0 |: f - LOGGER.info("Перезагрузка всех серверных скриптов.");
* u. c2 G9 o( u" P6 l7 I2 p$ V - try
" ~& P- G7 f4 o9 p1 ^/ ^, R( K - {
- H5 ~9 s7 F. K - ScriptEngineManager.getInstance().executeScriptList();6 B/ F- t4 E' z `
- }3 D7 k' Y p) V B9 B
- catch (Exception e)( b+ a1 _4 A( H+ v
- {4 A" D3 q5 d& r: a" d; K6 T
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
$ t2 } Z: D+ w3 }; P0 F( H - }
6 d( z: Z- }0 r -
9 q- A& T6 P7 u$ z - getInstance().report();
+ M4 I! L, V' ~* B; t+ t: w& A* Z - }
Скопировать код Метод unloadAllScripts()) N& h& ]& _0 _, ^( i
" c2 C+ g2 V7 O$ F( m$ x- /** ^9 E4 l5 N V3 i1 ^5 f! I0 p5 ~
- * Выгружает все квесты и скрипты.2 M# g# L9 q+ s; w
- */
: Z/ k0 T& G) g - public void unloadAllScripts()/ X: V; S% t! X+ v+ R4 n; \
- {
2 X A* j, `/ d9 @1 P. N% k - LOGGER.info("Выгрузка всех серверных скриптов.");
7 U4 D, W5 j, H6 w -
; m" ^- B: t& i+ v6 q - // Выгрузка квестов.
( z/ u/ o4 w0 N3 J9 J' N - for (Quest quest : _quests.values()): m2 {( K- `/ A/ a( f; d6 p
- {) f$ d" q8 _% @; c; m* w7 ^4 y
- if (quest != null); r0 V- _6 d0 _1 t4 x; ~
- {
( [& ?. b9 p2 O - quest.unload(false);6 t: U A7 L( g1 V6 k
- }
' ?/ h h& X! ~6 s - }
' y5 p% B$ d* n8 E; R! K0 P7 B - _quests.clear();. u7 C! c: [. E# P! K, B# s
- // Выгрузка скриптов./ q3 N! A; m0 i! }% Y
- for (Quest script : _scripts.values())
D+ U( g; l2 Y+ I1 P! p - {4 { L1 S5 X- K( b' A
- if (script != null)/ D+ b5 m/ z" q7 {8 @. |" d
- {9 V8 Y; i' [3 ~- X8 |
- script.unload(false);- @' P% C& F+ a. y
- }+ c2 M m+ C: G* n) T8 }# M
- }
) i) n9 z* @6 V! ]" k4 l0 Q - _scripts.clear();6 t0 o/ J" |3 v! `
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.; O/ m" G! p; i2 b" b" ^$ Q! f6 I& K
; K1 ^% O: o4 N6 W; V0 `
Метод report()# ]6 H+ b! S% V( p" X
8 B" y- s* h {' |7 t1 v+ V& g- /**: T( D! v t) `: `6 Y9 P
- * Логирует количество загруженных квестов и скриптов.
& r8 P) L2 }4 Q, f' Z; |, O - */
; g1 K! v! r# p3 o6 u# M - public void report()0 x, `$ L6 V) [
- {
* a3 G+ x: p, Q' ?- c - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");0 f% s; Y3 D: ?* U6 ~
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
. \+ G( A. V9 n; U/ k - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
2 K% O# z) E3 M5 |1 g, y, V # @/ U+ Z8 O% S1 q. I; o( U( B: L
Метод getQuest(String name)# o0 L( A$ b1 `% I
8 s2 M7 S# ?* j; z E- /**! t M5 L# M+ F2 g3 i' W# F$ a/ n
- * Получает квест по имени.* q+ }/ A6 N4 I$ S+ u4 S3 F
- * @param name имя квеста7 p. n4 l7 j0 i" x
- * @return квест( m; L2 ?' K) t3 W: ~3 Y7 V
- */
# o+ I) Z3 r. v - public Quest getQuest(String name)6 M+ n P- o7 w1 q5 K% r" S( a
- {
& y5 a1 u8 S h% N8 X/ B ` - if (_quests.containsKey(name)). T: J \( i- ~9 y
- {; K& v+ R) k$ f7 i
- return _quests.get(name);
, s* i9 }+ R, t5 \1 c - }
2 m" k6 E4 U% A" H3 {; \0 b" R - return _scripts.get(name);, w7 h+ o% f" `# F7 {4 X
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе." A9 d, C3 b% E4 Q% `
. {3 @& g! F+ d& D3 G: m9 y
Метод getQuest(int questId)
. l. {( A) V/ ^7 G
( Q$ [4 q# R a) n) R0 s: u1 e- /**
# [2 Z. p) n4 _* U6 P4 m1 E - * Получает квест по ID.
# Q7 _& w0 y% w6 ?- ~. r0 J - * @param questId ID квеста2 g2 h- g( e% E: ]4 Q
- * @return квест, если найден, {@code null} в противном случае( L+ z8 @* R/ g1 j$ C
- */
2 W; k6 }4 L( r' i ? - public Quest getQuest(int questId)# |, P/ X6 ]& C& B% G
- {0 j# `* H! f) {& M$ k
- for (Quest q : _quests.values())
. `3 a! L/ O7 X2 Z& ^$ M8 j6 f - {) h# D! y/ @1 a6 z4 V, a
- if (q.getId() == questId)
* k' H8 P3 y H& g6 H& S - {
* d8 o( ^1 E4 C; L - return q;
9 s P7 E- r8 Y - }5 U5 g* j% _; r9 f" d; o
- }3 z7 K" J& @7 d# w6 o% r; H
- return null;3 I; @: \/ D" a
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
3 p) q+ m: Z3 [5 M$ V( [ - K8 I/ R. r0 m
Метод addQuest(Quest quest)/ j* W+ k! [' M5 r& W
. q/ x7 [3 i# o* }
- /**
+ s. r/ A3 w6 y5 p% L2 u - * Добавляет новый квест.: p: }2 j8 K( w4 F( z4 N
- * @param quest квест для добавления* \# W' S+ s" t* `
- */ `4 B: Z( T" i
- public void addQuest(Quest quest)* @% G% S/ a, j9 X- H1 ]
- {: `; ]1 R* V* [$ R/ F) y$ c4 S
- if (quest == null)
8 w% C& H: q+ m2 G2 @2 I) e- H - {$ i2 Y0 |0 B- }2 r0 q
- throw new IllegalArgumentException("Аргумент квеста не может быть null");% t* C) x, b9 @7 o- d9 O" y
- }
, u% m4 N) [7 _1 ]( u- y; I7 P F7 { - M0 [9 z2 e" l/ z% s
- final Quest old = _quests.put(quest.getName(), quest);) h* j0 w1 V ~( P
- if (old != null)
' [; [2 G4 \" U3 H - {
7 D; t" y& N7 x5 \0 ^ - old.unload();
G% G C k) f! l: V - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
* q6 Q7 C$ C, F9 m - }2 K" |4 A: y# ^' N2 K: D0 C7 k
- 3 c+ v2 |* n3 B2 V+ `4 v
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS): V9 K; U+ w9 h$ N6 P
- {
# p- K" h+ j0 g$ b7 s1 Q - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();" U! X( p$ ?1 d
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
7 F5 l2 v0 j# m2 j$ v4 A2 x - }! e6 `1 \- S% V/ ~' m# C
- }! e t/ Z/ K+ G$ T3 y$ {# A
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.' |. ^* P$ ?: Q# l$ `- w
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
) K( I l% X. m, \/ N" N0 f4 S E( `+ A/ h2 P, w& n- ^2 m. l
( L. i% x# _2 a$ S9 l
: q( r7 i/ y2 [- X& J
|