Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
& e9 X% s3 K9 F7 Z, b6 J5 q$ [% Q' n
Разбор файла QuestManager.java
; ^9 \! h% i1 g% m F2 `% `' T/ F. Z' ~7 R* N, Z
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.4 O6 p" K# v( \+ A& J3 m5 Q4 F
Основные элементы8 I6 u7 Z$ x; {0 ?$ I' p
- Лицензия: a, Q8 F1 s8 Q# W* C% [- `
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
8 Y" e# Z$ T: b. R+ l: \) K
- Импорты% [ d& s) d* e' B$ I3 [
9 v& N+ i; @3 XQuestManager.java — управление квестами и скриптами.5 }$ e5 h9 U8 Q! ] [+ y# W
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\/ z* R/ q+ c9 W7 e/ ~* W5 }8 U. D
, \9 Z9 E- J) R- S8 i
8 ]0 ?6 w2 y& @4 Z* V$ p* p* v0 `Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.# R5 S, j1 x& M! \; [ B7 P- d
1. Лицензионное соглашение
2 j6 j9 Q: ^) ]. X+ N% j- /*
' k9 c6 A# O. }! t3 K - * Этот файл является частью проекта L2J Mobius.
6 ^5 U, N, f6 ^" M - * % |) m! `4 n2 A( A
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять" m5 t' d# `( e) ?; y' [$ C% I4 b
- * её в соответствии с условиями GNU General Public License, опубликованной! I, C/ H7 `4 i1 A4 S
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
- h1 _8 \; w! a: c- L - * ( i" b' M7 U" T' r0 [% T
- * Эта программа распространяется в надежде, что она будет полезной,
: `4 I9 k# [0 Z# w$ B& q - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии; j1 U& j# a }$ S# h3 H+ [
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
% N" n. A* W$ Q* x5 H# c - * См. GNU General Public License для получения более подробной информации.
' i" r, i' j. n% s - *
' o2 `3 F) t {! `- E( i) H - * Вы должны были получить копию GNU General Public License
% w1 z% e5 P# C4 }8 }( ?6 ~: ] - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>. y2 N8 i# O/ J8 g1 F
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
1 @& V0 Y; j" P$ a5 A0 x
4 w& X, Q/ r9 j$ K% t5 s0 \7 |$ z( x+ \# w( Q7 J
2. Импортируемые библиотеки
% U. W# x' F! C' Z/ x
+ v" `8 u |7 Q% Q5 w' [/ A- package org.l2jmobius.gameserver.instancemanager;
+ [# W2 ?9 C5 i' K6 m
0 x, F; \2 x& H! P: |* _- import java.util.Map;
8 @0 z7 N/ H: |0 i - import java.util.concurrent.ConcurrentHashMap;
) T/ P" K N( Y z6 l - import java.util.logging.Level;5 R3 f, q! W" h; t9 a3 a
- import java.util.logging.Logger;5 _1 R( q; |2 W7 n
/ H0 @' T5 q2 M) V1 H4 p- import org.l2jmobius.Config;
% i. V% q# A/ X5 n2 g - import org.l2jmobius.commons.util.CommonUtil;
# u( l2 ]( v! |8 a8 \ - import org.l2jmobius.gameserver.model.quest.Quest;; W* D0 Y0 {- }( s4 b( ]$ L
- 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 — менеджер для работы с игровыми скриптами./ n w0 g+ x! B- Z4 J
8 H6 s+ x6 t+ e( n" w4 V
3. Описание класса QuestManager
: n1 @4 x# b6 _6 ~- /**
4 b1 V1 w. ]; z8 I+ t/ Q - * Менеджер квестов и скриптов.
" k& }4 Z! Y% v$ ^$ [1 F, Q - * Автор: Zoey76
! v, H/ x; x2 R - */
2 p# \5 A' I) o& ^" l$ E# Q - public class QuestManager: |1 H* t9 L$ z3 ^8 W0 G
- { P/ d$ d$ S0 N+ w" P" [
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
# a1 E/ o- v! k" D3 g -
1 {5 ?: | _/ U, V1 P- L- j9 l4 u - /** Карта, содержащая все квесты. */5 n l0 \' |: V( \
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();) Z" m y$ D7 z7 g# h
- /** Карта, содержащая все скрипты. */. I8 {/ K: J1 Q7 C# O
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();% t. e" B+ w \0 l8 E; Y
-
- P( |( d2 R0 [ - protected QuestManager()
3 Q7 |( t1 E1 R' ?% `0 O( Y& Y' N - {
& U& E/ P# R( R1 t6 N. p B- x - }3 X p" n. o4 w# d0 {
- }
Скопировать код 4. Методы% G- A1 p1 j# }8 @8 [4 N
Метод reload(String questFolder)
; u& t* c1 B; j1 x- public boolean reload(String questFolder)
- a7 S- a6 O0 a* c. ~! P, ^ - {& L9 X' q8 c# m) V. A) Y3 k6 r5 y
- final Quest q = getQuest(questFolder);
$ j7 h; A j- Q) }+ ^' W - if (q == null)" Z$ r& e6 b- _/ q
- { N8 [ ?. b& i9 i1 G9 Z8 Y
- return false;
; s; r3 K) } l' S$ S - }0 O3 O) L: ^0 Z7 {# o5 {: k
- return q.reload();
7 V! U# o% E, r* m! s: _( b - }
Скопировать код ! P" i1 X- [8 K% l) q
- m9 _2 V' B" t, P
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.& a) d# b3 ]# ^: V6 Q7 Q5 r
Метод reload(int questId)0 l: L8 W% p+ Q
# V0 d) @8 h8 V+ g D
- /**5 D& F8 v7 R; u Z& l- _
- * Перезагружает квест по ID.% U* k+ o y4 Z$ V* x/ B4 v
- * @param questId ID квеста для перезагрузки6 v9 C6 Z. a) J" }3 b {2 z( t1 H
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
! X+ [4 S! U# h( z4 _ - */" \+ q1 f4 n1 I. k- M' c
- public boolean reload(int questId)# O& s# w8 `/ F1 w6 m' {9 Y
- {
7 _) q- W; X( P9 u! f3 @- u' n$ U - final Quest q = getQuest(questId);) N- a4 E* v. s- d2 ^% t
- if (q == null)
_8 V$ L( i! I7 [) s( A - {
: T2 A. `2 m; T) q3 ]* a - return false;3 L$ O% T: P, C7 ]
- }' S# z8 \" r1 l9 s2 L
- return q.reload();
/ g$ n$ A5 M3 ~& Z$ w& y - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.0 K ]( N) a" j' W
6 p9 [5 V3 A. U$ x8 @# [8 }
Метод reloadAllScripts()
$ I) O) r+ N; \
* \9 c; F9 u7 _- }! _6 b- i% }- /**2 }5 ^) m2 b4 t) `7 S/ A( h
- * Выгружает все квесты и скрипты, а затем перезагружает их.
/ H0 W5 M! m) ^) ^, @. } - */
0 C7 x2 |6 b& z6 {1 G6 z - public void reloadAllScripts()2 H" g2 a# ?' m4 X/ [( C( a6 z. `
- {
) H T7 e4 U6 _9 C5 b' P - unloadAllScripts(); U5 z& P J1 q/ x
-
. I) I& V/ \- O! X - LOGGER.info("Перезагрузка всех серверных скриптов.");
3 Z: h i) m2 K - try6 x5 R0 q& A3 g, _/ h8 d/ D
- {0 k" l9 ^! B% G1 x8 ?# U: \
- ScriptEngineManager.getInstance().executeScriptList();! m3 z3 r1 V' M1 o: D& l
- }% S, [2 v" `. v. r# Q- @
- catch (Exception e)' q/ a0 @, I2 K9 o6 [, o
- {8 [& h j4 M) s& _& I
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
# X8 j& b8 X5 [+ A% t7 q1 {4 { - }
/ d' _5 H# o z; N - / @8 [. Y3 Q7 U$ G* D- \ w5 z4 W7 b
- getInstance().report();
O* s; P" a7 n8 n% Y - }
Скопировать код Метод unloadAllScripts(); Y0 q/ l6 @: d: f1 w8 e
# H! s% ^+ o- m1 |: i( B! B
- /**8 _, m- M8 P& K( Z/ g: j
- * Выгружает все квесты и скрипты.
* U# P3 I* O0 q" w - */4 P* p C3 L6 O g6 ], }; M4 F
- public void unloadAllScripts()3 A: m( T. Y% j& L8 l8 e& t
- {; `% o, n2 Y1 K4 g7 P
- LOGGER.info("Выгрузка всех серверных скриптов.");4 F+ Y2 X, S5 I* L F. C
- 7 \" w) V1 X/ I, T- E4 O3 G) U
- // Выгрузка квестов.# s, X" ~3 ^0 a8 u {
- for (Quest quest : _quests.values())
* t7 k! ~" L5 G' Z( f" i1 ] - {
7 q8 {% |; Y, f - if (quest != null)
; u! j3 j8 U1 W# K* y8 ]8 F$ S - {! G' V, t+ v5 \* E5 z K" H
- quest.unload(false);
y4 I5 z7 _- J: j6 l - }
" [4 J( v* _' j& q+ X# N$ P - }4 D& n' P" U$ m. ]4 n3 }
- _quests.clear();
9 N( k8 b* \5 Z1 Z6 Z3 z5 s - // Выгрузка скриптов.
+ J+ |) E) c! p - for (Quest script : _scripts.values())
( h$ I3 y. x- ]* Q - {
) L1 Z9 g1 j* I, C( l2 ] - if (script != null)
; S! A2 s3 R) x5 ~* s% Q* k1 M - {
% N+ @0 g$ l1 Z/ M) U - script.unload(false);
+ a0 e+ W( A) A$ d - }
3 |+ b( D! G/ g3 o* e - }- R; u/ K3 V f+ e0 F6 \
- _scripts.clear();9 W. y# T! g, N
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
4 {8 [ X3 d2 O 6 V5 r8 K( F( ^' v( `$ G
Метод report() r5 }. x2 ? p6 E
7 }6 `; |/ k( ^8 o! J2 Z5 o9 h
- /**% D5 C: y9 U- `
- * Логирует количество загруженных квестов и скриптов.
4 l8 `% @' P0 i+ M( Y - */
7 V5 t! u1 E& m5 N' J) ~ B6 l3 |$ ^ - public void report()& S% o r- f6 |: n( z
- {
- M& _+ X9 W' e# O8 x6 Z8 \ - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");& D# h, C: z0 w# Y% K; H
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
) m! A0 p2 {- F. r( [* K3 ?- F: \ - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов./ A8 T$ b, ?' E7 q$ U" o1 a* y
6 u6 i: u! Z" F$ A4 o" ^ G
Метод getQuest(String name)
. Z4 n% z$ V1 w/ w( n6 ?$ o/ @4 U$ g: z& H$ [" B' M% `
- /**
4 c. G) i5 \9 d. r - * Получает квест по имени.& L, _$ G! p6 p/ @7 F7 f7 k
- * @param name имя квеста
9 c" J2 K1 Z+ h9 i' A) @ - * @return квест
7 [+ C* g$ L8 ~8 \5 y" `6 `7 f - */
( S# Y$ h' H5 J - public Quest getQuest(String name)
, `( F+ {2 u" f0 ^; I - {) t" P9 K) |) r+ Q% S. ^
- if (_quests.containsKey(name))
$ R* E5 r$ X9 C" F1 F, ~+ M* j' M/ v - {+ u3 P" a" y/ ?. i' {
- return _quests.get(name);0 a- `& E1 n& U+ m
- }0 I0 n( x) _2 M6 ]. C
- return _scripts.get(name);. I' `. U$ [) ?- S0 m
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
, {) d/ t+ r: U0 R- q7 D$ \ 8 y. W) R+ b: p' \+ Y. ]
Метод getQuest(int questId)" k) ~9 ~3 ?/ a. x+ l2 O# N
* C$ M+ G4 X$ ^4 m4 @- @: B# m/ @
- /**
' m' V. V4 l+ F - * Получает квест по ID.
/ }+ z2 t/ d' w8 U: g" h y - * @param questId ID квеста
2 U4 t+ M* C; e, V& k0 T - * @return квест, если найден, {@code null} в противном случае
/ s! |. ^3 ^* Y3 m6 \ - */- y& G* y9 E2 s/ X# ?) Z% N4 G
- public Quest getQuest(int questId)/ R8 s2 U2 F' m s5 n, i
- {
7 k) W' |* O- F0 |% d A - for (Quest q : _quests.values())
' M- F9 e E& H1 S- M. T- |" z - {
* W3 j! o0 M# {; z5 i8 G - if (q.getId() == questId). ~ H; r2 M" O! B1 B% t
- {8 `. ^6 e* I4 \- U' E4 x: w% Y
- return q;1 J% N' r$ f: ?) g( h; y
- }9 R V0 V1 n! X+ r- f
- }8 N6 J# i3 O' ^( p$ B& a2 a
- return null;. W# M* y1 J& @! g
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.& X' b5 X8 w2 t+ N$ X2 ]" P! }
: _- [+ j6 X+ \# L9 UМетод addQuest(Quest quest)# d' V, D7 a1 A3 m# _
A7 Y6 q% d# n7 V# @( k8 l2 O
- /**
) b& Z/ z3 P) i8 u - * Добавляет новый квест.* }$ }) e3 o5 J& G8 r5 c
- * @param quest квест для добавления( X4 ^( M; u: i$ F0 e
- */
2 u7 p8 [; B1 T8 A: d - public void addQuest(Quest quest)
0 p; `5 n# D0 @8 ^ B+ b - {
, d, s% @0 v6 V0 q% g% H - if (quest == null)
2 r$ e% o9 D/ _9 g, s - {
# o3 F6 Q7 u a+ x" e3 M) Q9 L3 G - throw new IllegalArgumentException("Аргумент квеста не может быть null");
+ w, }/ w# z; L b! R# u - }. ^9 b! l( z/ d9 I3 d+ C
- 9 w( n. _. N8 O" {3 V; O
- final Quest old = _quests.put(quest.getName(), quest);
8 T: b' b/ V. j1 C - if (old != null)
% z/ P1 T# j2 g2 S' O: H& } - {) _* o0 K7 L4 n' @9 l3 C
- old.unload();
7 q0 D& h7 n5 \: i - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");* C% w, q1 f4 W& U
- }; ^% v% [* w5 e+ G4 E) j
-
+ T# G# {# g* O9 t - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)2 d; `% z0 S- Z- e
- {
6 Z: t1 Z6 r! `) g - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();1 ^2 @0 P8 N3 g/ v
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
# t5 F7 x$ w$ p - }
6 c8 g* t& U# g - }% k* |! e2 f; V' q2 `9 I& R3 k
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
+ p, [5 Z% K6 Q/ }* ~ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
! ]0 b0 E# \: U2 S% C) A8 @
+ h( S# a7 H1 M& ^$ j
6 ?; p& D. F" w# ]& @+ v- ^+ c: |9 G' g$ |' e* g
|