Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
' q* H6 Q! m7 D8 e/ h! {& c) M$ v2 p: a8 ^8 o
Разбор файла QuestManager.java; Y4 k$ p1 H; X* F! R
0 l" S9 \0 `$ A0 d, X1 v& {3 U; [Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.& X" v1 V7 o( U8 b
Основные элементы
( l3 Z- m' A' W0 f. y& U9 D' L- Лицензия/ k7 E- ^+ `6 g# I
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
8 n+ J( c/ v3 t* N. R& A# e+ B+ H
- Импорты
" x6 z8 p$ b; D$ c ( V/ @/ z) D+ D8 Y& P' b8 l
QuestManager.java — управление квестами и скриптами.
0 F% N! _/ e& Q4 e( `" O0 O( v+ lПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\+ i0 B7 t1 {( Q$ G0 i7 x+ I) l* n
1 i( V/ d- C8 ]# q: A, e3 P' [# v) l2 ]" R
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
" i8 [' v1 [$ J! R1. Лицензионное соглашение# z6 K: g/ I1 H
- /*
& t- `& ^1 z* }) J. E3 W1 S) E - * Этот файл является частью проекта L2J Mobius.
Y$ a( {* L2 B# E' ? - *
% M a7 G% {1 Q- v( u( R - * Эта программа является свободным ПО: вы можете распространять её и/или изменять9 K: T4 g6 _" z% u
- * её в соответствии с условиями GNU General Public License, опубликованной
4 f9 t0 |! P" G6 {% S - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
0 a% G- e5 |* n - * 2 P V4 k7 A) N
- * Эта программа распространяется в надежде, что она будет полезной,( i7 V+ u# ]; y; }
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
* |& X( t0 ?9 v. A A w: G - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.1 l; o" e! M1 K! g0 k- v! c
- * См. GNU General Public License для получения более подробной информации.
5 b; U8 z! g) g% X+ y' Y3 d9 J - * " |3 V0 p. ]3 j% M( V
- * Вы должны были получить копию GNU General Public License
6 B5 j% X1 e0 I1 x3 d - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.3 K Q* C$ V' N$ D2 r7 b
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
$ @) K7 I# f) L6 @% Z( C* {! K' r% j. P0 ~6 D
9 z* x& G. i+ c' u1 }% u# w, O2. Импортируемые библиотеки
% l& C8 {% D# ^6 p8 Q7 k) A% K2 l0 X' E6 Y
- package org.l2jmobius.gameserver.instancemanager;
' M% q! N- c: X+ Z' ]
# [) @( I0 |0 v* @, {; ?4 j' I/ R9 C- import java.util.Map; T1 z+ s1 }0 V3 F# V9 V3 F4 A! s
- import java.util.concurrent.ConcurrentHashMap;
: p- }- R! `3 {' L7 t - import java.util.logging.Level;
7 G, ?+ v4 Z9 G- ~7 Z7 S - import java.util.logging.Logger;+ d' _0 G2 U; s7 b
$ j/ T, [$ J7 b/ x# c( F- import org.l2jmobius.Config;& Z5 ~, p5 f" y \
- import org.l2jmobius.commons.util.CommonUtil;
' C; X7 x% x% P7 P: M! {8 x - import org.l2jmobius.gameserver.model.quest.Quest;
" a- j" |: A/ c5 |" n" f - 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 @5 i7 K- _: ?2 S( n$ ]
5 g4 q0 w" S6 W% J3. Описание класса QuestManager4 v# j- P! l2 [6 U P9 q+ B; _8 Z
- /**
0 R0 B0 h1 U ?1 D' ^ - * Менеджер квестов и скриптов.7 s6 T- o S' F, J
- * Автор: Zoey765 |, |1 t9 ~' W( V1 K$ Y
- */( u6 d A5 s- ]7 Y% }$ [, u8 i* j
- public class QuestManager
7 }* C# R7 b7 `- r; i1 p2 X$ {8 { - {
7 g8 H9 m! r& n! u3 o q2 { - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());# S4 | T5 Z) C- _
- d" {; A c! N9 _
- /** Карта, содержащая все квесты. */) `* M4 ^9 k) r( M$ F I+ k
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();* b+ `9 q/ G- M3 G
- /** Карта, содержащая все скрипты. */
! E/ _8 }* a# h) d! u - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();" ~' @6 x5 |7 X3 y& Y+ l8 A
-
8 Y, Q+ _8 z# K5 A( n - protected QuestManager()# V+ t; M. ?* f" N3 g" J+ e+ W
- {& }' s( s% j' |/ V7 G) V
- }
8 d& C, i) U- }; A% l- v' Y - }
Скопировать код 4. Методы2 k, R1 p1 M; Z5 D+ C/ s
Метод reload(String questFolder)3 E. M0 D. A4 b, v) ^
- public boolean reload(String questFolder)8 g& _( V7 B+ Q
- {
* S7 v, _, N& y2 A0 d - final Quest q = getQuest(questFolder);
2 ]9 E4 t; A1 u4 ` - if (q == null)
. w3 t# Z3 I Q( S# L - {
) l6 o S9 Q5 z' w, @) Q - return false;" I. ]; H: @5 V) E* {* k$ p+ N# ~; {
- }
! u) S/ f0 {: { - return q.reload();8 D o6 v$ u/ a% C- L( c7 F5 S
- }
Скопировать код - w% g4 z$ H& z0 }6 P
+ _# U9 C' t( J0 H; C4 sМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.3 `) c5 d& o) F7 g
Метод reload(int questId)0 ~0 V+ U$ @% G( Q' w% B2 ]
% K2 x" J# q+ b6 a- /**$ P& ]5 u. p% @8 d7 ]
- * Перезагружает квест по ID.$ C. \$ `+ D. U- s9 p
- * @param questId ID квеста для перезагрузки
& X. K$ i& T1 C% U! z - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
2 c( C) [# J# \$ \ - */
' W& S* [ ]; S9 ]# Z. t! X0 I7 T; ~ - public boolean reload(int questId)( i+ [. T1 y1 K7 c% A7 Q
- {
2 H" N1 m. C2 S [1 ?! W- c ]' W5 T - final Quest q = getQuest(questId);: E( e- A# q; q6 Q9 q" x$ b
- if (q == null)0 j) A5 ?5 D, w. ~2 Y5 l
- {0 _$ j; l" |; c. D4 T2 k/ n/ P* U
- return false;! v( b6 h( ]; P) t
- }
8 \' V+ C/ O# K1 ?7 H" c) K# N1 A) d- o - return q.reload();
. j* ], v8 B D/ G+ @- O. a7 d* h - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
" G6 S! N) `% ~8 q # t. i4 |- Y; y# f! w8 h% n+ i. k
Метод reloadAllScripts()/ _* ]8 W+ j" o, A& H* j
3 G6 e2 @% d7 W6 |/ A( A
- /**
2 E5 q2 b$ C7 i - * Выгружает все квесты и скрипты, а затем перезагружает их.
) O6 u" l2 F# g* ?! C6 r- L - */# L$ W6 q p( O" |
- public void reloadAllScripts()
1 @' q( y( C* X. F& O/ ]4 M - {, p% e( G# t; z; ~# \ _4 u1 L, i
- unloadAllScripts();
5 W9 J+ Y2 k) e: ]( F5 y - ! l! L+ \$ _6 }* j8 B3 A/ h2 `; ]5 M
- LOGGER.info("Перезагрузка всех серверных скриптов.");4 v) [8 Z0 b7 ~
- try, w: |# L. R$ T' q% t+ x
- {
W+ W' ]- t: K9 u/ i% S - ScriptEngineManager.getInstance().executeScriptList();+ E9 U, C+ O& s/ t, R( ^
- }3 O. v; y. c- I$ [5 c
- catch (Exception e)
( l6 O2 ~* _+ M/ Q: \. ~ - {9 L W5 L1 k1 u1 y; q; }2 i! A
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);* a2 a7 m O6 k9 P" M
- }. V3 G: h% m* c
-
, n# N8 T, Y' u% n" D - getInstance().report();
8 p9 K5 O5 i% H0 U7 e1 U% Q" z# \8 G - }
Скопировать код Метод unloadAllScripts()3 }. y/ V; V+ a5 T
- ]2 Z( X- I, f+ X
- /**
# s2 K4 _* h% e6 r* a! L8 d& h9 ~ - * Выгружает все квесты и скрипты.3 }4 i4 G7 e$ o
- */
+ s* A: e% d' A+ H" W1 f# \ - public void unloadAllScripts()
. G4 B# x- t$ d) u' ?5 E - {
1 U& ?0 M0 s8 p2 P! F* j$ V8 W3 d - LOGGER.info("Выгрузка всех серверных скриптов.");
. B: F& w. l8 ` -
/ N5 D0 B. g; D - // Выгрузка квестов.9 I: B1 g" a- K) P d
- for (Quest quest : _quests.values())
8 ~. o7 v& M5 J; |% F" d - {/ H% x9 `6 ?8 Z a% K
- if (quest != null)/ Z1 ]/ a; p' T/ ^# g9 o& H
- {
4 F+ w6 x) s3 Q4 M - quest.unload(false);
7 A; h9 }# F* L1 A* i4 S - }! R% Q6 i* R+ y
- }5 v$ o d- Y7 V" @! J
- _quests.clear();7 Z' T! z; L7 F& I1 l' z: S$ N# g# }
- // Выгрузка скриптов.
r4 K3 s4 O+ \( j9 O9 i1 y! X - for (Quest script : _scripts.values())4 i* }( I' @1 l, ~
- {
B5 l' `- G: ~( q - if (script != null). j& l. I, b2 d8 b
- {
2 g, q% a# u5 J }. Z' J - script.unload(false);
( V |. d( j7 q- [3 ] - }! b! }4 M+ }* O1 l& h
- }6 F4 Z+ C" v& K1 U3 q2 x
- _scripts.clear();
, M% M3 [) h! X+ t9 ]6 b! A: Z9 z - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
' U4 }# n$ z4 j" |
' z/ Z$ h5 f) Q: D4 E7 Q% @! w) CМетод report()
. e& Y% `6 G/ \% f
6 W- z3 S! a3 u: c$ e% N- /**
8 @4 C: ^* C7 P/ x* i1 W4 @* l - * Логирует количество загруженных квестов и скриптов.: G1 f9 O- M/ s! Q& ^( J- g
- */
% d6 S3 B& m2 V - public void report()0 Z) g6 [* H2 G+ S2 I* b
- {; f) ^% _! Z3 U
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
% B8 s$ @& M! H2 _3 r8 z; n% N - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
; Y5 Q1 w+ A* ~8 B. A' s* x% C" R - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
# B% M& V" @6 O) Y1 Z 4 o2 j% x6 D& ]8 v9 A
Метод getQuest(String name) [5 x: p$ e; c4 c1 p+ `
3 V8 S; \8 H$ J
- /**; I' f' C, r2 Y' P3 e7 E
- * Получает квест по имени.
K/ L6 Y5 g) z4 h - * @param name имя квеста
, T" k) ^! u8 ` - * @return квест/ E/ r2 g: }5 @8 z" ?5 F6 |
- */
g4 T6 [/ C7 C- ?$ C3 e! m - public Quest getQuest(String name) U2 B0 Q; N- y, i9 V1 A/ ]$ y" `* X2 n
- {
7 B: ?1 w0 y7 f" p1 o8 Y( m4 v - if (_quests.containsKey(name))
" V, h0 x d5 e$ Z1 ?5 ], X - {
! W( }+ J0 t' H+ i) y - return _quests.get(name);' K; X) _9 [% Z2 N# d# X" U( W z
- }
6 |" }" m* ]% P! m3 p5 S - return _scripts.get(name);! r2 `* [3 n! C5 T$ {. e
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.5 b1 w9 ? T0 _" a
) t1 I! M7 ^' r# e1 aМетод getQuest(int questId)' I5 J' y* Y. e4 q1 ~
% m% Q: h4 y$ P, j
- /**
& Q2 Z1 c. L& w: h+ B" n - * Получает квест по ID.
9 o3 k3 t) B) C - * @param questId ID квеста% d2 e \; Q( G, A ]: R& e
- * @return квест, если найден, {@code null} в противном случае% R* { Y- _$ Q. q$ U V
- */8 R/ P- v4 I, e: z
- public Quest getQuest(int questId)* K, R) R5 Z$ w }3 Z
- {' n1 ` M4 M/ Z3 F/ h R
- for (Quest q : _quests.values())* Q) u' T. ?3 L3 k3 `( d
- {! ^/ ?* w( L0 g) a
- if (q.getId() == questId)( I5 e" i4 C7 a3 a* Z0 D: H4 }
- {4 J, g- a2 L9 m+ Q
- return q;% x/ W& q( v% a
- }
4 M) J6 P/ q# S" {+ P/ N' N3 U - }
" i" V9 u9 N) L P. v# ?' l" ` - return null;. T: R# z$ `* [4 k9 F. x1 p$ D
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.% b4 v" ?3 H/ b% V
' C6 m3 }0 W, x% E6 r! LМетод addQuest(Quest quest)' t" d) m+ [6 C# J5 ~' X; W' A
0 ]5 m& c3 S- `
- /** H" t7 p/ ]& X- S2 x, E( l
- * Добавляет новый квест.
$ w4 f! u1 g" Q. ]# V3 F - * @param quest квест для добавления
& i1 _# f! m+ t) d - */
" b k; u+ f q: P9 T6 k - public void addQuest(Quest quest)% @( Y) _& d% k6 f: R0 ]
- {
2 d$ H& t( A4 m0 v1 c( { j# U s - if (quest == null)2 l% j. d; y+ y
- {3 f; S( W( ~ U0 B
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
. f8 l4 J! o+ {- v8 w - }
% E, M6 f, Z* R6 l% v4 _ -
5 |& P( h J; D/ f, ^6 ]" m* J% b - final Quest old = _quests.put(quest.getName(), quest);( Z1 j- a, n X: _5 t
- if (old != null)
; V; U! s& w3 y5 e - {
1 N. v% X$ c) m. i - old.unload();
2 r! f% T# b7 ^ - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
z; W5 V; v" h4 M1 ]6 m u9 | - }
+ J/ u4 Z R. _, A -
`6 R5 y' ?# d - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS) D+ G. H4 }% N
- {- M' F [8 y; a' H! h3 M" J8 P
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
$ ^" X/ j3 E: Z3 Z - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");* l" e4 T$ Y! e2 D! a
- }0 V6 f$ @8 J6 H! B8 N$ G
- }( V+ ?& y% j& z& K( w
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.& _- V/ a4 n) n3 L! f. S. H) Z
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере., `8 N' N& e( l3 G. H+ P
5 H$ b D8 O9 W& m$ s
( j7 h# o! ]8 X! C% P5 Y ^4 p; o/ y$ y6 w1 K4 J
|