Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius6 j" b4 K/ q; P6 p$ @ W
. k3 [, U7 l' A
Разбор файла QuestManager.java9 [: ]5 X ^9 v/ b0 q
. U& P( @( h! I) u5 V
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
0 T: t! w" ~) x8 M( ]1 \Основные элементы
" B; V& Y! ?9 g" F# c6 [- Лицензия
9 d" N: n% U/ U! b- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
5 |( {4 {( |$ q+ y* f T" R
- Импорты* T5 J3 ?* e" E) P
2 v; \, N! N, t( `
QuestManager.java — управление квестами и скриптами.
& z$ e& |- I8 v3 N8 g0 N. [Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\5 c- f! ~0 v6 j/ @
5 x$ h4 p: Q2 B6 Y1 R
' R; [6 X8 G& k5 I, P' v/ _7 }; JДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.2 ^7 W" j; z* ?4 K3 e) S
1. Лицензионное соглашение
4 g+ h6 d' a. E7 O- /*2 @7 g0 C# R* G. @
- * Этот файл является частью проекта L2J Mobius.- }/ k/ `8 [# _& ^& n& G
- * $ ^, @9 p9 Y, u$ r/ O% ~
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
, u* T( _0 @- q3 `/ I! @ - * её в соответствии с условиями GNU General Public License, опубликованной
a& a' I( U* I3 n/ W2 S: k. L - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
7 F) d+ V- L. U6 n3 }- ~+ b# e - * 1 F/ ~4 S7 C9 [, O2 _5 _8 N
- * Эта программа распространяется в надежде, что она будет полезной, c y0 z; X+ m# I5 w) M, L
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии+ S& K$ _3 S* U- k$ d8 q' Q3 F
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
6 T( j0 k! F4 T& w4 U4 z - * См. GNU General Public License для получения более подробной информации.
- x$ s: J2 H! @9 r - * + T" P6 n/ V5 A+ |9 R
- * Вы должны были получить копию GNU General Public License( }3 p4 W/ K/ ~% w. H4 d& L
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
9 x4 o7 i, o$ S9 p p8 m. k# _ - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3." U! y& R/ K; b7 _& [# w
K$ ?# e0 K- R7 e8 Z
, s ~- T; U3 @& O; q9 C$ W0 [
2. Импортируемые библиотеки
* {; C& g( T6 R& B, D4 E( t# _- J
- package org.l2jmobius.gameserver.instancemanager;
! C7 t3 t0 x* b: B2 E$ ~5 }) [
; @9 m' v8 u* N! V" S/ L' t" z- import java.util.Map;1 D, c3 c W: U
- import java.util.concurrent.ConcurrentHashMap;! P, N% Q3 `; l( J
- import java.util.logging.Level;
0 E- h; t5 J7 y( _, K6 h/ A7 u - import java.util.logging.Logger;$ N/ @* z% P W5 O
- . W! q; F8 N/ |# T* X, F# |( G
- import org.l2jmobius.Config;5 u4 N8 q7 O7 u1 |& x
- import org.l2jmobius.commons.util.CommonUtil; [4 ]1 R) }- d- R4 b" b ?
- import org.l2jmobius.gameserver.model.quest.Quest;$ h; f6 G( a8 z$ u# B
- 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 — менеджер для работы с игровыми скриптами.
5 ~# c( Y9 @0 b
( v5 d( x$ E2 [& [0 B+ k P7 s3. Описание класса QuestManager. R+ z+ x0 \( p$ S
- /**
- j1 ], X$ C# I9 f+ s( x# Y% K - * Менеджер квестов и скриптов.9 }; m. |+ q1 d7 c, b% R( M' Y/ a; [
- * Автор: Zoey76
8 v, A8 d/ M: n6 ~ - */
$ t9 B' [( m3 j% n+ }8 V; O - public class QuestManager: w8 F! z7 |" ~* Z& Y
- {/ c0 c( \" @% X
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());3 A+ }7 h* z+ L$ e
- 2 S, v2 _! }* E
- /** Карта, содержащая все квесты. */
9 J+ @! F- r+ ]( B! ? - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
% O ^! y1 y0 c& [& f: } - /** Карта, содержащая все скрипты. */
- e% j9 L+ \9 W3 h, m - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();( A; ^7 c* T1 O2 ^1 u) Q, [! B( l% `3 I' D8 [
- 3 P* _1 ]+ o3 j0 S. M2 j r- p
- protected QuestManager()
7 T1 ~3 [+ y4 | - {# k& I# {( A& P" S# ~ U) e4 U
- }% s7 q! U% c% q5 F$ t$ }" D! |
- }
Скопировать код 4. Методы
& w* r" a d: I$ j' h, UМетод reload(String questFolder)
$ i( g0 S; ~$ ~+ S* D+ I2 o- public boolean reload(String questFolder)/ ~$ T8 v0 U# T+ @: u9 J
- {
: Q1 [0 G# X2 v! c - final Quest q = getQuest(questFolder);
$ P5 Y6 R% E9 W+ d - if (q == null): E% a/ x5 D3 E1 n( M) g
- {+ X( ~# u+ H5 [2 N
- return false;
2 g5 G. G5 Y, [- s X - }5 S& A: M- U5 \6 `9 o" i' U( Y
- return q.reload();% `$ P" ~9 s2 D0 N- @
- }
Скопировать код / v6 p/ p& a. d' p( p @
5 r( \( ^2 n4 c; `2 n2 m* n
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
& y4 K: |8 H- a4 f6 @. AМетод reload(int questId)
3 X3 Z! H+ K7 C0 Z# `* x, v3 Q F: a* T! |* J2 I7 u
- /**
v4 u" I7 i0 t# [* [ - * Перезагружает квест по ID.% V: ^/ Z5 n* o$ h8 `+ y
- * @param questId ID квеста для перезагрузки
8 U! Z. ?; v# p/ S6 v - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
" H( j5 r: [. u - */% T7 @0 K$ e& e
- public boolean reload(int questId)6 ]* T+ ~/ I8 f, {) v& N2 M8 _1 S* J
- {
$ m! x. l0 s4 o$ a d+ V' V# g - final Quest q = getQuest(questId);
E4 H: g9 z4 L8 n9 k- A - if (q == null)
, v5 \6 D f" ]( Y, j - {
/ \! u$ G0 v, H9 F8 |$ m; Y7 ~ - return false;
) [, q1 b- ^5 z - }' U5 ~! P6 o. B' y4 s, O
- return q.reload();, j. g* V, \1 I9 e* {+ _3 F
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.9 t2 J& R# K# O3 S: J
# W4 K) z% ]5 P# }
Метод reloadAllScripts()$ X' f- R- T1 K+ e) o2 e9 C# N% k: K7 T
) x+ b. ^/ z4 Q/ Y, d* ?
- /**
7 f! o9 r6 i/ \) g0 K - * Выгружает все квесты и скрипты, а затем перезагружает их.
. H2 \& t0 r4 ]1 ^2 z/ J+ ~1 y* P$ V - */- M+ m4 ?2 h' X: Y) u& X
- public void reloadAllScripts()( o3 M8 O7 |" [1 S0 Y8 n7 R: T
- {
2 w: h9 c. ?) q- e - unloadAllScripts();
$ c5 p& D4 |1 z D -
, e& H# ~) e& d - LOGGER.info("Перезагрузка всех серверных скриптов.");) l# K$ E1 F6 J6 v' g$ J
- try
7 o4 }: r% E( j - { z Z& U1 Y5 J' c
- ScriptEngineManager.getInstance().executeScriptList();1 ], Q2 Q. b: m! p& p$ X
- }! }4 X' ?* E c3 X8 K
- catch (Exception e) g! q2 {1 E: W; N3 A$ l2 b
- {/ S3 Z7 b( ^) K- X b# X' G; Y
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);! @& ~5 ]: S+ d" n* b& N
- }, @0 Z# `$ H* |3 ]4 X. X$ O
-
# D x( {- N$ u - getInstance().report();
' C" Q3 I ]: S- V - }
Скопировать код Метод unloadAllScripts()
! j) V- o; T8 F1 U, z5 T
% J7 G" G8 N+ L* j1 Z, ]9 H/ z- /**! b5 X# w" L+ x% y1 W
- * Выгружает все квесты и скрипты.
4 Q: i) n! G: N. C: F - */
0 E z' a7 I1 Z1 E - public void unloadAllScripts(). V4 ` \ F% V* F
- {
/ A7 g3 c A3 }7 L7 Y' R - LOGGER.info("Выгрузка всех серверных скриптов.");+ ]- j) L+ t* |; m
-
" H/ @- y2 ?5 z2 `: m8 i - // Выгрузка квестов.) f, z5 v5 c: P( G* D1 I
- for (Quest quest : _quests.values())! H/ P1 I2 O7 o0 c& z" D/ y
- {
7 P: r* t$ U; V/ D/ K- l$ |% v - if (quest != null)' Z7 L; D5 X# Z
- {
8 y* `' Z9 p+ y) b' d3 y' o - quest.unload(false);+ h1 K) a/ S' o" I
- }
! b/ w& r! P1 r( |+ S3 l1 S - }
- A+ `! K" W# p - _quests.clear();
0 K- K: u) E/ g, m( S - // Выгрузка скриптов.
% ~/ Y1 i# l/ R" ?2 T - for (Quest script : _scripts.values())$ p' q4 T( D! F# V% O* j
- {0 n% d$ k3 Z8 O; A1 ?" R% g. g% s
- if (script != null)
+ E& u3 ~. t+ a4 { T, F, }3 N, A7 l - {
3 g) |5 Y; ~/ X! M, C4 j n1 B - script.unload(false);
4 f- X5 r% i5 D8 W* L. e4 j - }0 C. E- y3 r% R6 p: o4 i
- }
2 o' p+ o6 m* \/ R - _scripts.clear();( X5 |+ R; D" I4 ]3 L6 @
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.# |) O- h/ {5 c9 J
* x$ A: \' `0 u s0 E/ t& N
Метод report()
* O# P* Z+ b7 k
! x F k. Q$ |8 L0 y- /**
0 \% p9 s. y2 @8 H4 o - * Логирует количество загруженных квестов и скриптов.
7 V: i% C! }' x0 o - */
4 W* ~! w$ z1 n2 n! r0 @8 D C - public void report()' i# c/ b2 B+ f* k
- {
% W5 U0 N. z& f& [! F - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");5 Y) W& N* X1 j4 Z/ t
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");$ Y+ E# G8 _3 ?! y% j3 a
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.0 A' M; s4 W' y
& o; v1 b! R& e* K! G2 N8 rМетод getQuest(String name)
! ~# q* w T# F8 d1 |- w+ S: {) A3 m; A/ Q- x
- /**' X6 F7 ~1 K' {4 W7 I- K: ]4 @
- * Получает квест по имени.! Z. \( C- L/ y( A) \7 g- Y
- * @param name имя квеста: m1 S2 K) b8 a1 |7 m
- * @return квест
) ^, p( x$ N( u( g8 p - */
9 l1 n* T& { \1 w4 u+ C - public Quest getQuest(String name)5 a( u2 l3 k r
- {
# W1 K, g: e) p, V; O1 y - if (_quests.containsKey(name))5 {: Y" i o# a/ _/ Y! J7 O. c
- {/ s" X; z. c+ I# r) X
- return _quests.get(name);! G9 d' ]! x4 [# E8 M$ V
- }* h6 p; m! g$ l/ X5 f: {- f4 p
- return _scripts.get(name);
) E2 z! q- k7 ^ N& x - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
/ m! u. E9 a q9 b+ j
2 y/ v$ B2 O/ f# w: N3 {Метод getQuest(int questId)
+ x" N, m, x4 y5 w" q# _6 ^6 X, r/ n$ g) ]% |! r+ J6 }( B
- /**" |, N! v f3 p+ F( j W
- * Получает квест по ID.. [% N) O# p2 S6 s- z. f( _, X
- * @param questId ID квеста
# P8 e. Z, U# n3 g7 q - * @return квест, если найден, {@code null} в противном случае
8 X1 D: U/ h' c8 o - */
- f9 v, D: f% [1 c" U9 S C5 v - public Quest getQuest(int questId)
! ~ {' {# D& f - {
$ b$ T+ O" g2 l - for (Quest q : _quests.values())0 t, x5 l( _1 K; O, B9 U. ^
- {
% X6 B0 a& t6 D0 t, w! `5 ~ - if (q.getId() == questId)
; x, l: M) Z, C5 g - {8 }% B% A" A7 j2 R( u5 o
- return q;( c# A% p- X) Z w6 b( Y! h
- }
: N: P- ~$ |- A5 A5 L- ` - }
6 R& Y W8 Q4 [" D7 v! q - return null;
. [' w" C1 U& S \6 e" C7 n - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.# m/ x0 w" K: ]7 U! ]4 F
8 R/ m: W8 B6 O% B; f, r* |
Метод addQuest(Quest quest) ^1 A: y/ L1 x6 D. \. V% }' }
& M" ?4 O. G/ h1 Y
- /**- a9 x0 V# F' g) \2 D* V
- * Добавляет новый квест.
3 Q! \9 L4 z' ]4 Z# H - * @param quest квест для добавления
/ C' C# {$ Z. @, `3 o - */( N7 y- x. t, m- I- g1 r
- public void addQuest(Quest quest)
8 u1 J! t; |4 F r! { - {) D$ {: t" X2 ?- X
- if (quest == null) ]: E$ D+ X' i7 O
- {
+ {" z% k0 R& |$ n - throw new IllegalArgumentException("Аргумент квеста не может быть null");
1 h* Y! B# y) V$ a4 J/ z - }
" P- g1 ]8 c8 i7 e2 G -
3 ~% H% p: y3 O+ U! j8 J - final Quest old = _quests.put(quest.getName(), quest);) O9 @+ ?( A0 Y9 N8 ]# o
- if (old != null); T! Q5 D" {# v/ r! R* I1 u
- {
% S+ n* X( u& f2 C - old.unload();
9 E" b5 c# G3 f: u8 Z: m3 Z0 j - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");% k( F+ ]4 y. k$ t' C) ]
- }2 _( r$ e: k' s1 Q. U7 f' s8 T) b
- ' E- Y/ D! B( q7 u8 J2 c, H% ~& [
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)# @% ?4 l- J- g/ D; e
- {& p' h" ~* S* S* Z
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();" n" {% S' o2 g, f8 q4 q* }, H' l
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");3 T$ q0 q6 c C
- }
0 L4 d$ \% Z% ~ - }, K2 s8 Q. x; r' K4 O' ?
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
0 F- y9 F ^4 E4 R) t2 ?ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
3 W1 j0 h' h6 D- H+ B/ h, P+ r* f* u' Q w' O
, R7 b$ S1 Q3 j R9 k
0 c4 Q1 T! N! ]5 Y& O ^3 b/ E |