Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
- B2 ?( D! p/ V, h7 V
( P! j8 c* r1 v( C' U2 A+ _/ e2 ]* q: YРазбор файла QuestManager.java1 \" u* {- m! f+ u
& v, u" j" a! Y# x) V4 Z
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
+ h J( X# U1 l) cОсновные элементы
8 j" `% J6 |) C+ ]3 W7 }, V- Лицензия( D7 F* X7 v; r$ ]! r/ g0 r5 B S: S/ `
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
! p! n# ]! U5 d
- Импорты: S9 ?, e& c0 x. i8 `
0 ?# R) ~2 o6 i- ]( h
QuestManager.java — управление квестами и скриптами.
+ _7 K, }/ a) {) W. L. k5 eПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\2 x4 a- g8 I( l+ K' K0 E
+ W* z7 O- ~ J% u$ |, v0 Y/ t
7 q, N& d a+ p" t. p% a% V7 `Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
2 u, U+ Y+ Y. _+ |# y; ^0 z. L8 \+ H1. Лицензионное соглашение
) q) Z% F$ Q4 w z- /*0 r9 l5 t. [6 @2 t9 N8 v6 N, Z
- * Этот файл является частью проекта L2J Mobius.
. ~: o% [2 m* X1 L+ q( \+ H. Z - *
" q( o$ S9 G A( J3 C+ z7 [, _3 X) E0 ? - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
% n7 E; U" z% M! Y. ? - * её в соответствии с условиями GNU General Public License, опубликованной5 H, V2 [7 N7 [* v4 z J' ]
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
: r% J, [3 ?( `: K4 w - * / o" W" t* N: ^8 @- `
- * Эта программа распространяется в надежде, что она будет полезной,6 R# F$ r# S3 s( [) f4 P, W0 h! q
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
$ l6 g4 J7 ]5 ^5 I& j% t, @* m - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
t6 t# n1 ]+ r* a0 Y" W: {3 W' f - * См. GNU General Public License для получения более подробной информации.
+ b8 Z0 ?$ s. f% e - * . }/ F- p6 {" l' K+ f. J
- * Вы должны были получить копию GNU General Public License
5 x9 [" {' D, o( Z2 K( H - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
7 X, e: Q: i/ K* o( i8 ? - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.1 g F, z$ F x3 R
3 q% o5 `* a# }6 `. `% n: V
* J* F- K3 |% M4 R
2. Импортируемые библиотеки4 n. L( H* I+ k9 G
0 @5 U- U# W8 ]- package org.l2jmobius.gameserver.instancemanager;
& u; e! _* |4 Z2 d% \, C2 x5 E# _7 u' A - 5 e. F( `: a) n. o2 _
- import java.util.Map;; K* M8 C& L0 B. f* d9 G- U7 P2 B
- import java.util.concurrent.ConcurrentHashMap;
: M4 t4 V1 y/ g$ }3 b - import java.util.logging.Level;3 G6 O3 j- n- G
- import java.util.logging.Logger;* b& d1 z2 X% t0 B0 V4 |- T: f
- 8 k% {8 V: X4 Y: P5 g* i$ f1 z) j
- import org.l2jmobius.Config;
6 Q3 R) I8 U5 J - import org.l2jmobius.commons.util.CommonUtil;
4 O, h& l% s/ o% {' H0 h& P w - import org.l2jmobius.gameserver.model.quest.Quest;* E; ~' ` }1 h/ g; o. x
- 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 — менеджер для работы с игровыми скриптами.3 B: \5 o& c: s$ p
# o7 |* ^( G8 D* j/ S9 q# N3. Описание класса QuestManager( M8 @0 b, B' `% `
- /**
7 x& g. B0 c$ L! i r. U - * Менеджер квестов и скриптов.5 G; Y& Z/ M- e, r3 l7 s
- * Автор: Zoey76
: y" h' @! W! H2 Q. N1 a8 i - */" b9 I& Z! g' y& C- c7 w
- public class QuestManager& \* f- E4 b b' o% B1 o; F
- {
8 W/ b4 g: M Z( t4 X - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
$ h& n% {6 H8 p# I |, ? -
4 ~. ^( ]" Z3 C; g - /** Карта, содержащая все квесты. */- x* Z3 C, t4 v# S
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();- ?, t6 y) M: T% z3 D
- /** Карта, содержащая все скрипты. */
% M; U1 @% j. p5 h% W& S# N" O N - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
$ s( e3 ], E& [$ q- W - * z* _3 E' L6 {5 T5 f
- protected QuestManager()! K% ~% ^6 \# h1 ]" x6 J
- {$ x# W+ v. [% G c6 b# B0 ?
- }6 Z8 _9 @% a H8 `" X
- }
Скопировать код 4. Методы/ q D" x8 S+ d' g5 E
Метод reload(String questFolder); C4 h) T; P( D. r
- public boolean reload(String questFolder). e w, `1 p d. w% U \: o
- {* Z1 {" E' d! s) h
- final Quest q = getQuest(questFolder);$ y# G6 p9 ]( H* ]- H' j/ O
- if (q == null)
" v, L6 G" U Y& x$ q; M4 P- R - {2 D0 N1 I# V! ]4 Y+ P0 W6 @2 T7 v
- return false;0 f) |4 Z7 ^ X u! ~2 y F7 F
- }2 w E2 Z1 ~0 j( c6 H* Z
- return q.reload();
, U( Y# u* X- T$ j- P2 S' T - }
Скопировать код 0 L M. m0 S" |( _* e/ o
3 ]( m% g1 R* l) ~8 SМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.% |4 o3 \( w4 h
Метод reload(int questId). V4 g: O& `' B: ]
: J- x% j! }0 L% O0 D2 s
- /**5 W" u) y# D/ S
- * Перезагружает квест по ID.
4 @5 n L: N5 k) K: y6 V9 y - * @param questId ID квеста для перезагрузки# l# V+ _+ i) q9 l7 ]# C9 c/ z
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
! ]3 a! `& K( J2 ]$ W3 \- U - *// C9 \! i" B; G! p, q
- public boolean reload(int questId)% }4 q# w# c G7 A
- {+ Z7 v* b2 K! [# J/ k z; h
- final Quest q = getQuest(questId);: c, D& x; f" f; }+ o7 ~
- if (q == null)
+ v8 s, _$ O3 d6 o3 R) _! r- q7 ? - {6 H# y% h+ @7 L
- return false;
3 G, y/ v$ L9 x* c6 V! Q - }' P% ^# ]4 l J- w- c6 V. t: J
- return q.reload();
8 {. d; I3 O; ]. @# ^1 _( u4 R8 {1 M - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
+ |7 _8 h2 b% i- g! M
. c- F& j* W' R( B* x9 T) QМетод reloadAllScripts()
; F* K$ [' @! Q; ]1 u3 Y4 h3 t0 N. O+ i+ \9 V! ]: ]
- /**' B3 Y! Y. k4 q" k# D4 L
- * Выгружает все квесты и скрипты, а затем перезагружает их.. R1 ~1 x V8 K5 s1 B7 g
- */
" P3 M# m, X$ E; y - public void reloadAllScripts()- f0 g% m! d% }! J
- {4 f7 |+ p$ \6 i
- unloadAllScripts();
: X( M6 o P/ ] ] - + J1 O; P4 ^9 h, I, ]8 F4 G5 s
- LOGGER.info("Перезагрузка всех серверных скриптов.");( R& A. {( s0 v7 [7 L
- try
9 h+ m- G* i: t& e) N - {# c. B, y6 R; Q3 W7 B' N" @
- ScriptEngineManager.getInstance().executeScriptList();# F3 u! @. c; i0 _; W' ] C
- }# C' A% _- I3 s( A
- catch (Exception e)9 v! s1 L9 c/ L. d
- {
7 U2 H# {0 W! U3 \- K* W - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
, M" ~6 S3 z# D/ n% s& M% b! ~ - }
# y5 V. z# M% i. b0 y: o - 6 K2 C) `1 S! d- I
- getInstance().report();
2 r, ~) N3 }! X" i- J3 @7 ] - }
Скопировать код Метод unloadAllScripts()
# Y' k! ^; Z `, ?7 R' o
7 y1 S1 D$ W/ m8 G: }: `* }* N- /**
; D \% L! `7 ?9 z- Q2 ?. z - * Выгружает все квесты и скрипты.
$ d! z9 y- S" x' [6 I& e - */
; u/ z, i" n8 r2 @3 k - public void unloadAllScripts(), |2 l# ~9 k& s' \
- {: v/ M$ H5 Q, X& o
- LOGGER.info("Выгрузка всех серверных скриптов."); ?) s7 z8 S+ ]
-
( ]( x2 n1 q- H$ l7 s9 Y - // Выгрузка квестов.
4 M8 f0 \$ i9 s, X0 o1 } - for (Quest quest : _quests.values())( E4 a/ [- r: m" ?! ^
- {
3 e% O+ _. S! y# B) r - if (quest != null)2 Q& ~# d$ r6 B! K$ @9 K# g" Y
- {. m; }6 q* G$ V; V* `2 a! S
- quest.unload(false);
$ K% u" B( M6 b# z; |+ K - }6 z1 o2 z3 Q3 q6 u: S/ w1 @4 Q8 J
- }* n9 ~+ ` a8 b: J( L4 t2 l9 d
- _quests.clear();) i% I A4 B p0 x3 S8 v! q
- // Выгрузка скриптов.
7 k+ A3 s( ]4 d7 ~1 x - for (Quest script : _scripts.values())
+ `# u7 F5 F6 n4 S) R: g - {
5 T$ Q0 f y! ~$ m+ f - if (script != null)
: J( z# K) e8 h- i. g - {' c# T* m- ^ W7 i: v: l7 F
- script.unload(false);
& N% C4 q+ Y7 X7 h! U6 R - }- D' \5 ^4 k' A- k1 ]( _0 r
- }
" _- i) o. x' B+ I- c4 x - _scripts.clear();
' B% E% d( \9 v1 E - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.) w5 f" c1 i d8 }# I$ x! n
$ E% G* b- `% a( z! K7 ]8 x8 u! f
Метод report()
+ e, W6 U- O/ G% F1 M- }' k/ d. a0 o5 ]$ B. l+ w
- /**3 i' Q' D' I7 [' v- F( d! ~
- * Логирует количество загруженных квестов и скриптов.
7 a: Q: m4 J" T6 d! f8 v - */% d; w! y+ x7 w: Y7 s
- public void report()
/ O0 P2 n7 e( u3 c& P - {5 q: p4 V" y6 r5 ?3 s
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
& @* a+ c; k2 W* {! w& P) R U6 i - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");+ C ~2 B1 {' o- i
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
9 k) m7 t$ z$ G& q i+ z 1 [& ~/ j" H- M! ?# l- _% H1 B9 z/ b
Метод getQuest(String name)" ?( z& \5 l( i% _, ]0 w* u+ Y2 g
" R6 h; K9 u8 V- /**
. [0 `6 ?6 c& O. E. E - * Получает квест по имени.
' ]1 R& n2 B9 L: m1 y8 _. Q% t - * @param name имя квеста
! t$ f% l$ u. E8 u - * @return квест
7 @2 o& ^9 o! E - */, u" ^. Y! Z, q( G8 U6 V# U
- public Quest getQuest(String name)
2 r$ Q3 e5 d7 A3 x: p5 z - {
3 ^' d- N' \4 d1 p - if (_quests.containsKey(name))
3 E1 a- ^. l; w. l - {
7 R1 ` Z% g: m1 ~" t1 C# W2 v - return _quests.get(name);
; L0 u. {8 b* ]7 W - }/ P* n# Z- u4 d7 C# p! T3 n
- return _scripts.get(name);
% w5 U( Z& `5 }. [& I - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
/ j3 x; v4 ?( f 1 z5 V% s: ?% ?7 F- q+ b: C% U
Метод getQuest(int questId)! F% L5 o$ \; F; X" y% w- R) S
' g) H. U; y: O* R. H+ Z: T- /**
, e1 M6 T4 y9 X3 y - * Получает квест по ID.8 @" v) a; i, G6 W
- * @param questId ID квеста
- ?4 W. m H4 h( i! z+ Z - * @return квест, если найден, {@code null} в противном случае3 X& w) B7 [( ~% |( F* V
- */& C" i- O4 i5 W# Y$ q B
- public Quest getQuest(int questId)
- ]3 y/ b! N( S - {) M! A: e, ` p# u" P( j
- for (Quest q : _quests.values())
1 D, d4 |$ L5 K8 v8 C% W! p - {
! l5 g4 ~/ L. r) [3 J - if (q.getId() == questId)/ g1 q! U: [& b: r8 [( m
- {
$ S5 A$ B2 M9 Z# K7 _ - return q;
* a d( [$ g' j/ C - }) o( }& i! p: y0 J- c l
- }
! `6 p& [5 w9 D) C: K, ^0 K( E: Q - return null;8 a, P' z$ _* a1 W8 E
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
6 ?# F* ~ o% Z1 r0 `4 ` " P1 a2 X" n Q" H
Метод addQuest(Quest quest)
1 G- ~7 x: Z- N# l# ?& Z0 s
0 _* r m+ ^0 M+ i4 R# D5 M- /**
* D0 P( }1 _5 P6 T0 U - * Добавляет новый квест.
$ A/ I3 K! m. r, k2 e! V - * @param quest квест для добавления
2 l$ U6 _( `- C# H3 d2 o - */7 e5 W3 z) ^. R/ X! y; F
- public void addQuest(Quest quest)( ] P- y* W' n% S# W
- {
- W8 G* k5 Z' L - if (quest == null)3 a6 v! @4 _7 ?2 C8 j; O
- {+ _. ~- p, X: {4 X4 c3 S" Q
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
& K) z; T4 r% b4 [ - }
: C( [$ J8 p7 r% z9 l4 l# ?5 G -
! K" a6 G$ }+ }! K! K. I - final Quest old = _quests.put(quest.getName(), quest);$ R: n4 j. W8 r! q
- if (old != null)9 {+ \& B6 c: s5 U7 {& I) F
- {
5 y6 L- E6 {1 F - old.unload();% B8 D0 p0 w, u9 C1 T; B
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");1 w5 [8 P6 P9 |$ {0 D9 F7 \
- }
; q& S( q$ B, @/ E - 5 ?1 Z" l3 _; z" b1 {+ s
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
% g! A" b, p/ N9 d5 A$ @ - {
@5 m" L% h4 D3 J. W0 i - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();7 O- U! m; Z( Q! ?" o7 g* o1 {
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
# S$ w1 V- R" R6 d$ W - }8 l2 R7 ?- c0 o& l
- }9 r/ N# f. K2 x+ H) `" j& f0 i
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
. U Q# x+ R7 q! F- h5 m$ \ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.: ?* X( R" k6 G0 n
5 B7 t; [$ Q$ N G5 w. _& r, K8 Y! a9 D
0 t* y7 Q% i) [
|