Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
, v9 d( v r C: [) j& _$ ^; Q; @ [5 c' v: F
Разбор файла QuestManager.java m0 l3 H5 D8 H2 h3 R
5 X- s$ m- Q# f2 T; R: a9 Z _ |Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов." A. T0 P$ b, U
Основные элементы
1 I5 ^4 r6 U& H3 |, `- Лицензия8 l- _+ j' e1 b9 Q" k
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.. P- H' ^; g4 N, @; \9 ~
- Импорты& C; ~ ^1 ?- f5 ~* _3 R
5 w t, ]/ [( z4 U) M2 ^
QuestManager.java — управление квестами и скриптами.7 \: @! S/ K; }5 P
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\+ Q# {; o/ _9 f2 m; z) X
* q( T: p7 @" C) @, }+ o
/ U, I4 Z; o: V% ?6 Z0 r: u
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.) p) A! @6 a- F( X+ A! G
1. Лицензионное соглашение
5 Z& s, w5 y+ G# ]' X- /* r4 s) i$ K n! |' [
- * Этот файл является частью проекта L2J Mobius.
0 Y- H+ c9 @% U9 ] N6 O# _ - *
2 B& H( h1 o) C# U. A( X# ] - * Эта программа является свободным ПО: вы можете распространять её и/или изменять3 P4 O0 i. c4 M! C
- * её в соответствии с условиями GNU General Public License, опубликованной
. i! g0 i4 Y. e - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
4 R$ e: g' h) R8 V* O* L t - * . u2 @( `" n1 ~- I f+ R# ]) Q
- * Эта программа распространяется в надежде, что она будет полезной,. v* g" t' B& z( A- X
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии1 r5 i: L# ?9 s0 m/ o2 v
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.1 n, A' v$ }' \2 z4 x
- * См. GNU General Public License для получения более подробной информации.
- c' q$ h2 m% z% b9 O/ D: [$ C - *
; J4 B4 P- L4 V- o) w$ S* E6 c - * Вы должны были получить копию GNU General Public License' N0 u' y# ~: ?! A2 M
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.6 c& c9 Z! G8 {
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
. N; E+ C) d% m+ I! |, C% D
- [ ~5 B i" X) B% E& Q' n9 p! I1 }# s
2. Импортируемые библиотеки0 [$ E% ]2 v5 B! ]% g
Q0 X, E# r2 ~8 h0 E
- package org.l2jmobius.gameserver.instancemanager;$ t& P# |- y: U% y
& o9 H7 w! X% ~* B/ b) i k- import java.util.Map;
7 b$ T1 |2 Z3 | - import java.util.concurrent.ConcurrentHashMap;$ v# V/ T* K4 e' O+ x
- import java.util.logging.Level;4 `3 ^% W3 A9 w O4 J% P0 f
- import java.util.logging.Logger;
% L( z1 _0 I) @. n! \5 y - 3 k: T# h; L+ @( v2 m7 S, e2 i; ?
- import org.l2jmobius.Config;/ R, b! g' \7 u
- import org.l2jmobius.commons.util.CommonUtil;. L* B( M' B% R& Y( d; j
- import org.l2jmobius.gameserver.model.quest.Quest;
; [1 [7 h+ F1 b# q8 b% U4 ` - 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 — менеджер для работы с игровыми скриптами.
9 U) j0 o/ O0 F4 B: @1 }. I+ r4 j7 q0 @6 g
3. Описание класса QuestManager5 h) J% \/ ?" J) D7 H
- /**# E4 X8 P2 q+ w4 A8 N
- * Менеджер квестов и скриптов.9 O9 E, D+ Y4 e1 j
- * Автор: Zoey76" T& x7 g) N. s
- */
$ n0 \7 ?% E) V0 U2 y6 d - public class QuestManager3 `+ d4 M( K- z7 j/ x
- {
2 W: ^3 `" F% } - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
( m5 n: \7 t7 K5 _" z -
9 [) R0 I+ ]- b - /** Карта, содержащая все квесты. */) z9 p6 R2 v8 \! u" E+ k' _- v
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();- Y. o x2 N. O8 M$ N$ T5 q
- /** Карта, содержащая все скрипты. */
l( j' Y2 L; j3 K+ p) }. B- X" d - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
?/ C, \ T2 M1 Y* N! D+ k9 w -
% p6 m& T% e& D# ~( w) _" m( \ - protected QuestManager()4 |) t" T2 Z W) I0 [1 \. S/ s
- {
: h& C) {- t- p0 P" I& s. | - }
% f+ c, f% b$ C2 G' ?: U - }
Скопировать код 4. Методы: _ z) E2 \* Y: [9 k& R7 ?
Метод reload(String questFolder), k2 f& o1 ^: _8 y# a3 {2 i! g
- public boolean reload(String questFolder)
1 Q/ K: I$ T) s2 U2 g% ?5 t. z - {
6 b* `/ u0 B8 n2 }6 s - final Quest q = getQuest(questFolder);& p0 q' l6 o2 {3 J
- if (q == null)
( ^$ ]% J$ }' N) o7 n! a - {0 s* Y3 _: y; l/ _0 F6 J) E, s
- return false;; ]( b$ M, Z4 _) @" h# A1 k
- }
- q. c8 N' S# A% G9 Y5 [+ o - return q.reload();
7 P3 h# z2 d/ x! }& b) m! |* C8 j - }
Скопировать код
! V/ d4 a6 |1 R6 U2 A1 Y8 C3 |$ \' z& R3 n* l
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
+ l: F( _0 v, l8 V7 v4 nМетод reload(int questId)
+ i0 n* h% q$ y/ D* r5 J2 b v& b& R! R+ p) b/ } p7 r+ G6 w
- /**
* V. r# @8 m" T% {+ Z - * Перезагружает квест по ID.
, ]6 g' i" Z* v: S0 G - * @param questId ID квеста для перезагрузки
# D- B7 @7 m l: j0 C4 m) y1 I0 Q - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
. N W" }! H& k7 x - */
8 O: W+ m8 G. Y* M Y% ^" G( P7 ?6 { - public boolean reload(int questId)! |7 c) g" T% d/ |" H
- {1 b' E& f" m; |
- final Quest q = getQuest(questId);: ], {, ?, f0 [
- if (q == null); \; M( t$ Y4 ]' k: r, s
- {+ A O2 V4 y9 m1 H" S2 {; v
- return false;
. h0 P4 _: S. t% z, @% N* y - }
% _- \$ W* U+ i4 c/ S1 c# M - return q.reload();
4 n3 n7 q. A9 }1 H0 y - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
2 e6 |0 T% t2 F2 o/ P 7 ^) R# B: k3 f. R, }: o
Метод reloadAllScripts()/ M6 g4 G1 p6 u5 A
; N/ L* b! |1 d) P2 P( O- /**5 {3 U$ I" B, l
- * Выгружает все квесты и скрипты, а затем перезагружает их.
" ~4 w: n" A, I; X9 Q9 e* S7 C - */9 m1 j1 ^$ V4 n8 u; `; \ W
- public void reloadAllScripts()
/ g" L% S; K v - {3 c! ~1 I3 Z2 i2 ^8 l, }
- unloadAllScripts();7 d6 n9 |2 u. D/ g
-
$ _7 C9 ~; ?- V h5 C- x - LOGGER.info("Перезагрузка всех серверных скриптов.");
) G; m! J1 q4 d6 w8 K* G z - try, t# J+ P5 }- y I" Z% p3 W
- {( @# ~0 {1 n) a7 W( c5 q+ q# k; w$ C
- ScriptEngineManager.getInstance().executeScriptList();3 j3 w- q4 y D0 F
- }
* A: {) {0 M7 |$ k - catch (Exception e)
+ R# F5 y# a$ P& G' y1 k - {
/ Y" ]% Y8 b, V: F+ E - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
; @% P2 v! b" M' }5 x/ ~/ A - }" Y& }9 u; D0 P% H, T! k5 i
- 1 Y8 V0 k, S+ d4 g4 B
- getInstance().report();" @( |; o6 f/ J. U' e ^( Z7 I
- }
Скопировать код Метод unloadAllScripts()/ M" O" J% s% K1 B' d0 I
2 ~% a0 `0 _: h5 x/ g" Y- /**/ i8 l" I' |. I0 ]0 V; w
- * Выгружает все квесты и скрипты.
+ G$ p% [- a9 n! H0 X0 Y - */3 u: U. _& t7 U
- public void unloadAllScripts()
5 x, C$ a1 V+ Q. N3 ?' U% ~3 K2 | - {
! ~" @* j3 @! f% b - LOGGER.info("Выгрузка всех серверных скриптов.");5 M; q) G9 g$ q5 Y: E5 A6 v
-
$ q) G9 \9 m0 A9 i! K - // Выгрузка квестов.
4 }" F& s& o! x) P1 T5 z$ ~8 Q0 M - for (Quest quest : _quests.values())
; W9 } p/ {% C7 Y9 I - {& l, ^2 b- o j" c( ? c
- if (quest != null)
- d% c6 h! V% [. o - {
2 m; W4 R( k8 \2 R$ A1 Z - quest.unload(false);
w/ | e1 }3 P, O- ]3 A - }* r9 F! X0 b& o* U' ]
- }0 D2 d% {; @6 g* I" u
- _quests.clear();
8 R$ B8 B* y6 {. T! E @ - // Выгрузка скриптов.% ~- H( s' Q$ D9 ]" y: {
- for (Quest script : _scripts.values())
5 B% V( m+ r9 ?* Q R - {8 [ U* H y+ K& ?) T6 g
- if (script != null)* U# `, Q$ B. V$ j0 I
- {
$ D2 v+ | i/ o5 Q6 c, x - script.unload(false);
/ A3 E$ \$ L) U0 M9 b. B - }+ A9 W# E( V1 R; ^
- }
. ~) U" L9 x5 @; b: ?5 z - _scripts.clear();# e O) k; M' g0 ]
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.6 s% z2 D2 f# ~) o0 N* O6 c0 W2 Q
1 Z7 S; ~* z: z- ^, S
Метод report()# ?5 y8 e, W' b; |! d) u/ h
1 V3 ^1 L. q3 v9 Z$ L- /**- G* H c# b, q$ W2 u# W- f
- * Логирует количество загруженных квестов и скриптов.+ k( G7 a$ y# f: q! \: |3 _8 _
- */' ~0 ^7 u1 }7 w3 I9 y% F
- public void report()
7 M* z ?2 I& @7 j8 G- K - {7 [: R+ l8 H- l1 i a- o) k- r
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");$ e; B0 J% q/ e: d# [
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");* h; Y- z- w$ L4 z
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
8 v9 q7 U2 Q" q0 r2 \ , p3 e& j: j0 B& V; z4 U0 I% j0 B
Метод getQuest(String name)' E0 F0 f5 `$ g W% ~
^" |& F& U% @; @- /**
3 u9 W' Y& W2 `6 V5 C( R - * Получает квест по имени.
5 P0 K* d+ G. c* U9 O+ K; c - * @param name имя квеста
2 \: _; ?2 K0 Z' s - * @return квест# S$ c( K" M! G5 X) g) |
- */' @* i/ z' K- v$ `2 _# I
- public Quest getQuest(String name)( U5 D. ~! I& d- l0 ^" l$ w7 p6 h
- {
7 j: A. K! \) }# I - if (_quests.containsKey(name))
$ p* D# {2 }1 z9 K/ @ - {
. H# X/ N1 K; N/ b - return _quests.get(name);$ _* I: D! B% b0 A
- }! @$ y1 P" y3 U9 x5 E* o, c
- return _scripts.get(name);$ A! \5 s; x( ^
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
" m. X# F$ X; u7 z7 }) t8 { z / T! s1 r! D2 e3 J) Q" R
Метод getQuest(int questId)8 Z7 J( `( D- x
& |8 h3 u' A2 P3 r
- /**! Q4 H# q9 g4 ]" ]( P! @4 q6 X. z8 P
- * Получает квест по ID.2 E* T9 N6 [+ G: S5 ^$ a
- * @param questId ID квеста
* [3 q4 Z1 s. \& ` - * @return квест, если найден, {@code null} в противном случае
9 f) ]. W1 E* s- O! l - */% L8 S; ^5 I; g0 A' b
- public Quest getQuest(int questId)- q$ `9 a+ f" P, {8 c
- {" q3 t9 b2 F! g, s" F/ q b
- for (Quest q : _quests.values())+ a8 Q- i" N' V7 w+ F/ e" {5 ~
- {3 |% w% M, |! b" j% Q) X
- if (q.getId() == questId)0 _' t, ~: F2 E+ B- U$ y" h ~# x
- {6 c# q; R" I- L: b. v6 {3 Y
- return q;
( s- o5 y, S% ~6 Y4 F$ z$ N - }
. r) Z0 O U2 ]$ I5 \( B9 i - }. ?/ A. S0 ?/ K! r* o( N/ ]# U
- return null;( E: D8 t" p3 `- M& N
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.2 l* e- Y& d! }3 p
* @3 \/ |/ X: F2 o$ o9 Y8 ]
Метод addQuest(Quest quest)# a4 X* E- Q' l/ _3 x
( z1 u- |( V* T. z5 G/ f- /**
z; Q8 y& E' W% i9 B0 L" c3 o& } - * Добавляет новый квест.
* w' X- s) ?- _ X$ i( @ - * @param quest квест для добавления* X- v! {; `& B
- */
% o. K3 p' g) d& c4 K& u2 q; D - public void addQuest(Quest quest)
: s y; }9 G, w' Q5 f( A5 G0 q - {& P: Y( \6 a; {6 Y! F
- if (quest == null)
% P! |/ g2 D6 n - {
1 n6 m: X0 T7 u, f! }0 @6 L - throw new IllegalArgumentException("Аргумент квеста не может быть null");
# r% ~; ?6 X. A0 n' j: W2 X - }
- m. E& [" m2 X4 U - 7 H: [% ^$ M$ |, ~
- final Quest old = _quests.put(quest.getName(), quest);
2 }1 {& j* I5 B( Q# u - if (old != null)' I. c" ^6 X: V, H1 k; m' x
- {6 [ C+ P7 [7 j7 u5 U, _4 N
- old.unload();
+ l; G' `9 r. Z& v _+ m - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
9 r: b \: g4 L+ W - }, q8 P }) O3 x5 ]. l
-
- K2 x! V6 l) N, I8 W - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)) q' k8 Q0 o. F) u5 r( @* N2 M
- {( a9 a9 a% H2 X, w7 h$ Y
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
* O' I, z! q, c% x5 Y - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");# k. g7 e3 a& }: W
- }" g1 K1 Y/ a0 i5 p" f
- }
# z& k7 ~ |" p* d1 F5 Q! { - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.& l( g# o, [2 F" m: m9 z8 y
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.8 x1 X/ S8 v! k3 r% H! A
: J' v: k+ g$ M. _# {& |3 l8 x1 b
& n5 ~# L+ o# O
|