Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
( V x7 {' o( f/ ?6 h6 y. `& ?% U7 E
Разбор файла QuestManager.java$ b7 `0 O: e, U. Q; @; s
% @7 M6 o) T5 l" J" E: L8 a( r+ kЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.7 b+ ?6 @% w$ s& o! B0 l
Основные элементы
) @+ i) I/ i! |- Лицензия
4 a! h* w6 p/ z8 ~. o- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии./ ^- c# x$ R! M6 p7 J: _1 u3 i
- Импорты
% C3 Y0 g, M( Z, _
# s2 |% A1 r9 y0 }QuestManager.java — управление квестами и скриптами.2 T+ |* k( f9 M& p5 m1 c
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\$ A% A& B+ Y1 Z. `9 K
! _- e0 j# g7 A+ f/ P) ^- ^3 O$ Q5 h" r8 G
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.) q0 Z! \% A \/ g+ v; z7 V
1. Лицензионное соглашение# E$ q. ?+ U, q4 m' \3 }6 M8 v
- /** j4 E( _/ p1 `$ R
- * Этот файл является частью проекта L2J Mobius.& f6 t7 X @% B7 Q3 [
- * 7 x$ j2 G5 s2 n. q9 [ ?
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
# R2 n+ B- B- ?% L4 W - * её в соответствии с условиями GNU General Public License, опубликованной" d. j# F$ F9 O7 |
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
7 I0 u" o5 O- s+ Q/ ~- [; x$ l - * 8 D/ t& D$ S7 s. w2 @. D) h
- * Эта программа распространяется в надежде, что она будет полезной,. R( Y) ~2 ^) L) j
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
3 K/ y+ N& @% E; \- y( F! `9 X - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.4 p. W0 {8 K5 `/ j' n
- * См. GNU General Public License для получения более подробной информации.
' e5 F& t6 L+ N2 v+ Z8 g - *
& F3 `6 G; O) ~3 ^0 I, c0 q1 r - * Вы должны были получить копию GNU General Public License
0 }( a6 L. B# _0 n+ G - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
8 \& k+ z4 o/ j% c. f - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3./ z6 a5 b" I- k" y$ R K6 m
1 e" G3 w3 B0 s$ E: @4 E: Q6 y. _
5 L# d5 |) I3 X- T. T. m* N2. Импортируемые библиотеки
; o: N5 U1 f6 z' o0 u/ Z% ?; O5 U
% P! Y% \$ R5 x+ Z1 |: Y- package org.l2jmobius.gameserver.instancemanager;8 J' h) S8 E( z. N1 U& M' T
- ( L, L& j/ d) p: X7 B
- import java.util.Map;
$ R( o5 }+ H+ k% i) } - import java.util.concurrent.ConcurrentHashMap;+ ]% E" S0 M# S+ O& L) Y
- import java.util.logging.Level;! h1 U* d+ D5 }) v
- import java.util.logging.Logger;3 C4 D4 b. r1 W& c$ F
- ( x7 T. F* {% Q& B9 V+ {# X
- import org.l2jmobius.Config;+ z; g8 B- W5 o: N+ A3 b
- import org.l2jmobius.commons.util.CommonUtil;
# {, y3 N+ I1 o+ R- i - import org.l2jmobius.gameserver.model.quest.Quest;
1 K1 E% y' d9 J) U1 h' l x - 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 — менеджер для работы с игровыми скриптами.
* ?0 B0 Q% b, Q: J+ U' y) G' T1 W9 \3 A$ v6 T" a/ ~
3. Описание класса QuestManager7 r5 \: U+ i* ]6 o8 C5 _. ?
- /**, f. u9 A* J5 p
- * Менеджер квестов и скриптов.
5 m1 F, ] _& O6 @ y$ S7 u - * Автор: Zoey76
$ ?# C9 I( ]+ k1 S& ~+ q* }$ F7 ` - */, ^; [# s9 [! M
- public class QuestManager
l/ f' N: x# h; _ _$ m - {
- Q& m; U9 I8 ]) ]: ?* v2 H/ E - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
( P( K: |4 V' f4 K3 {. e - 1 u1 k% ]6 R2 L x) b- |+ N8 P
- /** Карта, содержащая все квесты. */( t4 H* p1 x2 b- M
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();( |" T6 J! R3 g! |) ^
- /** Карта, содержащая все скрипты. */
% T1 H. L& w% `* }3 J - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();$ R- H h. G6 A4 I5 {( v; R
-
9 l: [1 S/ q2 x) m - protected QuestManager()6 e ~* d$ j: u" d+ x
- {
+ @: n' h9 H( P! \, a. T - }2 `, M1 j$ @& n2 p
- }
Скопировать код 4. Методы* D6 H' L( p& n& M4 \6 U' B
Метод reload(String questFolder)# A3 M* R8 r& x" i8 t
- public boolean reload(String questFolder)
: F( u, \. e1 V' m" ? - {; c* e! c$ w1 a8 V
- final Quest q = getQuest(questFolder);" ~# c' s8 v) s0 O
- if (q == null)0 h0 Z' m9 K+ k# r9 }+ ^
- {6 `6 L/ |0 B. `5 x; D
- return false;
" k( b9 N9 K7 Y0 ? - }
4 q3 S7 r1 K S$ x, k - return q.reload();4 R( B& ^2 e1 z+ Q, o# w% ]0 o9 W& c
- }
Скопировать код
* e# C7 ?1 E! |4 A- e1 x5 Y( e4 n% s& ]- n
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.1 e1 k! v1 X. z7 B9 [! F6 h
Метод reload(int questId)
1 J# d- q7 A2 y% X% Y3 V
) N( n$ \* y' n9 f& `0 Y- /**6 q) p$ q0 m0 y' m! _9 f
- * Перезагружает квест по ID.
7 u# d' W8 h! R% K; u3 F8 B3 @ - * @param questId ID квеста для перезагрузки' ^5 u6 s4 B9 ?
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
: G- ]) L. M& l! i1 z% ] - */
# X: A3 e2 |0 \ k - public boolean reload(int questId)
' m1 A- \& C, u9 e8 J' p; D - {# u: d# ~9 |9 L/ ^* ^3 |
- final Quest q = getQuest(questId);7 G p- Q# j: ^# t7 B
- if (q == null): h' x! v$ g+ }* Q) ?3 i. B
- {/ {/ g' l2 T g9 P, h8 F% ?0 x
- return false;# M( p$ y8 L, L0 y9 o' [1 n. N
- }5 C" j: A, M B8 r$ y2 U
- return q.reload();
7 ?) b: w V4 L) e - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.& h* v6 F8 d7 y& I% b/ A( g
$ A6 y+ N) p9 {2 @Метод reloadAllScripts()
; }' n/ V/ T/ e
( `, k! _- r6 i K5 B% | @) e- /** J/ T5 `9 v4 D# a4 r m$ }0 X
- * Выгружает все квесты и скрипты, а затем перезагружает их." h! Z* Q. O3 _
- */) m4 g. L7 F7 b0 Z3 P! ]
- public void reloadAllScripts()' V! A% y( }& E, q
- {
1 s7 v1 a9 x2 T% \* Q4 `2 m - unloadAllScripts();
9 Q A3 s6 I+ e9 U8 X4 U- C* c - ' ]9 M F# N& e+ q9 [# ?/ C
- LOGGER.info("Перезагрузка всех серверных скриптов.");5 i: }& Z# X" {7 p. A
- try
5 m N3 y+ W9 C$ V! S# Y/ ^8 Y# y - {
- F% D+ |2 d0 Q - ScriptEngineManager.getInstance().executeScriptList();
3 o& t2 ^* N6 E# Z - }3 c( q% k! y V4 V4 B
- catch (Exception e)/ k$ B. Y) Q& v6 |( g6 S+ V- C
- {
2 U% {. G) v8 t5 J( @$ r - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);3 Z# ?/ e+ C& J! g: w [5 Q. {
- }+ {1 E$ R* S; p" }, p) a
- : |, g% g, S2 m X* z4 b
- getInstance().report();( m3 p. C% Q) s* P5 W' B( S
- }
Скопировать код Метод unloadAllScripts()
6 x7 I, T. A% m2 S8 @) ?
1 U- @; e8 p% f5 j; m2 Q7 E- /**
: ]" o8 I7 o: K( O! N3 F; { - * Выгружает все квесты и скрипты.+ B* o( a% I% z- [
- */
% l0 I& Q% I3 B! |$ F7 z - public void unloadAllScripts()* D5 R3 y8 W! m, R8 c/ k
- {! h L5 d% j C- ?
- LOGGER.info("Выгрузка всех серверных скриптов.");% Y0 j" r2 s4 L: a! N- Q! Y
- 6 ~& g1 V, p/ c8 ~2 ?' V
- // Выгрузка квестов.5 I4 j: ], x( r" J& D
- for (Quest quest : _quests.values())4 @2 c' |4 W6 J P
- {: \- D, }8 l2 E% k
- if (quest != null)
" b* E" X8 h/ V% u4 N - {* p7 T; Y! p+ C$ {" w- X
- quest.unload(false);
/ O" Y0 [+ ~9 z% ~1 N- y8 f - }
) y u; n- L1 X - }( _* {3 l6 O, @# r
- _quests.clear();0 B0 V: z- r6 h' _6 f K9 m
- // Выгрузка скриптов.
$ Z. G6 r! C7 Q( z { - for (Quest script : _scripts.values())6 W: x, L; r/ w9 w
- {
G* |& \5 s" P0 b: M - if (script != null)
/ T# M+ S/ e+ ?3 T: { - {: c0 L( p6 N' S* N% C' I+ K
- script.unload(false);0 |; i( c$ H& o$ H& G* {; W5 `: b
- }( |3 V' ~- a5 O+ w( ^
- }, d' U6 x& _7 G: z( F2 |
- _scripts.clear();) R: x; g, e7 F) N1 K: m0 Q
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.: s* ?" W1 j" [7 y& T, k' _9 ]2 J
' D8 X# K% N W: B0 x8 y/ ]( WМетод report()
F w$ G; R5 p% u' M" ~2 W) @$ Z) P
9 P; @; h3 X' }1 y- /**$ G' H. i1 \2 F1 _! F2 g) i4 w
- * Логирует количество загруженных квестов и скриптов.
: m$ S$ K6 A( _! A% z - */
0 e X3 a1 f0 o8 Q' D& @' ` - public void report()
: f! o6 ~2 f: |- A6 H - {
- h" z* O+ _: t8 w7 L: D - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");! R) z7 Q+ s% x3 f/ `* \6 t' J
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");. v& I6 ?* e- U- @% p+ Z* |
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.1 }- k$ W) ^! ]$ s* X2 O5 {( r
( n: R9 q2 y% \! _2 @Метод getQuest(String name)# U8 U t/ x0 ]0 ]! |- V
6 w* G' {9 R, ]/ @: d& i8 j( y. D- /*** K0 X. n6 p8 W9 B$ h
- * Получает квест по имени.
6 P' w/ \) u( H$ L) k - * @param name имя квеста
1 S/ t+ q% J- N% [7 w - * @return квест3 ]3 J. R8 ]1 O6 x
- */
: e! D3 e6 x3 E N& ^ x8 S0 | - public Quest getQuest(String name)- N' G' r9 v% t
- {4 A: c6 w3 k) A
- if (_quests.containsKey(name))7 w5 b# h2 I7 i' f( f- ]
- {
+ d% p4 E' }: ?0 l' v2 [ - return _quests.get(name);
/ ^, |6 D" K6 E7 D% K! b& p+ w! K ? @ - }: H" N. C1 c" \! V
- return _scripts.get(name);
/ S8 u. `9 S1 ?) P - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
+ l! g% q% p$ S; l, d' x" l : [& d$ j* X; O2 ~' e* P/ @
Метод getQuest(int questId)
/ g( N/ g( f8 `: s4 q2 b3 i# m1 o/ Z3 ^0 ]
- /**3 H; F+ D4 G- x
- * Получает квест по ID.
) s7 j( D- L9 k" b - * @param questId ID квеста
7 N+ H( ?. L% K - * @return квест, если найден, {@code null} в противном случае$ ^* J2 N" A9 d) f- v: C# p( M
- */
% m, Y1 j4 q4 N. L/ ?9 c - public Quest getQuest(int questId)6 v' X, J% w/ q U8 M% D2 v& [8 h( i
- {. s: h; c& L4 ^) {" W1 c
- for (Quest q : _quests.values())
/ N; ]3 J7 X- O- p) D, y. O2 E - {
" T. S4 Z0 n- Z% H( E - if (q.getId() == questId)
- z* [. [0 ]3 X6 f6 H - {0 l$ A/ f( t/ v8 A" L
- return q;
4 s0 [) K/ V/ N H" a - }
. e8 p: F' B9 L- @7 A; J! @6 I - }1 V1 D. [( J) H" _0 W2 T
- return null;
( l( l! Y1 j6 f h - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.& N) r; \5 x u; w
( v- X: n1 D% Q2 C HМетод addQuest(Quest quest)- W% V# O+ y1 [2 w) r( w9 R% |# ^
. M* a" v! F' J1 P' a Z( j
- /**
. S8 ?- I; g2 u# [3 o - * Добавляет новый квест.! _4 |* V% G! N7 Y1 \# L- O3 i
- * @param quest квест для добавления1 I: _( K4 h7 W- x3 U* K7 w' Z# H
- */3 o+ E6 A9 f( p) M0 Z% j9 e5 f
- public void addQuest(Quest quest)
+ B6 _' h7 q7 [5 J - {) W% l. _, G+ ^
- if (quest == null)
7 M7 [1 Q8 a/ g( h$ e - {- S- b4 w+ u% |6 Q
- throw new IllegalArgumentException("Аргумент квеста не может быть null");$ q' x! x: S* \
- }' ^( n; |# t* a7 F! q: M9 z, b
-
U) V" y1 v; \0 H - final Quest old = _quests.put(quest.getName(), quest);
# q% v7 I9 Y/ `; t! d) v - if (old != null): |/ i. {; d }- l1 A* t ~8 k
- {: M$ g) }' O$ I# `+ C1 |
- old.unload();
" F6 c, X7 u! [4 {: M& O - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
$ l, X, A' Q C& [9 z0 c - }! S, q7 F; ]7 e' M W* W8 t" N$ F
-
# p! }4 W3 c5 p, {& @9 J( U - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)$ D/ U7 k4 n% `- _% y! _ T4 P
- {
' @4 \2 X: E: f1 b, f - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();3 d6 t6 t" Q4 D2 U2 m5 H: H
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");$ ] m; j' E/ a k& H
- }
o" C4 s3 Y, x- h1 S g& }6 F - }5 w9 |+ G6 W( l' \: n
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
- n _2 m$ W# r0 o, `& \ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.$ f. Z% \. G0 @% B7 u: M, F% c
- V% j2 W" D; V* w, f; J8 s
+ O* B8 o E) @0 o1 \- L* S9 H6 ^" t+ y5 A0 P, ?+ V0 R
|