Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
9 m1 e. N+ R. R9 H3 k! H5 ^; z* r8 i6 @1 S( t0 g s9 ^
Разбор файла QuestManager.java
! R* ^* y. ?9 \: h/ [5 F
; B' E" Z3 S- G! ] CЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
1 v2 Y: `! I( {! W+ k% m4 ~Основные элементы9 V/ Q5 a0 m) f: p+ L0 s1 v
- Лицензия
5 c3 i# f. `: h0 e8 S2 C r- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
* Y: c( y% _1 T, {: I# m
- Импорты7 }# S5 L* \* F, t& X: R4 ^6 x
; S7 R* w: A/ Z5 T- qQuestManager.java — управление квестами и скриптами.1 W0 d G9 X8 l% H' \' K: J0 r: ~
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
" l5 ~% s5 f6 V* {3 \7 r- C/ Q) j- u. }
: p: z9 @3 a0 o3 q* L
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
; o# i V7 n0 ^' T% M: _1. Лицензионное соглашение \9 {" o, B. X9 e: {
- /*
5 @' V" W5 C+ A" u; ^" ~2 h - * Этот файл является частью проекта L2J Mobius. G4 P# r; ~! ?/ p7 c( {
- * 4 j L% y# h: I: a. Y, _
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять& n& S/ `/ s% r: j# ?
- * её в соответствии с условиями GNU General Public License, опубликованной
5 x% t/ V# ?# }# z: F- R - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
% z: j$ t' k# C5 V7 d - *
9 _4 A5 M, s A! D& ?3 W2 ]0 s* J- m - * Эта программа распространяется в надежде, что она будет полезной,
: T5 i% G% r6 L. Q- r5 q - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
4 b; ~7 n) {8 ? i% h) \. n - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.; R, D. Z3 m/ R2 U/ y, h
- * См. GNU General Public License для получения более подробной информации.
& X# M) d9 O* U( M' e* P4 r - * & [" ]3 ?1 j7 h; x$ ~9 T- i
- * Вы должны были получить копию GNU General Public License
7 q% d1 N4 B; u4 B, {0 e' N1 { - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
+ p' d3 _6 v w% q8 t - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.5 @! _1 D5 _: @. k# y
; \, Y( r9 ]2 Q3 i
, `/ i5 z" [+ B* r' G8 q( k2. Импортируемые библиотеки3 @ _, }9 S( q
1 y# D& I5 h$ ~+ h% p) r; C7 I1 {" J
- package org.l2jmobius.gameserver.instancemanager;
5 d0 c8 b$ {$ @8 f" {# ` - 2 j7 c6 T L- E8 ?1 h
- import java.util.Map;
* _5 f& Y8 E# g& B* J - import java.util.concurrent.ConcurrentHashMap;% I( ]. h) ]' w1 u
- import java.util.logging.Level;; Y: r7 k, D) O: i' X
- import java.util.logging.Logger;+ [: w& h/ `5 ]9 G3 c) }
% D4 X7 X- n9 ]! ^- import org.l2jmobius.Config;! Y2 |- p% e! K1 I9 z
- import org.l2jmobius.commons.util.CommonUtil;: @: c3 q( ] |1 S3 P2 q" R s* N
- import org.l2jmobius.gameserver.model.quest.Quest;3 g$ {1 p9 O( J9 v
- 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 — менеджер для работы с игровыми скриптами.8 r' o0 M! L' w X6 q8 [& G
: g+ P/ [6 ^# `7 Z
3. Описание класса QuestManager
6 h3 |8 H# W, ~2 M9 T) j% p- /**% g% ~ I' V1 [" C
- * Менеджер квестов и скриптов.0 F2 i: K S$ d0 Y
- * Автор: Zoey76
/ o6 S. Z8 n& R; N - */
; @+ [7 Y8 R& g - public class QuestManager" \/ ^ W, o7 S. X2 g4 P0 g, u
- {: g' Z6 V$ r" I( ?! k
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());8 K$ B5 i: r+ a
-
2 W) p$ {1 i: x$ y6 X9 R% z7 x" r - /** Карта, содержащая все квесты. */
# G* ^) |: l$ ^. ]% V( i, h7 P - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();5 M2 D# o& B' B
- /** Карта, содержащая все скрипты. */: ? H. @' O. Z
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
' I6 _8 B9 `, u" { - : n1 N2 m2 Z& M4 a
- protected QuestManager(); e4 p' n! |8 Q8 l
- {
4 K5 X6 H3 S& ] l, i" g3 [$ x1 }" N - }
2 a& X, j2 }! _# @% f9 @ - }
Скопировать код 4. Методы( m5 |+ R* ~$ `, `
Метод reload(String questFolder)( [4 A: n9 t! c- f6 e. Z& v; ]1 ~5 n
- public boolean reload(String questFolder)
6 O% Y' b& j% d2 {" D$ b - {
$ L3 [. V2 U& x8 d' G - final Quest q = getQuest(questFolder);, M8 u9 @9 G: n5 ^0 S T. ?
- if (q == null)3 T8 P0 Q/ h9 K, ]! o& q6 A; A
- {( G' p' Y6 A+ U8 Q$ ?0 p" n
- return false;
& p5 Q. f3 v. _+ |, O) o - }$ a, Q) ~5 f9 m
- return q.reload();5 i; Y& b* I4 J' J: r
- }
Скопировать код % k8 {+ f* G6 H, @$ T
! i9 ]8 K( G/ G- M% ?, R
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.; @ n$ _. x- }2 R* b$ Z
Метод reload(int questId) P+ K/ @) y& Q: R5 c
# i: \$ _6 l; q# @9 Y+ O
- /** T: `; w8 S$ F8 i1 r+ x# Z
- * Перезагружает квест по ID." p4 M. `2 f+ w) S4 i
- * @param questId ID квеста для перезагрузки
1 `* ^4 \5 s, E8 x- d, L - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
$ {& W2 O o6 O% i1 z* H" O - */' s- M1 F% L/ r4 n! Z
- public boolean reload(int questId)( M- G- N. ?. ?
- {
5 V* B( x9 v% e# K4 Y - final Quest q = getQuest(questId);0 M& |" W @7 ~# X4 \5 y
- if (q == null)
# a7 ^. W4 D, Z" [4 x - {1 z* I7 w3 J7 {) _$ P
- return false;& t4 _5 t: Q$ }; w* k. n* o
- }* {# S) M. C* D
- return q.reload();% l k Q6 X; Z2 K
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID. M) R$ E7 u* j! f; g* d; S
: s7 O' v6 ?0 w3 e
Метод reloadAllScripts()
+ q6 C$ q- J/ y
% E* U* j! j" c; y! F- /**
5 {( M, l! C4 A" {1 [ - * Выгружает все квесты и скрипты, а затем перезагружает их.; H! X H" \& K
- */8 d/ ~5 P) O+ Q$ _6 f
- public void reloadAllScripts()
. G" Q' m& d+ j# ~, R: X5 J: s - {: |# A& ^5 S! U, s/ [- E
- unloadAllScripts();
4 `7 ?& T5 R( | - - Y; e6 J7 b$ O v& b4 q
- LOGGER.info("Перезагрузка всех серверных скриптов.");
7 ]. l S ~: z4 y& A2 t9 r9 Y# v2 ? - try. n) q2 z. U- z1 Q
- {
8 k/ ?9 |; k; e+ ^9 w% Q - ScriptEngineManager.getInstance().executeScriptList();
' i0 s/ k( p( V" A; S - }
" S6 |+ X l8 f# C/ `* t, H - catch (Exception e)
" W; ?4 n( h9 B4 T' V. h) p9 N - {
7 r9 F. d4 P/ R% Y# Y" H - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
5 L' P0 R9 d' ~* i% ^1 i - }
8 }# u' i# v& J# c" d -
- y0 e6 \4 g. ^ - getInstance().report();
5 j- a% C- g$ O8 Y, z/ h* J1 E - }
Скопировать код Метод unloadAllScripts() t, Q) x, l9 h* k
- r' h; x/ s2 c* R3 E% Y
- /**
4 F% j* }7 a3 H, @5 z& K2 ?9 n - * Выгружает все квесты и скрипты.* S9 G& u2 S: b6 @1 Y/ x
- */
' E' ^6 o9 G+ _0 X, [2 a, ? - public void unloadAllScripts()- e6 M$ Y6 Z4 ~9 u
- {
; X4 y% |# l+ u6 G - LOGGER.info("Выгрузка всех серверных скриптов.");
: T- h& K1 h @ -
. X2 V" c; ?! O$ k - // Выгрузка квестов.
( j! Z) S5 j+ m: P- u - for (Quest quest : _quests.values())
3 X8 X9 u5 \* N. ] - {
3 T( L0 J( Q- G# S" i+ e2 W: d - if (quest != null)
9 Y0 w8 `4 S( ^- L) ^ - {1 b) k4 ?, F' J$ L. |1 m$ V e
- quest.unload(false);2 x6 [; u) D* |6 F; \. ]
- }1 k% g/ A0 L& q$ Y3 O
- }
; {* F+ M8 }5 ~0 V1 Z9 X0 B' e - _quests.clear();
* \0 `! b# w( E7 P7 k - // Выгрузка скриптов.
4 }; z) _9 [, |/ W: d$ S9 S- l5 ^ - for (Quest script : _scripts.values())
! k- X, ?! `% | - {
0 z9 A( U( l" V8 \5 z3 ^8 e - if (script != null)
& d5 `# @7 K& S F# U5 ^ - {
- A# I- E1 N- R; ^ - script.unload(false);4 o( ?( h1 ~6 t- |4 A2 O: c
- }
' y$ W5 ]: ]& r/ e+ B# }: S1 t9 \ - }
+ F# B$ u0 h* } s - _scripts.clear();
+ L) m: O1 h' D9 A/ b# s0 U - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.. C7 T4 k4 _& b$ O1 i. p
3 R9 J B5 Z0 @4 z) K9 x6 {0 d7 jМетод report()
J: S# B6 E' A% P3 m' ?2 c% L7 j* R$ p! t8 s" I: k" P
- /**
$ e$ V4 T' v, }2 I - * Логирует количество загруженных квестов и скриптов.5 j |# `+ g1 B3 d# G- g' X
- */
' g1 H! W5 E/ P$ ?: ~! } - public void report()
& Q0 i' v7 u- S- j( T - {
7 Z6 O2 n& U& c2 F - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");) i+ A, ~/ Z7 c* y- c
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
% r' ]4 x! o8 F# m% q - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
( H) G' H4 `5 {: X9 _, k8 ~ 8 ~/ G# z7 Q% j* Y, s
Метод getQuest(String name)# _' N5 U3 X! ^% a8 ] h: p" `
9 K! n) X8 e( T! ?. Y
- /**% F0 m& k X# M
- * Получает квест по имени.& s: F. k, d6 U. Y/ ]! k
- * @param name имя квеста
, f/ F6 i% W- r2 |! [5 \8 Q5 W - * @return квест; O# m: K" c" e \+ p. [9 F. h
- */
! ~& G; K. u3 R$ x4 q6 o% ] - public Quest getQuest(String name)
9 \9 f) b: B' z) b; M8 t- _/ k, l - {3 b) |+ [+ {5 |
- if (_quests.containsKey(name))8 J, _7 g+ x/ S* x3 c' K. P Y" ]
- {
A3 T2 C- x. O* K - return _quests.get(name);
: T8 Q6 C* ]% k8 E1 N" t" Y q - }
" m3 F! Z; w) m. T4 [ - return _scripts.get(name); M+ V; p0 o: O
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.: Q6 [# t _* [( ~5 }: @
\! O# W* \8 g5 s" xМетод getQuest(int questId)
2 }: R& \/ X9 W& h% ?+ B
c* |4 E( Q* w- /**/ `& b: z1 A0 x6 {, r8 S4 j
- * Получает квест по ID.( Y6 N: D( w1 H& R
- * @param questId ID квеста
" {' F& y0 ]( r. N1 d) {* K - * @return квест, если найден, {@code null} в противном случае0 i; q9 G) V0 n0 e
- */3 d$ c: W' @& { ?5 Q
- public Quest getQuest(int questId)- V5 x3 ?0 [5 ~2 G7 c- J+ L. `
- {" ]. G2 M5 M: q6 C3 _1 c) j
- for (Quest q : _quests.values())
& S* a3 ?; a% o9 o( z8 `2 a - {- v+ u! `; |6 i( x5 ?
- if (q.getId() == questId)
$ r3 @+ Q4 M/ O1 h# w: q8 U# q+ ]/ A" i - {
3 B8 Z8 x% U/ x7 l - return q;
/ ]6 z t" y1 X ?2 c0 L, r0 s - }
r) g% I& ~3 d - }3 A; a6 t1 N! s/ N8 `/ [4 }/ V
- return null;
( l+ L, s* w/ c9 Q8 v1 x" j - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
: _) }" X f4 _ 0 _. E, N/ Q( S
Метод addQuest(Quest quest)% t+ _" B& z+ d& D0 I* E
- [9 j3 h8 X; ~
- /**. T9 c2 W" M) `' m$ z
- * Добавляет новый квест.
9 @- ^( q' A2 _! r$ Y6 }! @ - * @param quest квест для добавления
% p, \" j; u/ W3 i7 } - */ j# d% M7 ]* o) u/ Q) y, T6 F
- public void addQuest(Quest quest)/ u5 m& [6 @3 I" ~" O+ ?9 X6 P
- {1 @: v! U/ G3 U5 O" I8 k+ H
- if (quest == null)
7 V s# _. q) O: I) Z - {
2 O1 `: t) S* }2 D9 s - throw new IllegalArgumentException("Аргумент квеста не может быть null");
- e- o* H5 J! D# ]' ^, Q9 o - }
) t p. H3 D; v0 [ - ' R9 p! G5 e1 v# `, @
- final Quest old = _quests.put(quest.getName(), quest);3 e& W; y# ?# h4 U+ ]
- if (old != null)
& O4 q6 ]8 C8 G1 W4 @" O. F5 ~ - {/ [# ^& p0 G0 C
- old.unload();( X/ m) \/ L1 J1 n2 u, I
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
$ r6 D% N( |7 c: f - }
! {- e& u, B3 h8 l - ( K$ Z1 r0 a' f ~! W$ H; I: b8 }
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)0 `) o$ C! @) N- t# g4 ?
- {
/ e. G$ T! p P0 J - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
, H. s/ m n# O) X - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
4 g9 b ]! A' a; a4 n - }. T* q: V" \+ c- k, Z, Z1 ~2 g
- }$ s6 b* l+ z$ A& w! f( D
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера./ O( p8 Q/ ]% f9 q
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
# e$ R/ T3 E6 p5 K
, C/ A6 z# x8 W5 D6 X0 M% k& g8 t! Q% R. @. e( W
" S0 H! y3 ^9 H |