Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius0 @: l2 h8 L0 ?, s9 F
5 M) h# N) Y% |7 W$ \$ [
Разбор файла QuestManager.java
- K3 V- k) B& `& M* ?5 V! j
, d {1 \6 ?& f: r1 WЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
" {4 c6 w5 i' j. Y0 d, nОсновные элементы8 u. T1 B, a% Z6 i+ [* e( _
- Лицензия1 i0 T% A5 z" R* m2 Z
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
\! i5 P f4 _% `# S9 |% [
- Импорты
6 t. [5 a% N/ ^4 |- U9 g) b% U : g# @/ f/ E6 v3 G: G* M
QuestManager.java — управление квестами и скриптами.
, }- k v% i: Q4 i" KПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\" h* Y1 v. A. r: v' R- M( X
- e* _9 x0 U7 x. Y( T7 A/ t. T! n1 a3 T6 Q7 C$ j4 F% z& w
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.( G$ s [- o# V0 X; ~
1. Лицензионное соглашение0 E) i, V* X- K, E
- /*8 L9 H9 T" v% C$ E
- * Этот файл является частью проекта L2J Mobius./ p7 h+ o6 e. Q4 \/ L1 ~
- *
/ \, r7 c5 Q# ]2 d - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
$ @/ I& c, T F! q z9 `5 V - * её в соответствии с условиями GNU General Public License, опубликованной6 A7 V+ p; a# b
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
. v9 ~: _$ b8 b. Y5 G; a- J4 A - * 6 d; h! c' @. \6 [
- * Эта программа распространяется в надежде, что она будет полезной,, L6 v9 z6 I2 b
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии5 J1 \. U# N. L/ T. N6 h \9 i2 n
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
# j o) \9 p6 ~, N/ f - * См. GNU General Public License для получения более подробной информации.& T- R; A$ j% ~# x# D1 ^( t" ~
- *
" c/ U* P8 L# z+ v0 u# p; ]$ |1 y - * Вы должны были получить копию GNU General Public License
8 j' d( Z% a& q: v# P - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.3 m* ^" }/ |+ y' X' T# a x
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
/ u* L2 s; L3 q8 d% }
5 R' x: h% ^) D( P1 Q) ~/ D# D L. C) n# d5 ], v+ |
2. Импортируемые библиотеки
0 n9 q7 r u" C1 x8 x' q }3 Q8 L3 i/ E* Z/ ?5 t+ P
- package org.l2jmobius.gameserver.instancemanager;
) z6 V7 \! h! L3 F: G& r" n - * F* k. N7 s; x$ }+ l \7 P
- import java.util.Map;
) K* C4 H) Z& c1 K! o9 X - import java.util.concurrent.ConcurrentHashMap;
4 }5 b `2 }+ F/ k$ T) ?# ? - import java.util.logging.Level;
6 E! c/ `& t/ O8 { - import java.util.logging.Logger;" D- y$ c5 e& ]. `: g- O* v- R- S
; ]" t: l: H: i- import org.l2jmobius.Config;" ?! ?/ B* @* u1 ?% ?5 S: p5 [
- import org.l2jmobius.commons.util.CommonUtil;
! `% B+ q2 q. W% R+ h9 f% L# t - import org.l2jmobius.gameserver.model.quest.Quest;
: M5 F- q! i. C) J - 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 — менеджер для работы с игровыми скриптами.
+ v' E6 M, m. Z" p7 I: g7 A) d" \- }
2 }+ w/ w' o1 o1 V3. Описание класса QuestManager
- {9 B, u( A; I- W+ D( Q- /**
& S. m4 U5 g- i9 L' j - * Менеджер квестов и скриптов.
' M6 f7 ~' O; j# w; L5 y - * Автор: Zoey764 z' _+ p/ U$ h) y9 a
- */2 k: ?/ x1 k [
- public class QuestManager
' B4 r# C. C* `/ r! | - {
: P# y }* d* A6 }8 z, L% u: p6 y2 K! m( X - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
; p% o C, Y4 J# A' @# l - ' [% g I+ m6 L4 d
- /** Карта, содержащая все квесты. */8 _6 B0 t3 o6 z/ @3 X
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();" [. ~5 J1 e' E0 X9 }' c
- /** Карта, содержащая все скрипты. */
1 }8 y( n' W N3 `9 p2 H - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();% n1 t% |5 i; ], y' S! E+ L _
-
] }) J7 L2 @* n/ K* a$ P% w - protected QuestManager()) @ M6 @7 `; E, i0 }
- {/ `/ u) w q, T- {$ m; W7 L
- }
- |% N6 |. I( G( U+ x+ y - }
Скопировать код 4. Методы! {# ?4 y# y! M' a8 a+ \
Метод reload(String questFolder)
7 O/ `1 ?7 a" W3 L+ v, g/ Z- d- public boolean reload(String questFolder)
; M# G7 ?4 }3 ` - {2 T4 c5 U/ {4 J" _9 z4 j1 M
- final Quest q = getQuest(questFolder);" E# m, f9 E3 T0 |
- if (q == null): `: p' l/ A1 ?. U( U( E5 g% f8 U- U
- {, V5 n3 e G+ P& `4 y3 N K
- return false;
* r4 i; g, l# s B# {0 C - }
2 w6 n. L0 u- _8 }0 Q" R - return q.reload();+ Y* F1 m3 Q* |0 T7 _9 t. g% ?
- }
Скопировать код
5 L$ n% q. K) M1 o3 W, Y' H$ e* a$ y' V) v
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
* I8 Q2 u4 W1 B+ p0 i# @/ ^) X3 E( c, QМетод reload(int questId)- R" F4 x& z& y8 r4 C7 w
& Y* r% @& K: }8 C, g% F
- /**
6 U0 l5 q$ z* f - * Перезагружает квест по ID.
: \4 z$ j. `" B - * @param questId ID квеста для перезагрузки3 I+ O- a; W- z) I; s2 C
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае! e5 f) u" V5 v! a" d8 ]
- */
" r% Q4 `; s% M4 o1 K0 _1 W4 q - public boolean reload(int questId)
7 [, }; t& ^: } - {
4 o: K5 s: i: J6 Q - final Quest q = getQuest(questId);
+ A5 o: B: L& G" I9 {- Z- c8 w - if (q == null)5 M: C8 X$ w: O+ M& i2 q! o- D: M
- {+ {: U2 z6 `% n/ I3 c
- return false;5 J( z* Y" Z% o! L+ K
- }$ S9 t5 k; z; a9 y. ?
- return q.reload();
1 `, U2 y2 G0 a& m4 ]% g3 }; E - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.. Z$ E; O& b" h% ], l4 O7 I7 x% q
( i) H3 y1 e/ a0 ]Метод reloadAllScripts()0 r( ~5 E+ w% i% e3 w
- H& A# R9 Z7 G1 z- /**0 p. K: b, E( D
- * Выгружает все квесты и скрипты, а затем перезагружает их. g2 b# l) R) [* z( w
- *// H1 ~9 H4 z3 X7 z S+ b
- public void reloadAllScripts()( B. T) r$ ~2 [2 b F; b& L
- {" A% F# u& X5 S
- unloadAllScripts();) \; `3 b0 c4 G4 k
-
& ^: ^' [) L8 s: G" L5 { - LOGGER.info("Перезагрузка всех серверных скриптов.");
6 t; f3 x% n, ~. q2 R$ n - try
' N0 O! c/ b4 C! a( E% g" f4 f; { - {
; ]; T6 H2 R! ^ - ScriptEngineManager.getInstance().executeScriptList();7 w* {8 }" M$ ] G. w3 h
- }
3 [9 j( x+ B) i) N6 L9 y - catch (Exception e)
$ u" o) g: s3 n# P. H$ A- ^ - {% N$ j! J1 f6 w" a& y
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);; j* b% z; L1 Q7 o! q' w2 |
- }
3 ~: @" k9 T5 g+ }/ R - 8 _9 W( t9 z' ^/ {0 m* S" N1 \; z
- getInstance().report();0 K$ ^' ?! B% u* L4 f
- }
Скопировать код Метод unloadAllScripts()7 p4 ^* ~( P% v% n2 N
& p3 S' D2 c: {' u; w3 Y# Y
- /**
) m: o3 n" [; A) W' y - * Выгружает все квесты и скрипты.
8 r, u& }/ L+ P- y9 y - */& s- d$ i- p1 @0 c
- public void unloadAllScripts(), v9 `' r' R" h+ o3 b
- {9 s& }9 }9 `) r6 j
- LOGGER.info("Выгрузка всех серверных скриптов.");8 m" r. r1 y8 i9 K
-
- S4 J7 G) m& P1 ]# X7 F7 q9 c - // Выгрузка квестов.
% |' M* R! f& [* R4 ?8 h0 @ - for (Quest quest : _quests.values())
, W# B& x/ B; q" P- D - {% B6 N' u1 z7 T- P" `
- if (quest != null)
# Z) H8 c! z2 |3 S/ b - {9 W _+ M5 c( I9 D7 \1 c3 r. U8 ?9 @( Z
- quest.unload(false);0 G3 U+ Y' N& P) C) p1 z) k+ L& F
- }9 d/ x( e: }) K9 }* {6 O) w& ^
- }
+ Y5 l7 G6 P; Y4 D2 I$ O! F5 J - _quests.clear();
8 g& o( z* O z. H1 q7 S4 H4 X% V4 L - // Выгрузка скриптов.
1 a( T# T8 ^/ {4 k) Y1 \* i - for (Quest script : _scripts.values())- x! Y0 x, r ?3 T- _0 _
- {. h+ H# K9 b5 i5 K2 E" B( F* W
- if (script != null)
5 n+ `$ z' M- Z% i - {
: ^: P' W- R$ u' v) L - script.unload(false);* N8 a( |6 C$ T. _
- }
4 n) u$ i7 ]' l- l. I L2 U - }: N9 z$ S4 Z: r' n0 i% J% G$ ]2 Q
- _scripts.clear();+ [0 N8 p& d& v
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts. |/ ~% x7 u# `9 J6 S
( V9 L7 }' c1 z2 G% c# e
Метод report()& t- N7 G( T1 Z. g5 z
; j+ }1 ~: ]+ I! M5 z- /**: B* H# B1 ~% @0 c
- * Логирует количество загруженных квестов и скриптов.+ r9 z: @& G2 I8 f3 P# R1 M
- */* F$ P/ x* @( y* g. _
- public void report()% i6 O1 ?* ~( w5 N: W2 Y
- {" U) t# h) g( X
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
4 G3 A9 m6 ~1 g- u* B1 P2 Y - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");$ P. l# `( [ U) l
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.5 M7 E: a8 u6 M0 G, e% q1 f, {4 [
# a i: m' z- T9 ?( LМетод getQuest(String name)7 Z# @; G1 X6 A
( S" ` \4 Q, G4 t7 @- /**6 Q$ o2 y7 B4 t9 R8 a1 ~
- * Получает квест по имени.
3 a0 C' J$ m" a4 q9 u# c - * @param name имя квеста
8 P9 V. B; p3 s& L - * @return квест
; y; f8 h5 z) W y8 H- e6 x - */; L4 ]- O# v0 j& N- a! l
- public Quest getQuest(String name)
0 w- t& I ~; q4 p4 l - {
8 r/ Q9 f V- g$ s/ k% }; i9 f - if (_quests.containsKey(name))5 n9 j1 a( J' o$ \
- {
7 A/ ~, l) I* B& h7 J - return _quests.get(name);8 @4 J) n7 N# v! W7 {, ~
- }- M, C$ g5 G9 y2 v+ L
- return _scripts.get(name); c" X3 w' `& L8 o/ z
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
- I; ]- s# |2 V( ~6 ?
& I& f# z7 }( L$ P8 p6 `' f! ZМетод getQuest(int questId)
1 h3 H- |2 s+ n' ^/ u# s* j# M& w* M. L1 d& q
- /**9 M2 s4 v8 r' |% P$ ^4 _: z$ [
- * Получает квест по ID.
2 f$ O6 q" K! _; q* \ - * @param questId ID квеста, o$ j( a2 h$ j) O
- * @return квест, если найден, {@code null} в противном случае, V2 w1 y2 _( {+ h( S
- */; K6 n6 D& w3 M
- public Quest getQuest(int questId)
) T3 N6 u* L6 i1 R+ X; _- T' y: w5 I - {
( }: F9 i6 t' q- q @ - for (Quest q : _quests.values())
( n6 ~5 Z" T8 p9 m - {
2 ?' e U2 e# L - if (q.getId() == questId)6 f+ [# l+ L2 L! i9 K
- {
s: C p. y; V. x3 b - return q;
, u- S4 k. z5 b3 R5 M6 ] - }! z; U1 W6 [7 H+ g! K& q
- }
* C/ S9 H+ X9 E7 | - return null;. W+ {# q, R+ h: U) C
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.* h% ~( L! O% ~# g, }! g
8 N: `" ?0 R. S( L& s, \
Метод addQuest(Quest quest)7 t- G4 K8 ?0 m! k
: E& c+ l- L) T& A! d
- /**
( Q0 p$ x+ X7 X# q - * Добавляет новый квест./ T" \ Z+ `0 Q" m" ~2 ?
- * @param quest квест для добавления% e5 H1 r1 b5 K: J0 t* H/ I: `
- */: X* ~. L1 y$ M0 ~- A0 s
- public void addQuest(Quest quest)9 o1 n& D7 i6 p
- { D( o5 S( {2 A: q: K) T
- if (quest == null)
* k! P/ I, ~% x$ ?' G# ^) D - {+ |8 R0 P* x6 o7 s
- throw new IllegalArgumentException("Аргумент квеста не может быть null");9 }# C+ h& N+ j
- }
! s9 p! p$ }; W% w5 i% a0 G -
4 n5 h, ]7 w+ w/ Q1 S& x" l - final Quest old = _quests.put(quest.getName(), quest);& e9 P% P3 Q( b. ]' ?+ _
- if (old != null)3 Y0 b4 W9 G5 G0 c. ^
- {
0 A1 B; J5 F. Y- {- j) E% {8 C& e - old.unload();
0 A- M2 T3 X" W7 R8 V$ ] - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
8 k4 K6 U% E8 L" [- u+ o - }
) \ W! e; Q+ v9 A -
1 b+ Z/ K$ F8 f) ^- N. I8 U - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
/ Y8 v' V, o3 u5 }& I: Y* }. H2 \3 ]$ e - {- R/ p, x% c- L9 |& p) p- P- b
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
; O( X# m, ?. y - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");* j; [3 x$ P8 _! K# r
- }: @# }& a( r$ O+ K$ a0 T/ ]
- } G, J7 C c* V, d9 H# N
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.8 B2 G+ I1 e( J
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
9 g3 d8 N$ A8 u9 D }% w, H; @, P: s& `1 j, H% Z9 H* x
: A7 C# ~+ L3 K
) S" U; y6 p C& l |