Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
' ?$ ]4 y0 m0 F$ F5 v; W5 j9 I$ J. |% h# t5 `$ c5 R
Разбор файла QuestManager.java6 m6 J2 i' z6 t4 s* Z# J* N) J
2 _* _5 l8 a' G; W8 n5 T# _' P3 uЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.# ^. H; j0 p: `/ I% g, G
Основные элементы' t/ Y9 y# g9 x, b8 {
- Лицензия
: G+ K4 @) C9 k% e3 q% A- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
. n, Y; ?5 z& Q% Z
- Импорты
8 O% L! t1 a" h6 ]9 {1 x) q
1 T) O8 u) [% N- B. Y' k7 t' TQuestManager.java — управление квестами и скриптами. [/ y% _& w8 \; E3 |. ?) Q
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\4 f& j: A A# o `1 Y
: K2 @" S! Z4 h& N+ I
9 M4 g) p9 W& I6 `. k8 fДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов." E$ i2 Q8 O% [/ ^2 a/ [. r
1. Лицензионное соглашение
% N( J+ e U2 Z5 A5 m- /*% n9 K0 V0 X! E" R3 A, ?' |
- * Этот файл является частью проекта L2J Mobius.' b/ j1 Q8 A0 O
- *
2 |! n; j* [/ t3 B* {& P- D0 c - * Эта программа является свободным ПО: вы можете распространять её и/или изменять% ^+ T- J- g1 x6 q# y+ _1 M6 t
- * её в соответствии с условиями GNU General Public License, опубликованной
8 V$ ^4 h6 x# V) k, K. Z% Q+ ? - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.+ y" v( ~) _$ j8 W$ F/ ^4 i
- *
! }) C! u. E1 p; u- e - * Эта программа распространяется в надежде, что она будет полезной,
2 o' }/ H$ A& n U1 I! ~! p - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
" w; \0 A5 w& D! B+ N3 g; x6 [; j* D - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
9 ^+ q, }) }" T9 d) H( s7 g0 X X+ e - * См. GNU General Public License для получения более подробной информации.
9 I5 v+ E& ?3 N - *
6 s. E! d% @/ [+ a - * Вы должны были получить копию GNU General Public License, \3 X$ e: N! ?" l# b2 U
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
3 z4 M6 G2 H! F - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.: K8 l8 |8 z8 n, X0 w( K
' q5 g8 ]& }$ j
4 c& ]/ K) T$ q8 I B
2. Импортируемые библиотеки
' d% g* B! R# s
) m: |2 [" `2 |# k- package org.l2jmobius.gameserver.instancemanager;
- w5 Q3 o7 R6 Y' Z! W4 {2 z - d; g+ Y8 N5 p: C% U7 O
- import java.util.Map;7 _4 O2 s6 K: f! Q8 ?6 M4 ^3 e1 T
- import java.util.concurrent.ConcurrentHashMap;
; ^0 x' t# D: l# t9 e* R8 K3 A - import java.util.logging.Level;3 T; K$ O1 p( Q9 T7 F1 Y. a
- import java.util.logging.Logger;
3 C! o4 Y+ a1 Q X3 z9 h - 8 b4 i$ W8 K2 P3 W# y+ l
- import org.l2jmobius.Config;
/ i& \$ S1 ]. p9 o7 E# p$ T - import org.l2jmobius.commons.util.CommonUtil;1 Q$ J9 y! x, E( [( r
- import org.l2jmobius.gameserver.model.quest.Quest;6 t: G# j! Q d6 U4 Q
- 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 — менеджер для работы с игровыми скриптами.1 t" f) z8 z/ D& X7 Z/ f
' U+ Q/ H2 [4 s
3. Описание класса QuestManager7 ^! m# ^6 _6 k4 E2 }; C
- /**
5 e. Z8 v, F' R7 i) ?6 U( [ - * Менеджер квестов и скриптов.
3 M6 R1 z% x- c# q* F5 `+ ] - * Автор: Zoey76
) H# h7 I% `% W, v3 @ - */
, o8 k9 U+ h5 L; O m - public class QuestManager
& z; w i' K! e$ W' } - {
% |. m# `1 }, F - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());4 t0 f8 _) M% g* F8 m6 y
- , U9 \# J0 w/ s/ j/ m
- /** Карта, содержащая все квесты. */* W- ~7 d: F. d+ u; g: L8 f& Q, C
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>(); Q/ }$ b/ ]7 ?: G
- /** Карта, содержащая все скрипты. */
6 H9 O- G* w! Y8 [ - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();9 J3 C. d2 |, J6 k+ S7 {
-
- P) Z+ B1 z6 H; \! x5 V* [ - protected QuestManager()
* N$ R7 K; X$ U6 s5 ` - {
, C1 p$ i0 F; C1 ?) K" b - }
' d) z+ L" A' ] - }
Скопировать код 4. Методы
/ V- J a& Z' u kМетод reload(String questFolder)5 I7 r" w% a. g& K
- public boolean reload(String questFolder)" O1 i1 |+ m6 j m/ U7 T2 C
- {
: H6 O: a' s$ x6 n1 [. Y - final Quest q = getQuest(questFolder);2 r# ^; d. C3 l9 Y4 N, Z6 l1 S
- if (q == null)
! A' Y' v/ { U1 H. R% A" v+ b$ J - {
9 v; K t% B: }: T) o - return false;
- F/ a2 k& q! C3 ^! H3 m. t$ I - } d( D, u X4 T H1 n! f
- return q.reload();3 w; {/ x1 m: ~# \5 u1 `
- }
Скопировать код
/ K. |3 U: e7 w& u! X1 K
: P5 W# I0 n {7 m' a0 DМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.3 n$ T, T% E9 |
Метод reload(int questId)
# P, c; E; Y0 W) ]8 w! S9 ~. |" z! A3 J- }1 O2 t
- /**8 S/ c3 o Y# p& C9 Z
- * Перезагружает квест по ID.6 i& o& @! Y! s1 A) L' L
- * @param questId ID квеста для перезагрузки; Z4 l: |$ @+ A+ x9 @
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае" k# o1 m' L$ }" Y0 O
- */
2 p# a6 ~3 o9 _ E1 Y - public boolean reload(int questId)
- n/ y% g p* S6 T K. Y# H - {
" C2 }1 f& s K- i i6 u5 k - final Quest q = getQuest(questId);
# H" ~7 y M2 s - if (q == null)7 B: {: i+ T# u# b) b% ]9 w
- {
' M/ y/ r! o8 a3 |' ? - return false;
2 z. b! c5 o" I& Z; G0 `1 Q - }/ [2 O- l) ]9 M- J0 U9 P# K' d
- return q.reload();1 ~+ }7 }2 p, b) l/ \+ ~1 M
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.- m) p% I( w; B N# b( B
" Y: f% K8 t2 Y7 r% G: Z! c: XМетод reloadAllScripts(). r& m6 [, t7 Z, ^
1 H! a, e7 X/ g- B# f4 V- /**
; J9 B& v5 t4 y" h0 q4 I - * Выгружает все квесты и скрипты, а затем перезагружает их.4 C: E; Y# D( T) ]
- */! m. Y: q. h! M! t+ ^
- public void reloadAllScripts()6 g! r8 P0 f- M* ~
- {
) T6 ^7 Z* t! l& k8 v; e - unloadAllScripts();3 x6 U3 p: k7 }
-
1 ^* x. r- T- v* e9 i* O - LOGGER.info("Перезагрузка всех серверных скриптов.");
0 V1 P3 c9 i+ Y% N3 O, Y! @ - try( A) L. ?! o& \6 P
- {0 e% Z# S; Z# c! D. p+ c8 n, z" w
- ScriptEngineManager.getInstance().executeScriptList();3 G/ `. _8 T, I5 {! {) Q
- }
- p' r6 X# p+ w- S# r9 E - catch (Exception e)
1 P, x) J. }% \ - {/ t' P" W8 P' Z2 _+ _1 @
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
( @3 C# n, F" s1 m - }5 F. ^( L; F. c' q% `1 V
-
- z# Y @% b- O" E; p - getInstance().report();; S$ {# V) M1 C9 Z# b& X2 V
- }
Скопировать код Метод unloadAllScripts()4 M6 ?/ ]* `2 v' u& m" m+ u
) V0 N# b- y z8 t0 E. K$ Q
- /**& q# ~# z' \; O! m' C; ~+ n/ ]
- * Выгружает все квесты и скрипты.; M" J( J" I5 T; f/ r- c) N6 q( ]
- */) W9 g/ ]8 q' Y: q; Z# k6 ~
- public void unloadAllScripts()& i U. E8 _) N5 s# q3 v+ m% s3 ^ \
- {
: X, c- l- T3 N% f. j( C5 J( ~; k - LOGGER.info("Выгрузка всех серверных скриптов.");5 a8 ?1 }: f: J$ J5 N8 G
-
. f5 Y1 h! Q5 X" l - // Выгрузка квестов.
# l" c% F' B: R. r. [ - for (Quest quest : _quests.values())% f& a/ T; J1 {9 K8 |; _% d& J
- {
5 B$ r7 m0 F* U; M0 m - if (quest != null)
" P* O; h0 z8 ~5 N - {1 ^2 o7 \: a, M! q: ^9 T6 c
- quest.unload(false);
6 u5 z7 [3 S( C6 F( B9 P - }
9 f$ r8 o8 k$ K6 c - }
& v% k8 O c m1 O - _quests.clear();
5 o2 i7 J/ E# e3 L - // Выгрузка скриптов.* Q) s) K$ w% L9 Z" X
- for (Quest script : _scripts.values())
6 ]8 I, a0 Q# A! Z6 C, T - {
& v: B$ [: E. ?' W5 o7 O6 [+ i - if (script != null)
4 O2 D5 Q* W/ ^7 g# e5 ^) K/ y5 ^/ o" J - {( A+ i+ s1 P( X6 f# U
- script.unload(false);+ N+ A1 O& V4 Q3 M' e1 N
- }3 s3 e+ [& M) d: Z. `+ z5 j8 T
- }
0 F5 e8 l- f9 H2 v2 P3 u: a7 F - _scripts.clear();
, B0 ^4 ]" x9 | - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
+ X. M7 X2 r# B+ S; ~ - t0 S) d8 d' d- L
Метод report()5 Y; i/ U" Z e8 R% e* R! q
3 q2 ]- E' G4 z+ k& L& o; i- /**6 h! s s+ {/ z4 [. l
- * Логирует количество загруженных квестов и скриптов.
9 ^8 D' q5 g1 H9 g& d3 b$ E3 t3 ] - */
1 i8 Y/ p2 M% N, T7 R8 v1 |" d - public void report()
/ J8 w/ I$ V7 Y5 W! W$ u - {
5 F* I j. [; V - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
; A( Q0 G+ X) C3 [; F - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
2 ~0 l/ Q: } a9 i; n* W) @ - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
; i {" l0 ?2 K3 l, c1 t# \ 1 M R5 e$ n& P( E* y
Метод getQuest(String name)
, w; `. R! V. G4 P" P$ E$ z: ?% f
7 @% [ {4 ^' n* u- /**
9 A& Y( T( a9 b5 b4 ^7 l) x- L' W - * Получает квест по имени.
' t$ s; T" H/ S; Y" l - * @param name имя квеста% Q9 m% i8 j4 k# k9 q' |
- * @return квест
4 I/ m ^! K" Y' V - */
' H8 P! A4 ^4 m: C- z - public Quest getQuest(String name)
! M6 B2 D6 x* J6 Q - {
% t* E0 F8 x3 l- Y2 d1 j, W) H% X - if (_quests.containsKey(name))) A Y5 Y S9 R; G' G( f7 T
- {4 E. x" S" M, P; L7 t
- return _quests.get(name);( t! `. y' z' N- F1 \' U- z5 z7 V
- }
% Y: i' h; n/ p" `, o- T4 v - return _scripts.get(name);
) h- ^6 W, N5 E& B' I6 | - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
7 Q$ n3 P& {) Y' b6 K
6 v# G, X; ~- `5 ~0 T! E& wМетод getQuest(int questId), r" |2 r) b8 d% Y- c( X
; O9 S. ~8 r& z8 `! p* C: m2 x
- /** W+ m2 b8 a9 X8 @7 ~0 G
- * Получает квест по ID.6 C& \1 ?# f) v `' C/ z6 J z' {
- * @param questId ID квеста
1 X" O4 _3 H7 M: w* O - * @return квест, если найден, {@code null} в противном случае
/ _# f8 L# m0 f( [3 Z5 @ - *// }! Z6 c7 ~0 g- G+ m5 A4 V
- public Quest getQuest(int questId), Z0 v" r4 b7 \
- {. G7 A" l r3 {
- for (Quest q : _quests.values())1 l! q8 Q& p2 V
- { x' z' u4 ~2 [3 X& O7 I4 \: \7 @
- if (q.getId() == questId)
. ~$ r% y2 N7 K% Y, T# L. j) O$ ?/ S - {5 c2 ^2 D- ~. l* m8 g3 x) B+ k
- return q;4 D# E( q7 j+ c/ o
- }* A- k' b4 G4 `# ^
- }
$ G1 h1 o3 V6 d! ?) ~& \ - return null;
) I6 _* q7 |% U - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
3 q5 s( ?3 A; ~+ l. }3 x, A 5 y8 ]; }: S9 z9 O: A7 x
Метод addQuest(Quest quest)
! P7 z M1 J- ^& x% a, L* R* \0 X# ], o! H2 \6 ]" [& |1 l t' E
- /**
, |( R0 @# i4 S- I; C' q0 {- C - * Добавляет новый квест.
8 J- r, K5 V) o, T - * @param quest квест для добавления2 a1 b/ M6 ^4 C: J0 B( e, Q
- */6 z+ w: \4 r2 A3 F& {% g
- public void addQuest(Quest quest)
- S; r" x4 B: y: B7 S - {
) x7 s+ W( [$ L! G' k/ `! ` - if (quest == null)
9 m* R, ~% `8 D" ^ - {
7 h: F) ?* w/ I$ ~6 ]# y - throw new IllegalArgumentException("Аргумент квеста не может быть null");1 ?8 k1 b8 S3 X5 `/ ~1 s# l
- }
5 o; Q+ F, {8 a+ |( u- A/ k - ; x4 L! v& R* e s5 R
- final Quest old = _quests.put(quest.getName(), quest);/ r, f) w: B1 _* T, x4 `
- if (old != null)% O0 W4 i% r: C! G: k
- {
' P6 D% K8 N3 d4 G8 K- Y' p8 g - old.unload();, _0 g/ d- `/ R( J" h
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");. T3 s+ g( Q# {
- }
& A) @+ V, G2 }* f6 W. I -
( r2 m7 N) ~/ R) N% I! W - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
4 D- n* H: p" j9 ` - {
) @( N8 n& G4 R) S - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
) R" o/ _( T/ C+ N' D5 B. u) @% J - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");9 I8 E6 X z. @
- }* m3 j% J: j3 c/ ^ z/ }
- }
# v( X$ H3 m9 j0 c9 c5 \: J. h - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
+ {% Y% b- T% [+ M- s1 ~2 J: @ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
5 [3 j! G6 B) B$ |% H6 x6 }, Y
. {( y! N! X2 Q \4 A
* |( B, U( w' \ i0 _# D5 @
: C6 n: Q. r/ {( K0 w) E |