Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius0 D# j# W5 f% w0 O* A% e
: C; l* o1 _3 H# z, Z$ S$ K; o
Разбор файла QuestManager.java# t6 {9 |( u5 e: w# ^- A. ~
/ `) S& M0 v" u# h/ |1 \+ [. g
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
& E$ S6 }6 r& \* ]Основные элементы
! Z+ L; y0 ?7 T9 b7 ]: E8 t" P- Лицензия5 q0 w( B: F$ ]9 o$ M
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии. M1 Y# N4 x" m
- Импорты
3 n1 h, P9 n$ p* B, @ 6 [; y5 O; K; O
QuestManager.java — управление квестами и скриптами., p8 k" o! D) `! l: {( f, Z% G- l" j
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\- N3 u( l7 [( l& e
+ @' n( F! M! |) m; M+ \% b6 v0 T3 ^9 @8 B6 h) B6 j( T
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов., g. b8 A/ U9 j1 E- [
1. Лицензионное соглашение
* ?8 m1 x) `, l( M4 c- /*
7 w/ o3 r! f3 q4 f7 C; s - * Этот файл является частью проекта L2J Mobius.' D" |+ H4 y8 i( |( s
- *
8 P' E% K, _, ~0 X, g1 N. G - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
/ r# s+ q. o* J% o' z: H" d - * её в соответствии с условиями GNU General Public License, опубликованной
# n0 w5 U7 I$ k9 W1 n - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
' W5 y6 f( F0 | i% v D+ M - *
9 `3 A0 {8 V0 A6 U' n - * Эта программа распространяется в надежде, что она будет полезной,
& ?( k3 w6 [# j. V9 d - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
( |' [3 q" K! ?6 r) ~' V; @. F - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
* ]" c! B0 `+ I- r/ y - * См. GNU General Public License для получения более подробной информации.
& z: W. G! L4 P3 l {, {" [6 U1 `. C" y - * * z' b6 ` Z* u' D! D
- * Вы должны были получить копию GNU General Public License6 i: G& z) M7 {. U% e5 Q' q: @
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>./ a. H% H' @" ]7 P' i7 q
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.& o2 ]8 J1 u" u5 Q
3 U2 j: n) F0 }) s3 G0 R
' l3 d) p5 U$ [" g% m* l/ c- }7 @
2. Импортируемые библиотеки* }# ] n7 D2 H: E% K
6 g1 g5 @3 ?- I% h8 _( u7 b$ l
- package org.l2jmobius.gameserver.instancemanager;
3 I# R% l4 ^9 k: c - . U6 X* u' ~) f3 U% W C, Z9 e
- import java.util.Map;6 U. m" A. n& D% Q3 h, p$ ^
- import java.util.concurrent.ConcurrentHashMap;
1 P# V: ~. W( z& `+ z# [ - import java.util.logging.Level;% _ c# M, B) p5 ^" h) [' v7 Q6 m! Y* U
- import java.util.logging.Logger;
1 U G- X' E0 s* v' h# ?
4 e& n. ]: G9 W( R4 a, H; R% p- import org.l2jmobius.Config;3 |6 d1 |$ t8 w: _' f8 g
- import org.l2jmobius.commons.util.CommonUtil; u8 y g+ z9 n4 z1 L1 m5 l7 X
- import org.l2jmobius.gameserver.model.quest.Quest;) z" p5 ^3 z/ a- ~
- 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 W/ V Q; v6 R4 P' ?7 d4 u) i _, ]4 U
3. Описание класса QuestManager
$ c3 g) m# s* C8 \, q& ~% B- /**9 H5 p( K& V% G3 H; ^1 F
- * Менеджер квестов и скриптов.
: j7 d) v( [: m- u. B3 O5 | e# S. K8 |, b - * Автор: Zoey767 m9 p# H: y. h
- */
/ T. n0 x) w- S. Q- Q - public class QuestManager
$ c& `# P' {7 P6 w - {
9 P" N( n, c- k9 B- s3 w6 m - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
x8 ]4 T& [2 N -
- L/ [9 t( ^1 d1 K0 P* B - /** Карта, содержащая все квесты. */" _! K9 u5 b/ B2 b- g
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();' d8 v0 U/ I3 `: {
- /** Карта, содержащая все скрипты. */, I5 E) P4 Z( H( d, x: Z! r
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
1 p* f0 x. R. T - ^( |: {/ M2 k I
- protected QuestManager(). W' \: a* M" |9 e
- {4 b" M4 `/ L- f b
- }8 ~, s- s5 c! \7 A ^" o0 e& G x
- }
Скопировать код 4. Методы
. S7 \% e; h. i# pМетод reload(String questFolder)+ G' c& K/ x/ _8 T8 [ k; \
- public boolean reload(String questFolder), P& P. ?3 X( l6 `3 m" a8 `% E
- {* d( F! H7 d0 a1 X1 i; ^
- final Quest q = getQuest(questFolder);. R9 m7 E; l5 z0 Y
- if (q == null)
$ i& H; @, {) @& p6 }8 [ - { v. M2 I. }: ?
- return false;; Q+ F, I$ t+ o% C3 q6 ]. e
- }
+ K( |& l. b5 |5 n - return q.reload();
. n$ h* ]! @# q2 F - }
Скопировать код # G% _! r9 p8 x# J! ^3 D
* I+ S+ m& q4 |( @7 Q r j" T
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
( B1 }7 [7 d5 E+ S3 F5 z8 o! [0 B2 d oМетод reload(int questId)5 F. }5 ^& ?; v. K, L/ s% N
. R3 G$ _0 f, l/ @3 U! k3 [5 v
- /**
: [" W q$ G" |% R" Y# V5 L - * Перезагружает квест по ID.
. N w( p8 O; q - * @param questId ID квеста для перезагрузки9 n5 q P1 I- r' N6 {( c& I, y- p: a
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае9 w U; l! r1 F8 `" @, j( @8 Y
- */
# o2 ~& H8 [/ \/ l - public boolean reload(int questId)
6 Q* y3 g" V, ~) I: u" t - {
7 T: E& \7 l- U ]% K* a - final Quest q = getQuest(questId);* k- ~% l+ Q P0 p. {1 t& y* J- o
- if (q == null): x5 e! ]0 [( x7 g1 l' x
- {* J P' i! U# `8 p" _
- return false;3 |, \* Y' l7 q/ b; I* ~5 U
- }
: V" q4 z- |2 d$ i4 F - return q.reload();
7 l9 n- {1 ^2 [6 Y7 J' ^ - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.$ i& r& C, ^( t6 v7 b
6 M5 g! V% {3 g9 |$ T+ C
Метод reloadAllScripts()% H* S( g. t' S1 Q0 K& N
$ u) X5 B# h% y' }$ o' S
- /**' ]7 U) d3 p) l& g
- * Выгружает все квесты и скрипты, а затем перезагружает их.
& u: _, g9 y) n: P - */
y9 M8 ~7 b+ @4 ^: ` T2 T. m+ j - public void reloadAllScripts()! ]( ^" D9 a; g2 d( J
- {. V; u1 j9 O8 S
- unloadAllScripts();1 k9 Y9 V$ Q* [7 J3 K
-
6 d& M" R0 J- X5 n- ~8 F8 u - LOGGER.info("Перезагрузка всех серверных скриптов.");
# d9 {: L, `1 { - try
! Y- k* ?1 _& U& e% { v$ i - {
; }0 c$ E6 n% d: h7 s - ScriptEngineManager.getInstance().executeScriptList();6 j( M- r% w) ^* @1 @' N d6 X
- }
! l: A! f% t+ O6 i4 g; | - catch (Exception e)
4 d# m( ?# r! L) _ - {
- E! r7 F8 Y* S0 h0 O) r- ` - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);) Z( T2 u/ W2 _# j+ a! P+ e) H
- }+ K/ l T3 Q* t* r9 L& ]
-
2 m* _0 i7 G- ]& B' l - getInstance().report();
5 a# ~# W' S1 A, p& @# y, n - }
Скопировать код Метод unloadAllScripts()
% s6 C2 y9 ^/ S/ J0 T9 S+ Z0 g6 }8 F: I6 n
- /**7 ?9 R, Z8 X4 T
- * Выгружает все квесты и скрипты.( [& @ z/ v9 D* {
- */( g) k: ~6 t# q) e
- public void unloadAllScripts()
% |# {) |' O, h0 |, g0 \ - {
" F4 B5 I, E" _6 Q% a - LOGGER.info("Выгрузка всех серверных скриптов.");
1 S5 p0 l, n# E7 L: k - : j" T9 ^5 w7 d1 o$ K" }
- // Выгрузка квестов.& t3 u) M: A D V2 F p" V
- for (Quest quest : _quests.values())( w& t% y1 N1 F1 \& C
- {
3 T* T" }; x$ o7 a - if (quest != null)
0 o: |& S( f) O: l - {
% G3 W$ F$ |/ G- x& o8 N% y - quest.unload(false);, S2 {' h8 ?7 o7 O2 W) F
- }
8 F9 N% V/ y/ h7 { - }
; y( G& O& P0 C6 _' b - _quests.clear();
6 ^6 k: X1 R8 e! s+ B! Z3 h* I - // Выгрузка скриптов.
) p; ]3 l A3 q0 p, `: K( u6 Q) G - for (Quest script : _scripts.values())( F- F, o; e5 g
- {+ A. l6 c- t0 i; u3 R
- if (script != null)
* i$ |6 ]+ C! d3 |% F - {
% ]6 d" Q: c% m5 y9 F+ K - script.unload(false);' v+ |: c6 k; n$ A
- }1 `& x/ r; @# s. G5 r9 G$ P# Y* n
- }# T ^ c0 r' q# {1 A# }6 p' ~
- _scripts.clear();3 _ W" _$ N" M9 y
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.. ^! Y6 \5 |( a' Z0 ?/ |
s2 I% c7 V9 C3 i0 ^) L
Метод report()4 B* @+ i2 F$ l# P2 L8 T
) `& u# j& f' H4 g+ [
- /**6 N3 j6 h2 N7 q, V' @. U1 k4 [4 [7 o7 D
- * Логирует количество загруженных квестов и скриптов.2 Z8 p( s7 o. c
- */' ?5 f8 I% ]4 C" Y, \) U; l
- public void report()3 E, ~7 {- k- K2 _8 K
- {
. O! S; i' J$ W5 { - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");2 k1 w7 q" {1 }. N! a7 i! Q
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
2 d0 G$ O c# @ - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
q2 S |3 f1 ?; u- I 2 y0 t6 ]- M* q) v% k
Метод getQuest(String name)- J9 s! ]0 v: |5 b; }1 T! T
/ P" ~+ E; j# G$ W- /**) M/ `$ F. ]9 }9 G# i+ M
- * Получает квест по имени.# e( T' E* c, R; V
- * @param name имя квеста- H- n4 a% j' X+ \4 a
- * @return квест4 m5 O t' u2 Y9 R/ Z( W
- */
/ \ t, l# {2 ^) H: h" O - public Quest getQuest(String name)
) s. y. {/ B# x6 p - {
& k4 R# |0 }4 F8 a5 s/ [- M - if (_quests.containsKey(name))" c9 p1 T: i5 w- O. X; o
- {
" N( x" L, U- W3 ~$ C - return _quests.get(name);; R% @9 n' d3 C% Z- F' z/ @$ G# q' M
- }; z0 |! c. d0 \- L! Z9 t, \
- return _scripts.get(name);1 b. D7 u2 p& `
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.' a3 u3 e9 K$ f% P# v
) o2 f" Q1 j. k) o
Метод getQuest(int questId)% b& U$ L$ _0 e: O) Z) ~7 C1 P
6 Y" f$ I) n# @) p
- /**
- P3 F% `6 @" G" K - * Получает квест по ID.
5 d g) a0 X. O R% W# y5 E: S, j - * @param questId ID квеста M# Z9 J0 e5 V: h7 [
- * @return квест, если найден, {@code null} в противном случае
8 G( N, u8 b- S" v - */
! ^/ ^ R& n1 O - public Quest getQuest(int questId)
k1 E2 ]4 ?& H - {
2 D9 Y, Z1 K" a5 I - for (Quest q : _quests.values())
, \: _4 R1 r3 k: X, n1 G/ s' c) S - {& ?9 Z1 n* K5 r8 r+ s. J8 y+ S" N
- if (q.getId() == questId)
- k. A j& b. v5 X0 V x6 o* _4 q - {0 C/ n) H' r# o
- return q;
- [" b7 s$ y5 d" ^& V9 E - }
, U( L7 E. b% \: S" `9 M0 Q' c1 i0 D - }
; o0 _1 n: ?1 m2 v - return null;7 Z( l/ f( }. g8 [
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
0 K9 S8 ]( T( F4 b 3 y( \0 X9 u; [1 x' |' n5 h
Метод addQuest(Quest quest)
- W5 S( v7 T9 [* R' U9 Q5 q, e# P/ ^8 y- F( n
- /**8 r# Q+ k3 h j; \$ E
- * Добавляет новый квест.- c8 A) \# Y, [- _0 G! u
- * @param quest квест для добавления
' J2 ~6 C" P/ Z4 ]3 G! J - */
. u' e! Z+ @; W& A% C2 P2 I - public void addQuest(Quest quest)
$ Z. E* X$ \. c3 Q5 I - {
" l8 C$ c/ K5 ^0 T f5 U - if (quest == null)5 ]/ U' y7 T) e7 L, t* V
- {4 ?( g( z8 j* r; R
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
2 L2 d2 w9 w" Y# b9 l$ I' n1 L! C - }4 V4 e0 j _3 g/ z b( W# [
- 3 E1 h$ B" A- w$ T- O
- final Quest old = _quests.put(quest.getName(), quest);* C9 }* r: n6 E, }9 s( A% H0 `5 H! T
- if (old != null)1 U& _! m X+ z
- { Z* U. H7 O( z# q
- old.unload();) V |1 w% ?8 b1 y/ i/ B- K" b
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");0 T$ j, `7 K6 c8 p7 T6 C
- }
' J. K$ F: H! _# U% N8 [ -
. y. x2 G8 Q _# T - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)+ b H* K: _' C8 b/ p) R
- {% E5 U0 h; m% U
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();$ E$ r) N' B2 Z: k/ t' l( ~& ^' F6 a# P
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");" `* K& Z9 i" v0 J" z, F
- }
K7 `0 e( ?1 j* \ - }
! V: z( g+ |! Y* L, ] - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
, B" s! v) b8 q0 F) ~3 DЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.0 o3 X0 }. F7 p) {
# \: m5 U: G0 q5 ~4 x8 }
$ f* K; z" i0 d3 |# R; A% y( ^3 L" B( F9 m
|