Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
0 l% e& T r) H+ _' ?
3 G/ w+ e! v. g0 U% r7 Z9 i7 q) HРазбор файла QuestManager.java5 @8 F2 x# E+ I* f* k8 _2 s
4 x6 N- O" w. P
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
/ J1 V! [3 K8 q3 }/ ~" G; X& eОсновные элементы; l1 b" K& |: m6 {9 D
- Лицензия
. T4 v0 K5 Y* l$ C- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.6 ?9 W) r& \: e
- Импорты) M$ \" o0 l( u- i
5 T% s" k- y5 c- u' s3 e
QuestManager.java — управление квестами и скриптами.7 K" c0 ?( U, t! {. i
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
3 `1 f% Z+ [! K0 d+ d/ j; c
' y. ~1 Z4 m; z- u! T! o! U
& X& i1 S) {4 d. E+ UДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
4 S2 ?0 I/ S- q% s1. Лицензионное соглашение
& x$ M) }2 j0 f! e4 L8 |- /*
1 X, g7 N! h, @& m7 s - * Этот файл является частью проекта L2J Mobius./ y% n) E3 R$ F9 x; A; r& i% u* Z D
- *
% o! h" d% I. O0 w* M - * Эта программа является свободным ПО: вы можете распространять её и/или изменять6 b: h- _7 [. }! a; U8 p+ a& g
- * её в соответствии с условиями GNU General Public License, опубликованной F4 T' c# X; I4 |( T
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.$ A: ~# F0 S' H1 h" s. r
- * / E0 w4 s- i" r8 h7 I. s- B
- * Эта программа распространяется в надежде, что она будет полезной,1 ^3 b! d7 f* t6 z$ B$ Y
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
' j" s5 g" l2 X( z) h9 w8 c. F7 D - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ., p3 B2 g5 K! g
- * См. GNU General Public License для получения более подробной информации.' c- b5 B9 X5 J- \, i& B& E
- *
# i8 u5 { r$ @+ b* L - * Вы должны были получить копию GNU General Public License: B3 A4 P% N$ j5 C2 |% A# z
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
$ p' v8 N5 s, S - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
, Y) Y' k' {; C1 U2 D& ^0 n& _' u$ K+ ^3 e- e- a
, Y0 q1 K( H" \- @" W2. Импортируемые библиотеки* d$ F9 R+ G& u9 d
( w$ [0 |2 D( `, I+ Q% \4 a9 n
- package org.l2jmobius.gameserver.instancemanager;3 }+ j) U: ~- d( K# L7 ?4 c5 z7 e
- ; d: S7 k$ X) f6 x+ G& K% i" o! y
- import java.util.Map;. ?4 Y2 x: o5 Q. X( l; k; C; y I
- import java.util.concurrent.ConcurrentHashMap;$ }6 T# i/ B) e; P/ p. M
- import java.util.logging.Level;, p) g- h: v( [6 M
- import java.util.logging.Logger;
5 ~5 q: w. \7 D/ ]1 b& ^
8 F9 g( w: V& L% f: W- import org.l2jmobius.Config;0 B2 S6 v! ?! B% [7 D( o
- import org.l2jmobius.commons.util.CommonUtil;
A/ X+ _: U R" p - import org.l2jmobius.gameserver.model.quest.Quest;
, e4 A; b8 F% ?- E' c; D - 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 — менеджер для работы с игровыми скриптами.
) G) d9 e+ P/ `0 x2 E1 O/ L7 e+ m' y7 k" ^/ c C: y% p
3. Описание класса QuestManager4 r+ y9 l2 N7 n) b& U$ q7 k$ q
- /**
7 ?! ?* s9 a$ O3 v. H& l8 x/ b - * Менеджер квестов и скриптов.3 R3 O' @8 R9 G ]# ~1 p- X
- * Автор: Zoey766 X. |! O+ z2 Z2 [! U
- */
: J$ S7 H; I5 K - public class QuestManager# y* L) ~) j' S2 F8 M9 G7 s
- {
x( m: C" G; }' ]7 @ - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
' ]' A" A& f; p, W -
1 i* |( b1 E& V ?$ g( N: | - /** Карта, содержащая все квесты. */0 T) ~) Z6 n( o) ^' Q
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
' l7 _: b7 B" I5 G( p( e - /** Карта, содержащая все скрипты. */1 [- A5 W$ m/ ]+ r- [% s4 [) c
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
% Z$ H V7 \; h o# [ -
5 u2 B' b3 x, N: t - protected QuestManager()
+ M' K5 y" l3 V% y { - {3 Z& I, V' S( j; Q
- }) h) L1 ^6 G& C4 b# w0 ^" T
- }
Скопировать код 4. Методы
+ }* j; W1 c) _* g9 ~2 \Метод reload(String questFolder)/ \1 }7 g" _* g) n+ _
- public boolean reload(String questFolder)
! Y$ \0 U4 [3 d3 {1 ~5 j* v( ~ - {. E6 X5 G) I7 O8 j- O- l
- final Quest q = getQuest(questFolder);
+ S- x1 l; k; L' ]' s7 c: e- L - if (q == null)
7 Z1 H8 Z j1 e4 c/ U- p - {; X0 |1 @+ _) f! m" N; G) |4 |/ ?
- return false;( C2 ~$ C/ k; F, T a+ T4 O
- }
2 Y4 U9 Z8 S6 B/ Y0 Q2 P - return q.reload();" B. X% R! t* f r+ q, B
- }
Скопировать код
' U( C' q, G6 M q: z- ^) I5 C2 e0 k" Q+ w" k* q; b& i- X; _" }
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
+ C6 ^& Q' i: X pМетод reload(int questId)
( _7 x8 o) S3 n/ O: h
+ K) `( V( P* ^- j+ ?1 ?2 Y2 e0 ~$ p1 v1 |- /**
. W: N* v# ?' B1 u' | - * Перезагружает квест по ID.
o/ i2 ]6 e* k! ] - * @param questId ID квеста для перезагрузки2 l l2 h* ~, e6 C1 J
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае0 ^8 Z( w' @) s" |4 A
- */
2 q1 e1 ^; ? p0 }/ M - public boolean reload(int questId)
$ i! J) Q2 n# t) M - {
* L4 Z' D% I7 t. z3 U1 c& _& `' e - final Quest q = getQuest(questId);3 l2 ~/ f( c0 u$ s
- if (q == null)
% V+ i: G% ^* n$ C' I8 c5 { - {( [) T `/ l8 G; b: p1 S* ~
- return false;
! K9 {1 o" l6 e1 o; z2 [ - }
8 p, T, D/ D* [4 ~1 U& S9 y8 U - return q.reload();
$ y1 E1 {, r' M$ \8 G# b& ~ - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
. V! {+ l4 J3 I2 e( n8 P% K ( x; P6 {' y+ ~$ q$ z7 |
Метод reloadAllScripts()) n! ~3 V1 q8 e2 n( A
1 @! D% k+ H- V1 P' p$ N( }. p- /**2 `5 m2 w' d \9 @& D' r2 v C0 ]
- * Выгружает все квесты и скрипты, а затем перезагружает их.
7 _/ N" ^' _$ x - */
" u% u: ?6 o2 V5 ^+ J$ d - public void reloadAllScripts()4 _+ b. B, S* x) F! j; e; [
- {/ X6 F( W, u* }9 Y4 O, A
- unloadAllScripts();
' r* X2 }$ ~' U/ ? - % |5 A5 X" U: v* c4 h) f
- LOGGER.info("Перезагрузка всех серверных скриптов.");+ Z1 N7 V' J" u" y. i
- try
+ @! o, Y2 p+ a( d% ?" C6 H - {
3 A5 c8 B+ Y& @* `; ` - ScriptEngineManager.getInstance().executeScriptList();+ c( Z2 @/ Z4 z) M% Z
- }6 ^8 d/ u1 j' K; T. p0 N9 |! P
- catch (Exception e)
: u7 Z% m7 L+ T: Q/ T - {
# `$ }" K; y7 ]$ W) B; V - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
[* C7 n# U- H" _& F( n/ p - }
* @. }" D3 V& G0 L -
2 L% O+ D; u% a4 u3 J& O9 b - getInstance().report();
; [/ V, D1 G6 Q6 t- ? - }
Скопировать код Метод unloadAllScripts()9 o9 N+ U$ k0 \2 ?, a0 ?) e. k5 u+ ]
2 l. U/ v, c: T2 m0 K
- /**; t a2 G' s: @) H' B" T H
- * Выгружает все квесты и скрипты.- h ~/ i1 i( D1 ]$ ]5 W
- */
; o* K; ?; o; B7 l$ _7 @6 f - public void unloadAllScripts()
- H5 j, z0 ?) F; A7 i - {
. b8 A7 s: M- z% m4 J; \! W+ a - LOGGER.info("Выгрузка всех серверных скриптов.");2 t: y/ _* @. C( O+ o# e& ?
-
! z# w1 G/ P# w, s- B- P - // Выгрузка квестов.
; l5 f' F Z# L - for (Quest quest : _quests.values())
2 e1 |0 s% X& h1 k2 @& ~ - {$ i% t0 t. @5 f1 U! T5 W2 E
- if (quest != null)7 O g3 ~1 {: b& l+ H% h' Y
- {2 U. t" ]: |+ o7 |8 W5 M
- quest.unload(false);8 w; g1 d' O& J3 P3 j/ a$ [6 A: U6 p
- }
% m' h0 U7 z9 w5 Q/ u0 Q5 a - }
1 ~' ?5 d) b4 G% U, }+ ~& h/ H - _quests.clear();
2 K a i" b, I$ `0 K' | - // Выгрузка скриптов.
) \8 j8 b6 c. Y8 [ - for (Quest script : _scripts.values())! @* s7 p1 ~/ K8 s) w* |
- {
4 ^( }9 o) M/ o# y: j2 A - if (script != null)
8 L9 k5 Y8 T6 |$ @ - {8 R6 c2 B) S: `" ?* d
- script.unload(false);
4 o% w8 T/ U6 e, J. c- A7 i6 v - }4 j7 B8 \0 U% f) [/ M
- }/ ~! W9 ]+ i9 f4 h3 p
- _scripts.clear();8 U3 L+ B. ?0 i0 g% M/ ?, v
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
# P; O/ N7 p7 s0 _$ ?+ n/ K; o
2 E% r( C0 ]) T$ ~! JМетод report()+ h% g) O# L9 h4 C3 o
2 S6 i7 B9 N c3 g7 X4 l, |0 m9 O
- /**( B3 K+ j: y1 k7 Q
- * Логирует количество загруженных квестов и скриптов.
6 ]; `' K; f7 Z2 X0 K9 V: Z; f - */
7 a ^+ r$ {, q l# E) u - public void report()& I. v8 w5 t, S! [3 |
- {
0 t( t: Q% `4 U4 x" p! x - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");2 H" `+ F) i& W: i- r
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
9 [/ E$ ~- t' x! e0 N - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
* `' i; p2 A8 Q( {+ M! h" M
% _+ g2 C& k9 P3 sМетод getQuest(String name)3 z. n9 Y0 \6 a( d! w- |/ m
0 C8 o- O$ r3 M, Z
- /**
, ~' Z$ M& C: o6 z - * Получает квест по имени.$ {; A2 w/ b( M! O) Z. Z6 |: s
- * @param name имя квеста4 F" B; c+ u) `' t
- * @return квест
4 i, j0 { L9 V1 y* K - */
& q" e8 g" L4 E. w - public Quest getQuest(String name)
# _2 s$ c! a% b) h2 Q- x - {
) B0 g0 F+ q6 |! M) H - if (_quests.containsKey(name))
9 G. K- [6 B2 }' b+ K- @, G - {
# m. E5 @4 j. |2 O - return _quests.get(name);/ T0 J$ e# c' e/ F! D
- }8 r; f, c5 R* D$ q3 H) E
- return _scripts.get(name);% L4 w# w* U* k: Z: O& l, Q( m
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.. E K8 d1 y: P* X: l ^
/ a" f& i! G3 e1 l# N! z/ j
Метод getQuest(int questId). d1 v! @6 w- t, D l- Q- a$ m: h( ~6 V
h9 U: n" H% f: [- /**! m1 n8 x% e# k
- * Получает квест по ID.
( h* ?9 h5 e7 Y* {) c - * @param questId ID квеста
# x+ m6 U1 J) P) a+ r1 O: A - * @return квест, если найден, {@code null} в противном случае
' l4 `. X2 n% q! _. l# Q: { - */
' i, s' R6 j. m - public Quest getQuest(int questId)$ R% l! ?, ?3 P: W, z3 n$ g5 @( m
- {3 O/ ^5 B; S. ^, |4 H1 \
- for (Quest q : _quests.values())9 v# q( Y3 @' N
- {
1 G8 T0 P5 X6 V. K+ i - if (q.getId() == questId)
2 k; G6 n6 I* R: A) C* [ - {6 r! {, r& O+ Z1 |8 p" e8 H
- return q;
" e! K6 ~1 q( h5 r2 l- p% ^) @4 O7 m - }
' i1 {& Q/ s5 T. h* O- O0 C - }3 b% J* S, S4 @: H% P
- return null;! j0 s5 F4 k/ r( C" o
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору. y* B. n5 A" X$ y% t" J' ^0 D b
# g- i' C }. _( W- q0 O
Метод addQuest(Quest quest)
) M1 v2 R+ E6 n/ Q
6 F% X- F$ A1 F- /**6 x* _' q1 G1 ~2 N3 Z7 s. _
- * Добавляет новый квест.
r F7 d! {; i C) v - * @param quest квест для добавления6 J( `) V( ~* l3 `6 _
- */
0 a3 n- ^9 }' U5 E1 J - public void addQuest(Quest quest)8 ~3 A8 L! s+ q$ @8 u/ o1 o
- {' Y2 o( Z2 x' ?6 i& |' Q' g
- if (quest == null)! |$ z0 n6 ?4 o; P
- {
2 T+ t" K6 f' A+ } - throw new IllegalArgumentException("Аргумент квеста не может быть null");
( L8 X$ A ^2 z! n# u - }
" y: g! A2 i0 ` -
2 ~7 |& Z5 q/ W, j& j - final Quest old = _quests.put(quest.getName(), quest);* n# K9 Y& y. y* n
- if (old != null)
+ Y" R& Z' A+ V9 a - {7 n: k% W W7 D* R/ O
- old.unload();: N, a) I* S9 u- @9 v: @$ w- [/ e
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
% i/ x2 M( C V - }
; X/ |$ E& }7 I3 ~6 l! W -
& W0 E6 M, u- o - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
! Y" y8 M+ q' u - {, k, f: K' O- e8 u4 z6 \: Z
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();+ p1 U, d% L6 J/ \: G+ w
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");# T! J; Q/ @ H7 G; [
- } y ?4 f! c% ]2 V8 Q
- }
/ V/ K3 x( H- U8 g: L - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
, Q' N( G& t7 X: nЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.' D. D }6 `. y3 ^" c7 i" g
4 L- @8 ~' s( r) s6 k' B7 d {4 a3 [* r
- G8 r% B" s7 I |