Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius) q6 L( `4 p0 ~! B
2 _1 e( V8 {- b; q# P% L: }
Разбор файла QuestManager.java
7 w* o3 l' E1 U. D5 v; t, a4 B: _: a5 p l7 H* ]
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.4 ?! T3 X4 K" j1 E2 T/ `$ D4 C
Основные элементы& Y/ M. R& d9 Y' M
- Лицензия
) r) w: G8 m: c1 q- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.8 Y# R" } ~% K0 P! b. ]0 T
- Импорты; y' M0 S, e5 d, {* }8 Y) X& y
) ~9 {* L9 r; y
QuestManager.java — управление квестами и скриптами.! d }5 j/ m" B/ T7 Z
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\6 f% |9 g% ~7 Y2 O
% I/ s6 f: ^1 c' Z0 x) x/ O* s3 I7 V' Z
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
/ h( Y! h! B/ p% O: X$ W9 D) C1. Лицензионное соглашение
: d! h( f( n4 ?6 b, f3 I0 C- /*/ p9 ? o+ w9 k) v$ ]
- * Этот файл является частью проекта L2J Mobius.5 z; P$ G9 k4 F% [
- *
$ ]1 w9 F, E0 c1 @/ M, A; q - * Эта программа является свободным ПО: вы можете распространять её и/или изменять6 A& ]' @; S, f3 o) i( d' a2 D
- * её в соответствии с условиями GNU General Public License, опубликованной
2 g% ^# I* L+ ?! f# E - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
. I6 E, k2 P/ V3 V/ z$ S - *
& g9 Z# d& W8 K' T! w, R7 D - * Эта программа распространяется в надежде, что она будет полезной,
+ ~* D3 u) P: f) q% L, u! x U - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
4 q; I" p# b, N S& U6 Z - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
2 U& B8 _4 X& _, | M - * См. GNU General Public License для получения более подробной информации.4 a9 Y# D% D4 D
- *
0 m4 K6 ^9 x- P- `$ K. A; T - * Вы должны были получить копию GNU General Public License4 {- V+ x/ a g4 A- I" ?
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.* a; M L- Q1 H1 W6 D1 e1 r) v$ t1 ^
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
; [' P+ y5 x$ D- h* u7 e2 @" e, C# C( i7 | l
+ J, a% x: m0 O5 w
2. Импортируемые библиотеки
8 @/ M5 S6 a; s' e
+ j8 x; s( T6 B! h. `- package org.l2jmobius.gameserver.instancemanager;# ^5 M9 r2 _. O# }6 K- L
& ^2 X. T0 m# L. _! j- import java.util.Map;. ^( `! n- D9 }1 k' I( O# M
- import java.util.concurrent.ConcurrentHashMap;- I3 U# n0 r: l* z
- import java.util.logging.Level;8 L# S) ^& e) |0 e
- import java.util.logging.Logger;
0 U! v+ v/ V& [, z( H
) k" q4 G% Q2 g# k) \, J0 h o. {, `- import org.l2jmobius.Config;
5 F0 B5 u R) n# v$ a) h - import org.l2jmobius.commons.util.CommonUtil;
1 y: x2 D! p* M$ H2 c5 ~ - import org.l2jmobius.gameserver.model.quest.Quest;: r8 Y( C3 N, ?$ S, F- T! |$ W5 i
- 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 — менеджер для работы с игровыми скриптами.
1 b" r4 v1 o5 T; }/ [) n( s9 c
0 F1 N5 ]4 P, i) Q+ N! E3. Описание класса QuestManager
! W, A1 }9 n2 d+ L# P' y: b" ^- /**
% M& R2 |" [9 x2 X* w* q3 u/ R - * Менеджер квестов и скриптов.9 w( C4 i8 ~# Q
- * Автор: Zoey76
. ` U; ~7 @1 Y% r" Z; _* U - *// R3 k A8 _& v, b' b% |( \
- public class QuestManager
3 V' @' s; A' R3 K5 } - {
5 U V2 @4 x6 s: G3 E9 T - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
# F% |( q- g- j6 U# X; o' ^ - 0 d: K% w. z" C! C/ `& {7 \
- /** Карта, содержащая все квесты. */
- W8 M. f2 Q1 N- o( V4 p( `8 k - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();$ S, G/ f1 x s [( [, G: l1 j$ ~
- /** Карта, содержащая все скрипты. */3 x) s* G Y( d# M
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();' i7 P/ {( b( }! |2 @
- - l' l" W) a2 U* X v
- protected QuestManager()' N% _3 g& U* X) A9 y. E/ ? ]' c
- {
$ `& d* U& a# Q, ~# i# Q0 z8 U/ ] - }, B' Z6 p0 g2 A/ V" }: Q- U: Y
- }
Скопировать код 4. Методы' k4 s3 Z E% A, q1 h- t
Метод reload(String questFolder), O, x$ _7 L8 l4 {, i- a
- public boolean reload(String questFolder)# d- O: n! K1 h2 Q7 d
- {
0 K* g4 n5 `& m9 r- n& R - final Quest q = getQuest(questFolder);6 W9 `5 L5 m, c* b
- if (q == null)
$ b1 m: @6 [4 \, k$ }7 E - {
6 j& v1 d) h- _- C8 a7 q - return false;
, a6 k6 D( h4 o - } ?, \$ d3 k- Q B8 q% q
- return q.reload();
, G+ F, v! u! _! ~7 d" } - }
Скопировать код - ]' u% w0 V9 q5 k2 Z, }
. }( J7 s/ I9 R3 F
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.$ P V) z4 W( p) y8 y. @3 W
Метод reload(int questId)
$ O! V$ X9 H4 p7 E$ d4 S2 s+ B, G/ X: o5 j+ p9 e
- /**
7 P% o. P0 P9 T1 K - * Перезагружает квест по ID.
4 d( ~- u) f( f - * @param questId ID квеста для перезагрузки" P" ^% ]' y& t
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае5 z3 D2 l- l0 c8 G7 z" @& L, x: [
- */
' b, p: e: z7 r3 _( o - public boolean reload(int questId) E3 d5 n2 I" ^% l( w3 n9 ~- f
- {6 \: L, Y! ?, H+ l) D" Z3 q
- final Quest q = getQuest(questId);# ^3 j. q0 W! p: r$ E
- if (q == null)6 ^( Z2 P& c* W: i/ i( r* l
- { {2 c5 y0 z& r# q( `+ ~6 W
- return false;
7 v# x/ j, l: z9 C ^8 } - }$ V# s8 U6 k4 I7 }0 g; {
- return q.reload();; a% o; w2 t# m9 c: b8 t; g
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
7 t, J# G3 F9 Y7 y f+ _5 |9 D 8 c, }- u( U# w% u0 q* `" d$ C
Метод reloadAllScripts()
, t$ i, t8 T% n- v5 `: t9 a$ Q' t. C8 r
; k6 N5 y$ J/ u# L- /**( {+ f w+ t! E8 d- ~
- * Выгружает все квесты и скрипты, а затем перезагружает их.2 D2 b+ f1 o5 d' w) T& l9 k
- */* V8 o. y2 I1 s9 o0 k2 s
- public void reloadAllScripts()
8 y. D0 j3 k3 r3 i - {
U& W( O9 E# ^: `; Z - unloadAllScripts();$ X0 w1 N. f& i% F1 Y* W
- 4 E% H% _7 C; H# W
- LOGGER.info("Перезагрузка всех серверных скриптов.");* U$ C; R1 C8 H% H, ~0 h0 A- i
- try, j- c/ m. G* ~% X; r
- {5 v5 o" g" \+ y
- ScriptEngineManager.getInstance().executeScriptList();
( V) R. P3 Y7 [$ A0 i2 R; J5 n1 ^1 ^. c - }
) {- Q$ t s B0 m - catch (Exception e)
. }( Q' l% D- l. V& e - {
% _7 z2 D. ?7 @7 t; l! Q/ t - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
' o. @! q% j" g9 C8 o' A - }5 ^* ]) O) _4 w( @. ^! L: F* h
-
" t# n0 ]8 [- o. |/ J$ x. \ - getInstance().report();. F9 S; u! B6 Z# ]- K
- }
Скопировать код Метод unloadAllScripts()6 k4 }: r( j5 I& ^9 \
# f- ~6 K. w6 _/ U& f, O
- /**2 R* U+ `$ X3 F$ S& H3 \" g
- * Выгружает все квесты и скрипты.
& ~2 b" j0 j3 ~" K - */" N# ~4 E% s7 n9 I4 D
- public void unloadAllScripts()2 X. R& y9 ]' p7 X3 }
- {6 W; N. B- x% ~- F
- LOGGER.info("Выгрузка всех серверных скриптов.");8 v! B, ~$ h5 J( m. B7 x; o* y3 u
- 3 v O y0 \ w/ d4 t
- // Выгрузка квестов.8 v! ]. V8 V# X
- for (Quest quest : _quests.values())/ Q, Z9 L. U4 S7 u! j6 D
- {. A7 j+ v8 [1 k/ m- }
- if (quest != null)9 o: T8 V1 @' s; s6 [. W( Q
- {4 n: H! t W. y6 \7 P9 M* E x
- quest.unload(false);
0 {( L3 }, c/ ]/ Q! v; k - }
5 n- m# Z) p1 j - }
8 N. f7 R: p+ Z1 L. b - _quests.clear();
3 _& G, d& [3 Y, t+ ] - // Выгрузка скриптов.
. x$ w- X9 O @3 { - for (Quest script : _scripts.values())
( [/ g7 ]4 `" R8 T - {
2 R4 Z5 v8 R" w& a! |4 m7 q - if (script != null)
: a3 y9 I+ T3 i% E# A - {* [6 B3 B( h% _, C8 z, s1 D
- script.unload(false);
6 G( q! | C( ]' _5 ~ - }
1 T* g# P; t% t$ ?5 i) |: L6 n! v - }& p4 Z4 j% ]2 C+ q1 w
- _scripts.clear();! {3 V( ~' D& X& [ q
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
8 B4 T. u1 e5 b! `# y4 @! i
0 N3 K3 ^9 a1 w( B3 S' C5 [Метод report()6 |6 Y! P6 k% _, j6 Y2 D2 v0 ?
+ P- Z5 w" \: |
- /**
4 e: W- j' _2 B# L9 w/ f - * Логирует количество загруженных квестов и скриптов.* b7 m+ T( M/ s) s( c6 a n: M1 F
- */- d: A) `& d: i3 G( [
- public void report()) P; u( I4 k/ O( c
- {
8 w N; ]5 W, y# q5 t1 ^ - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");- V) [) ~2 q" V# R+ N* a1 g) F
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");3 z& [6 Y# ^, \4 Y6 t5 G+ L
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
* Z5 O2 S# }% o# Q' Q( k
7 j6 d; e- i' y1 A" U# G4 mМетод getQuest(String name)+ n6 a v3 s1 y6 |
. z$ O( A+ I# @1 V$ p: Y- /**& i! I v! l* H. b0 |4 y
- * Получает квест по имени.$ D) b2 y* Q) ` V" B
- * @param name имя квеста
; }2 ?( s9 {& ?, ~ D( J M+ l( O0 K - * @return квест
0 M" d* N/ M2 G2 c# X( @7 w0 v+ I - */) J5 a* K7 Z9 a; b) I' m1 e
- public Quest getQuest(String name)4 E( h8 F1 S8 o6 g
- {
1 m2 Q% @. t t* o6 M, I8 H - if (_quests.containsKey(name))2 H+ t( @ }. E+ n3 G- c/ x
- {
( Q4 B' w/ W, S* s& d - return _quests.get(name);
) B$ v m* y/ i/ n - }# ~+ `$ [6 c8 |7 a0 O
- return _scripts.get(name);
/ T+ r% c! K9 O; ? - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
6 L* K/ j& | M( T! h C( C+ c" d; M. b( F9 ^5 s
Метод getQuest(int questId)
- g6 t4 W, }% h; n3 a/ v$ Q2 A
# y/ ?# n4 m |! s6 n8 w- /**, v: v# }- m: B, k& \
- * Получает квест по ID.
; q0 D$ b- H O6 F9 Y - * @param questId ID квеста+ g4 P5 v! E; G
- * @return квест, если найден, {@code null} в противном случае
6 I& K2 G7 y" e" b0 c+ Q3 A - */
1 n* l! O1 l+ j" r8 X4 ` - public Quest getQuest(int questId)3 X7 M! C V: a$ u4 ]. R. E
- {
0 j. ~5 f) N" z4 [; @4 C6 @; @ - for (Quest q : _quests.values())
7 f% O8 ]# r ~, H) N - {
8 Q! G+ b8 m% _- D) ^3 I2 ~ - if (q.getId() == questId)3 J9 K* ?$ X! V( p0 S
- {; _" W- c8 y+ A
- return q;' R6 j1 e/ \3 f
- }
! U. E3 b1 Z M7 D - }4 p- ~* B! }! c# k$ s
- return null;- @; ?1 |9 D" I
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
& c5 a Y/ c& o4 ^( b . c7 U j# O* R( o( u) e5 |+ T
Метод addQuest(Quest quest)
" w: ?, D+ V2 Z+ i2 X! ?( u
6 i3 E: [; B0 Z0 c+ Y- /**: |, S$ F. O F, T
- * Добавляет новый квест.1 p# c& u( l- y, Y7 u, M# X
- * @param quest квест для добавления
% A2 j3 u! i/ }: v - */
8 G+ V; A% F N* l( G - public void addQuest(Quest quest)' z% ~8 l% E& q) l; b
- {
1 r" P* k# F R+ i - if (quest == null)% Y& g, x( ]6 c) L6 L, _8 J6 {+ m, Y
- {
) U* m: y: p( F8 n" I7 T* @; I - throw new IllegalArgumentException("Аргумент квеста не может быть null");% u8 {+ P$ C; P1 N+ N
- }
9 B0 M$ x, P% Y6 i( d - : a V! f1 _7 x* M4 u2 V
- final Quest old = _quests.put(quest.getName(), quest);$ _/ p/ l+ y: H+ W M% U1 F% u
- if (old != null)1 w! L' ]$ u5 k5 b0 p
- {
3 }# n$ B: t1 {. y4 y+ C# D - old.unload();7 z E5 B/ P: z1 N, u
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
& ~0 Q* U$ V& K$ o - }( g) `, ?0 y! d
- & L7 u5 }# y0 i' s- @
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
. z# R: u1 _0 Z - {
; T6 u5 b) s' J/ |0 I - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();* w) {, m, C+ d
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");$ E: B! X2 l% I6 ~
- }0 B( J9 e2 I4 r2 X# D! G
- }6 M7 u: Z6 j5 o5 b9 S2 p5 P
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.( G/ S' d7 ]; |/ B
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.( b; `8 _6 _$ \1 V7 j
' g1 L7 E/ R4 t' ]$ Y1 I% U8 x1 M- N4 {* s1 @3 N
2 F" r6 \6 @. ]1 u/ r
|