Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius. `9 Z5 Y/ s1 b9 s, ^9 `" ~8 Y+ h; }
. a. V% w9 h: F
Разбор файла QuestManager.java- z5 k \6 A& g" ~) C
$ y! U9 z& m3 n F* M5 T
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
& S" h! C, b0 ^8 I& M s) ^' G7 fОсновные элементы7 e1 f @% Y/ e
- Лицензия" X3 }9 y/ |. @4 x) @
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.8 Q' F0 O( ~, d4 G
- Импорты0 b) [+ O1 b3 J+ x
8 y: v0 P4 g' }! d2 m8 z- g
QuestManager.java — управление квестами и скриптами.* [" q* I0 }- r% D3 @
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
1 S# N0 X# y" ^3 v: X6 a
+ \# Q! V0 O7 A4 `
8 _+ \% `0 t$ k8 S) C. d, kДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.+ r9 ]: p" c" h
1. Лицензионное соглашение9 n: ^4 A9 e7 ~: J
- /*8 {2 J" Y" x: N" P6 F$ _
- * Этот файл является частью проекта L2J Mobius.8 n1 P# w" _9 A1 I" o
- * ( I: G1 b _# ]* u# J
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять, Y' @2 o* _6 ], y' v
- * её в соответствии с условиями GNU General Public License, опубликованной: G+ B) d% m8 b4 n
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.4 F: X$ ~* O. D
- * ' b# A1 y r4 n
- * Эта программа распространяется в надежде, что она будет полезной,
) w6 i# W: x& a5 R - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
3 K. W6 e( M2 `. a6 J7 a - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.9 P, n/ e+ ~2 m; J. S
- * См. GNU General Public License для получения более подробной информации.
8 s1 |+ `3 s& x - *
! P. p( ^% G3 R7 e' ~* V' Z5 j3 Q - * Вы должны были получить копию GNU General Public License
) ~7 |& ^" u; k$ v# g v8 k- l7 ` - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
' F C* d6 u& e) \, Q - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
: ^1 h5 e1 E8 c8 y7 ^ ~; ~
. T- d1 R. ~/ }. P! {. R! G$ ^2 p! R2 ]2 \3 R3 y! U2 _% D
2. Импортируемые библиотеки
|3 x" d8 d& U" R) H: F; k( t1 `/ P; `
- ~- `. d3 b$ A8 X- package org.l2jmobius.gameserver.instancemanager;
) A" w6 c6 w5 v1 f
4 E9 q$ }- m0 k+ d, w- import java.util.Map; G1 m6 N+ Z/ Z i1 o
- import java.util.concurrent.ConcurrentHashMap;7 B7 L& S5 l- _- q9 D9 ` j
- import java.util.logging.Level;
2 G! S" r. W. M0 P% p: O$ p& q - import java.util.logging.Logger;2 y9 v+ \. U/ O6 e9 X3 l* N: b
- 0 r' I t& y- f5 b4 ?) G+ `* a, b
- import org.l2jmobius.Config;* B2 P, H5 r/ s( k% q, p, U3 A
- import org.l2jmobius.commons.util.CommonUtil;/ q% U- k8 k! e/ ~
- import org.l2jmobius.gameserver.model.quest.Quest;, \; f0 \" n! ]- W2 l7 b: H
- 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 — менеджер для работы с игровыми скриптами.9 D$ x R9 B/ F( u
; p4 f: I9 C4 |! ~# T; M3. Описание класса QuestManager
' f" q: `9 V2 i, Z9 S- /**) l9 ^0 F& s/ l3 p% G- y+ c
- * Менеджер квестов и скриптов.
: V; g6 e! X2 ] - * Автор: Zoey76: [6 }0 A L) \, F% K
- */& x r9 x0 @9 ^* u$ ?
- public class QuestManager
$ Y( ~! a4 k* f% Q' v( @ - {( U# M: g. @( h8 W# y) w
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
7 F8 \. q6 i M9 ?7 n1 M -
7 f; `3 h9 L) B ` d1 c - /** Карта, содержащая все квесты. */
" D. C" G0 r% Q, F6 g- B4 D - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
, l% b& P+ ` H0 R: h" K - /** Карта, содержащая все скрипты. */6 e! V: }$ h5 [0 v0 }
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();* f, o( x9 `$ B2 C' V; [
-
3 o3 X: ~6 u, t% _2 }* |5 ` - protected QuestManager()" a( ^4 s1 ?+ |; [
- { p9 C6 ~2 x0 Y. E2 F
- }+ Z1 X2 t! A' C1 @( v7 |; j
- }
Скопировать код 4. Методы' F" R$ d- i/ F4 M: S' F
Метод reload(String questFolder) S' y* c% x/ k4 `( k. V
- public boolean reload(String questFolder)
+ ]* m2 E' j% v; D$ t& M" n - {& E0 M: w% d& ~2 q; u2 R, n" V1 a
- final Quest q = getQuest(questFolder);7 f3 g0 U1 n! }0 y% C ~, c9 [
- if (q == null)8 i( Q' u7 k$ a9 n1 F8 Z! ^) p
- {, E, f' e! Z7 G8 m; g
- return false;
% ^; h+ f$ l6 w4 o# @6 K P2 B/ p - }
7 T2 a; p* l k, v% s. V/ H - return q.reload();
9 H6 s" `$ V" }" C0 W$ _4 d - }
Скопировать код
( C. W4 n: Q5 j, X% y* _" B
( g" t/ f! n8 i$ ^' v5 UМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста., m7 m% O& v8 g6 Z4 ~! O
Метод reload(int questId). _, c& A: Z/ `& p8 r" I+ \6 w
' \. ~. [6 B9 S) P7 ]% C
- /**
. h+ _2 [) M$ T% |) ` - * Перезагружает квест по ID.
* S* e+ c$ [9 k) {3 `; s$ U - * @param questId ID квеста для перезагрузки: c8 q1 B" V8 t2 a7 r( \/ c1 a: ~
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
5 ?4 T7 {: n2 H) p# x - */. n# c4 f u5 {
- public boolean reload(int questId)- `0 R2 W8 Q3 I. `. ^4 X7 t$ \, C
- {
6 ?" D) E! m9 F* Q6 j - final Quest q = getQuest(questId);
! {7 D, Y+ |8 p/ D - if (q == null)
& Q3 u6 l+ a j/ [: }# Q! P' Z - {* L" b5 M! u& [% p& n9 ]5 m
- return false;( h/ c% j4 f* f8 N& W
- }( b1 G. V6 ~- @/ {
- return q.reload();
1 q8 h4 k! z0 a+ a7 a% G+ a - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
0 R. G6 ?) c6 ]. C9 O; P
: f% C+ @% } C0 }+ B' s9 f( RМетод reloadAllScripts()) \# U$ p# Q" X- @/ h$ t
* r7 a2 J# Z& s- /**5 k$ ~! x& W: r3 q$ y1 M6 R
- * Выгружает все квесты и скрипты, а затем перезагружает их.' D% l/ T7 p; ?5 ~6 N
- */' C" p+ W( w' q+ M' K
- public void reloadAllScripts()
# x; I& w% o/ `2 L0 C' u0 h% V - {
' v; U |+ T4 z6 c8 C8 i0 o - unloadAllScripts();
, N, k' _6 q4 e# L# q! `% X l -
( A6 V" R, A) a U3 Q - LOGGER.info("Перезагрузка всех серверных скриптов.");
: A5 l2 {# ?" _) v - try
' I" Q" C7 k3 I$ r! P8 B0 n { - {" b4 i. ^/ V5 t2 v* J
- ScriptEngineManager.getInstance().executeScriptList();# ^5 a2 V1 k: p. [% A6 e
- }
1 R( k% t) c+ f - catch (Exception e)
8 P: C. y' }- B9 K4 g N+ w - {# }, @/ L a1 U# C
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
; u" c5 ?4 h9 g3 { - }
5 X6 D* ^2 v5 v2 D- S( m0 N - # s5 B# E7 p9 ?
- getInstance().report();0 V/ |/ u- o2 |) h
- }
Скопировать код Метод unloadAllScripts()) Z5 k" q" @0 I+ e. t, N. B
1 I$ v5 H$ |; S5 d8 I& a' U8 V- /**4 B' h( M' P8 @! Q1 i6 B6 K
- * Выгружает все квесты и скрипты.( q: t; w: s+ [. ]3 x: y( `) ]
- */# I/ i1 [8 s3 l8 M, o' R- H# q
- public void unloadAllScripts()# \ b4 \) }+ W! N8 u+ Q/ l6 l
- {' b( r) l; I6 J$ _. }4 M
- LOGGER.info("Выгрузка всех серверных скриптов.");8 |. v/ R" w7 Z* ]) R8 f
- ' X+ }6 { n7 h& ]+ d
- // Выгрузка квестов.
9 ^2 |/ [* j7 I& q* f4 C: \2 ] - for (Quest quest : _quests.values())
& E% y5 _ e/ { - {& a$ w2 `0 s: \, a* A
- if (quest != null)
1 R% l) I2 L$ O" S! }3 ^ - {( J# I3 p8 H( K6 S+ D( H7 P, k
- quest.unload(false);0 G7 X7 q3 {- |" e
- }) ?5 n6 D' x- \" |
- }2 c' X2 s) L' B
- _quests.clear();: P2 k5 a+ m6 M4 {
- // Выгрузка скриптов.+ S" Q/ X- n8 M
- for (Quest script : _scripts.values())
& l1 ?7 b9 P0 U1 d - {/ Y6 `5 C6 M9 I* T4 f
- if (script != null)4 K3 N* u& F* [6 R# D
- {8 X2 ^, G' E* r$ Y2 A0 r
- script.unload(false);
8 W; }" j, X; g4 z* c- \* S - }
! t) V+ k( l; D+ M0 w - }% r6 M6 ]6 l) P) B/ H7 a! D
- _scripts.clear();( E( Z( a! l4 R& @1 y' s2 e
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
' X% l( W8 H" j 8 i: `) c5 w# N
Метод report()# h$ h! G7 @2 M, D1 {& s! p( h! M
% m5 ?3 v5 i" G( S8 _5 {- /**
+ x9 _, j' V! s2 o) G) R - * Логирует количество загруженных квестов и скриптов.
6 S! a3 f: ]' Q2 o. K! k - */: N+ u+ h% g) m, ]
- public void report(); x6 m, T0 D6 V( O. Y! v
- {
0 k4 }7 ` R3 z2 i. y: z5 d7 k7 s; X4 e - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
4 J& |$ L0 g/ m4 T* S" \ - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
( p* ~: Y& `' C# M3 k - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
* R# U$ ~- R7 v# L0 W
& a; U8 G( s, Y1 pМетод getQuest(String name)! k0 C* @. _5 C
* T: \$ n9 z) b1 U3 \! R% V- /**
- r1 [9 l) g3 S; e0 u - * Получает квест по имени.
; g8 f1 M' ?6 { - * @param name имя квеста2 a4 |' e9 W" m) W
- * @return квест
& @ E& C0 g: E$ z; G/ W+ c - */
( A4 X# d+ {4 P - public Quest getQuest(String name)
0 o% V6 |: m8 G - {
) }/ E( @9 R F& u8 K+ J - if (_quests.containsKey(name))$ d$ N+ W$ G9 S
- {
A1 r a# ] v, Y6 d - return _quests.get(name);9 Q6 y8 z+ T0 p3 C
- }9 i3 i4 p8 q% U. W4 u( `7 ^
- return _scripts.get(name);9 h( }0 s' c3 o) \( C+ q+ p
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.. y5 X8 E2 ?2 `) Q+ W2 H6 t
, S! ~) c, Q* L5 }+ o
Метод getQuest(int questId)3 ~; a! S5 F/ `: l
9 b* C3 O& \+ w" u! ?0 c
- /**( u& w5 G* n n. a3 @9 V
- * Получает квест по ID.
1 K1 U8 E8 S7 N! [- K, Y s - * @param questId ID квеста
% R7 J$ A4 R1 A - * @return квест, если найден, {@code null} в противном случае' \: R, y7 F4 U$ a L
- */" ]# r) O& o/ p8 U' \* ^
- public Quest getQuest(int questId)# C/ M+ W1 J; [1 T! g
- {
1 f, V9 z/ b1 y/ ~/ q - for (Quest q : _quests.values())
; y. j% \/ j( P) t9 y9 l - { o- B( e* C1 q/ D7 ?# u' t
- if (q.getId() == questId)9 d; D* n7 R4 Q
- {/ o3 A' k% k& f
- return q;+ g3 h- S0 z, V
- }
G& K1 q4 y. K" t; k - } e6 |# H! t8 J
- return null;2 i) s! S+ q2 {8 V8 Q' x) a. K
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
, q8 F+ ?( v B( G, b ; K6 T, X% c7 w9 G9 Z/ g
Метод addQuest(Quest quest)2 g4 g8 C u3 L7 P
+ i4 M1 b9 ]6 o _$ C
- /**2 f0 G4 d) j7 w- K6 Y/ h, M
- * Добавляет новый квест.
, G1 M. k: I! @+ V0 y$ G: D, {# g& ` - * @param quest квест для добавления( H! I9 \3 g& y4 X6 G, t9 C
- */! j5 `$ u4 A; ~3 f
- public void addQuest(Quest quest)
, p9 p. j$ p, D _+ }) o" e - {0 h' b# E3 D. M6 J* R6 [' {
- if (quest == null)
. `* j* W& N, L' V, ?. \6 m$ F+ U - {
' q. e% h' q8 L; B - throw new IllegalArgumentException("Аргумент квеста не может быть null");, y% _6 A. }6 \9 s4 g
- }
( ^: j" Z% ]% R" |( |% T2 k -
7 p- q5 }; i5 c4 C7 _ - final Quest old = _quests.put(quest.getName(), quest);
1 z: F# Q7 R0 U - if (old != null)9 ~2 R$ W y* T1 z$ ?6 @( m. Y B
- {# F( `5 E2 T& V: k4 ]- H: y) [ d' J
- old.unload();
* G8 _8 H, c8 X2 Q/ } - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
+ d1 N: p5 J7 T2 M - }
1 i1 u7 D% o9 ^3 q$ P8 S -
# t( n8 H; m5 U0 e* `6 p" A - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
r w5 J, B3 b6 W1 B( O - {, l a/ Q: _# r1 `' M
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
' ?: r7 B+ S8 `3 c) Z - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");; g( j# ~% t7 e3 e' [
- }( ?5 o& I/ e6 u5 u/ w
- }. w/ w I4 E, R; T; @) g
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
- x V6 @: n0 Y) k1 W$ RЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере. f w- M7 p7 g4 \
, ?2 Z6 l) f& n* c9 a
7 D; }0 Y" c9 g6 K; Y% g
( u" Z, {- M8 c4 Q( a" E! T |