Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
* ~' j, w) |* U3 ]5 @, c) Z; H3 y; U% T/ ^4 [
Разбор файла QuestManager.java- U% u3 e% ~$ g+ @0 P7 D) R( s- d/ B
. D& _ g1 J3 z9 f* }, |# `
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.6 F0 o! X* }: w9 e6 A1 U
Основные элементы
H% {6 v+ s6 H: U/ `3 P- Лицензия2 E; S# l$ h( k# B; a7 b: a
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии." A* S, O t( h' V/ b" l
- Импорты! l# l5 G9 `" ]# d
+ _8 a& K9 z4 v7 aQuestManager.java — управление квестами и скриптами.
- s* C5 X. m. H- M2 `Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\$ n7 R. Z4 s+ b% ~+ m* S
3 z% }8 G/ y& l2 g
; \% q- u9 o+ L1 Q l( o5 A/ C4 HДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.( G. k3 t% j! K- ~ ~
1. Лицензионное соглашение% Z' b5 k; f2 p! P- y( r
- /*
2 Z# T: P8 ~# k" I- o0 n# P. m - * Этот файл является частью проекта L2J Mobius.: M/ y. ?1 d Y* K
- * $ x+ w- L9 f' M) {- k. C
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
% ?( z2 i, `8 q - * её в соответствии с условиями GNU General Public License, опубликованной
! K/ M8 u2 E* r% ]/ ^1 e2 K! { - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
p( h! x) K/ O8 n5 F, g. | - * p, ]9 r0 a+ h6 s$ A0 S5 M' v" X
- * Эта программа распространяется в надежде, что она будет полезной,. p' [+ G1 L/ G% G0 y2 e* i
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии+ \# Y0 C1 l+ ^8 n# _/ D
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
% I) W0 c: W9 J4 X# o" m - * См. GNU General Public License для получения более подробной информации.$ T( P3 \7 b* B" m
- *
% y, `8 o+ R6 z7 w. m/ h - * Вы должны были получить копию GNU General Public License
3 n+ f6 k; S* z7 G# U, z( i4 S - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
* y$ e) L% R) M - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
! l9 f( c. }2 p% p5 C" j1 Y# c, i; Y6 ~3 {
9 n+ o+ R+ X9 C/ }9 k" c
2. Импортируемые библиотеки# r- r% m+ N- ]$ G/ H
" M6 N( E# k+ K9 }- package org.l2jmobius.gameserver.instancemanager;
3 H: ~" q$ b! a0 k - % E, y7 U; `% g
- import java.util.Map;
; u7 l, l3 b5 E$ ]- v* O: v - import java.util.concurrent.ConcurrentHashMap;
' {% ^- \) `) `# | - import java.util.logging.Level;
h( o2 o: y( w7 { - import java.util.logging.Logger;
` [( `, S. S
* K* |' ?5 f; l5 F, X0 z- import org.l2jmobius.Config;
; R- y" m2 J- ~ - import org.l2jmobius.commons.util.CommonUtil;
) B) D" Z$ Q+ |- ~* D - import org.l2jmobius.gameserver.model.quest.Quest;
8 O8 t( h: i7 H& F& m" 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 — менеджер для работы с игровыми скриптами.! ]4 }9 e2 l. D/ o
. m6 X; b- s$ j. ?- p3. Описание класса QuestManager* c8 H5 _5 z) I1 U2 h
- /**
, Y% \! z) Z8 M) e9 t( n - * Менеджер квестов и скриптов.
: `$ X! b% l( t! U - * Автор: Zoey76
% B8 m2 {: I9 ~ z& T0 u& ] - */' m; a6 A4 t2 S6 A$ c. x0 F4 e, X
- public class QuestManager
n( ^* {: K5 M* {/ s' s4 u# v - {$ `! _8 J1 D1 C& o+ x; W- t. O/ Q; |3 l
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());# g5 c n- ~7 X8 r O
- 2 F/ J; z. ?4 p ^& L% ?
- /** Карта, содержащая все квесты. */
9 t0 K7 L1 n9 Y3 X - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
2 _5 p3 y& k+ G% [+ s$ G( Z - /** Карта, содержащая все скрипты. */
8 Q: G, p& r$ ?" \7 `- H$ V - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();8 h* q4 R9 T, d7 J+ p/ J5 B
-
' p, |2 l* R$ K8 H* Y7 [ - protected QuestManager()2 ^6 i1 r$ C" c3 H' u; N( X
- {5 X6 D, X7 C. Y' A( w' \
- }
# P! ^* d4 P9 H) E - }
Скопировать код 4. Методы* D1 \! M/ k3 [' E {, k4 h
Метод reload(String questFolder)
1 y( f' a( V# E$ i$ D7 a- public boolean reload(String questFolder)" K2 ]! z% f; t. g- j, m0 P
- {
3 o4 B# M' W9 S! q# N. M - final Quest q = getQuest(questFolder);: l$ ^. m) Z' v+ S$ Z( K0 R1 T: X
- if (q == null)- o1 Z( j2 Z' X8 ?- d9 b
- {
2 a& y' A/ s L - return false;
1 G6 C; [4 z: Y' n - }! }# R3 W) Q o- V
- return q.reload();
2 k, _! H- J3 i% r% z2 v) U - }
Скопировать код 2 H* O+ y6 `0 X7 |
0 B, m- T0 g5 t8 FМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
7 n( V' n) S/ s5 @) ?3 gМетод reload(int questId)
. f" L4 S. [# k# k) n: `+ p: S
% _ o* X! v1 `- `0 g4 _& ^4 j) x" `. a% m- /**
& |# J6 s+ f& M1 ~" `- W - * Перезагружает квест по ID.4 H! F8 |5 J: l2 v# k
- * @param questId ID квеста для перезагрузки
* t* w0 ?- h# P) ?1 o5 D - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае7 M {2 R- {4 G9 m. n+ O* z8 Z
- */
% x$ z* v( Q6 D2 K6 k - public boolean reload(int questId)
4 D M0 h; x7 X9 ^% y p - {
8 k& c: k7 m- E( g0 U$ G, t - final Quest q = getQuest(questId);
& W( a1 m5 j. ]# E; q - if (q == null)
+ c1 F+ c: ^+ ?! R - {
0 R8 S* T% T) ?- `% S3 ]# K# s - return false;- [* R+ _3 L9 h( S1 Y
- }
) `+ U6 B/ F6 [4 a- ` - return q.reload();
$ e! c; D1 _$ s2 P( f% \/ }) i - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.9 n2 M! Z" W8 c# O/ L- V; I
' i4 w4 I9 K9 H; \
Метод reloadAllScripts()6 h6 l+ v- A% s1 {- h( F; j
9 J. H& ]* P: m* s- p6 Q- /**% |+ M9 u$ {" z8 \/ M: }. b
- * Выгружает все квесты и скрипты, а затем перезагружает их.
3 N' l5 y1 D! ~' S/ N' o6 g) m7 U - */8 X( _3 ^5 Q4 B. U
- public void reloadAllScripts()
0 B/ ~0 J( q" q - {4 P7 ^4 e- |7 ^$ x. N0 W- ?0 U
- unloadAllScripts();3 o P1 m- b) \ s0 `1 N5 a! K' _
- 7 K- j3 g8 T8 _/ N6 C+ `% h
- LOGGER.info("Перезагрузка всех серверных скриптов.");
( p+ B/ c( T8 E - try
: L; u6 G$ [) a4 Y0 a1 A$ |/ q - {
& H! Z% b; K" l1 _6 a - ScriptEngineManager.getInstance().executeScriptList();
6 w0 E: Q8 v+ N; o8 M0 c: n - }
* S5 h9 V' P! [9 A% L - catch (Exception e). C9 T( a. O( G. D) p( n
- {; A. g5 J1 T" D+ N- a) y: p8 B
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);# F8 {* R1 m/ T! f' f9 j1 O L6 [
- }6 y# F8 H2 G9 a# z; E8 ^
- 4 W$ D2 a" o' F" P! b
- getInstance().report();
" c. T/ b8 N9 `; c4 B6 | - }
Скопировать код Метод unloadAllScripts()* C) w7 l; J4 O0 G# L' H6 |
' u5 n, z; l1 v2 E
- /*** n' x3 ^7 ?6 d0 _3 m' b
- * Выгружает все квесты и скрипты.
4 Q9 h9 a1 ^; j, t E$ v# a - */7 I; F H6 ]+ w' f, X& ~* l
- public void unloadAllScripts()
. F2 x8 r5 ^6 ` _' @' T - {
+ z- V# G% V+ d6 X - LOGGER.info("Выгрузка всех серверных скриптов.");
# _, y' a3 n# Q2 n/ P -
( p3 z6 S. d. W# O$ q6 b - // Выгрузка квестов.
0 C5 N- r7 g, n- `. q; q$ A- R - for (Quest quest : _quests.values())
0 |6 L7 O: x0 O5 f# X) |) i - {; m/ E0 ^9 w& g: `" m
- if (quest != null)
U+ x" K* M. g$ q0 c - {
7 J" R" \/ |; ^ - quest.unload(false);
" F0 L1 M3 g" {8 P - }4 c# u, m3 x" G. s0 i$ x4 v
- }
6 j! i* G7 F6 p: _$ \' k" j - _quests.clear();
}8 n8 H3 d% Z5 P2 F - // Выгрузка скриптов.7 N6 ~5 k& Q* L! d- `
- for (Quest script : _scripts.values())) r$ }& m; [$ r$ z# _
- {
+ s) X! a+ _. p" I2 f" o4 Y9 w - if (script != null)$ f$ F9 O; n, X
- {$ ?+ T4 Q5 {* T
- script.unload(false);
# m/ F8 R' B% H; i - }
/ m, \4 T" H3 l) m% ? - } B, }. s; @7 ~5 E/ p7 U1 X
- _scripts.clear();3 V7 [# | p5 ~7 R( p
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.. N' z+ G, I, l8 K1 H$ d8 n
5 x$ b: x3 {' d3 v# h/ ^# c/ dМетод report()
! Q0 n V' Q" k1 }1 E4 m8 C2 w/ {8 ^+ v' i9 ?' [, g9 W) s
- /**
$ i9 k+ P; N8 B+ z9 D) b& J- ~ - * Логирует количество загруженных квестов и скриптов.
3 Y. [$ i' e4 Z2 [. @9 U2 F - */
4 ?1 S. w1 I% P0 K2 L7 @ - public void report()
9 p; Q2 X& @. H/ y( {) y! h( P - {. Q( u. Y, s9 ~
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
9 D; k% j9 B8 ?0 z! z/ ] - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");, I$ b( G* J1 m& @8 i4 {
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
# W/ A& s' A7 \; |9 ?/ V, s( S d
1 c7 V& A5 k4 TМетод getQuest(String name) f0 e6 N- L3 {
1 C5 L3 g( ~8 W( g- /**
* }5 u7 [! @' ~( Y - * Получает квест по имени.
% o# B0 A5 i" b" h - * @param name имя квеста
8 F9 E" v! I- l2 q0 E - * @return квест
$ o8 F' B& C' k - */
! x, R0 o7 n; x+ M7 e( X - public Quest getQuest(String name)5 Y; S2 f4 L' x1 O0 z. }
- {
. @3 W2 B% @5 `3 v% [ - if (_quests.containsKey(name))6 v3 Q0 F6 a; `" z+ F0 O
- {& C8 S9 f: K# Q7 a+ [- z& G0 C
- return _quests.get(name);& q( a4 `( E: G8 p* F) y
- }
6 ?: }8 j' X) G3 l8 i! h1 V& w - return _scripts.get(name);+ Z( m: j5 K; U2 F
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.& t+ l9 Y5 Z+ ] v u% \
9 }- ^# M0 B9 \! H) D$ c$ ^
Метод getQuest(int questId)
, A9 Y' J$ r" q0 }9 E* j
; l% \0 E7 V( n2 k m- /**. ?2 H" s$ g- m( p
- * Получает квест по ID.( E# O9 \6 ^* \% r* P1 J% \* n. g
- * @param questId ID квеста
0 d( B8 S( T- Q+ I( C( `7 K - * @return квест, если найден, {@code null} в противном случае
! V7 A) V- R2 e/ ?/ C - */% M8 z( B4 U0 k# Y
- public Quest getQuest(int questId)
) ?/ q( O1 n- g - {
. y7 E; | U8 S+ k' Y - for (Quest q : _quests.values())
9 {- n+ C, b" ] - {" L( x- K O- R5 H- V: }8 w4 w
- if (q.getId() == questId)% f7 \/ w9 u( T7 s; P
- {% O6 E' j% m X, v- i+ N
- return q;( F7 n- ]0 Y$ F3 W1 t0 \" z) f5 `
- }
* l3 \# a4 ]+ Q% d5 J, b# H! C - }
! [: ?% w8 E2 I* p- w6 G/ g7 _ - return null; t6 E; \: V) |
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
8 h4 N3 G0 [- S. h& f+ W! n# ^4 [ % s6 T z( \- m( z* C
Метод addQuest(Quest quest)
, `# a& |: F5 p
% B: ^2 y [( J3 x' H3 v- /**, N: I$ W* E. A. n
- * Добавляет новый квест.
6 `9 ]# k2 O7 D4 T3 e. j+ f9 i - * @param quest квест для добавления
7 @5 k9 |, R0 m6 z' M+ |$ f3 } - */
4 s# b6 s0 n$ p/ [ - public void addQuest(Quest quest), Q9 I9 Z: s. ^
- {
2 ?6 Y$ q0 h" u1 Y) A6 I - if (quest == null)3 W! x) r8 Z9 |3 n. y* `
- {4 A: x1 k$ T* q! K% h8 f
- throw new IllegalArgumentException("Аргумент квеста не может быть null");: v5 E' m0 n( `1 d) o/ T
- }+ n# ^, L/ b* Y" _) P i6 i. t
- * l6 E- j5 M/ _
- final Quest old = _quests.put(quest.getName(), quest);
: Y6 X) A' Y* g8 V( ?8 t9 z- G - if (old != null)& }, L, u" U# t- D+ q) `& k/ t% |
- {
; u+ P3 ?4 Q+ C2 t8 D- ^" O - old.unload();. N. H! T; L: s) ?+ f4 ?
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");9 Z" A0 `( W, G1 n
- }" P4 N# M! R5 r+ z; J* N, s0 y' l/ M
- . `: s$ S4 P8 R- K+ `
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
- a6 P( [; I2 ]9 ^5 j4 m+ h& ? - {
# J$ P1 y4 J; R - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
9 V6 [/ L8 G) F& v; _5 {0 Z - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");3 Y, O+ C* _1 D. E# E
- }& `9 Q0 R! _$ p- ?0 a5 L8 w, a
- }
: D: Q9 G- B5 Y0 o9 i* g - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера./ `! U- }( D8 T' u8 S
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
. x0 S4 g. z& g6 v+ t& x
5 W$ D; `4 g2 A' f. k1 ^) q H l3 I
6 U# l2 F5 G9 w, H/ `) S( X
|