Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius0 h4 A+ m' _5 ]
1 l1 G/ U o7 P( l- i
Разбор файла QuestManager.java4 @% e+ {0 T0 I6 J: A
- G% K5 A2 H; q1 u% h$ q# f3 C
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.5 P" b/ N6 @6 ?% ~1 l. x
Основные элементы% c& y2 P( A# Q) Z
- Лицензия: A0 U' P& e) f
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.- @) ~, S0 s& W1 C3 G3 J
- Импорты
4 | |* k) u. \+ g0 P
# J' T5 T0 U0 [* dQuestManager.java — управление квестами и скриптами.
% q$ K4 X4 k( b4 ]: c3 n4 LПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\! L& ?6 r" [ j7 V' ]1 W
% k' I) I3 _5 |. _
3 C2 e' R' |- k; D( e! h3 VДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.' y3 W" i$ v" R9 L
1. Лицензионное соглашение
; W) a( o. a& @7 ^- /*5 S! ?+ j& c8 }6 C6 V
- * Этот файл является частью проекта L2J Mobius.; o1 l+ k8 }" t
- * 6 ?/ y1 k4 {; |$ B1 R4 q4 E: P g
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять& H& O1 e2 D. N
- * её в соответствии с условиями GNU General Public License, опубликованной
& d" v& n2 N7 y) L6 ^: u - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.8 [6 u" Z- C3 o8 Q9 Q4 D1 Z6 Q
- *
4 z4 k- S) C- R0 s7 w - * Эта программа распространяется в надежде, что она будет полезной,
, s N3 |% }8 c& t2 G - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии4 ^9 ?7 [- H. {; i- N
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
X& W% H& `* A- F7 ]; P3 K* W - * См. GNU General Public License для получения более подробной информации.
" f3 j+ U% ]4 n, n5 m) ^ - *
! V" ?& i, z( a7 |3 k- ?& o - * Вы должны были получить копию GNU General Public License# H; x8 T' ]$ p8 F' @6 ?
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
# Q1 a1 e# K2 l - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.: C/ I, Z' u! H
2 y/ `4 I: Q h/ A
# x ]; o2 r. Q! W) ~0 C: i" d2. Импортируемые библиотеки
8 L. Q% S7 R K8 ?" r1 c1 ^0 G: R
' l0 D$ A: Y1 f7 N$ F2 s- package org.l2jmobius.gameserver.instancemanager;* `) Z6 u/ S; b
' W- j1 c& o4 x5 G% f( `3 f* F- import java.util.Map;% a. w) O; K$ z0 I& d- f
- import java.util.concurrent.ConcurrentHashMap;
; I. K8 c' f+ B - import java.util.logging.Level;
( r- j6 T8 ?* O. u - import java.util.logging.Logger;! I3 ?0 ?" k4 F4 b
- N D1 w# z* ?! S' s9 C- import org.l2jmobius.Config;
" {5 A' q7 Y9 }( ~ - import org.l2jmobius.commons.util.CommonUtil;7 p# U1 }# ^/ C$ |& P
- import org.l2jmobius.gameserver.model.quest.Quest;8 i& R" {- W K- Q. x0 T y, U0 ~
- 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 — менеджер для работы с игровыми скриптами.0 t' o# N4 k _# I8 a$ H3 f
, ?9 c2 g, `! X; c1 R
3. Описание класса QuestManager6 Y5 {% s. L- F: }
- /**9 Q! j. r3 Q1 J4 ~! V' N
- * Менеджер квестов и скриптов.
. W/ V; L8 i. n. o0 [ - * Автор: Zoey76
; v4 i/ y+ H: A* @ - */4 d' h* j3 n; l5 V- x9 P
- public class QuestManager$ h; @* Z. z" n5 ?9 g
- {0 e6 k) R3 b' W
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());3 I2 I$ G; u* T" z
- - ]" m: F9 ^! a# h2 e7 W( a
- /** Карта, содержащая все квесты. */
# i# A, H5 X. e& u# R - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
7 w$ f2 \3 x! M c - /** Карта, содержащая все скрипты. */
' M, i2 R% O' s1 Q$ v8 s1 z: v - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();) J2 y% R/ q( ?3 I2 w J
- ) F) ^* G* e1 \
- protected QuestManager()/ ]; Y G3 A. j# B
- {8 w* A5 P, C0 `1 t6 i( }
- }
: w4 A/ s8 g( G# z% p - }
Скопировать код 4. Методы3 X4 _1 B* o7 A5 ~ I) s7 D
Метод reload(String questFolder)
) f, L& i4 F2 N, P( ?* U B- public boolean reload(String questFolder)
; y/ A8 [$ O# {) E8 S5 }, X - {
0 P* B! u3 |8 w( c - final Quest q = getQuest(questFolder);
8 L/ m! e$ v# j- R, n. ~% f - if (q == null) I, y `7 m- k7 j! H
- {
6 {! y g9 g0 W/ G. y8 L! Z+ i f) v+ j - return false;5 z3 ^9 P7 z$ D, r( I
- }
4 X1 l/ \2 V. x) h; \ - return q.reload();
+ n6 t( c& m7 j - }
Скопировать код / L' r$ o7 y4 u6 q" C5 x, Q
# r6 n; G5 H, V, E1 r' H3 Z
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.1 j" H! b4 b1 X }* Z$ j
Метод reload(int questId)
0 r9 s2 T3 t' D3 J4 W! Z0 H
; Z) X, d$ U/ l- /**
}$ b Z4 F& w6 k( F/ K- m - * Перезагружает квест по ID.
1 N; ^1 K" Z& i. e" I6 g: J0 ~) p - * @param questId ID квеста для перезагрузки
% K1 {$ ^* I/ P# N# y - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
" r0 C* x* J$ H4 O u - */5 ]# e& J5 n6 u9 v7 ^- D1 i* l7 ?/ U
- public boolean reload(int questId)
. W/ S- j0 w9 T - {
1 {9 k! D& @6 e$ b j( S- q9 R - final Quest q = getQuest(questId);6 g8 w( H- T8 c- K/ n
- if (q == null)5 Y4 L [4 d6 n& n" c
- {; c3 t, I, y [
- return false;4 {+ K+ O& p: G& \) v6 v/ x
- }
7 y4 } ^" `# e7 J% J4 W+ k" G r - return q.reload();
1 P. \- G/ {( r - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.9 U1 _0 v/ `( A% p2 | V* f
/ I" g0 m9 v6 {/ l
Метод reloadAllScripts()3 }* [- D; x7 Z/ a. B
5 x5 Z+ B" F1 ~: A7 x2 J- /**
0 S) B7 p8 O& F7 V- q4 M - * Выгружает все квесты и скрипты, а затем перезагружает их.
0 K) Q" W3 b) z% P& S+ J5 e4 ? - */
2 x) T/ Q4 Y+ Q* ^) H - public void reloadAllScripts()
( j% s: N/ s: \3 i - {; t' W( J. u7 }1 j' {, \# J; P
- unloadAllScripts();! Q% P( R& f1 {- j7 n2 o
-
* m2 B1 a& t( a) F - LOGGER.info("Перезагрузка всех серверных скриптов.");
( d a& {5 v- `+ e3 b8 J$ M - try) A2 X7 Y: `" a! J
- {
0 C+ W- |- Y2 A+ J6 P7 x - ScriptEngineManager.getInstance().executeScriptList();4 T" i- f# n* e6 i, s
- }
2 t6 t. O3 a+ E U6 u - catch (Exception e)
6 j- n$ @2 a R3 w7 R1 X - {
' e( i3 s9 |" ^& U* U) d& W - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
* e1 A# |. Y& Q; D0 z) I0 n' h - }: I0 A- M/ ^6 d( d% X% n# @
-
6 f! s4 \: T% g- ~3 V4 ?; Q - getInstance().report();- I; W o( d* ?% s
- }
Скопировать код Метод unloadAllScripts()
- l9 y$ c9 z4 h v
, m' p& R" _. u# H1 Q7 k- /**' y' g" ^- n0 h& H- O1 `" p0 M4 ^
- * Выгружает все квесты и скрипты.
+ v4 ]3 r4 E% O# a6 a - */
W- D& N$ C. c. Q7 ^ - public void unloadAllScripts()
( Y3 g* n% i5 Y! X+ k - {5 ~6 D+ i2 l! a# k, N. c3 k5 h$ n
- LOGGER.info("Выгрузка всех серверных скриптов.");2 H" v2 z* g' M1 L
-
- F( a: i! t2 Q8 }1 D' A3 d& ?0 g - // Выгрузка квестов.1 R& q) ~; L6 A; }! j& |
- for (Quest quest : _quests.values())
" r l" |. H4 W4 g" k - {2 w+ h6 N6 B2 \5 \ x% a& y
- if (quest != null)! z( x( O) u/ F/ P% r, n
- {% M( D6 I5 T) g7 {
- quest.unload(false);5 w) R5 M( Y: w# G
- }. }9 j+ ]# e/ Q% X& j
- }
2 X! y# v% T7 H* M3 ?( w - _quests.clear();, {3 {# D3 J' J* m7 g2 e9 {9 d
- // Выгрузка скриптов.7 g( M3 {1 j+ O, r H0 ^) ^9 J
- for (Quest script : _scripts.values())
2 u6 H% M7 g- `4 ` - {: [! \' V( g% U) r9 b+ z3 @
- if (script != null)
9 Q: z/ g/ b# f ?. v - {) ?3 T) z/ F! I' M
- script.unload(false);" F; i6 |" w7 y) _& v8 a! z" [
- }
) }; m- A& P' r. m2 t) K7 V$ w D( s - }
2 ?! w! i7 o& u/ b - _scripts.clear();% q& c- Q# V& \' q* P+ Q# D
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
, n! i1 ~8 j: B# G/ q7 f5 i
1 @- Z; ]3 [; K) FМетод report()
* l% _4 [/ i* A* B: f3 c. u! H- J4 K- ^# I: B G g
- /**
4 M7 l; ` U; V- w E( B) q, X - * Логирует количество загруженных квестов и скриптов.
* w( e! q# ` L* F - */& d7 o {' U4 N3 C
- public void report()1 F# G, x/ k& h: W8 }$ d) q" {1 Y; L
- {
) n/ s; @3 }* s0 a6 l- f! C. C) E7 L - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
0 s! T2 L- |# I3 C* D& E - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");6 n$ V/ Z; u5 E" B, l* s
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
$ D1 M# t& F3 h/ s$ ~. E
. w+ s: z" T3 S& x, L' _ ZМетод getQuest(String name). ?+ T2 Q8 L1 Y% i- x
! q9 f/ P0 r- P- /**/ P e: F6 {7 O s' `! X
- * Получает квест по имени.' l% o) a+ _! \& p/ L' I% w% q
- * @param name имя квеста; x9 j# y% m; P
- * @return квест' ?/ \8 ]! g6 F! w/ T9 z! [; l
- */: c4 ?& k3 q" R& }: u& F: U
- public Quest getQuest(String name)! W1 j0 |7 A/ W) N2 C
- {% M! b- F+ T; a7 \, o
- if (_quests.containsKey(name))
) @9 Y8 ~' E1 I0 H E6 V$ ~ - {
+ O) n$ u# i, `" G' v1 p( ~ - return _quests.get(name);
1 s% K. u+ L8 x/ W - }
$ v% O% ^! F1 y. z& Y7 Q& L% s6 D+ e. f - return _scripts.get(name);; ]1 J" s! W7 ], _& R3 Z
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
' m' y) N/ r7 L7 \& }' _
8 q5 [: |( g! eМетод getQuest(int questId)
2 _: _( @. I5 c+ Y$ |" F, k$ H9 U" F4 f+ [- V9 ]5 a
- /**
, @! f; ]% P6 b9 y8 s, p - * Получает квест по ID.! ~6 g T5 A$ I8 ?& T
- * @param questId ID квеста: x! V) @/ \1 m4 \# \
- * @return квест, если найден, {@code null} в противном случае
6 @+ ^7 j l3 ~% M7 M- c: @ - */
& w8 l, b! ]4 F" s6 P - public Quest getQuest(int questId)
" c }# c) H) x. o7 V - {( A& C z& F; V) @: K$ K
- for (Quest q : _quests.values()); ^( _7 T) p2 \) v# f9 ]
- {) `* R& o/ S b \' V1 _9 Y8 v
- if (q.getId() == questId)6 i3 Q/ O* l1 N2 t& o$ P
- {
( I) |" C' b2 e. i/ D( t% u - return q;9 k; }- s" c4 y
- }0 V' W; y- @+ b
- }
5 b$ C8 u6 m& b - return null;
1 B* [8 e |0 ]# ~$ `& b* N* H - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
/ {# k, k+ W, U' M+ S! x: o8 z7 A s
+ R! z. ^, I% \% uМетод addQuest(Quest quest)2 n+ L0 b/ @; L( ]: I9 A
1 v. Z; }2 c7 ~" H- /**
+ l" i6 D! c) T9 q: S - * Добавляет новый квест.
& J) r* Z5 ^% e; Q - * @param quest квест для добавления
' R, U5 X6 L3 W9 T: D - */0 _8 t+ X) m; K! v, Z/ `0 p* n
- public void addQuest(Quest quest)
. s, R: k9 V6 Z) }- ?; U7 z/ r - {1 W7 T; U' r: b2 z
- if (quest == null)0 H9 D1 R- I) \" q
- {( h5 r: e) Y' a7 i; f+ _8 F
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
B3 I; k- b4 i& ]. w0 Z% z8 @ - }
& L- H* I# j% L# ? -
' u; Q9 _/ |9 X8 B8 g - final Quest old = _quests.put(quest.getName(), quest);
" f5 u! {8 b7 Y% e$ G - if (old != null)/ t8 a( {+ L- |: Z8 p( I* j+ R
- {
' K& e) Q( {. y4 d5 d - old.unload();3 B: \0 o; T- [4 D' l7 y2 z
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");" A$ m: q" f& c2 e+ J0 v" c
- }$ c) O9 L) k+ s3 Y3 v
-
+ y0 M1 y, M, f - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)" A* N' V/ O( I' `
- {
2 R" F& ?' e' n, s" v: F3 F" R - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();( K, q* K9 h6 [; |8 I" A: {! `6 U% I
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");0 z5 }/ `+ Q# q4 \4 k
- }2 k+ B- k; U+ B0 r' n8 G4 c
- }* h! j0 B* w+ Q/ g5 i. c) |( Q
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.( J" [5 t$ {; W
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере./ C: ~" D& P" n1 l- W
# ?( g/ H0 O: P1 m, \" [" F# v! o
2 ^- l8 y) l6 b% f9 F+ q8 V; x1 ~2 e
' w0 A r, D# ]/ U1 P/ A* M" ? |