Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius& x7 I/ R" u1 X: n6 C2 Y9 M6 ~
1 k; [$ E0 q+ ]. t+ n: v/ sРазбор файла QuestManager.java; E+ [/ f' L9 K% y, [% Z1 w: N; Z( |
* O. I9 x, Q9 E* P1 W' i
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.' Q) b i3 Z. H1 F/ i
Основные элементы" G) i0 R2 n2 `
- Лицензия' W. G: C+ F. ~3 O! l
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
6 C( f3 T# m1 {9 [
- Импорты
& l& {5 ^: e( A+ ~8 l
; |% x& C( G) z! f' E' BQuestManager.java — управление квестами и скриптами.
& K$ J. ?7 c7 ?/ R/ Y* H- Z6 cПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\3 s2 U9 ]) |8 b4 o; i9 }% I
0 F& D) t4 s, l5 X: K2 N1 Y
2 U2 D7 g& e: K5 v) _1 n4 k
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.5 ]% X2 r7 e5 L. w
1. Лицензионное соглашение
- }5 C/ ^% x D7 O8 E" P: `- /*% g0 M2 L r! j0 ~/ j- A
- * Этот файл является частью проекта L2J Mobius.0 N) a, R# n4 L$ f O6 h
- *
7 U4 o$ g4 f+ y# X; _9 b - * Эта программа является свободным ПО: вы можете распространять её и/или изменять, E4 |) R: U" J3 D+ ], H# _ c! W
- * её в соответствии с условиями GNU General Public License, опубликованной
7 g" z5 @5 T9 \2 y; }8 D/ | - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.8 i/ n$ R8 C9 ?3 f
- * 9 @0 n5 O# t: R s2 n' R5 L" ]: P6 z
- * Эта программа распространяется в надежде, что она будет полезной,+ D$ R8 Y; \* ~9 Z$ q0 f
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии( \* e2 O- b; ?6 j3 k" s. W. f
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.4 X, G$ [ v9 c/ m# p! @9 ]: H, o
- * См. GNU General Public License для получения более подробной информации.
" w' r* Q4 G. h. G$ { - *
# u% q* j0 X4 E! D0 }( X - * Вы должны были получить копию GNU General Public License
0 |6 o* y( q3 p- h - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
- B3 b- U5 R' j- a2 Q - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.% K8 q7 ~, ^: ^; g o: D7 x
& Y: i! D+ N' m e8 S! W
0 g+ G0 }+ ^3 f3 g" L2 u2. Импортируемые библиотеки
) t8 D; R; n: ?" ~, \0 V
! N# A7 i0 [* ]# d! T/ h, ^: I2 Z6 t# ~- package org.l2jmobius.gameserver.instancemanager;
9 n4 |1 e) t# G: a# \, I - - l( X7 X* o: X4 v3 R
- import java.util.Map;4 R a4 ]" U# ?4 \8 o
- import java.util.concurrent.ConcurrentHashMap;3 U5 f$ T4 K$ P+ U
- import java.util.logging.Level;
: ]; G/ \. A& n. n& J* e& O' b - import java.util.logging.Logger;' }: ~# W- B& P( i' h8 Z2 _- ^
: F$ y1 g$ a0 P$ ]1 c. y6 |- import org.l2jmobius.Config;
8 b" Y" ~& ?( ?0 s3 @- Y - import org.l2jmobius.commons.util.CommonUtil;- `5 ?( z H" `% d; D* W* w
- import org.l2jmobius.gameserver.model.quest.Quest;
: Z c P# G" l - 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 — менеджер для работы с игровыми скриптами.
8 W6 X0 Y% R6 R4 w1 J. z8 ]2 b, ^ s& H
5 ]! j- q3 A9 Y: B9 {+ [" X3 s3. Описание класса QuestManager
4 t7 @3 F, `: c% n( C- /**
' n0 ~2 \# u4 \5 _; R1 K7 o - * Менеджер квестов и скриптов.: n: V4 b2 p0 w$ _# W% c
- * Автор: Zoey761 s: Y. O0 ^" t4 B2 h' l* ^
- */* p1 `) G5 F4 Q4 |! C1 i5 q
- public class QuestManager
6 d8 Q4 y) y8 n/ L - {" V. J" ]2 J1 a: X9 k0 X$ L
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
2 O6 \7 X8 X( v2 M - 8 A" J6 m/ ~2 p5 O8 j
- /** Карта, содержащая все квесты. */
( o/ J F* W; Z. F- X - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
2 e! S* F1 t* M% { - /** Карта, содержащая все скрипты. */
- @7 E! u) D+ F2 q/ U6 T6 m) [ - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
7 L% c) i0 {3 M Y$ Q/ i( P -
" l7 k- |) U) j! [$ ^: K - protected QuestManager()5 [, L9 C- C' O2 s9 e: ~* x$ c& w
- {8 f3 r% j1 M/ S A
- }8 e0 F9 h# u& F$ U( d V
- }
Скопировать код 4. Методы
( ~" l# D( R( AМетод reload(String questFolder)3 A0 z) k N2 l5 q3 z6 N
- public boolean reload(String questFolder)
0 W7 N- u p! q& A* T/ D - {
. q4 E3 L$ w' v( Y( s - final Quest q = getQuest(questFolder);8 K: a6 L- _, ?
- if (q == null)
D, C) e8 O5 b, G5 t - { u* |; r; c8 x8 ~1 j: x
- return false;5 i& S1 I0 t$ N; c9 _
- }
8 }5 O0 M5 x& ]3 l- l - return q.reload();
; ]7 _1 J* k, x G8 w - }
Скопировать код . z; t" o3 G/ |! i+ ]/ `! y7 ?) _8 a
; g. A' W: A# _+ s9 l" \1 JМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.7 G! t7 Q. M" Q* C8 U# R. w" D
Метод reload(int questId)
# j1 N! D9 D- }# p1 \/ b5 k4 Q8 [9 q& m& O% t3 }
- /**
+ W9 y; f6 l& h - * Перезагружает квест по ID.
4 K4 W2 [# d, {2 X3 {1 J - * @param questId ID квеста для перезагрузки8 Z1 Q! h4 K+ Q+ s0 B
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае, P( X: }6 L' T) H) c; L( l8 \
- */0 ]' }' S+ s) P: T
- public boolean reload(int questId)9 [+ P9 x: O0 x' A
- {! x% b8 n- K. Q0 |: L
- final Quest q = getQuest(questId);: Z% ?* t; v) m% ~; V$ N+ A
- if (q == null)
v1 F# N+ P% Z. ]' i - {& y# Q; j. x8 C& _
- return false;
; G7 W# w. n& }7 D - }# R- I9 c* [/ j o" g9 x
- return q.reload();* g/ g4 E$ v# a8 H0 t" X" p8 j
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
7 G b1 \' X! W* o# R" s: A! X ' ^" H" ?6 a( O
Метод reloadAllScripts()
9 \- h) Y5 W5 ~. R1 y7 l( i& X: _* v, t% c ~: u
- /**1 r" k! _( M- H8 P
- * Выгружает все квесты и скрипты, а затем перезагружает их.( _# T; z3 n' u. P! I
- */
3 e6 Z* r9 M' t- X - public void reloadAllScripts()
; h; H' B# ^) @$ I! o8 C - {7 F6 u; h3 x z/ N
- unloadAllScripts();
4 o8 f/ G. e0 e _" G - # d6 G) O$ h* o3 P% f3 Z( i: ]4 m8 @% O
- LOGGER.info("Перезагрузка всех серверных скриптов.");
K0 v& _3 b' y - try
( p9 e* g1 v1 Y. Y! I: G - {7 N9 l* p9 N7 Y: {
- ScriptEngineManager.getInstance().executeScriptList();
0 H2 ~! f W8 W! s: G2 q - }
v* M8 ~! F2 m9 A) a. w5 d - catch (Exception e)) p$ ^/ c& b) q; t# K
- {
! h0 n. U7 `8 K2 H c# J/ e - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
1 \* _6 ]2 P( M) i7 d% V - }
" F0 W n% f5 S5 w+ x' ?# U -
: O) u7 F' T" y0 R/ C4 l# M - getInstance().report();
7 M9 z o: ?- s/ o3 W - }
Скопировать код Метод unloadAllScripts()' b) d# \9 g5 W" t, Z
* G2 Q3 j' z* A
- /**5 \/ l) p& P; | L' s5 \. s! \7 `
- * Выгружает все квесты и скрипты.
1 J; g, x: E' c0 o$ X5 M" @ - */! s/ J0 S" Q- \3 W
- public void unloadAllScripts()2 `4 l, m, G! z
- {
3 ?4 |) K' Q( o6 ~" t - LOGGER.info("Выгрузка всех серверных скриптов."); e( S1 T/ b9 a4 T' u
- 9 } `' t5 L- x" W
- // Выгрузка квестов.7 Z. [ c G2 y
- for (Quest quest : _quests.values()). Y. U1 D6 w' U; k
- {% P) z5 D6 x( l4 T
- if (quest != null)
& @6 e+ h' e4 ?* a' L! e - {
; Z/ `+ _/ `$ L! d2 S0 @ - quest.unload(false);
) P0 i4 Q7 l" S- c; p% q2 y - }3 m2 J: m9 `' t0 z
- }! T5 j* R) T6 O
- _quests.clear();
, r4 b8 C; N1 J& |6 F/ h - // Выгрузка скриптов.! X1 s' ^3 X. b8 o R& m3 _% m
- for (Quest script : _scripts.values())- a' x9 l, b/ l/ [
- {9 x+ {% v) P, V% z) r5 d1 O
- if (script != null)- h1 _0 Q& |: r2 V. i# R
- {0 A; o: f, }" w. x; Z( [
- script.unload(false);
6 a/ q5 Y# {: @' N - }
5 l( a# q3 {; u5 C - }% c- _: h" J: _ h6 K
- _scripts.clear();3 \+ k5 J: [ F& A+ I( f4 w* V
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
9 \0 H7 Q% T) v
( R0 U P+ n# F, }! y. `Метод report()( n0 P( Z4 l0 d% r2 d5 z* K" N# g
% n; Z0 w' w! }0 ~3 {
- /**1 M1 |7 \4 J( i7 {2 q! t8 @+ `' R
- * Логирует количество загруженных квестов и скриптов.
) j5 o8 u! S) W+ m+ g6 C& r - */
# v7 F2 `& x5 K& h8 I, T% m - public void report()
]) v" S1 I H/ W9 k' }: ]. E0 m - {+ S" K- L* m( ] S$ b: a
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
' o9 `- H/ }9 m. W3 P. `. { - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
/ I5 n$ j$ D# E4 ^% \: F - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.) {( s8 b+ f& L4 r
C0 W; {7 j5 p2 z
Метод getQuest(String name)
: x( x& H6 O9 h, C# _% I( G, R' d% j
- /**
# a4 T8 S2 N$ `' |. v* D - * Получает квест по имени.
' B% B2 r& j: ?' D8 y1 @! z - * @param name имя квеста
/ o' M7 c7 k& T2 [* G2 X - * @return квест) ~9 d% R$ ]+ t5 r& W
- */ J# C( H0 w* a
- public Quest getQuest(String name)+ n D8 L7 `4 K
- {
$ w- g% y; @% Q; S - if (_quests.containsKey(name)); h+ w8 {2 W" y" v1 p
- {
% W/ c0 [, I* X) r7 e T - return _quests.get(name);
3 a' W- j; s3 m" j) I - }
% h$ E* k. p3 Z% G/ | - return _scripts.get(name);
4 P# N3 G; w2 f8 m. N4 j; N; R; X - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.4 \6 E; c1 u" f% Q/ H+ A5 @
# g& }- D! v% o+ i8 J3 lМетод getQuest(int questId)
7 W) h8 f# K6 E/ U1 Y
8 Q9 H8 A9 }) s, R! M3 C; ^8 A- T- /**+ M! f7 m5 ^( g }/ Z# A- C
- * Получает квест по ID.
7 V$ F* W8 _) n8 A! L' T# e - * @param questId ID квеста& J3 \! _9 O/ K# S5 Y0 h' e$ v2 h
- * @return квест, если найден, {@code null} в противном случае
; F+ f& M$ q0 }# m( k. k - */
9 {( e7 }2 l o& ^2 `4 q4 ?5 m - public Quest getQuest(int questId)
j5 K2 A0 E- Z4 |4 t% ~* T - {
& X( ^0 N8 q, L. @ - for (Quest q : _quests.values())
0 V& E0 {0 L6 O - {0 O: N' `0 h7 J
- if (q.getId() == questId): B" I- t, q4 ]) R- u
- {- X6 i/ A$ `# R- k* X
- return q;4 l* w/ n( H# g
- }
+ E% Y# g5 c& ]# A$ T - }
1 M9 D- m& R: k3 j* N6 a - return null;
( H t0 n+ x3 {8 z6 \; D - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
. N( B4 p: g" X, o1 G3 G/ Y m 1 G) s3 g9 h+ \( X9 }
Метод addQuest(Quest quest)2 R# _; G9 X* K6 }3 U/ l+ |0 r
2 }! I* d% J7 Z* ~- /**2 A; n$ V1 e, d3 C! ]8 ?, E) V6 b
- * Добавляет новый квест.5 C& M; U( Q. g) P
- * @param quest квест для добавления
- y0 J. v' l: A - */- q, T7 _4 g+ V, E! O
- public void addQuest(Quest quest)6 i1 J) D. D# Y. t& Y8 X' q4 s
- {& K# {# f5 b; V1 ^$ x: ]$ S
- if (quest == null)
' Z: X8 b: D; p) L. i6 a) O1 i - {
3 L0 t& E5 M' W5 A - throw new IllegalArgumentException("Аргумент квеста не может быть null");
& r" e2 m& {% s. s) x - }1 G4 }% Y" u( ?+ [: T; K1 R
-
7 f# n, q W9 i; ~: g - final Quest old = _quests.put(quest.getName(), quest);2 Y B6 R3 c: Z+ K
- if (old != null)
* d5 k8 b% Q U1 p4 Z( N K/ i: M - {% |3 N* F8 {: `3 B
- old.unload();
' V6 P' V" F8 B Q2 C7 W) j& A5 L - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");8 }) b" W0 e) {$ e/ H
- }4 c9 Z; W' c H
-
, ?. W: ~, t$ O% l - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
" \; P: h( g4 o6 n' L8 G6 N0 U - {8 d. c( I2 i1 T
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();, ^4 Q, m) {: H& \! l6 ]! l9 C
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");0 i7 ~ w6 i" C3 k
- }
: C+ {1 Y" d% y# ` - }
* w! W8 C5 O5 y. R: S - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
4 T% O% e. g3 C! {ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
% D" i; v9 n: u' b: ~/ L' G4 k; S, }* [* k7 Z. |
6 u: f" k* J* t# {2 f4 N
! \7 J7 I% x8 [7 F( `
|