Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius; |4 h! R5 V" ~' c' A" q4 g, \
7 t6 M: w, O9 w* z
Разбор файла QuestManager.java' a! O9 J+ o6 j3 N3 T2 g
3 Q4 ^9 s( r/ C; T, x/ [' j8 h5 {
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.& e& U) N4 k! `. K2 J" a6 m
Основные элементы6 E' s( @- [ R" N6 d
- Лицензия
. L0 C+ y5 O& m1 a" }- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
% z" W) }; Q* c# B. X
- Импорты
0 d; w8 n9 Y0 u4 o& S; \. [/ A3 N! y
8 k; h2 ], y9 U+ t/ [' cQuestManager.java — управление квестами и скриптами.
! j/ b( l/ n+ B$ ^; mПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\! i4 g$ d' l! l5 G1 B
0 u3 R: |4 ], l+ P- f3 b! j2 p
% k& R; w( O0 L
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.3 ]; p; K, h0 r' d, `" Q
1. Лицензионное соглашение
0 p& V3 C6 R6 x; B* d1 W& ?- /*/ m/ w% L8 s4 c0 n* k0 m/ \
- * Этот файл является частью проекта L2J Mobius.
6 H9 l, o) n R - * 9 I0 A& Y" ]8 s/ d8 ?2 G. p3 ?
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять6 h% m& ]7 S" x7 F* K' o! I
- * её в соответствии с условиями GNU General Public License, опубликованной
3 _6 y: c: o' x$ a - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
. i3 k- c* S- l7 B - * : m# v, S! J# @& m) ]
- * Эта программа распространяется в надежде, что она будет полезной,
+ W8 h x. ]* \8 ` - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
% u5 w c0 v* a! D) h5 g - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.+ x! }" m5 A J+ V+ H1 Z5 h$ z
- * См. GNU General Public License для получения более подробной информации.$ ~ B4 T; V: G5 G
- * ' L% d0 [2 v: j+ e
- * Вы должны были получить копию GNU General Public License s9 m3 ?# p1 H2 |' I3 u
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.4 [8 R+ J5 g# M0 |. i. O U
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.4 w4 L- |% n: d3 G
. z5 b; X9 Z+ [0 |; Z0 {
/ T; Q& k* h# u9 q- C3 T2. Импортируемые библиотеки( ^" g( v! L; ~) n4 W* Q
7 j& f0 R* B; k- package org.l2jmobius.gameserver.instancemanager;: b7 F8 l8 E8 l- n9 k. e# {
- 2 M x. A) v0 w: O1 ?; F
- import java.util.Map;
# ]' E E z2 R. L- J - import java.util.concurrent.ConcurrentHashMap;( ?. N' K# z2 O' {8 g/ j8 h0 U
- import java.util.logging.Level;. `) g" a& V4 @: A$ p2 @' B; }% M
- import java.util.logging.Logger;
) I0 g5 a0 z1 H2 Q: } - ) I; J. [. {( j1 R$ T; x
- import org.l2jmobius.Config;
2 Q, F, K w1 z! Z/ c - import org.l2jmobius.commons.util.CommonUtil;3 d6 ?4 g! p5 F; G$ O7 v- n
- import org.l2jmobius.gameserver.model.quest.Quest;
, j; y5 k! ]$ o' } - 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 t% N) q B, \3 U& q1 S+ {
5 e& P) m# G9 B/ M, C3. Описание класса QuestManager
( W4 `9 X8 o; F9 R; W- /**
! i* h, C; E6 w/ s - * Менеджер квестов и скриптов.
" }7 g, Q5 R" K- a/ ^, `" T; V - * Автор: Zoey768 G* b C4 A' ]7 Q
- */
, B: C, A X! j7 i% ~3 O - public class QuestManager
9 q- h2 b+ F' ^( H# K: W - {7 z/ e5 r( J6 E/ H! [0 x5 o# y
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());. y% q) r* x& i" f+ B
-
; ?9 E+ c3 F: w - /** Карта, содержащая все квесты. *// k, f( o8 i9 d5 A; W
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
" K& ~( g8 d( Y, a& z - /** Карта, содержащая все скрипты. */
- J% o, U% y- \8 Y - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
2 ]. E- Q) N0 z+ D, m - 9 O m! a+ ]( @4 A* l/ X- o
- protected QuestManager()
! Z8 _9 @, c- a* M9 O5 L! g - {7 y, i9 `, [& g9 ~+ Y' ^3 ?3 r
- }
) @+ T( H4 p. ?6 w; J# n* H - }
Скопировать код 4. Методы; L% B S% G' W1 `" Z/ M
Метод reload(String questFolder)
% H2 x m8 n' Y7 h9 k7 k2 E* O- public boolean reload(String questFolder)
5 b" i1 C2 U7 m; Z" Y - {% g5 q" o& w4 K9 c9 d
- final Quest q = getQuest(questFolder);: e) v; K( m8 r, S% {
- if (q == null)
- L1 l7 r* z6 e$ b9 W - {, B4 t+ l8 }0 N e' e
- return false;" [# F0 b! _2 S
- }
1 c, P( b2 x, g: v5 u - return q.reload();9 X, U3 Q, J7 j/ c7 M- P& S
- }
Скопировать код 9 S2 P! n. P) n9 }/ z0 V5 z
# e+ ?/ B6 E6 W& k9 W Q YМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.5 F* ?- P$ w- P: L
Метод reload(int questId)! u8 |- l& w. z! \1 X0 Z
7 Z' a+ N# l$ c0 s; ?7 v) y
- /**& t% F# V6 w3 l& `
- * Перезагружает квест по ID.
# ]- X7 ~0 x+ G: \. y* R& ^ - * @param questId ID квеста для перезагрузки9 b- j ]' x$ Z. N
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
- J7 U {6 {5 k0 E! l: T - */0 O e U8 G+ e2 x
- public boolean reload(int questId)
7 K3 k' r/ w: K/ R# w - {
3 G. @: O, T/ m$ z7 } - final Quest q = getQuest(questId);- U) B* e8 b# _$ s4 B
- if (q == null)
% C$ b3 m4 o6 z" a! s - {
) H1 o/ e& e9 ]# q2 V- { - return false;
8 Q% O8 _$ B$ G& |6 @+ M$ b - }
3 |3 z, g! h5 p6 E - return q.reload();
. U& L4 ?% v5 l" s8 n - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.- X: u/ R5 N- V, j' k5 S
3 p4 W [: q, O, @$ |Метод reloadAllScripts()
0 ]4 \- W9 a. T4 w# c
: s G9 P' _7 b0 j& X* N( ]- /**
8 k7 H ~1 G! H7 a# S, s - * Выгружает все квесты и скрипты, а затем перезагружает их.& c a0 \3 M6 k( T1 c3 E
- */, r \, w6 ~, c9 V" g, I3 D
- public void reloadAllScripts()0 u* F8 [2 p \9 p9 A2 r E
- {
1 j1 G. f3 w' e+ r4 r - unloadAllScripts();: G( M; ^; V' H, s" u( a
-
- ?1 x6 j2 D( C" d+ @ - LOGGER.info("Перезагрузка всех серверных скриптов.");
7 q. p1 S3 W, v" x' W. B2 w - try
! l; ^ w% \ j0 F8 \/ ? - {! V: u/ y6 D3 c
- ScriptEngineManager.getInstance().executeScriptList();4 Z* Q; C4 r0 Q
- }
/ D$ R0 p, s; K& G9 G" b5 v! b& |; w - catch (Exception e)6 c8 J' C. x3 ~1 ^6 T
- {+ O. [; h2 i! ]+ _$ F" {
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
. O# v3 I3 J( [. O - }
+ f. k$ m y0 p7 [+ M- r -
% E5 u$ E8 ^% f0 E, P! z" b( J - getInstance().report();
' a+ U. ~0 H! O; D$ q$ a - }
Скопировать код Метод unloadAllScripts()
8 j8 _$ @) d' U. C0 O3 H+ g% ?2 _. E8 k. r
- /**3 o" |$ ~1 r# X& o$ B" b, ]
- * Выгружает все квесты и скрипты.
o$ b5 s" z3 x \1 z% @) n - */& f' b2 E K2 z# ^9 d; U
- public void unloadAllScripts()- {1 @3 Q9 Z6 B1 W; i# S1 E2 q
- {: k I; s& R9 E O
- LOGGER.info("Выгрузка всех серверных скриптов.");) V3 ~- V, t- d6 ^* Z" }( ]9 N4 R
-
5 L% v5 z" g h# S! @7 q' z - // Выгрузка квестов.8 J) H' p; m4 F
- for (Quest quest : _quests.values())- p- |3 w6 r9 Z4 b
- {
* u$ ]/ L U$ b2 y - if (quest != null)3 S6 ?0 o2 ?6 z6 E
- {; s5 f Y& O0 [2 f. T! @
- quest.unload(false);! M+ t8 G% D0 h0 Z3 g: t! n
- }
2 K* [$ [- _; K3 i6 V - }
& |. Q) o4 u, Y7 { - _quests.clear();
5 S* }1 r9 l+ S$ ]% E; {8 k - // Выгрузка скриптов.; z$ d- J( O% u3 w' E. h( Z
- for (Quest script : _scripts.values())7 X) r$ K1 t0 ~' j- G$ W; E
- {8 ~4 e: N9 O+ @7 o" t D
- if (script != null)
8 m. `6 k8 ~$ H - {( `$ b/ u$ p1 H) u F5 Y- g' [. n
- script.unload(false);+ S2 _. B* N- i
- }: B8 ]: M$ e' N8 T8 E
- }
# g5 a* h) O+ {3 o - _scripts.clear();
" z% y* z6 `# H. |9 ?+ w - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
1 ^" F4 b3 {+ S( @# y6 o9 R , Y; V+ l9 X- O7 a! @) N# h% k
Метод report()( Y! x6 S2 j' T. i9 [9 {3 s
. B$ T' x: W* I3 \, {- /**" n1 R# j' p% {! U: [/ i [/ D
- * Логирует количество загруженных квестов и скриптов.
, L2 \- s) m8 b c3 i - */) t |4 l! \# [! ~) t0 D: x; R
- public void report()
, l+ D" f. @; B; ~, c* K: | - {
! A8 a& o0 s/ b; V" Y" }1 E - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
0 P" r ^, x# j I. b - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");) n$ E3 L- Y; [0 n' y5 M) J$ I0 e
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.5 u3 D3 ]2 G$ ^" Z2 r7 y
( B* z, @0 b* IМетод getQuest(String name)
8 ]. Y0 U$ I; G: O c1 v
9 T7 x2 r+ ^& ?& k- /**
3 p, U: n! }* n |( M" \ - * Получает квест по имени.# f: Z" `; u% w Z, a0 U) N3 q
- * @param name имя квеста
& a5 U, E. V. j# m D5 T - * @return квест* U7 Q* n# o( V3 q3 `8 q6 m
- */
" K x8 P; L. u- G( v - public Quest getQuest(String name)8 S5 b# b7 D# Q+ C- |- y) S
- {/ E/ Q6 D- Q4 E! p8 b7 A5 H1 ]
- if (_quests.containsKey(name))
- T1 y$ Y* m/ k+ Z% B% U) @ - {$ [9 K+ M) r: T% ]
- return _quests.get(name);
! g8 A1 D$ s) }% l - }2 d. S5 R# i( X
- return _scripts.get(name);
& b' }3 |+ Z0 l6 m - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.- h$ ?0 C" u2 C% J$ M- F7 ]
9 b8 S, b9 h4 [/ N8 L8 R
Метод getQuest(int questId): `: T& h$ d) @9 H/ V/ f
/ e3 {2 } z: T& P
- /**2 ^: T% q. d+ b& W; u2 q
- * Получает квест по ID.
# ~( |) H3 P, M# l; z - * @param questId ID квеста
/ ^4 B1 O1 f7 H/ O g( F - * @return квест, если найден, {@code null} в противном случае
" }" d5 K' q2 n8 a5 \: \! y# @ - */
- P: n6 s+ H( T1 w7 P - public Quest getQuest(int questId)- y$ _. F# V1 U% ^1 d6 a
- {! B0 {! C" f# K7 m) b9 m3 l
- for (Quest q : _quests.values()): @' _* n; x* W) o, a- |8 m
- {
) }$ d' f$ a/ i' M0 f8 |) ?0 ] - if (q.getId() == questId)' v! |9 J4 k9 ~# s
- {* A1 t7 H1 i: n8 ?0 c3 M
- return q;+ U, t7 m# J9 B# m9 [9 [
- }: R, X! G4 ?( B3 x0 ?
- }( x9 ]# u/ o7 Z) C3 X
- return null;1 |- D0 N1 S! v
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
; U; S- B" f7 \" L7 n
+ L& i8 ~$ N' iМетод addQuest(Quest quest)& w3 i3 D( D. Y1 T
% A$ P+ E# v4 y. r8 J. _
- /**
1 d$ @7 z. B! p - * Добавляет новый квест.
8 E o( }) N, M8 n, _& K3 T - * @param quest квест для добавления
% y9 W3 i9 c. l6 _$ m, @& H - */
1 w: s9 x+ C2 L$ H& w - public void addQuest(Quest quest)' i% X! U$ K- |$ y+ W0 d% i# ^
- {4 D) ?* A6 \ i4 w! C
- if (quest == null)5 m+ e+ w+ R3 P J P2 B6 P
- {" t" }# P4 V) ?
- throw new IllegalArgumentException("Аргумент квеста не может быть null");0 O! R8 T" N3 P0 o0 r0 E
- }
8 q( C+ ]8 o" N -
# C7 A( n& @: D! E7 p - final Quest old = _quests.put(quest.getName(), quest);
- e* b2 U9 {4 L7 e6 Q. ~5 K - if (old != null)
5 M2 i+ ^5 [& |2 U( O0 C- R, } - {* R- Z, A: s& ^/ w5 i2 E8 A
- old.unload();
0 x: Y6 ^. Z0 s7 E$ t: U - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
+ Q& h( j1 A6 c4 N# j: C% z - }& a7 U2 F+ Q. [$ r
-
; X* o9 _7 D* S- N - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
% p! Q+ O/ ?/ e$ c" f6 N& v9 z1 K - {# e$ s0 y3 h, s1 p% l5 X. U* R4 N# m
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
9 i: n" a5 {$ W, o - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
{$ O, s0 |' F$ k- `. h - }
* z; J& [7 ]4 x* x - }
, O) ^( V4 ]* M/ r! b. {% ^( G - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.8 g% w: b+ n0 `7 ~
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
% H8 b: [" M! y+ r/ m; Z' q4 |; Z: ?$ o! H
9 y' u3 l; `( P$ m3 W0 B) ?1 B, x
! H( u7 ~ e* c |