Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
- m6 K! R1 A4 p+ v- H: j$ C! s1 O! D' D! G2 q. }+ [5 N' I
Разбор файла QuestManager.java* a7 H/ i C3 r4 T
+ s8 i: b: A! @$ C8 @Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
) I; Y0 H/ Z @; s$ Y" pОсновные элементы1 o& x" t1 ]6 r: ]% O
- Лицензия
! j- S% K- B4 u: a* r& a- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.0 e. {2 }8 U: `
- Импорты
& q9 z7 i7 w$ L( |& @7 D- [
: A$ b0 \7 s% _, G0 JQuestManager.java — управление квестами и скриптами.# N, ]7 U5 J" W) l4 l1 g
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\5 X! y0 t7 @) I8 I
" @1 u* b& j0 q w
+ C3 D: {: R+ A( |- p8 @Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
# [2 M, z. L) Z0 P1. Лицензионное соглашение
4 F9 k E j& r4 ?& d m/ ^- /*
! \ J4 S9 Y1 L, H2 a8 O; i - * Этот файл является частью проекта L2J Mobius. k. P: {6 R3 \% R6 o
- * ; g/ h9 v) v, Z2 g q; D
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
6 r0 @& J' Z4 X! } - * её в соответствии с условиями GNU General Public License, опубликованной
% T% d& r" S& u, P$ o - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.' l! Q0 x" Z+ a1 n) O
- * + v- u" X6 F4 p$ m
- * Эта программа распространяется в надежде, что она будет полезной,
6 T6 s, u8 s L- r7 V - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии4 u0 L: J3 [7 ~2 O7 x3 I! _
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
; c8 C( q7 I, k& c - * См. GNU General Public License для получения более подробной информации.
4 E8 I3 v& V& F6 x - *
, \$ b9 U8 @/ v9 S9 S4 { - * Вы должны были получить копию GNU General Public License4 Q6 Y' ]+ f7 C6 U3 c8 _! v
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.) L. a& R1 F: O3 r" I' j, z
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.( L n' i! h7 h" I3 B" s
* O. @# K$ \, z$ ~0 p$ U0 b
5 o4 E: B& o% b4 ?
2. Импортируемые библиотеки, r5 Y0 ]# q* w* w1 _# [
- A0 j# }7 Y* A! N9 U- L- package org.l2jmobius.gameserver.instancemanager;; K8 A7 N" _' B/ E2 G% u
& {' Y; M* x7 R( J+ l0 j( |- import java.util.Map;
Y! R2 b- N; Y7 M& }* f9 h - import java.util.concurrent.ConcurrentHashMap; M. I/ T% `9 o( z1 Q& I
- import java.util.logging.Level;: o# C; m6 i/ [
- import java.util.logging.Logger;% {1 i, b% F. o- M+ }+ T/ \& O( l
" y F% ?' y' L+ K: y% R9 s- import org.l2jmobius.Config;
4 L. R0 r0 k. s0 d, K: l - import org.l2jmobius.commons.util.CommonUtil;
% v7 K: [+ Q, }+ l- L$ l; a% b4 S - import org.l2jmobius.gameserver.model.quest.Quest;
* M c- }/ y6 N4 s& g - 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 — менеджер для работы с игровыми скриптами.4 P( i. ]& @9 r4 y+ z8 v
0 T% [# H+ z, G: S( B% v+ Z/ n" W( G2 `3. Описание класса QuestManager
; x4 Q9 f' R. F! V- /**
* N0 p: h1 D% B- ^$ L - * Менеджер квестов и скриптов.7 X# v0 z* M% }8 x, X: D
- * Автор: Zoey763 [6 F6 [" x6 d# @3 H+ g
- */
h4 b- J2 G1 b( E - public class QuestManager
& g, k7 y6 Z* ~# j. n - {9 n% l. M/ w: D. D B
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());0 H2 _( u( Q1 |4 p
- $ U" _ u0 ]! k9 v
- /** Карта, содержащая все квесты. */- S, ?' m/ Z7 Z8 U/ m
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
" @6 E( T Q; e$ u - /** Карта, содержащая все скрипты. */! b+ J+ I% F( a; K; C0 g
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
6 \5 w9 Y# e+ ]9 Z7 C. x( b) | L - 2 ]6 _4 {% n& k; z
- protected QuestManager()
) |3 O. N' ], t - {
" _) d, L7 \$ q5 Y" ? - }& o% x: Y) ?( X
- }
Скопировать код 4. Методы
# _- G; E0 m* g. Z* i* X7 iМетод reload(String questFolder). `( j. m0 H" h2 i" T
- public boolean reload(String questFolder)/ M- H) y6 V+ a+ g- N
- {
- `- L7 E* N1 ]& V5 c" E4 \1 l - final Quest q = getQuest(questFolder);
& w% ~% L0 p1 [/ z - if (q == null), f) E3 x% L8 |* Z m1 _* [) K3 X
- {, ~# w1 r% D' n( o! M* q# p
- return false;9 J4 h, d- | x
- }
+ s" L. I s \- p - return q.reload();4 M1 K: G! |4 v& f5 T6 P
- }
Скопировать код
4 \6 g8 s# t7 @) D/ x% R ]
0 S6 A* @ s1 ^' O7 m2 SМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
* Z/ J: l3 d( Y8 }8 E) OМетод reload(int questId)9 R! T! c3 z5 g; ~: {
/ c, [& o2 p! J) E) x
- /**- d Y4 [) Q4 c; k, v4 q
- * Перезагружает квест по ID.
& @( i% p' x, f, T - * @param questId ID квеста для перезагрузки
$ b5 I2 a/ Y% f0 X$ `3 w9 u - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
( E, Z6 [' q( g0 ^* S - */
. X+ w& z @' T( e1 E - public boolean reload(int questId)
! O' [6 C! }. ?' M+ Y - {
: X4 Q4 [; _4 q1 R% E3 j6 ^ - final Quest q = getQuest(questId);
. w' a6 x3 X6 y& u - if (q == null)5 ^7 I" V4 M9 K& K) m8 Z5 b4 B
- {
* Q0 r6 H2 T2 S! A" C - return false;
$ l) U1 q9 m( _. F* o" a - }/ w' u- q# `% x) A% X
- return q.reload();
* Q: t& p: h+ w. h8 C - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
+ ]1 D; m6 A, |; M6 F- x# B ' g/ S. y/ V3 K( P( P; \
Метод reloadAllScripts()
8 g5 n" t. o( _% I! l7 Q6 s& _6 B. z! f6 k- `& ~
- /**
, v7 [/ N, p3 a0 w& H: M! d- X - * Выгружает все квесты и скрипты, а затем перезагружает их.3 u6 F. x8 Y/ r2 ?. B
- */' j9 U; z% f' `9 t# P$ N" H. m4 a# d2 ] r
- public void reloadAllScripts()
8 m/ I$ c3 l2 g8 Q7 t i - {
5 K: {! Q2 U7 p* ?, { - unloadAllScripts();
$ p* X; U0 g- G$ g - . J/ q- s6 u# f' V/ I
- LOGGER.info("Перезагрузка всех серверных скриптов.");
4 @8 ?) f" _/ } - try7 L% [" o( R/ W8 V. z; }. i
- {6 y v# W5 H" d5 [9 L5 H5 u0 A
- ScriptEngineManager.getInstance().executeScriptList();2 h$ E. w9 T; ^9 U+ a6 k j* p
- }7 e# H- ^9 \# f
- catch (Exception e)
' \, r' r4 l4 \ - {+ A _5 _) e+ V* N9 k& M8 v
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);! S( e: _ M' Q% L4 P
- }
+ D% J0 R' R$ Q% o - 8 w' P, k0 r9 _, b
- getInstance().report();
3 Z" F0 j1 S4 l# L8 c, ]& M - }
Скопировать код Метод unloadAllScripts()
1 N( {+ `" ^9 U- Q) m' c U0 ~
$ ^& G" ~' |% m" d# n+ r- /**% C C1 j* b0 T7 r2 }0 U
- * Выгружает все квесты и скрипты.
5 @1 a8 A2 {1 P+ m" z - */
& K0 u) u$ O( J+ `- m - public void unloadAllScripts()
3 H; l [4 y9 _; F* y4 k; ] - {0 y" I& {5 D r: m2 N
- LOGGER.info("Выгрузка всех серверных скриптов.");9 q/ {2 n6 G; ?' Q+ z- {+ k( }
-
2 z* s7 c0 ]; }6 m) t/ @' u( C - // Выгрузка квестов.
, d! d& u# G' t0 v9 o) | - for (Quest quest : _quests.values())3 I4 U: z" k! U/ _; o
- { r L4 q5 m% i# v
- if (quest != null)9 \; f0 L/ |$ m5 y
- {3 W1 c0 E! W0 V' K- F# X w
- quest.unload(false);
7 G) Z* ?: @8 X! d) Z- x. { - }- c' Y( B& z: ~. `$ w
- }
5 G7 @7 {! |( U( U6 Z- N, }$ z - _quests.clear();
5 ]+ N9 Z" I: _, r5 |. e - // Выгрузка скриптов.
( r) \- ?% [ y0 t - for (Quest script : _scripts.values())( Q6 U; ^* R% s4 R- ^
- {& `7 F* y$ r7 K" H6 {
- if (script != null)
# w3 r/ {0 l( \6 X) X! p - {) _- X1 @! J2 V0 |; K
- script.unload(false);
7 |8 X: P6 T% m - }
9 H# b) i4 S9 ~( P) f0 p" N$ C - }
4 g4 \) d( G9 u t$ T - _scripts.clear();
% J- y; b2 s! Q% W8 r6 @ - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.* M6 ]) I# _5 Y" {# Q
( D2 z, V+ B8 Q1 q3 u# I9 C; OМетод report()) M- z5 K/ Q/ e2 t5 T
# ~& p Y0 i1 p" Q# a- /**
- L. K6 x Q! e3 }5 S" `& c9 g2 D - * Логирует количество загруженных квестов и скриптов.
" v- t2 M0 v2 l+ K7 X) W7 Q - */) B+ y& q, z! X; i$ j
- public void report()
8 P8 O3 r& c% M$ }1 F% l - {& d# L# ?" n, u0 S, x
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");5 {# ^* ^' A" h* Y- X6 ?
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");# p# s S- x2 R# s3 Z( c. u1 A6 I
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
9 R: c6 z" b' L1 { % }0 ], r* e( P5 i' p' o' x
Метод getQuest(String name)) ?+ s# n1 O, l! S' P3 E
4 R N+ O, ~4 P0 b3 c; P- /**
0 B0 U3 x$ T. a% R: _' Z, a - * Получает квест по имени.. u2 s6 E$ Y5 l1 l
- * @param name имя квеста) |% L/ G, y0 y/ @5 [" ^
- * @return квест
: `7 U& N, Z& O2 F. U5 ~ - */# A/ o& t% y2 ?: W6 a6 e a
- public Quest getQuest(String name)( W1 g p5 b+ I, A" g
- {
6 E% H7 S6 y Y8 ?# K - if (_quests.containsKey(name)). f/ j* ]& t* y2 F2 Y' c6 M
- {
5 e4 s- D+ j% Z& T - return _quests.get(name);
2 V) F+ y! T; w3 c6 H: E - }
& S7 |) y3 H0 Y2 Z9 r3 j - return _scripts.get(name);$ e" W+ I& d3 o; i; u' [& [
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.) u" v7 @1 e8 U9 T6 E
4 ]; k w* D7 @8 Z9 p7 a/ aМетод getQuest(int questId)
4 z5 u( d. M) R* {( ], w+ f: t# Q8 l
- /**
) B9 w% m. y; S' ` ~4 t$ @1 g - * Получает квест по ID.! S+ N1 N- R6 S& h4 o
- * @param questId ID квеста+ z5 ^# ?9 l% Q* @7 ^
- * @return квест, если найден, {@code null} в противном случае& w7 G, X# C, @
- */
8 F7 E& W' s8 S$ m( b - public Quest getQuest(int questId)- k- v' S( n; \4 W6 C" P
- {# [% E1 P) O# N8 b M
- for (Quest q : _quests.values())2 T1 k3 C, [1 @" `' v: t1 Z
- {' y7 l) E: T: m9 k
- if (q.getId() == questId)" y" Y {) [3 F
- {
0 m$ ^; G3 e7 D% i. T6 E - return q;
! b9 a3 ]+ ?/ m( O8 i - }8 \ X" S& y" X' s
- }
% Z0 r/ ]# x) r/ D* L k - return null;
, b0 ~+ x- ? h& S% E - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
1 j$ s0 J1 V) \
4 Q( L$ E! j2 }' x) ~Метод addQuest(Quest quest)0 l; f' x @1 ?5 \9 } p
' p3 w9 }8 V& _, l! z6 F
- /**
0 ~9 v, z! X \3 M - * Добавляет новый квест.
; \8 [# {7 ^ Z2 q/ D5 Q - * @param quest квест для добавления$ Q. v" S3 A0 ]
- */. p. A# ]( j) Q/ F( Z" U
- public void addQuest(Quest quest)
$ ^' z" ~3 h; ~' [( O - {: i7 v2 _ a4 l- U {
- if (quest == null)
4 h1 w, f- [7 K/ | - {
/ d7 c7 D3 \1 @$ F5 J- `3 _ - throw new IllegalArgumentException("Аргумент квеста не может быть null");
' I& X( [5 A- Z6 @$ C1 z3 S& S - } Q- [$ m, O! u& r- \- W
- # J4 w% M+ o- ]9 g3 o
- final Quest old = _quests.put(quest.getName(), quest);
3 Q- i" H4 x( m! X% d) f - if (old != null)0 y1 ]( C2 S( e% y5 A% e. t
- {6 i; J h( D9 l( N0 V# h# _
- old.unload();" ?1 e' S5 U; |; D, U5 X
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
1 F0 V4 \9 R# h( T - }
7 Y" ?7 s$ K* t, \) C Z -
% ~0 v$ x; s0 c - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
, q7 C2 P2 p" n' b - {
' ]' h L" `. J. L8 O8 H9 Y7 y- q - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
6 D5 `3 Y1 C, q - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
& y b. e& P( ]+ x/ J - }
9 V6 i: t/ j( L - }
3 e X5 `! }+ |% g - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.' y3 S' F/ \1 U
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
- q; H, ~# Y+ r% @% K( ^3 d
! |+ `5 x. d4 v9 f1 @ a0 H4 z( |# @ u: \( j1 j
8 } S; |: r! H% ~1 W, q
|