Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
, G9 w( j5 m" ~ K* [% {# V- C) I6 S- z# N) H( W0 X
Разбор файла QuestManager.java. h! O7 t4 u6 f( G0 A0 ?
8 y1 e( t$ r3 [! m9 E4 x7 |* J
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.# m8 \) a. _, @7 R* Y+ \& R5 B
Основные элементы! a9 [# h0 J% u6 U7 K) I
- Лицензия1 a7 @2 N( g! ~+ T1 j2 [) w0 f! V
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
4 l( n- i1 D# v8 }0 X+ X2 c( v
- Импорты0 G6 R; f' ]. Q9 O0 n
0 A. y6 q3 W# s8 D9 Y* B, X
QuestManager.java — управление квестами и скриптами.1 Q0 J4 S: M6 T% b! g. x
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\( {9 X- S7 ~5 D6 s6 s
2 c7 t/ ? R( m5 H+ c. B" A( u: [
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.. q$ {2 X+ f* `
1. Лицензионное соглашение
' N& b; p3 z( b- f. F( r- /*
: C( F( [/ K i! m - * Этот файл является частью проекта L2J Mobius.
4 m0 a- `8 u ^& r! ?, e2 I6 D - *
3 y j9 i3 t3 d" r - * Эта программа является свободным ПО: вы можете распространять её и/или изменять; o6 a1 P( `6 s; F: E$ d g, R# B
- * её в соответствии с условиями GNU General Public License, опубликованной: T$ w' j" Q: f$ k- ~% q4 O! c+ t
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
0 w9 \2 r& @+ r# b9 I" R - *
" U; T. [5 W6 d7 _ - * Эта программа распространяется в надежде, что она будет полезной,
- j3 n+ c, \# M9 C* X# } - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
/ y2 w5 K- Y7 x, P - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.5 y7 V' T, K3 ?& i5 ?; F' Y
- * См. GNU General Public License для получения более подробной информации.1 i. R1 O3 ]# b, h: E) J& u- _/ ^% T/ x, c# Q
- * g# H& b1 d- e0 O$ W4 j
- * Вы должны были получить копию GNU General Public License
) T+ u2 d0 ?6 Y; J+ f4 ` - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.) L9 ~* }5 l# {4 w/ h% \
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
1 a) f+ O( g4 q# B& H0 b% h4 m4 c& `/ f, _2 J" a: w/ z1 p
/ y8 d2 @' h* s7 g% ]
2. Импортируемые библиотеки
, k6 T- V" [2 D$ t$ j* c
; Y$ g; ^: \, M( S, J7 R- package org.l2jmobius.gameserver.instancemanager;1 V' z. e) I& Q+ @! O$ ?
( a8 t4 O4 Q% o; b, I- import java.util.Map;
) a6 z$ @- }! s0 ~# Z0 V - import java.util.concurrent.ConcurrentHashMap;
" O: z7 V4 S% ]0 p6 X0 ^5 X - import java.util.logging.Level;* V4 e4 X4 }% _0 A
- import java.util.logging.Logger;' i5 |4 `8 Y- g x7 w+ c3 Z& x1 q
9 R7 v: I" n! \ U1 P- import org.l2jmobius.Config;
5 @, P0 J7 H1 j- n1 E6 n. W/ c1 } - import org.l2jmobius.commons.util.CommonUtil;
! I% H8 `) J; Y - import org.l2jmobius.gameserver.model.quest.Quest;
) `. G: l1 G) A# B6 Q: B0 K - 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 — менеджер для работы с игровыми скриптами.
: g; n9 F- n+ M; P. F0 c; W# I3 V
3. Описание класса QuestManager; n O) Z3 `( T
- /**" y4 Z4 b0 g7 q' |
- * Менеджер квестов и скриптов.
9 q- ?% v+ c' ~: A( u - * Автор: Zoey76+ a2 R, d* b: B! W! J
- */) F9 L4 L/ v* R, @
- public class QuestManager$ t# _# D0 D( M, J) s* g
- {
' M4 n$ J: Q% d* r- O - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());; y$ [8 J( d/ e# ~% ~
-
5 A( h x/ W# [1 X - /** Карта, содержащая все квесты. */4 i! e8 X) l, E. D; d) R7 d' G$ ~+ m0 v
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
4 L, w1 R: i, ? }. u3 C4 p - /** Карта, содержащая все скрипты. */" C6 n5 T( H: M2 I- s
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();, f: t/ B9 P% H) L* O7 @
- " b1 r2 I; e1 v5 `9 k+ ?/ V
- protected QuestManager()1 {3 B6 m0 |5 J. Z
- {8 p: I# b/ C, r5 v' h6 w" f( u( I0 v
- }
* d5 p" z, o5 b - }
Скопировать код 4. Методы
7 i; ?; ?0 a" @7 k6 Q' lМетод reload(String questFolder)
: w% H9 z# v3 l% z/ b* w/ u& g& T- public boolean reload(String questFolder)
6 e- n3 j/ v& C9 ?6 c - {
" x& I) p7 C. k - final Quest q = getQuest(questFolder);; a6 F# L0 D! X7 o+ M1 D9 z
- if (q == null)
4 a. ?5 i& n7 u& \% K* Q' r - {% |1 `4 n( T1 O: F
- return false;
4 @: m* @9 E9 h1 u, V. l - }
. f8 u8 R+ Z; c# x# o - return q.reload();
. J3 ?, P( X! ]) M, B6 \1 O2 S' z - }
Скопировать код
4 b5 b/ c) G+ g$ k; B z9 i' h5 u! d; @
0 Y: y! e; E% ?8 [! gМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.: G' M0 c# Q1 a! C, g: F- Y5 n8 j
Метод reload(int questId)4 g8 N: k$ M* |- Y4 ^
3 F7 R- D) Z& I
- /**
# x$ v- V* R- P$ }/ H - * Перезагружает квест по ID.
7 S4 l: }- |4 g5 e- k6 q - * @param questId ID квеста для перезагрузки
3 X( j' c2 C/ A% W - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
6 w/ k/ \& z$ K+ K - */
( ]2 b* p7 h) U/ U3 ^2 m - public boolean reload(int questId)/ F6 y6 I/ |6 b, K" N
- {8 _8 d/ Q" [' H. U
- final Quest q = getQuest(questId);' V9 B3 c/ {- `* x; x
- if (q == null)/ S( a: Y3 r/ _, Z: U7 t
- {+ |6 @* M. Z5 t5 e# ~% g- N* D( x
- return false;
- }) I+ T8 Y& h! _9 u5 b - }/ s% r6 e% r2 l3 X. P( t2 p
- return q.reload();
, s4 b# Z" B3 r+ U - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.% _+ l4 ~3 D. J- A1 [% o7 w
& e- A# N: L) ~; ]5 s( G
Метод reloadAllScripts()* B( j! G4 r8 X* _5 U0 q0 x: P
( R6 N" P" ]! A% h- /**- e/ R$ R: d9 n
- * Выгружает все квесты и скрипты, а затем перезагружает их.1 p* i0 z$ \5 i, }
- */
7 t6 u% P% t3 ^$ l9 K - public void reloadAllScripts()
# A; {% j; v5 y1 R. m5 ` - {7 w$ M) f9 h; o8 N4 G
- unloadAllScripts();' E! K* |( O+ p2 `
-
+ u7 _7 e R6 h: {' A9 E - LOGGER.info("Перезагрузка всех серверных скриптов.");
/ J' F b. V4 x( {4 P& e+ D0 K% ]# W6 V5 a - try6 L8 _& J2 h2 {( k1 x7 C" q
- {
2 k' {& _3 L4 h% P6 z, b" @, e. p+ M - ScriptEngineManager.getInstance().executeScriptList();
" `+ A* K' b. S& h7 q0 V# c! ^ A - }
7 [6 s+ i4 a }# b0 K6 _ - catch (Exception e)
% [- r( Q7 y1 b" r7 g7 T* E - {
' W5 F5 _! C' O; e - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);! m3 K; x; T) w) O, o
- }
5 V' S- d t$ f6 n' u) }4 u -
0 }8 t. T; L" B6 i% ~9 X; e - getInstance().report();
, f, t5 X) m2 r1 U7 l; u - }
Скопировать код Метод unloadAllScripts()9 j( x; H X' Z, ~5 _9 x
% a/ S+ A8 _: O" t9 r) G7 p- /**
, X0 |8 G* }+ m, L+ F - * Выгружает все квесты и скрипты.6 k! X2 a3 m6 k! _( q S
- */
; ~3 U5 ?* [ q3 r. s* J4 f# b - public void unloadAllScripts()* U4 [! k6 {+ ?. m
- {' @) b9 |5 S, U, Z
- LOGGER.info("Выгрузка всех серверных скриптов.");& W, x h6 ^% T: o9 Q; U! M& ]" [
-
5 B2 G7 {' h! R$ C% F# `" T& \, S - // Выгрузка квестов.
7 Y) k: E# p& |% v6 n8 ~ - for (Quest quest : _quests.values())
2 r* U9 G; e) T - {
' b) ^7 y# o0 t5 l - if (quest != null)
. |4 ~$ M, x9 A1 N) ]( ^ - {
5 v% J9 j {4 I - quest.unload(false);
( o8 A' L, v( `2 N; H6 e- ` - }
9 |- } p9 W) a- ]* c - }
2 J0 ^, N( L9 N% y, O/ @ - _quests.clear();" h4 O3 z. ]* J* ~, H
- // Выгрузка скриптов.
. w& d/ T/ S! u' v. O$ q' N - for (Quest script : _scripts.values())
* ^* X- r$ C; h - {" X# `- @1 N% L, ~3 L
- if (script != null)1 w3 }5 g' t4 L9 X X* h3 ^
- {, ]4 ^. H' l. N! i% e+ V# l" ]
- script.unload(false);
9 C9 i# T3 c+ p6 h- ` - }3 V/ R+ n; L7 f9 p8 s! ?
- }/ _) X. r( E' N. a/ A
- _scripts.clear();2 X0 i7 y. T5 P m' z) V; X
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
* e! V5 m0 ^: V# X2 v1 w! M 2 Q D9 b/ V' r+ j0 N
Метод report()
$ i' V6 w/ X* l5 J& B8 h# g6 Q
+ |" J C. U! V/ w B* i9 y- /**
( d, B7 U, W) v - * Логирует количество загруженных квестов и скриптов.3 E) F5 U7 I. c& t3 y, z: ^
- */
, O% O m# N2 R3 [: E - public void report()
. D4 i$ ]! i* s - {
% h M5 g' Q7 D. |6 K( H - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
* k# T* U2 T& u - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");- R; o, ^( a/ k+ P
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.8 b5 |6 [9 U& R) N# M8 m
0 {. H4 L8 ^ _: H. M
Метод getQuest(String name)/ |8 T. Y# Y9 X7 ?; v6 h. m
* t3 P# }, G5 h/ d5 B4 g" V; k, @
- /**, d' \9 ~" i& C
- * Получает квест по имени.
% c f( o5 ~* s6 A; H; O - * @param name имя квеста
4 p% _5 I. T$ ^4 p6 g - * @return квест
6 q& z" f2 ~' r3 p* S - */
# C$ D/ B4 n- q) W$ N; K- y - public Quest getQuest(String name)) H) R, k4 v; C; P
- {
* }( Z8 [ R5 q! q - if (_quests.containsKey(name))3 z. `# E* p* B
- {9 P9 ]1 a! W. q9 L: a4 a
- return _quests.get(name);7 s4 n" G! i8 r: r4 @" \
- }7 n! q7 Y& d2 U$ p
- return _scripts.get(name);
# p: p/ B/ l- p, Z/ f! t - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
7 [, L& a- k4 O8 Y, Q: b
5 M, U: p5 k- a0 M5 V6 L) u' G2 zМетод getQuest(int questId)6 F( n! | V1 [% h `) r
; ?; P1 N4 z1 w# E% K$ ?: t. z
- /**
7 T+ I- C% x# E - * Получает квест по ID.
8 V; Z3 n6 g4 _! W% V+ U- q - * @param questId ID квеста
* [' S0 C, I. Z/ E5 T - * @return квест, если найден, {@code null} в противном случае$ Z% P2 A+ ^3 y( k: }; J9 E
- */
, y& n6 u9 I) b* _+ ^ - public Quest getQuest(int questId)0 n+ @7 E8 j0 S# \2 M7 {
- {
6 R1 p+ C, L& {1 U6 Z - for (Quest q : _quests.values())- F' s8 H, f7 `4 I2 \
- {" Z# J$ O$ u& c9 q W) V: E
- if (q.getId() == questId)9 b9 [( L, ~( u: y6 M7 L0 j
- {
' }) D; Y G) ^- B. p/ h - return q;
3 S6 @1 i. u% _* y5 K; A - }( i. y; z8 B C: H" ?+ w- k B- d
- }
9 h" }% I, y8 Z - return null;
; J8 G5 a/ I" w$ G9 ~1 Y+ i - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
9 i* q+ e( G- D+ b( x : j( j" W F$ [/ a; B
Метод addQuest(Quest quest)
% _9 ]# C: U2 Y8 E$ o6 t& M2 W+ g
# k. {( Q, c2 m) Q+ U% q% w- /**
- [* D v5 |5 R8 D - * Добавляет новый квест.' f' h- i, ?2 e j
- * @param quest квест для добавления$ t3 `0 o7 o- ~. y
- */
( u( A3 [# M; R* H - public void addQuest(Quest quest)
9 N# d0 g- K0 L% {1 Z4 ~% t( H- L8 S - { @+ K/ k( u( N2 M' o! Y
- if (quest == null); \/ z( L, W" b" e% _2 Z
- {+ a6 f7 Q2 I+ N$ Y# b
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
! j/ [5 I3 a7 } A6 f$ q. o - }! [, Y% z6 P5 ~4 l
-
# i* t. H, s: S2 T1 S - final Quest old = _quests.put(quest.getName(), quest);
M+ m$ h) ]6 o3 E5 p$ L - if (old != null)1 z4 t$ `8 V8 G5 b
- {8 k# f" O% G: J' J- E3 T7 R; L
- old.unload();0 ^9 x. L/ w% x+ W" h
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");' D4 z& ?( H' J/ p: U
- }( n6 B7 X+ q# \5 b# r! I2 G
- + V, Q5 f! X( \' |3 @; B
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
. N; }, C- X+ `" r& E3 l0 H$ K - {
' v9 R; G s/ N# [0 t6 u - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();# S+ q) k( O2 [/ R; y
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");! ?1 f6 o: R4 D! J8 u
- }
" f9 y- l5 u2 _6 M - }3 N% A. D" x e) D8 c
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
) k) L9 l, D' m- F( \% I; fЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере." o0 p7 O1 q# R
$ m; c! p: m2 `4 S6 i2 U5 C! U* {$ n0 V. ]
( O; ~; J; p% k5 h/ R |