Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
. G* M4 a+ m' ]; F. J9 e. K
: N" q& T3 _6 g6 {Разбор файла QuestManager.java
8 }' g" _9 N. [. l2 k( J I. q& R: e- K s! x( i) a
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
& i9 Q* n1 D I+ e& Z. bОсновные элементы
+ T6 x! Y3 E6 p/ A- Лицензия
8 ^9 q! v' k, W; j+ E) u4 |- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.& z+ L3 u/ ]8 Z; N" T1 f& y8 Z
- Импорты
2 b! c0 C+ U( r* U0 L9 ^3 O . P7 `0 }6 ^7 k4 A1 a9 r. Z# o
QuestManager.java — управление квестами и скриптами.% r6 K9 w4 \( T7 \ o
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\" j0 F$ e/ _: Q1 z% T5 N
* |3 F) c( Y/ s$ y+ c' A
" d& Z1 g! C5 h6 N6 b
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
( J* I) Q" E* h1. Лицензионное соглашение$ T' B4 `6 v; q$ o3 O9 }
- /*
- g E8 T7 X1 ?" w - * Этот файл является частью проекта L2J Mobius.( V! {" f1 d3 ?" Q9 A
- * ) Z- Y: {1 e- [# Q2 N; U' j5 @4 E! e
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять4 ^2 L5 @" Z& R8 S) y9 x
- * её в соответствии с условиями GNU General Public License, опубликованной
- P5 [: [0 i8 K3 g) Z( G5 O! P3 F' \: D - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.1 \' x% G) T: |( g+ P- e
- * 9 L6 I+ |* e9 z( N; G& G6 o2 G0 U
- * Эта программа распространяется в надежде, что она будет полезной,* `8 K; p, k5 ^! w; w8 \* P
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
8 f& ]+ c$ O5 B& ^ - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.8 n: q q( {0 ]' d* n9 ?
- * См. GNU General Public License для получения более подробной информации.
6 \ B! S" E" v0 M } x - *
( `$ @; r+ ^( ?) Z9 D: k - * Вы должны были получить копию GNU General Public License
3 Q2 d$ f, t) b) N - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.+ A) v! Q' f9 [# \' ^& w
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
( L& i5 S1 k: h$ e- z. G
) B6 A8 n- l" u4 f$ [' ]. i1 d1 M8 o m: W/ u8 X+ e: J
2. Импортируемые библиотеки
7 ]2 w$ s/ }7 }- l- X. d% d+ \2 c% ?1 y
- package org.l2jmobius.gameserver.instancemanager;
( \. {4 i, d/ c2 R6 i; R1 F* S/ x - 7 H4 ]0 s- A6 |* x
- import java.util.Map;
; L( k( O' s0 u" i+ u - import java.util.concurrent.ConcurrentHashMap;
* Y- i. V }1 z3 E0 A6 ] - import java.util.logging.Level;
$ E( ?; S+ A/ i4 m9 n S# b - import java.util.logging.Logger;. C5 Z% M! `! j2 u7 U, W" S; z
- $ G! @, |1 c2 |/ W5 V+ @
- import org.l2jmobius.Config;
' |3 u& Q9 }( F4 u2 R* y - import org.l2jmobius.commons.util.CommonUtil;! l, Y" G2 J8 L/ g
- import org.l2jmobius.gameserver.model.quest.Quest;
7 z' o1 a+ o+ Z0 z" s! M9 z% i4 V - 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 p! i% E" O7 w! C' O/ L, t. H$ X- {
3. Описание класса QuestManager/ Q& Z+ ?) t2 o$ C1 U! \9 @
- /**2 H0 ^8 F# T: h3 m0 c6 H
- * Менеджер квестов и скриптов.% s4 y- c+ W1 s, w: L
- * Автор: Zoey76* @9 q2 y' U/ Q% _
- */
2 f. K# C8 S3 N - public class QuestManager- r% f# Z4 w# p% m" j1 E
- {' V4 {, n8 J7 S/ a) |. u; W# ?
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());) l: j h. ~# b! v) c5 ^
- ' C6 r; M5 G( M2 g7 T6 J6 @: `3 s" T
- /** Карта, содержащая все квесты. */6 Q, P7 B: k9 S
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();' I/ s! m, }( e
- /** Карта, содержащая все скрипты. */8 J5 n+ o0 d: M U2 r$ R3 O
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
$ _% l2 M( n6 ^' t+ e+ T1 T& o -
6 m+ U7 T9 c) Q9 S( N- ~9 j6 g6 @ - protected QuestManager()& s( p$ r' }& M6 R
- {
6 Y3 j. T: p6 S - }
G1 w+ j" G3 t p6 n) ?0 | - }
Скопировать код 4. Методы( n! K. ?9 m1 i5 F( T( g
Метод reload(String questFolder)
0 q/ _% e0 W! y& P+ h/ O- U- public boolean reload(String questFolder)
5 H- e# z3 O J& i8 }0 }3 K, W - {
/ }' P# [+ Q: L - final Quest q = getQuest(questFolder);
5 {; Z$ I/ _: ]7 N - if (q == null)
4 p9 K$ e" G# D& Q- g6 P: u4 ^ - {
, G; S" b V# B8 }1 y - return false;
* ?& O4 c8 O, s- d - }
1 \8 }0 S% K: t - return q.reload();
. o; Z, J. `1 g - }
Скопировать код
, Q8 F8 Q% ^4 N1 h) @: [$ _* n; y R! w( M( V9 r
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.0 L. n5 K8 F$ o
Метод reload(int questId)2 R5 t4 }% Q4 z$ K6 o" d$ L1 b- D
: p! G3 T/ J* ^6 l* ]- c
- /**0 l9 H0 q% s; }- k$ ]6 C
- * Перезагружает квест по ID.
/ g+ c, b! S$ R. K3 N% V' r3 T - * @param questId ID квеста для перезагрузки
5 {. q7 W2 b" w. O - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае1 a1 f: l( z8 a
- */3 t4 V9 J3 _7 C- |6 L* W t3 C
- public boolean reload(int questId)5 F- l/ \& ~- v: [/ s
- {
& a$ y2 o/ p2 O7 V) o, f! _ - final Quest q = getQuest(questId);
9 k0 J& D& B5 j2 V. h6 v - if (q == null)6 O" z/ x3 t" {5 h4 e
- {9 ]; J9 I$ j& u+ I1 B6 R/ A0 [+ ?8 n
- return false;
3 A1 B& P2 U' `$ Z! q7 z& X - }
* e% E$ C8 f/ E8 ~6 t4 d. Z. M - return q.reload();
9 w* T+ i9 t. D. h+ R! {& g7 H - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.1 W1 p! _5 I6 |3 o
: s' b* G9 E; z% i# R5 R2 z" xМетод reloadAllScripts()5 R% k" m) c4 L B% f: i
! D" R. H/ N t4 P
- /**) @0 [! n! P- f1 ~
- * Выгружает все квесты и скрипты, а затем перезагружает их.4 C$ C' u7 q* a9 S/ ?
- */1 C5 G3 h2 t* w- ?1 O
- public void reloadAllScripts()
t, r1 _/ W4 x4 b+ U; f: I - {
7 L' {! C& m8 q# t5 G0 O) e" d$ A - unloadAllScripts();& J. F8 K% X7 O8 r# H
-
# A9 V& j" D- R, _1 }4 b* s' j - LOGGER.info("Перезагрузка всех серверных скриптов.");8 \% O3 l7 J2 ]" p
- try
0 m, f6 G5 L! @' v. G) ` - {
. x. Q3 I& Z0 [ X - ScriptEngineManager.getInstance().executeScriptList();
! I% X2 u( [7 O - }
. ]2 { W; _3 G, }" F/ N& k - catch (Exception e)4 C! Z. J0 `+ M
- {
& r" C4 B. v1 i. E1 u# D/ r% A+ b6 J - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
7 i2 V) v0 ^4 @$ C1 {: k - }& A9 U9 h7 B* v. {5 k; T, w; X
-
6 m" a0 a1 a$ a - getInstance().report();
0 m2 r; u7 }. \8 z: y - }
Скопировать код Метод unloadAllScripts()" ~9 j0 D+ q' i/ _8 S# @& Y. l3 h
$ _4 g+ R# z* B& `0 y& Z' v- /**
$ B7 [! N* I7 D, I3 x - * Выгружает все квесты и скрипты.* Q7 H. z5 }8 A: u
- */6 o, Y8 N, ~. U) U* o
- public void unloadAllScripts()
/ @ _& x! E" b2 v {8 } - {
; D. |$ m5 F( [5 K( d2 h4 v) ?8 E& Q - LOGGER.info("Выгрузка всех серверных скриптов.");
) C: M0 O# _3 E" O: }' V - * j- n6 v& J/ k
- // Выгрузка квестов.
2 E) s' F, L$ }: B3 k9 A' y' [ - for (Quest quest : _quests.values())- |' T& N, ~! x$ _- y+ r" h
- {* H. \- K0 |* O% i% Q: B$ A
- if (quest != null)
; o) V& y( p9 V& ^' U) ~' c - {9 ^: e- K1 C2 c$ e) }: T
- quest.unload(false);; P. f$ c! W, b
- }
+ \/ B6 u* ]$ M - }
/ F6 N1 x; U$ C2 X6 H2 L/ E$ g$ j - _quests.clear();
}* j7 c3 g$ p5 q - // Выгрузка скриптов.
4 N. w/ o$ c* _9 r: I" ~& g' Z - for (Quest script : _scripts.values())- ~3 {. @) C) Q
- {) U) \) v8 V3 y- ^- a
- if (script != null)( |. d0 g& `( O K# ^: Y3 T1 Y
- {
! L/ N( _' k& h2 r% F! j - script.unload(false);5 w0 e2 k! `& \# e' d
- }3 z# q( U- w& k
- }! Y7 F/ Y. G9 c2 {& {
- _scripts.clear();' O, K% |8 B& r4 E+ A# T$ ^ T
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts. S% D4 x- M5 U) U
- t. [8 ?9 Z! Y/ [- e) uМетод report() r( N- {( H, H j* t
; _- v r( I; x/ W; \" o6 f
- /**
# q7 W* ?9 G+ z) j9 j - * Логирует количество загруженных квестов и скриптов.8 a% m5 X& L& P% h' k( b {
- */
" P9 \* b+ i2 g, H - public void report()
0 I0 t+ L2 U/ s9 u, I - {+ v. M* T$ p- g. z2 u" \ Z& W( V
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");3 p, I1 o# w. K5 Z; l
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
& z7 c {6 y( W" T! | - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
. B8 k- N& |0 O* p7 i
# E \* r9 y0 ], dМетод getQuest(String name)
* D- ^8 v, ]& l% e* U6 w
# X7 U: w$ E8 a% m- /**
9 U2 m! v( \# E3 k3 A) u4 ] - * Получает квест по имени.3 A' T, N' d3 C1 D7 X* z$ T
- * @param name имя квеста
9 t0 }) F7 t4 h9 @+ j7 h/ M) ? - * @return квест
/ W. ]9 W+ z, \' j' U S - */$ }" F. p+ h; y4 Z8 v6 H9 \
- public Quest getQuest(String name)0 E# j, j' x' x0 u: `. ]
- {! p; o% \4 p8 p' x5 I
- if (_quests.containsKey(name))& f2 g" }6 e1 f/ h. P: ?9 ~% t
- {
" O9 F5 d- }% ? - return _quests.get(name); c1 X i4 s2 f% M
- }
" ~( J0 b7 z1 e! w7 D3 c$ r - return _scripts.get(name);
! ^* M" G$ m' Z! z( z3 ` - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.& B4 J1 C" g( N! _: W7 |2 U& R) L
$ |5 i+ z6 S. b
Метод getQuest(int questId): _! j# ~0 [* ], c- E& q
- [) {- d2 H3 ], s" I- /**
$ t0 l9 D7 E, x8 J - * Получает квест по ID.0 a! J4 t4 N, I! s- a1 T
- * @param questId ID квеста: T j- D5 b9 H6 [5 {9 Q: i
- * @return квест, если найден, {@code null} в противном случае. A1 ?7 ^) ^* r4 ?- n1 R) R
- */
0 h; e1 \+ C2 q - public Quest getQuest(int questId)
s4 D# A! e& U( ?+ @$ f - {2 j7 z F/ }, d6 l& }+ [4 D. B3 w2 L
- for (Quest q : _quests.values()), i1 i) C8 ~* I5 R) ~
- {
9 x4 O3 a& c% L" r/ f. G C - if (q.getId() == questId)
$ B) k/ y, p& T - {7 N" K1 V+ X# B
- return q;: K. T& j" Z; A
- }
, M$ |; ~1 f/ J1 f4 N7 W# q - }, V. Z8 A3 Z5 L9 i: _& A4 i
- return null;7 S7 Q, |7 m" S5 h. Z
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.% o$ R7 j" M: Y2 x1 Q
* A, u" a4 i' r9 h. @( F' N+ Q
Метод addQuest(Quest quest)
- N6 E2 R# ]$ R' p8 p2 f. H; I W" H0 O, t* W
- /**
6 l" w! `+ Q, P; ~) Q' [2 V - * Добавляет новый квест.% u) i" X/ u0 A: d: r3 u
- * @param quest квест для добавления
3 K8 @2 N! s! ~# l5 }! e! L$ s - */
8 l; E* a6 q0 q- [7 z6 k1 V7 ^ - public void addQuest(Quest quest)
5 w& g9 |9 }. i$ L - {: q- P- W8 O1 N4 n
- if (quest == null). {& E/ \1 H* K
- {
7 p; j2 n: o9 V, Y! e# d - throw new IllegalArgumentException("Аргумент квеста не может быть null");
) i2 C5 \( b$ g# O, @; X. j. G - }
- w5 u& G$ ]2 P - ; m% Z4 M9 I. M$ r
- final Quest old = _quests.put(quest.getName(), quest);
0 E* _0 v* S/ e - if (old != null)
- ]- j$ g; L' C" X, p0 v - { ^5 K4 i$ m' m* U* C! k9 E
- old.unload();
$ ]- A( _( ~- z2 O4 i - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");; V; O3 X# s/ i; |: L3 j) P' M
- } S4 x F) Y- Z) e* ^
- - X, V L) p. y/ l3 l
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)$ ~. m& C; @* {
- {; j! p: |# P9 K& @1 D) B1 ?7 k% V
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();+ B1 x5 }* A; o; T* y1 ~
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
2 f v) o- t! p; E+ y k1 ~ - }
' o. H$ l1 _4 b. U6 ]+ ~4 c6 J - }+ F( V* w* y4 Q* B* _ _2 P
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
0 k7 K, R8 a5 R! T* v: g9 z" Q/ r9 TЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.6 P8 U& G+ u. u* {0 G
& l4 U# o; _4 o; x* V X5 {( ^
( P2 }! u$ D. O' D* c+ N! t2 Y9 H+ \- f
3 ?9 x4 Q1 G9 _& I |