Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius. S5 u+ n( T j4 G, ^/ l
! M8 j9 [6 f z) t% CРазбор файла QuestManager.java& @- `* [ \3 X- g& d* x
/ V8 N' F8 x% O2 A! FЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
: t4 y1 E! ], \8 [' BОсновные элементы
% o; O, Z$ i8 x- Лицензия
" L" ^. F& s6 s4 W) T. B- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.' k8 a: S$ s1 c
- Импорты: z3 W# @7 [% C5 B6 ]2 i
8 q, L5 N+ ^- p4 K% f5 N
QuestManager.java — управление квестами и скриптами.' g9 C6 m' J8 h3 F5 L" O
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
# W) ~8 @' c/ i4 @* Y" c7 s5 ]7 s9 c+ C% D& W; i
- c5 U( z- F" G& c3 A; T, b1 }Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
5 J% j8 z f, I i* \5 ~- X" q; c1. Лицензионное соглашение
) ^* e8 [0 e% _$ E- /*3 t7 i; C0 U, _: q* ?9 J( Z- h3 I
- * Этот файл является частью проекта L2J Mobius.
4 L! V8 f* x F* v" J8 `" s! |" Y- r% X - *
. O H. i, m+ e+ t7 R" \ - * Эта программа является свободным ПО: вы можете распространять её и/или изменять) V) L3 c: T n ~9 T& ^2 j! Z
- * её в соответствии с условиями GNU General Public License, опубликованной
- v J( F2 A: f& q" y! s9 ^+ `6 _ - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.2 J( {# ~0 p* U# z4 {8 C
- *
: r; P% ~ M3 F$ H2 V" O9 I - * Эта программа распространяется в надежде, что она будет полезной,
2 h5 ~& i- M* @: l; M( x/ x - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
: E4 f/ g/ P, F4 N - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
. s# u2 r, [, L8 f7 o2 d& w - * См. GNU General Public License для получения более подробной информации.
s/ w, e- D) ~% h% k. g) J - *
0 e5 t. M. Z) F, [ - * Вы должны были получить копию GNU General Public License& i2 k: Y* T2 e% A y# w; S, h8 f8 c
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
9 M. n' U' Z% s" U: ~" Y% z - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
* i2 @2 f9 F0 C. U! s4 a- U9 p( H2 M5 |1 @# c
, U5 D' z- u& o; ?! f2. Импортируемые библиотеки
1 r4 t/ W! F& p& Q! w9 g
, `* q7 p: l9 Z5 b8 w p2 Q- package org.l2jmobius.gameserver.instancemanager;' v8 K& f$ z# ?& a6 H/ x! e7 c
3 h" N, S2 R" p. `6 C$ ?- import java.util.Map;
' @8 m% M/ Q$ c' ^7 z' h$ Z - import java.util.concurrent.ConcurrentHashMap;7 t; U+ O( Z: S& a4 x
- import java.util.logging.Level;: }! o y& A) S5 q0 a' Q
- import java.util.logging.Logger;
5 g* O3 h; U2 p; g- j1 W, n - 4 z4 ?9 d2 p s
- import org.l2jmobius.Config;
+ M* D9 Q7 ^) ^% u+ `; s - import org.l2jmobius.commons.util.CommonUtil;5 R2 X9 [* D! c- m! Z
- import org.l2jmobius.gameserver.model.quest.Quest;, s H3 Q" ]. K! p& f9 ]
- 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 — менеджер для работы с игровыми скриптами.! d) f. g: W% V) M1 C+ o
* x f+ J0 q2 P& N+ V$ M6 |) P, L# Q) r3. Описание класса QuestManager
& y) @* P0 m7 }- /**
2 l2 Y* R1 t- \2 n9 C( f8 r - * Менеджер квестов и скриптов.
' l% M8 X. o4 {) W! M7 a9 h, C - * Автор: Zoey76( M( Q7 `7 q( b
- *// c% k% R4 [$ C3 B% |2 w
- public class QuestManager( I) M2 f& {' E7 S
- {
0 X% F0 N' {2 R - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());- l, q# D9 H2 e, w% @- i2 z# T
-
( s. X$ S6 k. B# e5 x - /** Карта, содержащая все квесты. */
! O1 }2 s$ S I ]! p - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
( z' ?+ o _9 l, t - /** Карта, содержащая все скрипты. */# ^! {+ [7 m7 T7 a
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();( N9 C; X! v6 O4 O; e
- ( c+ a2 H6 R3 N" L6 V
- protected QuestManager()& h& j- U- v! R! k! J) Z; g/ m( ]
- {( z2 _! M! D' A0 K1 v
- }
9 a* P$ q8 W7 ^! Z" \ - }
Скопировать код 4. Методы+ ~3 w0 u. x" Z- {/ P/ E' O
Метод reload(String questFolder). v; v; @4 C j) ?
- public boolean reload(String questFolder)
" B1 s5 ?' `# V - {
4 Y& v: k+ N S' v: V - final Quest q = getQuest(questFolder);7 |; f9 E, Q- v$ C0 D! ?) ]
- if (q == null), e+ _9 I, i: Q/ L: M, y
- {
& w' t9 _4 V' }4 F9 S - return false;
2 G- q; K0 ` }) X) c: C+ U' ] - }
6 [# T- t1 y9 I, O - return q.reload();- I7 r, c! t: k2 C/ I* p! J, |
- }
Скопировать код
0 {, G6 h( t3 A$ Y% i; k" i
+ j3 D/ t7 N2 U6 i4 sМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
% d; O7 i0 Q+ s# OМетод reload(int questId)" a+ V0 I1 E, R# Z5 D
" f* N# m9 m# m( P- /**5 @$ R8 N5 c6 H: X% o
- * Перезагружает квест по ID.
% P, g# L) ~6 w. X - * @param questId ID квеста для перезагрузки) G) g" Z2 J' k1 h9 F' p
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае" p% Z: Y4 l% P+ l* F, |; D$ z8 O6 m
- */
4 e, Z- W1 g! m5 |2 T1 j4 E% v - public boolean reload(int questId)3 @# A# t; Y5 {- o. i ?
- {
; i8 `) T) Q, c' b9 H - final Quest q = getQuest(questId);1 J; D( Q$ ~2 ?* \
- if (q == null)& w9 W$ \5 X7 ~# ^% e* [# f
- {, n+ L. Y) g% K2 Q, W# y
- return false;
0 v( u% F, z6 e+ [/ c$ S - }% G2 r& f* o# `. P2 b# J( x
- return q.reload();. ]" _+ F8 }, P$ O, m! g3 {. L. m) V# B
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.2 M: k; i, U/ T2 }& f( G
" c7 w* T b) D8 `( r' e
Метод reloadAllScripts()
( L( I* y( ~% {# L5 ~: ~/ S, C; _4 w, i9 n+ O$ T
- /**1 t, F0 Q6 _* P% ~: z/ V6 G
- * Выгружает все квесты и скрипты, а затем перезагружает их.* q* _$ a: R3 j
- */% V) t) g& h/ }1 O! B
- public void reloadAllScripts()8 t" M* Q0 N6 l; w, D% s
- {# b; F7 |" M+ N! F3 }
- unloadAllScripts();. Y5 S( p( @/ g5 o7 ]
-
7 [3 O: ]5 J3 o$ w6 X8 Z: f! H - LOGGER.info("Перезагрузка всех серверных скриптов.");* D, z7 d4 [! t5 Z2 h9 `' Z
- try2 x3 |2 `# L. e, T! g9 G3 D; @& }- \: C
- {
9 Q+ N5 B; Q7 k4 l: ] - ScriptEngineManager.getInstance().executeScriptList();
) j% n& ?4 X+ p; y0 V - }9 F" N, O0 x, R+ ^& x( t# A
- catch (Exception e)* b7 }& v- {" r
- {3 c' g3 f8 o* v5 X. G
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);4 e, c4 }* L/ h# f" s( h
- }& u9 {; e1 t4 o1 p& I
- * K9 K; s$ U3 w" g }3 y
- getInstance().report(); Z# M7 O7 r9 O) f9 y0 ]* d
- }
Скопировать код Метод unloadAllScripts()
2 Z0 Y, X ]7 k. V' Y( n% I( b! _+ w L) L* ^ o9 A2 S% Z- b( _
- /**: [; X7 }% |. w* \ v$ n7 @) }8 w5 _- \
- * Выгружает все квесты и скрипты.
8 |- ?1 ]! b2 h1 ~ - */
0 j% n$ `+ E+ o- e0 Z- I - public void unloadAllScripts()
( k, A# S- x# F' _ {8 @- @ - {) S; C5 a( k# z- [
- LOGGER.info("Выгрузка всех серверных скриптов.");
; h3 z* ]" ]9 _$ R -
. j) [1 ~7 m- K; I/ A# g - // Выгрузка квестов. F* V/ K" f, [% S5 |# I
- for (Quest quest : _quests.values())
! i% _7 V, H; O - {
- G; Z9 {2 e* F0 X - if (quest != null)" s1 x; c5 S0 Z( O1 z* p+ s
- {
1 J* @! \0 U6 J; P! L! U& S/ C9 H8 A - quest.unload(false);
% _2 F3 c+ F0 {& J7 e' a: { - }( [4 D+ T5 {; i' ^) ^( d
- }
; [+ D( w; C7 i& y( H0 W2 i; \/ _) ^, o - _quests.clear();
$ {+ x5 ^, s& F. l+ |8 \- u - // Выгрузка скриптов.
/ D: w+ X, }0 G3 r+ s - for (Quest script : _scripts.values())8 ?% q5 E* n4 R
- {
. D* v- a p- X, o. x - if (script != null)
. o0 u; x1 Y: m& H f0 a - {
; z" [$ m {; C" U/ Z. b - script.unload(false);
) m: O5 q$ P4 h- v" P5 m - }
: r7 j1 h$ g+ L X- p& {6 J - }+ H) A1 r! q3 p: Q8 |
- _scripts.clear();
4 W9 V0 Y# n& g: z% u0 j9 _6 w - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts." X N3 ?0 R) a' a3 N( }0 s7 x
- _1 g) h1 X N% uМетод report()" b" L) B2 R( }$ I4 W3 [: L9 a8 b
; _* A0 a* i. D% ]5 E4 {
- /**1 D9 K" h; F: K8 M! p* g# u# d8 A, I
- * Логирует количество загруженных квестов и скриптов.
1 u H) `: A5 @9 p2 p8 B6 L - */
P( e1 _1 T0 i% r1 f( O - public void report()+ `9 q1 _& a" ?; S( {
- {* O; K# a! A! |
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");5 d: p) [; s6 s
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");* F* S: F2 |+ s- e
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
! M0 r; a! ?5 y5 o* ^$ K( U % Q2 D2 t+ T5 n9 Y( _
Метод getQuest(String name)+ D3 D* e5 ]3 f3 v# V% N: q( _
3 q/ D2 T9 H! I: _
- /**
1 ]/ y* ~: b5 S) Q - * Получает квест по имени.4 I3 I, C( i9 }7 N
- * @param name имя квеста. o9 U4 Y; ]. w3 {. Y. o" R
- * @return квест
+ s8 b8 g* E1 D) h - */, j- a: i7 A0 F4 ^) ?
- public Quest getQuest(String name)
: L+ e- u4 V* i1 l- I0 B - {# n! \. V$ @+ B, R4 v* O& V1 N6 s
- if (_quests.containsKey(name))
; p D M$ I% ^5 S& `) ~5 ^7 i - {
, ?" h! @9 {- }$ G$ m: a$ C - return _quests.get(name);, Y; j( N. L/ |$ `* l$ x
- }
4 K) q6 ?5 G: e7 I - return _scripts.get(name);7 v4 i1 @/ E" c! Y! k; _1 B- g
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.1 u) }: G8 Z; f8 O# q* N
! p) d. V( H6 x! P% m) [; \2 q2 Y+ gМетод getQuest(int questId)- U8 q" k3 `' D. e
2 U$ G( G( w' j1 t5 |5 |
- /**
+ v4 W, x9 ]$ o% ]/ r8 `: } - * Получает квест по ID.
" B* j) O- R/ P1 p, `; Z1 U; I7 V% e - * @param questId ID квеста
3 e+ i( f( W7 o$ E$ M, p0 w - * @return квест, если найден, {@code null} в противном случае+ o& Q1 n$ P# e5 T4 x' i
- */+ v8 B ]) ?; d4 P( K
- public Quest getQuest(int questId)0 s' G5 F/ h% p( A4 {3 U4 I/ o
- {9 D* S& L( C! E% r
- for (Quest q : _quests.values())
4 p! S6 T3 w4 w- m- U) p1 A6 Z - {
2 h- }2 u/ |3 H! U1 B% h - if (q.getId() == questId), {' |- \$ }' a
- {, h; @- r# P8 l# L, c
- return q;* p: r& @. ]* i( P" g
- }' b9 c0 ~& c v& `+ S/ m# X+ q
- }! J. m: C8 a" G9 t
- return null;9 M$ O0 j, w, k0 l, _, K/ X
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.! K" D( r& X4 r1 Q
" a C+ |) o1 L0 ~7 [) N: wМетод addQuest(Quest quest)8 s5 G! g4 f. _$ a' `+ c
5 O5 ?6 K s5 }- /**- V9 c( U' @4 M$ i
- * Добавляет новый квест.
5 z# n8 L; F. Z4 ^ - * @param quest квест для добавления# _5 S m4 N, n. J1 Z
- */
2 K& F. g$ q8 i$ T6 v - public void addQuest(Quest quest)
0 A# u# x4 k% C% T# g) r - {
# y' j& v3 _/ ?7 d6 {2 l# S - if (quest == null)4 Q" w4 ~& N7 U
- {% E! w4 u* V1 h; C
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
7 }3 m- n# y& R# R' U9 V' ]3 u - }# h' b0 b/ D1 t7 {( ?
-
; H p8 z" S( e6 r! s. @% g - final Quest old = _quests.put(quest.getName(), quest);# n. |; w6 W7 Y/ u9 `/ D& @
- if (old != null)8 t# J d/ z) A" A) E2 j
- { @8 j; }8 B# |3 \! [$ S
- old.unload();
" ]* c3 K8 Y5 D - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
0 K# C1 Z' \! f. a0 N - }
: K0 o5 r7 F2 u$ [7 K. F4 a -
& j( I( S: H" D8 x8 q( I - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
0 I) C3 O+ j' I4 [- `* [ - {
! v( ?0 m( u; y$ ]7 C0 O - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();5 g- `, m! D/ N- k c' V! E8 Z
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");8 M1 R9 G! w8 J
- }1 r: e w. y$ n4 n9 U
- }
7 L# L, r; x( g$ [" L( Y - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
% @/ D# M; ~0 HЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
~# Z. j& d' d( P8 Y) s h7 {8 g+ u. z$ N2 _7 h( j7 e7 q
5 `! @+ I! l2 W5 \' i& Q2 P# G* M% R6 b4 U' |( c$ [
|