Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius, ]! F4 s* l8 O( K! b% F
2 i, X6 R; o$ Q6 r+ e
Разбор файла QuestManager.java w' [; |7 z, C4 Y
( I, ]9 m8 T; ~+ W- w/ AЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
, Z/ e/ I/ k4 y0 {5 b- A/ FОсновные элементы
% ]* N5 V9 Q( i1 e6 \1 h8 U- Лицензия
: h& [6 B* v: g5 I/ A" h- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
( L" J9 X7 S2 e! i" Y' T9 E; {
- Импорты5 @: ?2 Z/ H8 ]
. |, x" U. ?3 C V
QuestManager.java — управление квестами и скриптами.5 Z- r3 A/ N) V& V
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
9 N6 V4 M: k2 ?0 M, |( X4 e4 ` Q4 i9 @
7 t' x( ~3 a; N; e7 P0 A% IДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
+ U% ]7 P: D6 n( _" W1. Лицензионное соглашение3 G% s1 l$ G! z: I2 k+ y
- /*( R" ^, g0 C$ d2 X* g
- * Этот файл является частью проекта L2J Mobius.
# h, y. U9 \3 {7 r1 t7 R - * - p n; t" Q6 r( c& W& d h) O
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять1 P, h }8 q0 j4 f- a s- X e
- * её в соответствии с условиями GNU General Public License, опубликованной
0 X w; I! P- y' Y - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.# W2 t$ X; s! m8 m; k
- * 4 J2 ?) g" Q! Q" v1 j6 A
- * Эта программа распространяется в надежде, что она будет полезной,) K% P4 o9 W4 y9 P x0 v7 Y
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии/ s; v9 ]* l+ I! B7 x1 Z; x$ u
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
$ n+ U5 r ?5 X+ h8 {. R - * См. GNU General Public License для получения более подробной информации.
, O- S0 k- X5 H* L* b0 d - * $ F/ I: \: B$ O7 a c5 m. Y( S7 _
- * Вы должны были получить копию GNU General Public License
/ P1 p3 e. r" D+ j6 e7 s - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.( t9 ^2 K8 ?& w5 b7 M
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
$ X4 A7 _. T0 g$ J- P, k8 m' ?4 u0 q" v# J" ^
6 ~+ Z4 {) l' E3 s2. Импортируемые библиотеки
5 f+ @7 Y& }8 p5 L8 n+ x; ^4 u+ h1 n9 J6 e* v2 F3 m
- package org.l2jmobius.gameserver.instancemanager;- g0 M/ D2 A3 `. C2 D8 c
; {4 |9 g* T2 [; U- import java.util.Map;
7 y; f6 E3 @, _3 r6 Y9 } - import java.util.concurrent.ConcurrentHashMap;: m$ w$ e4 E1 L' w$ D. j
- import java.util.logging.Level;% a% W$ I- q0 D) ^- c) x
- import java.util.logging.Logger;
8 Y+ _) N! r$ j- L, M
0 e8 Q* j5 R" K- import org.l2jmobius.Config;
+ {; ]9 ?% q% o; Z1 w1 ` - import org.l2jmobius.commons.util.CommonUtil;
2 f- w7 {6 W: H# m' T; X+ ^ - import org.l2jmobius.gameserver.model.quest.Quest;
) S: |; P8 P' l4 v8 C$ P; W6 e6 S - 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 — менеджер для работы с игровыми скриптами.) B4 k# A v/ I$ n% B
; S1 H. K1 h5 M+ j; f c
3. Описание класса QuestManager: [3 ?3 y) ? z! i. ?
- /**5 d' _0 r2 X# p: Y
- * Менеджер квестов и скриптов.
, d2 l8 |- m7 l3 s5 k- k* Q }! S - * Автор: Zoey76- {( |' I) Q2 n
- */
) Z" m r2 i7 \( j2 D" f$ ] - public class QuestManager) c$ W) E3 y ]9 D4 Q
- {9 V+ l9 y! g! o( x! ?# h
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
7 ^. S D$ O6 e% S$ x - : h/ b3 t4 m/ P& R
- /** Карта, содержащая все квесты. */* {# L) T1 ~5 U. f1 z% _: m
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
. ], V* v7 F$ r1 E; K6 W+ B - /** Карта, содержащая все скрипты. */( m0 {0 c L" X x& V. H
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>(); f" ^ H2 W6 i, k: w" T6 ?8 `
- % y$ F2 Q3 l% n* ^: y; D
- protected QuestManager()( T5 |$ @) n8 v2 {/ t+ T5 g+ Q) W
- {
9 |1 D) g8 W& p2 d; G - }
% L. _2 x7 |! j& |7 B1 @% ` - }
Скопировать код 4. Методы7 Y+ x2 c3 ^2 T4 l
Метод reload(String questFolder)/ a8 p$ z9 g3 r _* [' x* R
- public boolean reload(String questFolder)
) p% U' f2 @" s5 F3 [: ] - {
# d, m9 }" f6 Q" b - final Quest q = getQuest(questFolder);
' F* X( E4 X1 N - if (q == null)0 T9 D! ~' B2 I$ @
- {' T6 l3 j6 ]6 ?9 a$ b+ _
- return false;
# z3 h" C7 f l0 f. _- d* s- |! A - }
8 t0 G B. [ J: ^' O0 \, s - return q.reload();
, Y+ q2 \' g; t! L2 n; ~: I1 h - }
Скопировать код
9 z; H( l& ?3 h% f; V" H# t7 U, r0 r
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
- Z# ^. X! t* m6 p/ D3 uМетод reload(int questId)
) S$ g$ V) o: @$ z" w7 j/ ^5 \% O3 s* F, A2 }
- /*** m# ^$ `! i' S" m
- * Перезагружает квест по ID.
/ ^; v' S% E# r9 |2 P - * @param questId ID квеста для перезагрузки9 ]1 `! m- r8 d7 c" G* h% S
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
( i- v$ T) E+ e: [- h6 o1 v5 m, ` - */5 F8 U9 _" W9 s6 N' F
- public boolean reload(int questId)
+ n* {3 C" {- s7 c - {
" X+ S' a* @: c5 Y: u3 S - final Quest q = getQuest(questId);+ u8 Z( X7 T2 b* Y! t# Y9 b! Z
- if (q == null)
4 P% u2 j3 V6 E6 A+ W - {7 T n s. y! q% h) ] I+ [& Y
- return false;
; @" I7 v" j# I# W" n9 |/ F - }
1 D. k T4 [3 A - return q.reload();
" h. w, H/ y* L% ^& g0 M - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
# o4 j$ V+ [9 X5 S) X+ S
+ F" ?' _3 r# ]; f7 I# ^0 ?% Y' SМетод reloadAllScripts()" Z# L; Q6 W ~. X0 P8 ~; x# f
, p7 ]+ C, ~1 F& v, E B5 H2 `7 p
- /**
8 H: i" X) \# L - * Выгружает все квесты и скрипты, а затем перезагружает их.
9 S/ v+ {5 \4 y - */8 F9 [& Y" r& p' ]+ ~
- public void reloadAllScripts()/ ^+ A7 b# X* t5 h
- {
' S+ K1 X5 Z, H3 Y: X - unloadAllScripts();2 [3 F; k7 ?, n4 v' u
-
6 S) L! v. ^+ M) H9 Z6 ]& c - LOGGER.info("Перезагрузка всех серверных скриптов.");. {( J! _; x, e
- try
" t7 Z( e! c- H" L0 R) F - {8 W1 W' s# n2 ^# r# F0 V9 U
- ScriptEngineManager.getInstance().executeScriptList();" Y! u6 o* R+ y0 @
- }
/ U1 {+ Z) ?$ _" g8 _ - catch (Exception e) p& b7 T- H- \6 P& n
- {
4 R- h+ A6 n/ G3 ^6 F+ ^6 P. } - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
6 N* X1 n- w4 y7 B - }- V( z3 f9 F% u% A
-
5 t1 R0 e/ W3 J( Q! v - getInstance().report();
6 A7 W+ s8 J! P9 {) a3 Y+ E8 F! ? - }
Скопировать код Метод unloadAllScripts()
* T3 Y' Y& b6 O: f' _
* M6 ?1 j$ @! T1 w- D- /**
+ g, u7 `5 X" k) i- ~4 { - * Выгружает все квесты и скрипты.
& l$ w6 x( w) b: H; {9 w - */
6 J8 \# k( d [ - public void unloadAllScripts()0 Q. Y+ v$ j6 G1 w5 j
- {
3 V* w& V4 @! k% l: ?" h1 s - LOGGER.info("Выгрузка всех серверных скриптов.");+ B5 a8 J6 X/ ^9 n: u& p
-
' u, k6 L: i* D. t+ F0 ~ - // Выгрузка квестов.' z+ C4 S' F9 d. J1 k- v ?
- for (Quest quest : _quests.values())
/ I k- B6 E- _% p$ C9 v - {8 X4 m$ I8 y2 X5 a/ V2 ~( i# z) Q
- if (quest != null)
) T5 q& y: V- v2 Z7 t" A2 d- X - {
) H$ r# E1 C6 J1 G - quest.unload(false);) z7 {% G6 v( g K
- }7 G% I7 e4 C; F+ G9 H5 o
- }+ d* ^, z- a; F0 s; ?
- _quests.clear();1 A3 L& \) T* h3 N- p- e) E9 m0 ]+ }
- // Выгрузка скриптов.
+ q. l) k% P# [1 R - for (Quest script : _scripts.values())# ?1 |' c; j% c3 c2 s
- {2 ]# d* B9 S( u6 y% s- D# h
- if (script != null)
2 F+ t4 |3 b. k) G - {$ D" S5 i7 q# u
- script.unload(false);
, J3 R |8 ^0 c1 |- U/ K - }
/ N) K- Z6 x. _1 g2 C - }( E1 r, l8 ~! d0 p. T! V
- _scripts.clear();
; W( |1 z$ K/ @2 L0 }; _$ o - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
+ k+ z/ I% ^# i% P+ |9 p; q; N) e; { 2 q( J3 X$ c7 \* w: G. N+ D
Метод report()
1 H$ e7 o: t: c/ i) q+ F2 o. b$ T1 w( c3 H1 m
- /**
: j( P; e; F ^) {$ f - * Логирует количество загруженных квестов и скриптов./ K4 e8 z5 l5 w1 D5 ^7 g, t6 J5 k
- */0 C1 B, w$ y1 C! c/ i/ Q
- public void report()/ `/ U% D" \" s: X
- {/ @8 n8 r2 f1 L% [$ r
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
i* X1 S% Z; V, i' c5 B0 j1 P- c - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
" s ~. \+ V! Q S4 l( o - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
1 s0 N3 k" G ~9 H$ i
7 s" Q" I' w9 m1 v/ t! RМетод getQuest(String name)
- Y4 q/ }+ R+ a& r+ ~" {( w8 l. S' f
- /**+ M5 l5 ]9 M, H# f) @) S
- * Получает квест по имени., P5 A. E: r5 d" w# f
- * @param name имя квеста6 W- T7 L* L0 G& N5 ~8 Q1 I7 ?' ^
- * @return квест- Y8 P g3 a; ?7 v5 p* W* z5 v
- */
/ z% D: }, h$ \% ^3 p) ~ K& ~7 M - public Quest getQuest(String name)
, ]. {. t+ n9 B7 M4 R4 L - {
3 n4 d2 T: c+ s1 s E$ S ~1 x: R. H - if (_quests.containsKey(name))
* T! y( ~8 w0 }- \0 O8 Z - {
6 n. n7 T! O4 h4 `! ~. T - return _quests.get(name);$ M* `. M* `% @$ j( t
- }" w0 r4 Y' h, l; o
- return _scripts.get(name);
3 U8 g. K' w! y* U& l. K - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.; h/ \/ d4 e: o! e! q5 c+ K
5 N3 O$ R$ X9 @+ {# uМетод getQuest(int questId)
( D4 j. d* d) x# h6 x
% ?+ Q& t/ f1 B- /**( }1 n8 b* G3 N t7 _2 G( u5 n) t
- * Получает квест по ID.
$ g# q' n0 E# [& ~7 ] - * @param questId ID квеста
, Z( ]% V& R L8 w2 C/ i' h/ Q - * @return квест, если найден, {@code null} в противном случае
j) r! Z6 D! _& u3 H/ q, P - */
4 u8 q) Z2 h5 W' c0 p - public Quest getQuest(int questId)
: y% h. Q' {1 w: c - {
- Z& d0 Z0 U" D, D - for (Quest q : _quests.values())
8 ~+ }" U* Y0 Q$ o6 H0 a+ { - {
# r) `" u1 a, v# P - if (q.getId() == questId)& R% C$ g1 K2 P& x% Y+ A
- {
1 D1 o* L; R, u, f) ? - return q;
. j$ v+ I- s# Y$ Z1 v( ]6 w - }
. I* E J. e1 G0 a$ k! w: K - }6 i3 d4 C' n/ B' {7 ]
- return null;' q( p5 V8 |1 w0 H9 r1 l
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.0 S% [1 z. W7 }% R5 H- d
) g H7 s! g$ _# l& T' Y
Метод addQuest(Quest quest)
! X$ @5 O5 j* K& ~, b C8 C# v
2 d) x2 p9 v$ f' K$ [- /**
0 a) I/ O! U: }6 D - * Добавляет новый квест.( l6 I& M& P+ c7 l* N& j
- * @param quest квест для добавления
# W: {* b2 ~* J8 {* q* k - */
; \; d2 K6 [; m5 b - public void addQuest(Quest quest)8 N; b$ v! M4 |% c, T( w
- {! C8 f- [- k( E/ z: a6 j
- if (quest == null)
7 e: n( W2 T& H6 m( O - {5 ]$ \6 m1 E* F- d& D
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
6 Q4 m8 M: C9 Q& @2 D. E" z% _ - }
% k/ ?3 p6 B7 H - 7 w8 h; M0 g0 U: S
- final Quest old = _quests.put(quest.getName(), quest);/ m- ?& v- A8 g% ~2 l
- if (old != null)
: m4 ~8 }& r+ O$ k; H - {
, {6 J% r+ _# I. }$ A4 `+ \& S - old.unload();
/ ]6 a' Z0 P" i6 L/ j; ? - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
5 J3 g/ X4 j @0 y0 @ - }
: Q, }& l( |" D: A) X - 8 b, {# S4 w2 T/ M, s' o7 R: F
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)1 T& Z U2 Y$ a
- {( N# x' Q. u4 O! F7 C
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();8 r2 H* ~! L' n5 A* j5 V6 J. ~8 j
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
3 [" R8 ~* T( G. [- f+ R - }* S+ E4 l8 ^' Q; a: b# z
- }" b6 O4 d) b4 H. p4 P6 J
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
0 N, c7 `. E; p5 B3 ?ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.) _* O) G+ V5 [) Z {
) Y( \( A8 @( o$ B# e0 R
# g2 W3 p' K3 t$ h" ?/ i" ~
6 t R# T1 w+ B8 t8 ~. ] |