Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
' i) N; s5 z, S( t6 Q1 j4 U
6 I* Z4 Y E! o' w2 Q) O/ EРазбор файла QuestManager.java
( W6 }1 e/ y$ O1 f$ n1 A: X$ Q* Z$ K
5 N2 Z; v- |3 s" ZЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
1 G. o! \, |+ u" w5 u( M& LОсновные элементы7 I; b m! B: |( O7 j2 k
- Лицензия. l8 o% u( s) ]$ W" [; Q9 O
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.$ ]; h' m% q2 ~" w7 X! Y
- Импорты5 U: m3 Q3 T7 P7 N/ y4 d
5 o" z2 H/ k# e% {QuestManager.java — управление квестами и скриптами.
! Z9 |, i8 c- P( F3 v. `Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
; F" ^& j% L8 n3 _4 ^3 a" y
1 O* E3 P5 V5 S! ?* f1 S5 p: o0 `* k" s4 L7 B3 }9 F
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
7 A2 M$ |# Y9 R: G# r l* A1. Лицензионное соглашение
, m: ^3 K: h8 H4 ~0 B- i- /*
2 m7 ~" I- U6 l - * Этот файл является частью проекта L2J Mobius.
+ Y- b1 \& P) f7 N - * 4 ~3 x/ ]+ n4 O! @8 w+ y
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять& }# X: |' i, P' y- Y& a
- * её в соответствии с условиями GNU General Public License, опубликованной
- p, M+ {/ [9 a5 d0 M6 P1 `) I - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
8 B; w4 ]$ l9 E; l8 i# ] - * , u4 r; i, G) ]
- * Эта программа распространяется в надежде, что она будет полезной,
6 H9 G3 d8 H! z. V8 S+ X# |2 [ - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
' y5 o: P+ V9 V, ] - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.2 a2 `! Q( ]$ z9 T/ _
- * См. GNU General Public License для получения более подробной информации.7 A6 a$ [2 H6 O- [" \, f
- * + z1 z, w: Z" G. e! F+ `
- * Вы должны были получить копию GNU General Public License* C! B5 S, D! X
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
+ g& m" M# K' i. h3 i3 } - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
7 i; u4 L/ E r' Z3 b0 V/ R7 ^' r6 S/ A5 c# ^! p5 N( d
/ @3 I2 G8 }6 f' Q: a# k2. Импортируемые библиотеки9 J3 M! [. ^! k) `- X
9 y; t/ n7 H* q6 C1 I" }' {' |- package org.l2jmobius.gameserver.instancemanager;
$ A* u0 E- v+ i; x, R - + M Z8 e& A- G8 L# [$ t- P* l8 }
- import java.util.Map;% f! N" |' y8 n1 m
- import java.util.concurrent.ConcurrentHashMap;1 X0 f0 D2 X" b& ~! N
- import java.util.logging.Level;
# E3 L; {$ ~5 x& A - import java.util.logging.Logger;" f1 f# U6 v% X1 l
( f' C o4 N* z8 j- import org.l2jmobius.Config;/ r- l. P4 ^% o9 P0 g
- import org.l2jmobius.commons.util.CommonUtil;
$ K6 }! I+ t/ P" ?8 o9 q - import org.l2jmobius.gameserver.model.quest.Quest;& z. t6 h' C: {/ u x8 N
- 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 — менеджер для работы с игровыми скриптами./ F% E# Z/ L5 e+ p' E
1 Q5 s6 T8 J0 p
3. Описание класса QuestManager. {1 Q! x1 T; p4 |
- /**
) [5 v/ B |. |. h p - * Менеджер квестов и скриптов.
( k8 w! }# M0 ` - * Автор: Zoey76! X; V# w! l2 o% t8 Z
- */
4 O# @% }* H( Y- @ - public class QuestManager; J# m$ j+ X! ]: F% n- T
- {2 b! K% A1 r7 G
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());8 w+ X7 N' p% n @3 B
- , B, U: N# h) r7 T
- /** Карта, содержащая все квесты. */( a1 |4 c1 C+ t$ L+ \
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();0 ^9 y) t: t% |! z
- /** Карта, содержащая все скрипты. */
a# Y+ o& t( \# a9 v2 f- `) |! B - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
( @' x# u: Z/ J; X; n -
5 K* n6 \- t/ `2 a - protected QuestManager()
7 _$ b& y2 d9 f0 y - {+ t& V8 P# n5 I4 E+ `
- }0 }% X$ x. m1 G. u" p$ i6 y& o* T* D% W
- }
Скопировать код 4. Методы
4 _( q8 I4 P& K# C- ~3 Z7 ZМетод reload(String questFolder)
/ w; t: f0 |4 a; n# O0 C) y- public boolean reload(String questFolder)% c8 E+ t6 g( X
- {) r5 \9 n+ f, p: B# Y& f6 w- X
- final Quest q = getQuest(questFolder);1 Y4 X$ N5 P' S& B
- if (q == null)3 j2 B: ^' R z: ?' ? L
- {
) T/ [- }% Z: ^1 f" D - return false;
1 B8 t% K# F, r; G& r# I7 l5 f - }1 u1 K/ \) o6 E1 C+ Z* X7 b) s
- return q.reload();3 k# K! J8 |: ?5 ^" M; b
- }
Скопировать код
1 @3 J6 Q j) ~$ G( w- A% }( T3 G; C1 A
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.# G. `0 \* P" S q2 N Q+ [1 l9 t
Метод reload(int questId)- @0 \7 c: [: ]! I+ }
: v8 j. W) U y4 G' h1 E f `
- /**. k, s& ]% {. D
- * Перезагружает квест по ID.$ S5 F1 S& D* H; R( R A+ u7 T8 Q
- * @param questId ID квеста для перезагрузки; _' u& t2 a) p
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае! e; K2 f; R% L9 N! @
- */
! Z+ e. b: O, B$ J! ? Y+ }- a0 I - public boolean reload(int questId)/ Z7 b( \' W# h, P: d
- {/ P6 p/ A* O& C s5 o) _
- final Quest q = getQuest(questId);) B1 V2 E& N% x% p+ @% ?
- if (q == null)/ n: q. I8 ~5 D' U7 B8 i1 `
- {( U+ x1 l1 [8 F* m: F- U' [( u
- return false;' E8 X# [$ g) ~% h2 j* q
- }
) i+ C8 m4 ?4 O5 n - return q.reload();
% _4 E3 t8 `$ {2 x0 \% @ - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.0 a% X$ Y4 Y; K1 l; F3 n
, x1 T% I& q. i7 j. T( G' lМетод reloadAllScripts()
% n0 r* E: Q; Z0 O f' Q
4 ^4 {2 c; h4 r* g) A: Q5 C3 n' P- /**
# K$ \( r* ?- X! s1 Z) _ - * Выгружает все квесты и скрипты, а затем перезагружает их.
8 m5 P, n/ n! P6 s ?' x - */
+ M: w5 p2 L" x" t, v/ P9 h - public void reloadAllScripts()% u. v( s9 s1 ^9 z* q3 i# }3 X
- {' ?" Y9 }* f" T5 [1 C
- unloadAllScripts();3 S6 S# h$ Q, V
- - [. g( f: ]9 W5 ?2 o# F* k
- LOGGER.info("Перезагрузка всех серверных скриптов.");
; `! g: k8 }: D% @( ]6 X! h7 M - try
! K& A0 r! J- |! j1 y: ^9 E - {$ L. f2 n! o& v8 K0 U% `" }2 b* J1 v
- ScriptEngineManager.getInstance().executeScriptList();
. n' k6 |( e& l - }5 @4 }4 O; \5 r5 L& {% G
- catch (Exception e)4 J5 X/ d, a/ `
- {, q l& U1 p$ V* E
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);% c/ V( y: a/ k4 S) ~- o
- }
) I2 X. q; `2 ]$ ?6 |( k9 s' h- W - 1 ^0 n4 W4 S5 b+ B8 r( F
- getInstance().report();
0 n& ?! J( [6 E; k - }
Скопировать код Метод unloadAllScripts()1 s1 G; |. n5 C- H6 u3 L
, ]% x4 Y2 o" u& y" c+ w3 Z3 J, m3 ^1 e- /**5 [. e" @1 ?# M! C$ v+ H e
- * Выгружает все квесты и скрипты.
7 I2 M/ o o3 c! ] - */
/ y& o; T% B$ ~( K' V M2 ] - public void unloadAllScripts()
/ I8 Q2 z. ]8 e+ V0 C: k1 p7 q; | - {9 O# t& z; p4 ?7 j) W
- LOGGER.info("Выгрузка всех серверных скриптов.");5 }/ |$ K5 O8 ~/ L& H* }6 H* T
- + Z4 M0 Q: D1 a+ |3 U5 H g$ o- c
- // Выгрузка квестов.
" t1 s" Y9 T! B - for (Quest quest : _quests.values())! Q- e; G* l5 D3 z' Q$ P# L2 K
- {
) I% n4 g0 _+ c m - if (quest != null)2 r4 l+ \; C2 G$ U1 K' [
- {: ~' _( j! E: v0 k4 K( S$ V
- quest.unload(false);
# m% l) D4 r$ y5 Q - }5 V0 ?& b4 ^- Y$ F
- }
% [% K4 a6 X& T) Y" s - _quests.clear();" a1 u* w2 k9 k" V/ U9 r
- // Выгрузка скриптов.: i4 P% ~2 y: ^" L
- for (Quest script : _scripts.values()). o" U. U8 F5 p- F9 G1 _# d
- {
7 F2 v0 r h* n7 d+ ?2 B$ z% n - if (script != null)2 g0 g! T2 h1 S7 F7 ^* B/ h4 R4 e
- {
% B X5 a7 ?9 N% s - script.unload(false);' h9 k0 e7 B! t1 L- Z" H: r
- }& D) E4 k5 U1 R$ y; x
- }
' H% x G2 v- Q! [! l Q - _scripts.clear();
2 O4 h: K) k" o. G+ P' f; u0 j+ H, u - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
! C* [7 H) E& R& m1 P' r: D
, [0 Y3 g L+ B/ eМетод report()6 u3 j, S( d" d. h7 A
7 M4 [$ }3 r$ A: g; f
- /**' r. ]+ `# p3 I" t9 e
- * Логирует количество загруженных квестов и скриптов., {3 @9 P \. l% L
- */$ L5 ?' G" f- Q' g! E) W
- public void report()
0 |5 O6 g' s$ H. J2 c C' k2 b - {
6 R1 H# ~' K3 Z - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");, n6 ?4 N. J; P( s5 X) m, m
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
, P! s9 A: Z9 \9 G; s1 t; v - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
* q8 i4 S6 w+ `/ ? 7 m0 D4 \4 k7 j( U- \0 M! o
Метод getQuest(String name)
& S9 \' L; i+ A1 k! K ~
5 m* z6 b1 x1 T/ A: o8 ~) F' E, A- /**
0 L+ i. v6 v: y2 s - * Получает квест по имени.
) b- [# z- a% \& _ - * @param name имя квеста( A2 C- O% q& r |& I! B- u% v
- * @return квест4 ~) f4 l# l3 R/ _% k, g
- */
3 w0 {, q. o/ U - public Quest getQuest(String name)
" s3 e1 Q" @0 C4 n% ^ - {" M+ A* M8 Y: q; N9 \$ {; w
- if (_quests.containsKey(name))/ r5 k; A! j7 [
- {
! U8 G6 x( e/ k" s: J! ] - return _quests.get(name); I+ y- l1 z. A. w2 Z0 W
- }0 e2 Q2 U2 E$ j( [$ v
- return _scripts.get(name);! K# Y3 Z/ o [) z% f" E+ E
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.- `0 }$ ?5 J ^* I+ G6 s
; G) J% k! _: |+ c2 G1 N) i7 GМетод getQuest(int questId)5 g" F5 ^2 J: t
. F8 P' {: M0 A6 w8 G! J, P3 N
- /**
; G! h1 a3 p$ V w- E9 H - * Получает квест по ID./ \/ A' K" ^# |; A& K6 {' l5 q
- * @param questId ID квеста
- E5 i0 L5 i w7 U& M+ `. ]! g - * @return квест, если найден, {@code null} в противном случае
2 ?) t x2 d3 A( C1 v - */
) ~9 i, f. R* a' S! p r8 Y - public Quest getQuest(int questId)5 Y9 A+ j/ q1 X# J5 d6 l( V* l
- {
" @, h& G% v2 H1 ?* ?1 H8 S: k - for (Quest q : _quests.values())1 c; l4 f0 N) W( G' ]$ o$ x& J8 s) o
- {
( ~( R8 X$ g# F1 U- U" | - if (q.getId() == questId)
& F1 V& _4 v9 p- {. ^9 l - {3 R; P& i- N' I' b% g O
- return q;
* x( w* ?) f" |: T% a, G- e/ U - }
( G. ?5 `, o, D" L4 i4 L - }6 k/ C. n4 o% q z4 L8 R7 ~7 E
- return null;! w/ d1 Q# }" s0 |3 Q3 A4 I0 J
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
9 G4 [" u$ C' } h0 V* v0 z4 A 5 x- |4 A2 h% {4 b
Метод addQuest(Quest quest)
* `2 N- j. z) [! \4 d
7 \6 n4 L+ Y; S: N$ k/ `- /**7 W5 p) |& n$ v. d% p' f2 O
- * Добавляет новый квест." p9 S) t4 E( ~9 d+ N- w
- * @param quest квест для добавления
2 M/ T5 N5 d2 ?( U - */
4 N% ~% y0 Y5 A$ }6 P ^* m. B - public void addQuest(Quest quest): Y8 _! l, G" q
- {8 ^( Z' n; G* ?% ^$ _" O' w5 X
- if (quest == null)- M' V+ {% B4 A2 f1 v* `
- {$ q, z, v- a2 D( Y2 o
- throw new IllegalArgumentException("Аргумент квеста не может быть null");( s+ Q( d- {' n- g. k
- }2 @& `% v4 a8 i8 ~5 f0 ?
-
, T3 c3 N) c2 C4 t - final Quest old = _quests.put(quest.getName(), quest);
2 D' B* u0 w1 C# G8 s. c( J* A8 i - if (old != null)
}2 Y+ {; ^- U& ^9 V0 ?" l* k8 Y' j f - {
& W X; E7 B' [% M7 c - old.unload();
9 r8 x9 U9 e' o; l' M( M8 y - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
8 x( W1 Z* s. q; |- `, U3 r - }( c% m" K5 t9 B, ^2 _* c1 F2 Z
- 5 C2 x" N6 ^' x+ z* X- j
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
' B1 ], {$ {/ v* ~* Z - {$ |. Z& M" F0 Y" v9 ?8 n4 K
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();5 H, r8 [7 D' a0 A: C4 @* R
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + "."); p5 `) d9 ]$ G! h# b) c$ Z0 j$ G
- }! b2 n: S. U* D2 H$ r7 \, y
- }
, y2 w- v* A- g( X- J) d4 p - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.% g& ]5 i$ t* I' y0 ?9 v
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.+ W( }% j7 }$ @7 o9 }# P
" J# _" H) h: H
7 X, m+ Y4 z3 Q$ ]$ {
( a& Z. \2 `4 M _6 o) H) a |