Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
3 _% ?/ I0 X3 a7 N# p9 ~7 V8 e: [7 n* P! g
Разбор файла QuestManager.java Z: Q% ~# f6 }
3 d# F6 c9 a" L: |9 iЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.8 ?, x2 I7 S5 ]$ O4 U5 X9 m- [
Основные элементы( O& i1 ?4 d9 _( I `4 t
- Лицензия
4 _' S; E& @; w8 C- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.# ]% h; B4 n7 V' {
- Импорты
! \5 g+ B. [1 H7 s : A+ C3 F. p% p
QuestManager.java — управление квестами и скриптами./ f& f. p! e* j: A U2 B( ]
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
5 I) N. _9 L, @- S
, Y- y9 ^$ }* Y5 {* \8 d. E0 f2 D/ r2 O" A. v0 Y( A# g
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.5 }! i$ a4 ^: g5 b7 J
1. Лицензионное соглашение
3 E: c: v7 [4 M( C- Y5 `- /*
# w# V) v M1 A. b - * Этот файл является частью проекта L2J Mobius." X! E9 [5 x8 a ~- V
- * f7 p, m- {5 {- b; i
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять6 x2 \& _8 Y1 S: B
- * её в соответствии с условиями GNU General Public License, опубликованной
$ ^/ Z0 f5 K- }+ F3 e( b/ O5 @ - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.$ ?% h. N8 Z: x( C+ r& [
- * . {* U$ o8 s" J" r, v8 u2 e
- * Эта программа распространяется в надежде, что она будет полезной," F5 P7 X! z+ }6 P
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии" C# o6 K* M5 C4 R! C
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
' r: [. e3 @* p: D5 x" a - * См. GNU General Public License для получения более подробной информации.( u. z; ]" k, x0 n
- * % q; B6 S" E, M |
- * Вы должны были получить копию GNU General Public License
) K- ?! j; v R) q- I% d - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
0 t* y9 a( f* e7 ~/ s1 w0 ?, S - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.: j8 \3 C7 }. k( n0 q& L
+ p6 U$ D' Y& e4 ~& y
3 u# ]7 I7 {+ c! U" K+ O0 G4 \2. Импортируемые библиотеки
& g7 _, L/ F* M' U
9 k n/ W3 ^* i9 @3 q/ K q- package org.l2jmobius.gameserver.instancemanager;: U* q- n( h3 a2 v g2 s
$ V3 y. C. g C0 x- l- import java.util.Map;
- t- D3 @+ }. a - import java.util.concurrent.ConcurrentHashMap;- ~7 b. ?: A, E7 g9 F: A; r
- import java.util.logging.Level;; n% h1 k0 \6 z4 W( B9 G! t
- import java.util.logging.Logger;6 h$ s b; k) K I. q) ~
$ c! d; v% ?3 h8 @, k/ H9 v2 r- import org.l2jmobius.Config;
! W1 }2 b' k9 P( r9 t - import org.l2jmobius.commons.util.CommonUtil;2 C2 B0 \# j/ P) Z
- import org.l2jmobius.gameserver.model.quest.Quest;
. }! J+ o5 W& E' ?/ @% X! 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 — менеджер для работы с игровыми скриптами.
8 F" q# q2 A: L2 G' e7 r& x
; F( a: _0 ^9 H/ G& [. ~7 ~3. Описание класса QuestManager
- k- q3 U+ W# E3 f" v- /**- ]# v: Z7 F. X; P
- * Менеджер квестов и скриптов.
5 @- x. P2 F. m, j1 d - * Автор: Zoey76
' c( J! W f% r" e" P& D - */
8 _0 q( v" Q8 T! V/ E8 i - public class QuestManager
! f$ @+ i- N/ }. K4 v - {# D% N/ Q, [4 x: Y# L0 s0 \: M
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
- @/ \6 x% K7 } E& L, l -
$ ?: j M. g n- A - /** Карта, содержащая все квесты. */
5 n/ e/ r2 L8 {" q: u3 `9 G' H - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();7 d9 e3 q: r; r! I( z9 t
- /** Карта, содержащая все скрипты. */: @3 X( ^% H1 K1 Q7 v' [
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();: d+ L, M0 t* Y2 n( Y! t
-
" V- h* u& u* {% } Z1 v - protected QuestManager()
% y8 k4 ~, v* s% m$ f. ] - {
d o& s( b+ p' U - }% |9 R: B2 N0 {8 L- a$ z
- }
Скопировать код 4. Методы' p- ~4 {( f9 E5 o0 J* P5 ^
Метод reload(String questFolder)
; @" q( K5 ]% l- public boolean reload(String questFolder)
" ], P; x& q _- V0 S: ` - {3 j1 f: ~' `7 B) a9 f
- final Quest q = getQuest(questFolder);8 P1 }, y5 c9 H* V) `; j& e3 p
- if (q == null)
6 b4 V' [3 r L - {
6 W- l" x- I5 }. ]! ^ e- J$ H( N - return false;; i4 k# W- |- s/ A) C9 W ^+ |
- }- x% d) Q; t9 N
- return q.reload();1 w# x0 a1 V- ]) S! D* E. S3 y
- }
Скопировать код 1 L" _0 c6 F' `" x. p) U5 C2 s
0 p+ w! s) o8 E; f
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.) b3 s1 [( M0 j( n8 R: E1 W
Метод reload(int questId)0 o/ x0 _ k1 Z
' e6 G/ d! w& [4 L$ P' ~1 ]
- /**
8 ~- H7 L3 P7 H# U! n - * Перезагружает квест по ID.
( U' Y/ D1 |7 {% G. \( r( R - * @param questId ID квеста для перезагрузки
% Z, {# \; X% d8 e# [ - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
& i7 g; V Z0 B) y - */
* J$ _* H, A) J3 I% f - public boolean reload(int questId)- |9 T" \6 R9 N' ]8 `
- {" c, C% r+ E$ V' b7 x
- final Quest q = getQuest(questId);( @, f- o* a& o; Z: I% |) U
- if (q == null)
/ u9 p( [8 D# t, |! d: x+ q7 B - {
, D9 l9 H' ^: Z& l - return false;9 t9 } B( |( i4 D; Y5 k; R8 |
- }, a* Z4 s" p: c1 R1 P! |
- return q.reload();% p! S# ?1 q4 E
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
; j' v \6 ^8 a# v5 T2 d! a
- ]3 o" D- a; {3 JМетод reloadAllScripts()% Y! s5 Y8 s4 l2 ?" Z J/ D$ G8 Y
; n4 C* \, T$ [( i& J" ^- /**3 r$ j; a5 L0 y- r4 S
- * Выгружает все квесты и скрипты, а затем перезагружает их.
# E0 I! `! }1 v; i% ? - */
$ M) Z: h5 ]& h- J. K - public void reloadAllScripts()
. q8 A! _ i+ l( J: h - {
' {1 \ R5 f# Z: z* Y - unloadAllScripts();
/ L4 B4 b3 t# v# H+ n) O) L -
% x$ x' d5 w8 a: E5 m9 C! j+ H - LOGGER.info("Перезагрузка всех серверных скриптов.");
5 }' ]1 e. g2 H& v( Z/ c7 `- b5 {" p - try
0 h/ ?/ v/ x% {0 }3 } - {3 A6 ]9 [ e# s. B
- ScriptEngineManager.getInstance().executeScriptList();
6 \4 C7 w& { }7 b- ^( Q6 s _7 ^4 v - }; q8 Q7 i, Y2 e' u/ }( F
- catch (Exception e)
~5 a9 \$ }: E3 K5 ] - {+ T) E6 E# O6 u/ T/ s, @1 Z! q% s
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);7 E' d/ F2 j& { _0 ~
- }6 R" _8 B/ W9 s
-
" r. k7 c0 S' v) I* w3 e - getInstance().report();
0 ] `- G: g& w( B& A* N3 Y - }
Скопировать код Метод unloadAllScripts()0 i+ n6 W7 D: @/ {5 O* a
+ M0 b9 W* K( @ [# e0 @
- /**& P. g3 l1 Z( G
- * Выгружает все квесты и скрипты.( f/ @& m$ M2 a. m. g
- */
% u0 `; g. ?; Y w+ B* y - public void unloadAllScripts()
3 m1 `( y5 V3 I8 D7 w - {
' u- m/ H7 X/ C) I; x - LOGGER.info("Выгрузка всех серверных скриптов.");) J6 n7 _' j. }1 n1 o+ H- t7 d
- 0 Z. r9 f1 [+ }9 I* ]; N
- // Выгрузка квестов.
9 W3 I2 a0 v, u1 i0 Q - for (Quest quest : _quests.values())
6 p" F6 w+ M: }4 N# `3 o - {. y# G! l, Z9 X# g j* ?! ?
- if (quest != null)
, M# d8 N% p: o - {
) M r% u) R: R2 G( i ? - quest.unload(false);
+ w, |" s0 r0 b( F5 ]0 g - }& P0 g! U( t& M0 R
- }9 Y6 t X E: b" s* X) a
- _quests.clear();
" p% ]4 I4 U5 P - // Выгрузка скриптов.
0 O s* y) z. s9 u# Y$ T - for (Quest script : _scripts.values())0 R, j A* V' ~" }
- {
/ Q: e& i; k5 F. J - if (script != null)
8 z3 T$ Y3 H: G' d - {
9 E5 V, ^7 A4 W! J/ U5 z - script.unload(false);
0 B7 Q# O7 S2 ]3 S' d - }
9 X$ ]% X" `4 m* x6 v9 r - }1 v. f8 [4 a1 G# B8 _
- _scripts.clear();
5 F% R8 a7 o* o2 I% c - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.+ ^7 C. x a3 y# a$ E* d) E/ Z
) P& O; S9 J1 T3 l! u, O
Метод report()6 p1 n* e& h% `; c0 t- R
; }/ Y' ~( O, v; l! C) H# T
- /**+ P5 C' u+ y" C4 S* g( m7 w
- * Логирует количество загруженных квестов и скриптов.
) [3 s: ^9 l I$ R/ z - */# z* K& R/ k3 e+ g1 b" r5 z$ e8 D- R% a, X
- public void report(): P+ A/ j& A, m+ F: E
- {
, V/ ^# i$ W8 X# T1 L) U - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");' W; Q" p) c$ k
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");0 ]/ f' V" g& U4 z8 ~, R
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
U7 I; K8 K; A0 s& N7 j1 c4 R
0 U, w5 c# _4 n+ WМетод getQuest(String name)
8 [$ N3 G Y# z8 b( w1 ^. ?/ h. {7 M- C* Z5 p( X# j
- /**
9 p; n3 e" E& v# N$ G - * Получает квест по имени.4 z0 f; Z0 k& p1 ]+ F; E! y. G) q
- * @param name имя квеста
g q* W% ~1 s. g - * @return квест: }: R6 L1 x. i3 }$ l
- */. M6 \! ]: l8 a6 N1 | D
- public Quest getQuest(String name)* u) p# y. p4 s# x/ g' u( |2 W, l: {
- {
% Z0 K( V2 B9 L$ b5 d - if (_quests.containsKey(name)) D; W3 z) V7 K0 o. R
- {: w1 `5 f6 F9 j8 V
- return _quests.get(name);; t! \! d% M& k. }! D; U9 x
- }
5 t6 r4 f5 n! G# ? - return _scripts.get(name);! G! R' w; L$ g
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
9 u& X( Y* J; Z" g5 c
9 o+ O) ?5 R1 }6 f0 FМетод getQuest(int questId), A1 \5 q$ m4 N. b* t8 {/ c
3 ~" ]6 n) x. T) Q/ G( T Z
- /**5 |( u( |4 S' O( P$ S
- * Получает квест по ID.
) h" ]3 }2 e4 D8 b, s - * @param questId ID квеста3 J4 Z0 s8 i# }' L
- * @return квест, если найден, {@code null} в противном случае; N# p) e& Z- b* f! r/ w0 e
- */
/ O& g: e! ~3 A* q& N - public Quest getQuest(int questId)0 g- h$ U" I6 B
- {
% |3 F- B' x) H6 A - for (Quest q : _quests.values())4 H/ J+ R. O/ T P
- {) k& w% W' ~" F; I
- if (q.getId() == questId)7 L0 i. ^1 I2 r( n9 y) p8 u
- {5 b, g- e8 Z4 S- k+ Q( T3 V
- return q;
+ x9 o& o7 q) F7 B - }) {, p2 d6 ]- W) w5 t
- }
( M- C$ y' b' W2 j3 G. j/ O0 b - return null;
2 a2 i# ~6 L& W - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.% g1 P3 H) O5 }5 W) n9 t- o. t. h# B
% b+ b: i$ |8 x2 cМетод addQuest(Quest quest): G2 H8 Q- D! h
- C$ z7 F. [8 x! y2 S! t. s
- /**
0 D% N# m- @/ L. G4 j- Q+ R9 } - * Добавляет новый квест.
1 I7 ^: l- k' X; k1 S - * @param quest квест для добавления" j' z$ l) N5 H- n- f" c) R- x# n5 S5 U% x
- */8 Z' q4 q! [4 o* V/ @* Z* p: U
- public void addQuest(Quest quest)
6 m) A0 T, P$ ^) i3 |, U( E - {; j8 }( P0 g& z3 t
- if (quest == null)
a- a: O X( q0 v3 H - {
8 {6 d" P* Z4 r9 d1 a# ~, L - throw new IllegalArgumentException("Аргумент квеста не может быть null");" F+ s. p7 G! r6 N# q
- }
8 O( U' y- B2 T- m: M' ]9 a - . @) @2 x' r9 P- ~. `. i
- final Quest old = _quests.put(quest.getName(), quest);, h' j1 r" I7 `0 A7 b0 ^) c2 u: I
- if (old != null)
+ B$ A8 Z* S& r* z Y- ~; \ } - {3 }- S% j5 M8 W: s* _( \3 \
- old.unload();
0 ^1 P8 J% u& ~( t" p3 P* K7 n - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
9 u/ e4 [8 T& K: M - }. [& M% Q0 m2 \; M; C5 k& E9 G
-
1 |; S( w) J+ Y& ^. e - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)# K9 m# `! D/ l4 S$ F
- {
+ ]# {7 h( ~1 y* H - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
) a; q- f( O6 c: F) i d - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");1 y8 i; z5 s3 i3 k- f, a6 q
- }
" v( r6 P" U2 u4 Z2 k - }
" d; w4 @& e5 c: K- L) c2 R - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера., e! A' z* h; H% X; I- b p% a5 N8 |+ Z& ~
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.) V9 W: q7 y/ S d x7 e
: ?( C) W( J8 Q, F1 `
8 z4 ~0 l& G- E9 t. T5 i4 r' S- d6 D2 I/ F9 L8 C/ P
|