Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius/ Y! g2 ~9 B& x
, i9 L* ~# c c+ O! x
Разбор файла QuestManager.java
8 y# n1 X+ L' m6 @" X
/ I* J' n: w) {8 w$ W" H2 t8 ?7 jЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
6 @5 R/ j w# e) X: ZОсновные элементы
9 ^. o" W% G+ v- ^. D& _: f5 t- Лицензия
/ R8 u2 z4 f5 \1 r- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.* x/ A' R5 I" x% h
- Импорты' s2 p' q( h4 w% n( O" q: t
# s+ K( Z0 e2 y& L5 ^! A' E4 nQuestManager.java — управление квестами и скриптами. f. x m5 o+ i* G
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\7 ]! z3 i% L! a: s0 D% E* I" N. _
& i9 L! o2 Y( B y% {* ]
# x0 S5 N5 B3 [& P L( M! yДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
8 g7 m! P: r, A) J1. Лицензионное соглашение
1 }6 P8 K" s! O% M! L/ f- /*1 u1 O/ X7 o! ~# C$ h/ u
- * Этот файл является частью проекта L2J Mobius.
: H* s, U. ?& I* d: k# O, z( h - * / n/ F$ n4 f5 M
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять0 W" g$ \+ v+ w7 e0 r/ Q3 _
- * её в соответствии с условиями GNU General Public License, опубликованной V+ s" n c4 \. ~1 ^ n# I+ H
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.9 t; }; T) K1 b# L
- * 9 {/ p9 ` f% ^5 l
- * Эта программа распространяется в надежде, что она будет полезной," ?( P+ d# Y. w" _7 R. G. T6 p
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
9 r' ~5 Y' f8 u' N7 d9 x - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.- q4 H3 T. H) @! A$ w, O
- * См. GNU General Public License для получения более подробной информации.) l4 F. _* ]2 O9 a2 f$ x
- * " w$ j: A& j1 g
- * Вы должны были получить копию GNU General Public License
$ l0 c) J3 c* i5 D O4 L' ?7 c - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.2 c5 P- u# I2 n1 [; `$ n
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.+ {8 ?: G+ p g, K8 G' p; f
' H; X! b+ o* I4 I8 h- v0 U- ]$ y/ [, ?) [3 B4 h9 G& O+ E% T
2. Импортируемые библиотеки% b( F! T" T% E5 H4 ^
+ T e" T2 W- T) |- package org.l2jmobius.gameserver.instancemanager;+ g% C; L% a% p6 Q0 B
7 d* p' A0 T+ \$ a+ G4 i y- import java.util.Map;/ r$ V* r( C* N$ k8 K e8 `
- import java.util.concurrent.ConcurrentHashMap;
6 j) x8 t: u7 l1 D - import java.util.logging.Level;
9 F# a9 ~$ t3 f$ i - import java.util.logging.Logger;
" R" |% ^' M2 J, x' e, h - 7 d, l7 ?: h+ x" k
- import org.l2jmobius.Config;
; d: C; R4 a0 H. o; s2 P - import org.l2jmobius.commons.util.CommonUtil;! X5 Q1 Y+ w3 p# J! R
- import org.l2jmobius.gameserver.model.quest.Quest;
' Q' }$ t4 I; P- G - 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 — менеджер для работы с игровыми скриптами.
3 n5 ^7 X3 Y0 e
* h' U) s( A: D+ }# J' T* ]' Z3. Описание класса QuestManager9 m& l. |6 T. q% h
- /**
& _, g$ u, a4 W7 a3 a$ K) f! d - * Менеджер квестов и скриптов.
6 u( b: S4 X6 g7 ?9 p - * Автор: Zoey76* M, u1 b7 j, F7 b* K
- */- \1 j- G2 N+ W: J2 W3 E
- public class QuestManager3 i- L; k( p% Q( z- b1 F
- {. @# R1 \6 m4 C- j7 N9 j2 S
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());+ a6 y) n- W& l' E8 p3 ~( n. J
- 3 U' |6 m% e# n0 H/ f5 c5 i
- /** Карта, содержащая все квесты. */, F9 S4 K; \" N
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();! E9 v& s u& ~3 w; L! q. K
- /** Карта, содержащая все скрипты. */+ f1 \) Q- V$ R1 @
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();8 H& d. u5 b4 I& s5 y. i7 V7 f4 T
-
1 |3 A! a7 x1 ^' x1 E - protected QuestManager()
; ~5 i/ e" J8 N9 U1 l% | - {# \' W: U/ e* A D. C1 M5 u7 N
- }! M* i( x, H/ \1 b7 v/ s
- }
Скопировать код 4. Методы/ u: @# x* b. |. s
Метод reload(String questFolder)# F& V' ~/ x1 k
- public boolean reload(String questFolder)
* Y2 V8 _& z7 f - {
) ~" Z8 M/ I4 j4 r1 B2 ~/ O - final Quest q = getQuest(questFolder);7 t) ?4 S$ G' u7 B2 L2 c1 }3 z7 Y
- if (q == null)) ]9 Q" `: V7 g" C
- {( c; j7 y; c2 W5 L& B7 Q& K; o
- return false;
8 L0 Q. u- p" `7 U. Y& z, B - }
5 B+ k* Z, \0 u - return q.reload();
& d- p I& T0 Y5 t - }
Скопировать код 5 U% ?5 g6 w1 m1 g
% N* J* G( J, X- C" L4 i- ^; r# XМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
9 d: c* s2 R$ |+ pМетод reload(int questId)
Y3 m$ s C7 z- z( k9 x5 K# q- Q% t. P2 ^5 h$ T
- /**3 B6 ^$ u; [8 }' F: C4 C( g( j' p
- * Перезагружает квест по ID.
. Y" i0 z% ?( w4 r2 ^ - * @param questId ID квеста для перезагрузки
2 Y6 o. V$ m- o- R - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
8 Y* I2 K: N2 V; u( I/ @" M" M - */7 d; E/ d$ A( Z. n% \5 W' R
- public boolean reload(int questId)1 x6 L. D( w1 O: I' ~1 S6 N
- {9 c% M! ]- H: l% F- [+ U2 H
- final Quest q = getQuest(questId);+ T* f5 v- }) n+ Q
- if (q == null)
1 ]2 U L1 l" o$ O - {
; _4 n6 ^; c' K' g3 e! A, U+ G& {3 B - return false;6 O- B. Q3 \2 I& g
- }
1 X( h( R! ]: a8 Q- w, c( I8 i2 X - return q.reload();
. q w+ |; ^# r3 `$ c! D - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
% G* T: t# K$ H k, c$ J0 h: ^
" E& S7 T, g0 o( ?- n8 e6 y- B+ qМетод reloadAllScripts()! Z, Q1 c/ Y1 ^2 K5 ~5 A
( B" D6 {& i: W8 q2 f) M y
- /**
: m" F+ x* V8 |& T: f - * Выгружает все квесты и скрипты, а затем перезагружает их.! F- _0 @% X, i) J; s' k
- */
8 h; C" v% y/ z! N+ l4 H) } - public void reloadAllScripts()5 X& a. V8 ^" ]$ _* t/ I4 d
- {
( g, e4 W9 e; @/ ], G$ g - unloadAllScripts();2 P8 m. h. h+ G" G4 w
- / Z' }2 F& Q' d4 N& b% K
- LOGGER.info("Перезагрузка всех серверных скриптов.");9 R: k& Z9 f: e8 q. S6 K
- try! X6 W/ U: j+ \8 r1 w; D
- {
; i9 }6 F1 F1 e! L1 O3 S& a3 G3 A - ScriptEngineManager.getInstance().executeScriptList();
" }! |' U9 d3 p& ? - }& X6 O4 u9 {( z
- catch (Exception e). j# c9 a4 S% u
- {! b# Q& J% N1 i1 |5 F' W
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);2 U# I4 w* E: u( G, d: h3 {
- }
% J0 y# V }' S. I7 G/ P - " @( ^2 G- ~ \' U: @
- getInstance().report();
; s7 i8 J h! C4 A# d" }! T - }
Скопировать код Метод unloadAllScripts()2 t2 {( C2 D; Y7 g7 s# z5 L: ^5 m
2 E3 `' c5 v" O6 G3 L& h4 ?0 ?
- /**
# k# Z! }# ]) ?* a4 {1 ~4 ] - * Выгружает все квесты и скрипты.! u: n' X& f$ F- b+ [2 K
- */
; F$ T; e5 D6 k - public void unloadAllScripts()1 g! H' s; n; J. V1 l8 y: N( V1 P
- { T$ W* L( \% ^, G
- LOGGER.info("Выгрузка всех серверных скриптов.");
) }: E' I3 Y' ]' _ -
3 {5 c% U! G6 q! }* y6 [ - // Выгрузка квестов.5 e$ n. S) a6 ?7 q
- for (Quest quest : _quests.values())
3 T8 ^& R" N. b - {$ G, _8 f4 x5 F
- if (quest != null)* f* _9 e9 l& U/ Z1 E+ D! S) ?
- {
+ e$ D9 C4 U- H# q8 M% L' A+ X/ E: A) I - quest.unload(false);! y; N \" X7 c) N( u' [
- }
, O* h: \' P. |2 |+ G' W0 _7 Z - }
7 G% v( W. q, v0 G$ t- |; X - _quests.clear();
) G& d- W0 ^3 C! a - // Выгрузка скриптов.3 Y2 p) S6 U! M2 |3 E* T
- for (Quest script : _scripts.values())2 _4 g+ L8 N h+ W
- {$ I# t2 F, b9 ]8 `( d
- if (script != null)! @* R- f% f5 l2 K# U
- {/ d2 Y# r# A5 N$ I9 ~& \8 f
- script.unload(false);3 \" J" H+ V; F q- q
- }0 |% h5 H2 T! S1 l
- } g3 S3 p& I% ?8 y$ X) E7 C7 k! I
- _scripts.clear();. r e0 D W2 z3 }$ h6 ^( S
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.9 n! ~9 G0 `+ c: k/ k+ p! F C' o9 L
: G* C0 m- q8 n0 F* D# R
Метод report()0 m {+ {5 G. y; p4 X) t
. P) S3 x \. v3 W8 q0 F; z- E- /**- \4 G9 J) [% ]9 }: E
- * Логирует количество загруженных квестов и скриптов./ h3 c* T" d. Q1 C9 k* G9 m0 G- Q
- */
; Y9 A- _. M5 _* v, b - public void report()
6 i; U$ Z# I% H9 ` - {
& B6 k* ]2 K& N* l# E& D% c2 c - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");, b8 f1 M7 [: l5 a9 j
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
8 h) f0 U8 `) k9 i$ x - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.. O- v% h/ i% w1 ~
y$ }% G2 X( h0 h" k- Y
Метод getQuest(String name)
8 N( O+ d) S! r( d* y$ g& R; A: p% P, W
- /**
8 N1 U9 ]# o8 V* ?$ E' ^ [ - * Получает квест по имени.
- o1 O& n$ R9 Y9 r8 p9 j - * @param name имя квеста
+ l, c* w; t# L6 M' D% Z& M - * @return квест
3 w3 x+ J& e0 h1 g) x - */
6 {) Z3 |% \2 s! J* V: f - public Quest getQuest(String name)
( I3 ~+ X v: o7 M - {3 x' S$ v! I" g
- if (_quests.containsKey(name))
- j' |9 [& ?" s) u# ^ m - {" z; v1 @6 M( V4 ]- z& ]0 L( r( B
- return _quests.get(name);
) k8 A5 m% Z" V0 J5 @9 P! [; f - }
4 k1 H$ J8 x' W' @6 ?3 t/ k - return _scripts.get(name);
( L3 V, @. l1 D4 } - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
% a; l' }2 u% l ~9 t ) H8 Q7 c/ o9 d: n
Метод getQuest(int questId)
/ U: d! l9 s# T) F. @, }; _. f9 C/ f
- /**( i$ G- o# i5 d( Y) `/ m' z% p
- * Получает квест по ID., x5 J2 D1 [0 W# B8 D
- * @param questId ID квеста
) g9 ?' ]4 r- j, I - * @return квест, если найден, {@code null} в противном случае8 J& f& f8 S$ @4 t; f
- */
0 X0 Q, s$ n3 L" N, [+ M - public Quest getQuest(int questId)
5 h/ W& D+ E) v4 |, D: N, }9 L) h - {1 R* ~; }0 W2 t; S' D7 ]. s
- for (Quest q : _quests.values())
/ v3 j, }1 ?8 f0 L+ w) I; J - {4 B/ ?4 I- V8 y, o
- if (q.getId() == questId)
" u% t) [ {+ L7 N - {! Y" f i% m7 }" Z
- return q;
7 ~. y3 j2 |5 d6 T k - }
# U p4 a/ K# m& s: w/ O- b - }
( |0 N- e* {, ^+ D! h - return null;
9 h A" n+ X# T1 q; }% ^, s$ x$ R - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.7 p1 ~+ d' B2 x% k3 P9 @) h
* m" t! L6 H0 [. d: ^& T' V; U( P
Метод addQuest(Quest quest)4 P- T F1 b1 Z$ U
. D% \' Z- c; W5 F. B
- /**
& t' j5 S0 F0 S) X# P. a" M1 f - * Добавляет новый квест.
( O9 U* i. ^4 o4 [2 F( K8 V9 o - * @param quest квест для добавления1 c1 r) l& A4 {8 f. w3 G
- */3 i+ X7 g* X$ I3 _
- public void addQuest(Quest quest)
+ M% t/ e! O1 Q% r' U' u6 ` - {
3 m! m/ [* I1 P# ` - if (quest == null)4 D9 | S( x! N& `/ e
- {
; k1 G! r# a6 t - throw new IllegalArgumentException("Аргумент квеста не может быть null");
8 S0 n3 {( I9 B& e4 H0 x O - }
. y; |" Z# ^1 J j, { -
) n7 b0 S7 }9 F; J - final Quest old = _quests.put(quest.getName(), quest);
" |" i9 M! }# n0 ]! ^: _ - if (old != null)" m$ {) t4 N' C4 U# n* _6 F9 K" ~. T" b
- {
( j0 X8 j: s s; A( M% L1 ~ - old.unload();- q5 F7 t& u. U8 j# c( p
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
* a# F# ?0 ]% m- o - }
8 C4 Z" T# Q, ]. c) C$ F8 ] - : G2 [3 R1 x5 G0 N
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
* s( @( g( j2 }' H: p0 D0 Q - {
, u4 ]: a; |3 ~. O7 F - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();! T4 [5 [5 k" M7 V5 i, \
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
4 H2 V7 E& M4 M' n: ` - }
! {1 _. }( I6 R' [/ F8 a - }% z# J7 r* K) K
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера., e8 T2 U. i s9 w& x7 T/ G) s
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.. a1 J& h, D: ^: G& B! u4 j/ c
' m1 ~5 U% J7 D' M& H5 b8 m
6 M% C; g% L7 g3 c* E+ Y6 a- ]+ n, O. u; a5 T! O
|