Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
3 R; c8 c& ?# m" u# E7 t1 L: a% \2 w8 M* u6 j# v+ ?
Разбор файла QuestManager.java$ `6 k7 E( a. ]9 ^
F6 m; d6 c) @- a
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.' N$ C: r5 k! K0 T
Основные элементы5 [9 _2 s" c& l$ @0 `" ]7 S7 R' _# g- o
- Лицензия/ A' y5 s) h: |) n" J
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.* A* m* r" l, D' s% _
- Импорты, W8 M; ^% D" I: ~4 J
+ c& N0 r9 G$ `4 {
QuestManager.java — управление квестами и скриптами.
2 i2 |$ i3 |7 Q1 E" }Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\3 u3 `* Y8 {. u" G6 u
+ l& [: W g* H2 P& k( O4 S0 s" I6 J
# W: q8 z6 I" R" L. CДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов./ R7 y5 U# U0 s6 [$ @
1. Лицензионное соглашение4 O( U- O' a% `# g6 y( t
- /*
* k5 \# s5 n2 ]1 x& b - * Этот файл является частью проекта L2J Mobius.# \" D; V) h, w( E; E
- *
2 w5 c4 @$ z5 V# e; w0 r" Y - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
5 T" _4 M1 _3 p: g; U - * её в соответствии с условиями GNU General Public License, опубликованной
7 I: E3 Y9 w w& ?2 [7 [ - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.; v- A2 ?2 N" Q2 w4 ]
- * 4 n% t1 H7 j0 N3 ?5 j' R3 o( k
- * Эта программа распространяется в надежде, что она будет полезной,
, E; ^8 [4 _' [! i g( ^ - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
+ y, {5 s" z6 Q! I, X; G+ j - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
8 u0 H6 D; F5 O - * См. GNU General Public License для получения более подробной информации.3 S6 P4 `, t1 l- v `
- * + i) J9 S0 y* W. x: L( @# ?+ v
- * Вы должны были получить копию GNU General Public License9 l& a* T( o( H0 W1 U
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.+ E! R* D9 R+ u* \4 W1 O. G
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
, ~5 O' i8 b S9 u2 X# N" c7 I: a, A2 C# ]0 b+ ?
0 ]0 B E( l4 ~1 B- I' _2 O( q
2. Импортируемые библиотеки3 v1 Z* \- n; }. ]' }: f# r
8 ?3 s+ V& M+ q6 {* m, s! \% c6 f- z
- package org.l2jmobius.gameserver.instancemanager;
4 D) _- G0 A4 } - 9 n; e( ~, v0 b
- import java.util.Map;* ]5 L3 V1 a; F0 f9 C! A
- import java.util.concurrent.ConcurrentHashMap;# {# v4 c+ Y( x j0 y( c
- import java.util.logging.Level;
3 k. Y3 z9 ~) Q3 i! Y0 G - import java.util.logging.Logger;
5 H9 i! Y7 f4 h: M d; z
+ \' \ V/ g N1 m1 A' N3 a; H8 [5 Q- import org.l2jmobius.Config;
% k. s3 I2 h6 {: h9 Q+ P - import org.l2jmobius.commons.util.CommonUtil;
8 D' J! p) ^7 T: g8 w: f' }& n - import org.l2jmobius.gameserver.model.quest.Quest;; p! |( Q3 j$ z) w+ U
- 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 — менеджер для работы с игровыми скриптами.
& I6 H5 H/ K' |' }2 a
* k7 W1 j' Q; z2 E# T7 s F3. Описание класса QuestManager- w4 A/ `! \9 _8 g# p
- /**
0 A* y3 o, j B0 M - * Менеджер квестов и скриптов.$ j2 s y, l) y; o B/ }
- * Автор: Zoey766 Q- c& y `& A6 m% k0 Q& o- ]) ^
- */
% e$ U, `: s* V+ J4 L6 H9 r5 x - public class QuestManager- D' i! O3 i# R, e- _1 C
- {, n* h2 j2 a6 x( X; u" O+ s
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());5 [! f& K3 b3 T3 m
- 3 U- B& Y- D {
- /** Карта, содержащая все квесты. */* d% a+ l2 x) Q: }+ B J
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
f) M- ]; m$ l& t - /** Карта, содержащая все скрипты. */6 n2 f5 A- Y! J# x5 X8 D
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();" G1 _5 M% p: Y
- , o6 O u+ z7 ~9 ^
- protected QuestManager()
) H4 o6 C# D1 z: H3 E) \ - {
+ c6 C1 c: z! p- v - }
4 `# b( y8 `; B/ T8 O# x - }
Скопировать код 4. Методы8 `; {, U V# ]1 ^
Метод reload(String questFolder)' d5 q6 g. V) Z3 _
- public boolean reload(String questFolder)
, k0 q/ o5 I5 P# A - {
& s* x }9 S! G6 B @1 o - final Quest q = getQuest(questFolder);
1 {. {5 i- {* R+ I9 K k6 I - if (q == null)
# q; P1 A9 c# a$ b9 M4 O9 ]" q- p - {
9 }4 `2 p, G) x. o7 Z% C, ] - return false;/ r1 Q ^; I9 K$ t
- }* y$ A' z" p7 @: E* X$ o* S; L1 N
- return q.reload();
, ]) ?# a3 n9 H' i- X( V - }
Скопировать код 3 ^4 c1 b N& x7 e* F& Y) q; O: \. V
& y @8 E6 u: J: Z) w o$ p3 UМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
/ {7 u* p& c3 j& e8 \) YМетод reload(int questId)8 v! M m" b- A! F& u5 X
& O1 S6 {$ f: U/ _1 I5 j# m- /**3 c' l _5 l7 c h( b: E; A$ ^$ D
- * Перезагружает квест по ID.
* }0 u; g8 U7 f" ? ~; x3 `! b* U - * @param questId ID квеста для перезагрузки
/ P( [2 V, n) {1 e5 F9 J - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
8 P1 O* R! g q4 ^( I" ]7 ^) O8 E - */
7 v. Z+ `! {5 H1 A' X: Y1 { - public boolean reload(int questId)' l2 t$ l2 J7 o, a3 v3 X7 i
- {
3 L1 U4 \3 S% R c5 I+ i1 I - final Quest q = getQuest(questId);
4 v5 D4 X s+ W& I" ~' A - if (q == null); T. \+ v- l _4 j+ a' h
- {
2 l+ _* l* Q# k0 z& f - return false;- j3 M2 ]: m s* ?# D% X( j9 u
- }
' ]/ J$ A7 F; C0 V - return q.reload();, i+ F3 e+ b- Y2 W7 @! w
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.3 K0 g/ E# m& i6 y9 L1 Y
4 o& J- e* p. I( r4 x
Метод reloadAllScripts()+ q( k$ q1 j; B# C" r6 ~
0 i; i' y3 j% E- q2 H- /**. v& r- \5 } g$ g) ?
- * Выгружает все квесты и скрипты, а затем перезагружает их.
) {7 v0 D" \7 j5 r- [8 y2 { - */
- P2 l. C3 ^7 v" \6 w; i - public void reloadAllScripts()
' L6 e/ T0 s- j# i - {; V! _( @6 T$ w( V
- unloadAllScripts();
& r3 l, K4 o4 v7 u. i8 x7 @ -
* X$ k; p0 Q& l1 e' r/ I2 _% R - LOGGER.info("Перезагрузка всех серверных скриптов.");1 H3 n/ [9 e& N( J
- try
; o: L" |) i9 |; ]0 O% B! B& | - {
" s; U. Z C/ s- v - ScriptEngineManager.getInstance().executeScriptList();" M, ?2 p) ~& Q' A
- }' l5 Z# R! M# @6 ]& v1 e
- catch (Exception e)
8 y( `6 k; |2 a* ]6 k7 m8 s+ o* @3 _ - {
5 r3 c* e7 i+ F& Y( v - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);8 x5 y( [1 ^! S; {0 e( O
- }& t+ X9 w6 f* c$ U3 l
-
1 V7 z! y3 X0 k3 C+ R9 c - getInstance().report();
' ^9 b( n6 X( {+ k' q$ a5 ? - }
Скопировать код Метод unloadAllScripts()
: A( Z' {; K, `2 b" u% U6 \9 O* t
1 X# t. o+ e, j- m H. F" ^- /*** \ h5 g, b1 y, H5 C( n
- * Выгружает все квесты и скрипты., O8 A; N5 \; ?/ K9 ^3 `/ M
- */
8 Q9 K2 A- J2 L9 k5 t - public void unloadAllScripts()1 E/ Z5 [, B/ F. U7 T4 C
- {
2 z; q7 e2 n1 ~5 C% c4 s' I - LOGGER.info("Выгрузка всех серверных скриптов.");) v+ E3 c! s M* ~ o; n* O8 R
- 3 B: n. b- d* S
- // Выгрузка квестов.
3 s& M- X4 l; x, B8 A9 h - for (Quest quest : _quests.values())
_: a( U6 p S- J3 p8 o8 I( z - {
" \0 M$ p' \7 S, v; Y7 Z( C - if (quest != null) E) b3 ?+ u. ^ Y
- {
! |/ V' ?3 W5 F6 k - quest.unload(false);- C# @# M" @! f8 \; w1 {
- }
, O8 A5 h T6 R$ s5 }9 K - }5 ^1 P" K$ D' ^
- _quests.clear();% J* ]4 f& p! u; W2 q
- // Выгрузка скриптов.
: e d& j0 n: @' z& G* `; P) ^$ l - for (Quest script : _scripts.values())$ ^1 @2 n3 }' c5 t
- {
* ?* i* P3 N+ Q) g8 D6 x3 O - if (script != null)' U. H- X/ o7 I# a3 D* d
- {
$ `( X- T, w; l! V) F - script.unload(false);
- F9 z$ E9 Z5 h0 [& z - }
# B9 P6 N8 R4 y - } h" Z6 j2 o5 @" H' Z/ G: V# O
- _scripts.clear();1 w7 M3 a! c9 X" a
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
, S4 A% Y; e# U 7 d2 D* c% \. V8 _
Метод report()
# K' V( d; o- @, I3 _% {( D
" R0 }; i: D& }1 O. p5 }- /**7 i; b9 A5 _ y/ c" z
- * Логирует количество загруженных квестов и скриптов.7 u: k5 K8 W7 C* g$ l0 h) h
- */
0 r* Y5 v1 p* j - public void report()" M8 m7 C% M. \: W) b6 [
- {6 t0 o0 }$ B( h: N) T
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
9 F2 t6 Y$ d, a - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");+ z* ~, E. {! W
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.9 Z7 c6 h/ d. |2 j
/ V/ ~# Z0 B3 H/ F* Y9 q/ hМетод getQuest(String name)
2 ?5 H( u, P9 ?: ^) q$ \: g2 E) d( f1 E& W$ F$ ]
- /**
" M( W+ K/ s, Q - * Получает квест по имени.
4 P$ k8 }$ ~* F& } - * @param name имя квеста
; \; n! l! Q- z" z- w - * @return квест
% s x. l0 e1 w p/ ^/ K5 b, Z# [7 z - */
y7 T' ]4 _; F: @3 J9 i - public Quest getQuest(String name)
0 U( R8 K9 v8 |6 J2 k1 | - {2 ]4 G2 a: d, V( X l: y. x& L+ \
- if (_quests.containsKey(name))
0 }5 l5 V+ M5 @7 z - {( d5 }' {# S T0 Q
- return _quests.get(name);
& N! o# j: ]7 u% Y - }1 |( Z* f7 Q1 T ^2 {' g/ u
- return _scripts.get(name);
" I* y! q. W0 M* e0 A- j - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
% u1 ?5 y" u0 a# H( Q, ^
# A! J- D0 f' U$ F( I8 h8 v( IМетод getQuest(int questId)4 y0 t& m9 q0 Y0 `$ H) x' x% J }
% W3 {9 @0 T( F" w; M
- /**, u( n% |* U# @; j/ S
- * Получает квест по ID.
, l- q7 v" t% m - * @param questId ID квеста
! F- \* r) u0 Z4 {" S - * @return квест, если найден, {@code null} в противном случае
9 U! U6 o, `9 r3 \" ? - */3 N" [1 C: ]& T& L% p5 S
- public Quest getQuest(int questId)
4 q6 b" \( x S9 W - {5 _; y0 w" h# J0 `; H$ o
- for (Quest q : _quests.values())
: ]. f7 ]) L* e( U8 H4 h - {3 l5 Z( q* Y' e( m. p( v) w" S
- if (q.getId() == questId)
( H- [) S) X h. e - {
, }- K4 q5 ~1 Z$ [# j - return q;3 I' S% V% h6 J2 g4 O5 k5 z# n$ F _
- }
4 M4 n4 D9 U. l2 W4 o - }
1 i% C8 o8 g; C- h5 l" D% f - return null; j! [6 {0 A7 V0 h1 s. Z- ~
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.# G# y9 e: O# f, c% g |+ n. n
' S9 R7 S. e; K
Метод addQuest(Quest quest)2 h! u; t/ @5 |2 z0 \
; {- s' F5 s, V5 e
- /**
) B5 I/ u0 V, r) T: g u* V% | - * Добавляет новый квест.2 s* Y7 t7 \: d3 c, u `
- * @param quest квест для добавления
2 u; ?* z; d9 _5 v( Y: Y - */
, ]6 f% I; V; X. D0 v7 Y - public void addQuest(Quest quest)
8 r7 b3 |! p9 `5 \1 `2 x/ v* V - {
1 b# J R% h W; M - if (quest == null)
: K6 ^9 h5 y) _# i: q - {
( w) @8 G5 S) l- {3 a - throw new IllegalArgumentException("Аргумент квеста не может быть null");
% ]+ q8 `1 o- }$ M8 m - } @8 w4 F* h, I
-
1 C) ~0 V5 @% i6 }. X5 n& V$ f5 k - final Quest old = _quests.put(quest.getName(), quest);
& ]+ M( H3 j, a% Q# `" r% h( n% R - if (old != null), e C* H; i C2 i5 M0 U
- {
S0 v) q$ M# c& F* \ - old.unload();
. ~8 E6 S0 o h - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");: B2 G7 K+ p" Y. O- b+ b
- }
" y A! }+ {1 N5 k% } - * k h% m7 X% m# N F
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)* ]4 K% ~1 ~6 K8 J
- {
: R) m6 J2 n$ j - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();/ I( t3 q+ b4 V1 C
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
* p2 ~! S9 U3 g7 x/ ] - }
5 L( u$ {! B4 }1 p l$ h - }
7 E0 S$ R: E3 Z+ l/ S9 J w! X - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.2 K6 e- S* W2 R ^- V3 c! V8 s
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.# y+ |- E& c- K& T e
9 P& S& x9 Z4 P3 j6 C/ q
" b1 `0 |$ q7 I% F. ]/ X7 ^
1 B2 p' M# q- C! c
|