Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius, \* k! t0 A6 [% q
3 t# C# d# K3 a9 e+ Z! MРазбор файла QuestManager.java$ j& L/ M; V% z6 s! @- \9 @
3 i8 c3 v I" l$ T
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
" j5 z, b1 t. N5 z) J% lОсновные элементы
) Z4 q$ e+ ?0 O/ [& D4 \7 y- Лицензия1 E5 {) |" i9 U7 C2 p! L$ f2 g4 a
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
( _: T* t3 \6 Y! _$ Y9 Z. q
- Импорты% {, ?0 K; @- A
2 J+ x! s/ A# r9 x+ Y% JQuestManager.java — управление квестами и скриптами.& U8 x+ z+ a I
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
5 g7 l/ J0 [+ u, G2 q1 n8 l5 h9 O- y0 X- x, ?. G: Q
- `& _0 m: t0 U6 _% XДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.8 Y! L* J0 B2 W7 u* \" T/ R
1. Лицензионное соглашение
" O# L# R3 E: A4 X- /*
# S2 ^) R1 R9 Q+ B+ }& o& ? - * Этот файл является частью проекта L2J Mobius.
3 ^2 r; K$ J# D' a - * ( p; [$ [" P) g3 u$ s" F& d
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять* |7 I4 F' H; F% X- `
- * её в соответствии с условиями GNU General Public License, опубликованной
/ P. t; e3 Q. ]: F& O) x7 |1 J - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
* `( `, d; g( G- g0 G7 Y) E - * * k& P2 C9 F+ n( Z- u
- * Эта программа распространяется в надежде, что она будет полезной,/ K$ x+ |- {2 E; ?; B
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
$ n* j# z" O5 F6 i1 C$ ~ - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.: ~2 C4 O8 q. l% M' e; x0 @8 }
- * См. GNU General Public License для получения более подробной информации.( R: l# j0 X. L4 R
- *
7 ]$ Z( X' v9 H# J - * Вы должны были получить копию GNU General Public License
# {- R. }0 c$ |. V' G, l9 W - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
* E. y7 H P5 v' G/ i6 b - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.# a/ _( K9 g) q K/ U y
- a f1 Z+ ]( F1 A# F, v
8 v2 d7 ]$ O( q% z1 t( U$ n% \ c2. Импортируемые библиотеки
' b l e# y, f
# k2 [8 [6 }! A* |$ |- package org.l2jmobius.gameserver.instancemanager;: E, D( s2 S; z3 N8 T% r( z# D
- ) D- d) D! b1 I9 g/ _1 [
- import java.util.Map;3 z3 \+ c d/ E! K m7 F1 c
- import java.util.concurrent.ConcurrentHashMap;
! Q1 h; {# q1 t0 y) ^4 N/ U - import java.util.logging.Level;
t9 U3 |1 \9 h# C5 o - import java.util.logging.Logger;
) D1 M; H( b" \2 ~" a" Y
2 b4 e2 R* A$ W/ n1 L# L7 H" G- import org.l2jmobius.Config;
7 T$ C& Q) n: D' f8 b8 z/ M - import org.l2jmobius.commons.util.CommonUtil;
$ l' V. S4 p1 T9 j1 ^ - import org.l2jmobius.gameserver.model.quest.Quest;4 c4 d8 m) q) T" r+ E
- 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 — менеджер для работы с игровыми скриптами.
0 G T) M- {) @ F
3 y; l# l- b% _* l* D3. Описание класса QuestManager
( c& \- U7 p9 u$ n+ X- /**$ g, V+ B7 u. b. \7 O
- * Менеджер квестов и скриптов.
0 C' C8 M8 d6 p - * Автор: Zoey76
; I. n4 f, U( P& X3 x& r - */
- L0 H* U6 T/ M; ~ - public class QuestManager' u9 P8 Q8 @0 d6 s; C) G0 ~) E
- {3 W/ l7 W8 d6 R$ l9 K( {
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
2 f% s; G8 [9 G6 e - 1 p0 e, r4 v" E, v+ S7 o( o
- /** Карта, содержащая все квесты. */
, M( `/ b" I. h! F$ Q6 r - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();. f8 k: A. m: o
- /** Карта, содержащая все скрипты. */
& \# O+ m# _2 J A. V7 i - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
|; `, d! }. {/ J, P2 Q7 ~ -
j2 Q+ `/ a5 G8 C0 r - protected QuestManager()
9 d+ B: a) i. P - {' l! r$ T" t5 ]% ]+ P. Z
- }5 y) ~" v Y( Y3 `8 u
- }
Скопировать код 4. Методы$ j( a0 Z+ m% {, l% c* ~. }# c# r
Метод reload(String questFolder)# o# V' b: M# D3 Q5 [
- public boolean reload(String questFolder)! \& S1 U! t' {& g4 Q5 S) Y
- {& K6 K9 \4 L/ d! a2 U
- final Quest q = getQuest(questFolder);
5 ]$ n( o* h- i+ o& r - if (q == null)# r* V8 b/ k( Y5 f9 i
- {
/ Z& U# o* D7 Y% [5 E1 Y9 O - return false;! r, Y) m0 \$ N& Y1 N N
- }
8 B- z1 p5 `* Q1 O' d; k9 M/ H - return q.reload();3 R, H0 r/ v' u: n
- }
Скопировать код
7 L/ \) D; D" {, J2 l' y9 o* Z2 A4 H. [* b1 B4 m, Q+ R
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.& G6 Y0 q& K& \+ ^4 Z
Метод reload(int questId)
& ~+ W( Y) P, ]8 F6 j# U. ]6 q) Z6 u0 ~0 s: j
- /**
$ U- `7 U. @" d. X - * Перезагружает квест по ID.
, b! m5 O; I8 s, z5 J# z* H - * @param questId ID квеста для перезагрузки
9 a; ?( s0 I. ~& ]; R6 i - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае. N1 a( R0 ?3 L# ]
- */
$ S& i% r, q* z6 \ Z - public boolean reload(int questId)$ y' m; k5 B& E6 L/ f
- {: @5 S9 n$ w; R, w
- final Quest q = getQuest(questId);, [ Q3 z& H# l/ q4 }
- if (q == null): Z' V$ L, X1 P& ?# K
- {" x% |; g% [3 P) r
- return false;* u5 Q. s7 m( o2 h
- }
) E1 m/ z. R$ o; N" m9 d% Y9 { - return q.reload();
6 F6 _! m+ }: h( D1 @; ?! c - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
! F; \, p' H1 i! l* I1 Z1 z 8 a$ A( [! m! |8 ^- u
Метод reloadAllScripts()+ h1 g1 p3 _. x% I9 O( l4 R3 z3 B0 {3 j
" V! Z0 a% s- b! |# |) i
- /**9 x: }( T& p! Y) v
- * Выгружает все квесты и скрипты, а затем перезагружает их.
' i" H. Q1 r! m% e% R - *// m/ A) ?9 L! z4 t" V' u1 F
- public void reloadAllScripts()
2 I. u% q8 B0 A. J4 j - {
0 G: |! p! _: \9 b" A - unloadAllScripts();
" y( i) `! \! w/ E! x4 ~: x -
6 H8 M; {9 U: a' C7 [2 ~6 E _ - LOGGER.info("Перезагрузка всех серверных скриптов.");" C/ B6 ~! s% h: ^
- try; h( n0 ^& a6 n& c' W* g8 `
- {' }; S! q: w' v' e
- ScriptEngineManager.getInstance().executeScriptList();
2 A4 Z4 I& F) [0 c( M - }/ U5 v) }1 p1 M8 S* ]! @1 o% S
- catch (Exception e)
! n: ?! P7 v/ T+ P+ V* B' {: q1 @( G - {( z# Z) G$ Q5 Z9 [1 ?' H) f, `
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);# \0 e% @( \* W8 Y/ s& O# C
- }1 `) `! M/ m( S) P# N
-
/ J- T, k3 `0 [" B - getInstance().report();; T0 s% C8 B( D% l2 x: z( O
- }
Скопировать код Метод unloadAllScripts()
; a- H) a8 I! M9 o! W" @/ T1 _
/ \" i- p8 G& r# p: q2 K* V- W- /**
+ [! {- T7 r! m - * Выгружает все квесты и скрипты.
; O6 L) S" r% A/ e8 B/ t1 d* o9 O - */
5 a2 S% }/ f5 Y7 [ - public void unloadAllScripts()4 {# }# S5 j4 a& X' r$ t
- {) B* X; w/ n' {% Q' k
- LOGGER.info("Выгрузка всех серверных скриптов.");% [$ @# `" G4 r( @( T
-
' ?# \- {" ~: Z, w) g: X9 d - // Выгрузка квестов.
5 N* e. ^6 P* P. Z - for (Quest quest : _quests.values()). |- ^3 f- [( u: l, F1 Z; @
- {
' g9 {: ]$ h0 F$ H% S! V3 O* K# t; g2 ] - if (quest != null)
$ y5 U" `& W3 i6 N; I - {
4 a0 B- D/ ]. H' O - quest.unload(false);% Y1 \; G: I$ ?! r' E0 y- K! t; U
- }% f; _9 j4 A; V3 V
- }! V1 l( n+ G% r7 W3 p
- _quests.clear();* m- o/ \. c0 Z8 _' [
- // Выгрузка скриптов.
( x/ i- `5 P$ d - for (Quest script : _scripts.values())8 t3 A* P" e4 d C- r4 A
- {+ C9 H* v" D8 V2 h% K& I5 D$ z
- if (script != null)
3 q/ z R& A& o5 ]( U: f& R - {
4 P+ {) C8 J) d: J! I+ Y' m" S - script.unload(false);
* U# C; j6 x" j' G' m5 J - }
9 P- U1 F, r) k& F* E5 q - }& S& d) t& s% }; P
- _scripts.clear();
' S; q' h7 m0 q - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.5 B- X( F! \+ H: p. r
: l% a& @" s+ Q) T
Метод report()
! O _ _( \6 y5 M" S
1 j" {( b6 d9 l5 N" k- /**. \) X3 E/ ?* C7 p! g% q: Y8 h
- * Логирует количество загруженных квестов и скриптов.
0 z) H. _7 p0 x& G - */
( o; Y3 z1 l: o9 ? Q - public void report(): e5 _5 g2 ?+ l$ B: k q
- {) {- P: t% c; ^
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");- G' H) D" e5 G& k, X. R
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
* O: P1 _: {8 E - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
" ^. t% N$ g" C } ) U7 U: E5 ~0 L0 s, A' e- |8 L
Метод getQuest(String name)
4 y u. n) \5 Y% `; f G7 i1 {( ~5 L/ W; e& i- M3 g
- /**
) [8 R) p( {& q# V3 v - * Получает квест по имени.
! N" A" f3 A6 P- H3 _1 R - * @param name имя квеста- J# D k% T- g- C4 t5 {9 u
- * @return квест4 n! v; A# W# u* u j- A
- */' P- z! s2 ^. B
- public Quest getQuest(String name)% r% ^# }8 \& K! l$ R' B5 T
- {
8 L, }& J. W7 m - if (_quests.containsKey(name))5 m! g# {- W5 _9 }1 l
- {
3 y7 a2 g k: l' [. }; n - return _quests.get(name);; t! _' L1 l' h' M
- }% Z; `+ v8 T. P A5 v
- return _scripts.get(name);
$ T/ Y% s1 q; `2 g# V3 o1 l! N: f - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.% @6 X' j" C2 c7 {
, p9 u# t3 o5 u' U) F1 d( o( C. l; e
Метод getQuest(int questId); L; n# O ^' j# A! ^; C
" D! s( v3 o* G& } f- t- /**
0 P5 S, G) J; p r - * Получает квест по ID.
$ l7 d3 k0 v" [, e( K - * @param questId ID квеста0 ]1 ]. Q2 q! W1 I0 j& R9 ]
- * @return квест, если найден, {@code null} в противном случае
8 X H/ T" a$ x% ~8 @ - */: P' v' g+ z$ Y( h3 t9 Q5 x3 l( K
- public Quest getQuest(int questId)
# x! F+ q9 H' O- A% {2 V - {
1 j% n3 b* x0 x - for (Quest q : _quests.values())+ u" S, `3 W1 H- \3 T5 I
- {
1 d! q( h8 k3 Q) K2 v K$ m% b6 T - if (q.getId() == questId)9 A2 y: @* v- j" t$ f$ V8 V7 f4 A) l
- {) R2 v% M0 D: u- b* S) T* C0 E
- return q;
% K. B* |' q: J6 k5 ] - }" N% B$ J4 d9 ^) K4 N$ \/ v/ S4 J& g0 ?
- }' _. _6 b$ M/ A$ y
- return null;
1 q1 U/ ?7 z5 Q - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.$ s0 X7 d( p3 H4 i
. z3 H/ c# R+ _% W( _2 M
Метод addQuest(Quest quest)
& p' p1 q7 J, ]1 \4 D+ [3 c t' e
3 a. [0 \) P. V8 s2 Q# G5 O1 j5 r- /**) x( y& ?9 r. }# f
- * Добавляет новый квест.
+ D: q/ m# R! _9 f2 Q+ ^5 J" M - * @param quest квест для добавления" t/ I6 G1 q: ]1 |1 p
- */2 s4 N$ V+ p) Z% B3 G- I
- public void addQuest(Quest quest)8 v/ N( E3 v; ]8 E
- {
+ X. `4 W( |( I7 I/ [+ C2 U8 A+ f - if (quest == null)
2 M8 J X8 b5 O* |# D' Q - {7 F# u c- i: n8 Z5 a
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
* } q+ P* V- C+ O; r - }: m3 x7 \4 b) C' u7 s
-
' Z9 p9 a. t4 F8 `4 @ - final Quest old = _quests.put(quest.getName(), quest);
) y* _9 J" b7 F5 G - if (old != null)+ Z2 ]) o+ g$ g- v$ Q
- {
" M/ l7 r! ^# d6 d: ] - old.unload();' P) d6 h y% M i% o+ r0 I
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
8 s0 ~6 @5 h% J5 c7 \! u$ D - }2 K8 s, B) P; @$ h; f1 H% j
- . ^1 i% O4 }2 x8 P/ W r
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
5 y# k$ A% p' A - {/ D; ~1 M5 V( \9 F
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();1 Q6 U8 Q& q8 m2 G- e. D P
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
( h: i' W6 D: S$ M8 R; `) h - }
" b. ^% W" {$ M5 q' Y1 P - }3 e Z/ p7 X9 ~1 i5 |
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.5 {1 h/ t1 j5 B* z7 c
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.+ A& D3 L* B1 ?* y, j( z$ \4 M
! l8 \" e* ?$ s4 y
6 a" d% d1 M; i6 `( e* I
% C0 J$ O, u5 v0 D |