Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius0 o1 b2 L8 Z9 S. M `7 t
7 n5 O: ?# R+ I: ^) ?Разбор файла QuestManager.java% m5 v4 G3 r/ o; Z" R
+ i7 w! o5 w6 T4 G% M: u4 `! ]
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.) O+ b* X; N b2 g; V# {4 v# d& R
Основные элементы. T& M5 C" ?6 c8 ~
- Лицензия% R! {! P5 Q! n- r
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.$ n/ i! T" h, }# S8 I# s2 P6 ~+ [
- Импорты
4 q# E- ]% |- [4 N% G . I! E! @' e% ?+ W
QuestManager.java — управление квестами и скриптами.: A% o$ x. i7 N7 c
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
: B$ m1 g' b8 [8 N- o w* H
( O3 d# G& @5 e4 G( R, @. o% ^
! M) O9 F0 A9 G1 `1 wДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.1 X$ Q: p* m1 T4 D" ~
1. Лицензионное соглашение1 j6 R) L" ^5 E% `7 Q
- /*3 Y' d9 X( V/ q/ @- D+ d4 h
- * Этот файл является частью проекта L2J Mobius.
1 t7 Z* ?4 D" t! e9 l" R7 f( X2 \ - * 7 W, S. Q$ D3 j& L/ n! X1 @. v
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
$ Q) \ l- g# r; S. p - * её в соответствии с условиями GNU General Public License, опубликованной
- y3 V. C/ x, C3 d% {9 t/ k6 Y7 L6 O# Y6 b - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
4 ~1 {, [/ j# c5 U6 k" H! | - * ' e- L, ^8 v) u* N* ^, a% ?* |
- * Эта программа распространяется в надежде, что она будет полезной,2 |3 l" z: p) j8 ^/ B
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
2 ~% R, ^2 a% g/ e - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.( }. [3 O! w: h7 b
- * См. GNU General Public License для получения более подробной информации.
/ }3 f( \3 M! F3 `7 y6 Y: ` - *
( V2 z$ P, t! |' m3 [5 V8 V - * Вы должны были получить копию GNU General Public License
0 r3 n( D/ q3 H$ O% G - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.; e6 p2 U5 f( E
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
3 J0 t+ u) ^9 @
- s( h/ H+ F! \# _9 {# F# p/ B: x9 x9 p8 k7 q
2. Импортируемые библиотеки/ |/ @$ ~7 i) Q! N- X
" D" a. A% t, ?8 K& M
- package org.l2jmobius.gameserver.instancemanager;% u* H. @' ^7 O' b
: E/ }4 ~/ C w2 {0 s: b- g- import java.util.Map;1 ~$ e+ N- |. `2 D9 [+ K; o8 k
- import java.util.concurrent.ConcurrentHashMap;2 E$ p' j# V6 L7 n& [
- import java.util.logging.Level;
; X( n c, D0 x8 E% i6 N - import java.util.logging.Logger;
5 f2 @/ f0 _2 r& {$ X# f: e# i - 2 y3 z, F# B* b8 ^$ P
- import org.l2jmobius.Config;
; X1 O1 ?" B. ]9 P S5 p. {8 s$ l - import org.l2jmobius.commons.util.CommonUtil;
2 j$ B5 K- ]+ m9 N - import org.l2jmobius.gameserver.model.quest.Quest;
* B3 n0 L7 {3 {* 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 — менеджер для работы с игровыми скриптами.) m( o4 u6 J8 P' J
5 Z! a! }1 h+ r7 y! a) G7 w# `8 Z3. Описание класса QuestManager
$ @1 S: i* c0 m$ r- /**
* U" h; p+ T2 T3 K6 R6 G7 t - * Менеджер квестов и скриптов.
; y2 H6 {+ j) h4 O - * Автор: Zoey76
4 G5 t# @, i0 l& d0 c$ e. N - */! N, F+ F+ u U: B6 V# G! S
- public class QuestManager
7 m8 I+ l* M8 c! L e; }( d - {
4 U) s3 ~6 Y l+ O7 U" |3 J# ? - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());) K4 Z2 w9 q% ^7 ~3 N
-
0 _$ p/ |7 T8 W- Y, ]- \# P$ l/ B - /** Карта, содержащая все квесты. */6 F7 g* {# ]1 |4 I. \* s
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();- Y, }, Z, N. @
- /** Карта, содержащая все скрипты. */6 S5 Y8 e D n! v7 t6 i
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
# @3 w1 C! `% z# |) @8 h& v - - ?$ V- M8 T7 h2 x: p/ }
- protected QuestManager()
8 _0 {+ S9 t( Z7 r% M( W' V - {& }/ M( ]0 Q4 E" x
- }
8 }7 x% _% u7 y+ t - }
Скопировать код 4. Методы
, H& F$ y3 U+ [3 RМетод reload(String questFolder)
5 f4 a; V$ ]; F- R( S- public boolean reload(String questFolder)
- U u. @7 G& j- G/ p. \ - {, b, B) S: \. }
- final Quest q = getQuest(questFolder);
! Q7 W9 |" T3 K5 G1 E - if (q == null)
$ B, y U5 }; U, O" r4 X ? - {
3 b, c' P- {0 a3 k w - return false;
, F2 F% }) B9 f q$ ? - }( d1 c8 W8 H" w3 c
- return q.reload();. j! N( z1 B) U2 K9 q* x
- }
Скопировать код
* j9 x( y5 e8 b0 |9 `2 F9 E1 L, h! \0 f. k( p L# g
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.5 ^4 b# W( d0 ^
Метод reload(int questId)1 ]' a+ M8 l9 W$ A z- J: @/ @. L3 A" Z
& Y. u P2 f0 \/ X; ~0 w/ A- /**6 z4 q7 P; H' \8 t& q/ x: K
- * Перезагружает квест по ID.. g- f+ D( e/ K( g M
- * @param questId ID квеста для перезагрузки# q6 @# @/ v: f1 R( A5 M, A1 j0 y
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
/ D6 y# N9 `& L+ r# R' B - */4 ^: w. C6 m! N! Y4 w3 G
- public boolean reload(int questId)
6 @: o7 Z' W9 \1 z - {3 R3 z: D& E4 y: N6 A$ |' Y2 _7 i
- final Quest q = getQuest(questId);0 Q* @* o; g5 o* j
- if (q == null)
/ L {( o7 _' K& c' M9 [1 I - {. t, L9 L) H( _! s- y! Q
- return false;
! E7 n7 ^7 y* \9 P5 R. t7 b - }0 o! f, D8 Q! q" Q8 |5 d
- return q.reload();* d$ k' X+ }) l+ o; R
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.3 f* v8 B" D2 N# P1 N* ]
. @, E: E( k9 R. \Метод reloadAllScripts()
' _2 K8 Z$ t) q
) y& k) H1 {' t9 `6 C7 `( J( L4 r- /**
; c& j+ T+ z: D, T7 P$ r - * Выгружает все квесты и скрипты, а затем перезагружает их.
8 H' T1 V5 s' t5 F - */
( j' |# Z7 b8 z+ r1 x, Z0 X' o - public void reloadAllScripts()
1 _. ^! U7 I$ w8 h: x4 o7 K5 t5 O$ a - {
) M% v3 \" `" i1 \+ ` - unloadAllScripts();, l. s4 K8 E6 C5 @ h
-
' C% _7 }6 z" c6 d - LOGGER.info("Перезагрузка всех серверных скриптов.");
6 z6 {$ E$ _4 }4 r - try
) T9 ^: T4 Y5 K& E: v - {
8 a, E2 z4 {4 @% C - ScriptEngineManager.getInstance().executeScriptList();
3 g5 x1 T- z2 ?; ]' Z$ E* O& ^ - }( o S k& \% b' ~( P
- catch (Exception e)/ b4 J K; ^ D# Y
- {
6 z9 D( F" E. \- v2 P8 G3 b" H- { - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
( p0 R9 B) c% c i - }3 N' V* i; s1 V# O: u& J& z' X
-
& x! H I/ A p9 m - getInstance().report();
; e8 n+ X& k; F6 u0 j/ T/ q - }
Скопировать код Метод unloadAllScripts(): w/ {/ k- x$ e2 M* [, p5 `1 P8 M
3 l4 ]$ O3 E+ i) g) [& }: E4 w( X
- /**
) N/ F+ S; i! t4 d$ j( {5 v - * Выгружает все квесты и скрипты.( I n. X7 L( c
- */# _ I8 o! J& Q
- public void unloadAllScripts()
1 }& Z3 K3 U$ l - {
0 H! |, a8 T; z" `" h k1 O- O: d - LOGGER.info("Выгрузка всех серверных скриптов.");
6 q# M: }$ U1 \3 W+ Q0 H -
" M$ L! z1 x- y7 O- ^" S - // Выгрузка квестов.
: h5 F3 W V& Z( e& i - for (Quest quest : _quests.values())8 K% H8 ?, R: N( k4 u1 e) {
- {
* k' V7 \/ B6 W: Q5 x - if (quest != null); K" C( H; Y* ^
- {
, q: s* [# w$ N$ U- b - quest.unload(false);0 a) O' J( H* _$ w0 V1 ?& @; G
- }
9 D: i" [1 E) |5 F1 u4 A - }
3 k8 r% Q( x8 e+ K - _quests.clear();: Z2 V& {1 W) Q+ S6 U/ C! E$ L
- // Выгрузка скриптов.
/ i$ w' L$ a; ?8 ?# h- G; G - for (Quest script : _scripts.values())0 i+ o8 S8 z' M' d
- {6 |* u- [" q2 `. ?2 P
- if (script != null)
; }8 |+ N1 N$ n7 C - {! I; }! R6 M; _
- script.unload(false);
/ V! P9 F# u; S+ o - }7 w0 S. a1 a1 Y' c/ T
- }% u) P! h% `# }1 i" q% @
- _scripts.clear();9 f& r$ e4 }1 W4 P% K
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.6 M/ ~1 s; [1 c
- C3 ~/ ~& h( E8 J# K
Метод report()" D8 k$ ^+ u3 W, x5 W5 r: x* [' f; @
- [9 }7 ^/ C$ D6 `2 |
- /**8 [+ O+ j! N0 m N: s
- * Логирует количество загруженных квестов и скриптов.8 T& c$ \' Q! n
- */
2 }1 f1 K! C! j/ S" r - public void report()
b: v8 ~ ~3 c, q - {+ J: Y; \4 y; B/ W9 w, A
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
! W8 s4 ~6 M4 k& ~) k6 _. Y - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
2 l! }+ \( t$ n, j! }% |' o M - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.; ^4 g8 Q) P+ c ]# j7 `( B
9 x7 K- C8 ~: Q/ h+ ?3 M6 i
Метод getQuest(String name)
* |+ n! k3 l9 l* y
6 A- _8 J6 ?4 x- /**+ M I9 _" B) @( u
- * Получает квест по имени.+ o: c( ]9 e# q. Z( t$ @2 l# j
- * @param name имя квеста) v- g3 q5 d3 S" @& r. Y \& h
- * @return квест
, H" m! H/ x9 B( d* |- H) ~* W+ H - */
+ e" Y. M* Q5 }# ?! m2 e - public Quest getQuest(String name)
0 U! u3 @ E' u9 Q - {
- _4 {' C5 w# F6 T0 d/ ? - if (_quests.containsKey(name)): O" F% o* q* G$ q" V
- {* |0 n5 a8 Z7 V2 b) C" ?1 y
- return _quests.get(name);% n- Y- q) ]: I* n* `$ X
- }) [/ X: V, ?& k
- return _scripts.get(name);1 F: O3 _2 k" }
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
$ A+ `9 b/ ?- l3 ]
7 d; l6 v* F6 f# |9 g4 ?8 S `1 JМетод getQuest(int questId)! S4 z k) {- C, w! B x3 z
( S i* @" U7 T% y5 [% p- /**
2 o" I" }$ }7 J! @9 I5 V! E! V/ i - * Получает квест по ID.
5 h$ `3 O% ?3 E - * @param questId ID квеста5 ?7 K- x# i( J, O1 Q% t E
- * @return квест, если найден, {@code null} в противном случае
% n' d& u' j* P0 A/ [ H - *// a. T, Z3 L3 w6 B
- public Quest getQuest(int questId)
# Z# n( `3 E( f2 |' R) K - {
; B0 W) A& A, Y( Q4 W2 i9 e - for (Quest q : _quests.values())! T% n1 b; W9 o- c& P4 b& m
- {4 I8 @( T) A' V( k* I
- if (q.getId() == questId) @4 S2 C8 i' A# k8 }* S9 o
- {" t" P) t- e0 G) J: V
- return q;& t2 b1 z2 d, |+ B" H& v- e6 B
- }
, r- p( E6 J" f z( k+ y- @' ] - }$ F2 l) _5 y4 v: C* v9 i# {
- return null;+ X) w, i. X# o5 x" Y9 t7 G
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
' E7 [0 n. Z( f. Q3 B5 M. T
; t8 [) x z7 t# o8 ?* A2 X$ z5 M% ~$ wМетод addQuest(Quest quest)
" U: q2 B. Y% F# o6 t& s0 g5 ^$ W8 ?' L. z9 O |
- /**
. l. u% }6 N% J - * Добавляет новый квест." s" T6 V+ n3 U2 F1 I7 @( d
- * @param quest квест для добавления
1 z0 B* N3 `$ f' Z! z - */
! D$ J) O- B% K" u/ z - public void addQuest(Quest quest)
9 N: W9 W/ E: E c% p: j" @! v - {
0 c, w( }2 ]7 x! L - if (quest == null)
/ x: w) E. k0 f7 \+ x0 b - {$ p: A8 S% @5 W' A) ]
- throw new IllegalArgumentException("Аргумент квеста не может быть null");/ J7 g9 n- L1 X) m9 {6 I- z& O
- }
; L4 Q& V! x4 ~8 ?2 ?& ~ - + o' _3 ~' u" i( k8 \! M7 E
- final Quest old = _quests.put(quest.getName(), quest);& t r6 V& U/ k4 \7 P7 c
- if (old != null)) |! @) I! R& I0 Y/ A4 l
- { J' M! B! l. ^1 ]1 Y; Y$ U
- old.unload();; b {" P$ @& j" l1 r5 l
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");7 n4 R5 o6 ^ A" A
- }
) V& I2 ~5 y: z, Q+ c* p -
0 w; c3 o6 q. ^$ Q" T, J - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
- e1 p5 |0 O" n8 N2 ^3 X) p0 d - {7 U7 `& G, n& O+ W3 D0 A$ C
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
: m, A$ {: g; l- B5 I - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
/ I- T: h1 o: ]5 F! R. R0 q1 N5 ` - }
' C7 K5 u( t) N4 `! R - }
& Z. R5 e$ Z! W - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.8 i4 k' H( r* j' E% P$ o
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
8 @% S1 q) q9 X8 t' [9 v6 S. z; w: @" {
! @* b4 ^! ^. l3 j+ O
/ W2 V. r$ N- z$ h' b
|