Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
" o3 U* y: T. X1 g1 q! r6 ~$ A: T8 [( r) a, _
Разбор файла QuestManager.java# B& b! B. n" [5 i; A
/ G+ T3 d2 U8 ]/ q. V kЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.. x" O Y+ y5 l9 Q
Основные элементы
Q/ S1 D5 o! Q, q% G, t9 @! k- Лицензия
" g) a/ g3 ?" l- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.$ l; O. j2 O# |, v6 \4 T9 d$ }
- Импорты
* Y% \7 ^+ X8 v4 B 1 g* K" d% G @' { }
QuestManager.java — управление квестами и скриптами." ~' E. G" o B
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\- u6 D" I% U; Y; \
. c9 g6 l& j. Y( u. j; n
+ m- ]) r. D. R& E, RДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.' g, {( c: E2 x
1. Лицензионное соглашение
# c' ]! ]- Z& N# n1 `, J$ E) a) z- /*
" F* e, P& H8 {: n4 H1 a - * Этот файл является частью проекта L2J Mobius.
; B, P* T5 l( d+ l5 A; f2 [ - *
4 b+ s* U* \. ]9 [ - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
3 E( i! X+ c" A3 c - * её в соответствии с условиями GNU General Public License, опубликованной: d9 F) S; a X7 ^* t3 J2 H
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.6 F" [" B1 M3 |2 h' [
- *
! F( v9 y q# H3 F - * Эта программа распространяется в надежде, что она будет полезной,
9 }4 y' H: \& ]$ ]" Y. I - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
% k& _' H4 G& E: B3 ]3 |1 X9 U - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.6 n8 G6 z V5 A3 G3 ?) \
- * См. GNU General Public License для получения более подробной информации.
/ _: k5 o4 ^$ W* M/ { - *
* E" Z p% w" ? k; U& t - * Вы должны были получить копию GNU General Public License7 o5 s/ U& C& B/ U" k0 z
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.$ u+ r5 V9 h5 R' n
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.* X. h8 j9 m% _6 ^( s$ B
, v. G8 u$ z3 J; }4 B6 T
* W0 c: N/ E, I& f6 _/ g. q' N, [ x" W2. Импортируемые библиотеки
]9 ?; g* m6 A8 T5 W1 n0 h
! I' Y: z/ Y1 u, `2 `2 \" [- package org.l2jmobius.gameserver.instancemanager;
$ T( A- b ?2 X4 o
+ I* @. c x5 t% `) O# ~/ i- import java.util.Map;! o+ y# t: \6 n! x9 k o
- import java.util.concurrent.ConcurrentHashMap;; E( n6 l" T. g) K$ V
- import java.util.logging.Level;) o! i* O8 p4 ~: P5 ~5 ~
- import java.util.logging.Logger;
n6 @1 ^- L+ v. b ~" j" U" z- c - . x, S1 J2 x9 C, I0 w4 d7 ~
- import org.l2jmobius.Config;* {0 e- L. H( F* I# K u, Q
- import org.l2jmobius.commons.util.CommonUtil;
/ \5 K! a, j" u+ q - import org.l2jmobius.gameserver.model.quest.Quest;
3 y0 y1 ` w# `! `. U' |- 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 — менеджер для работы с игровыми скриптами.
7 W! M8 t' B7 U& S$ P3 X. C% u
9 R3 X, f$ q" W. e; s3. Описание класса QuestManager
. Y/ M* }* y" {3 E- /**
0 }. d& l7 V3 ?1 `8 a0 H - * Менеджер квестов и скриптов.3 Z. N3 z, W7 B9 h6 s# \
- * Автор: Zoey76
8 `6 c4 A( f% k* s8 C - */2 B8 J' h+ o. _$ A- _
- public class QuestManager" |8 ^/ @8 d3 K" S) D
- {
0 d1 W& Y5 w& Y: s) `4 x - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
5 f) S' L/ n' X9 K - & C. ]) r ^7 H
- /** Карта, содержащая все квесты. */* ]7 k6 b. @% `3 t
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();3 j2 l. \& O; D6 r7 Z* F
- /** Карта, содержащая все скрипты. */) `& k# \" h& T& ^- Q& v- Q5 p
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
/ X# C/ V: j/ d% A -
: U* k* C" h+ } - protected QuestManager()2 d$ a9 F* _% f; k
- {
" W) n# B, |6 ?2 K2 S - }
7 m1 i9 C0 K* M4 }3 ` - }
Скопировать код 4. Методы; k/ z5 V& C8 h9 Q- w
Метод reload(String questFolder)
# \3 \0 G+ T( O0 i0 X- public boolean reload(String questFolder)& r+ a! j; M' O2 k$ P) }
- {
/ j {$ k) n/ _# G) Y0 w, s - final Quest q = getQuest(questFolder);
8 X ]2 E3 ~' c p - if (q == null)
. {; f7 Y0 C% a6 n - {* P' u5 n2 m$ `2 O6 j2 t
- return false;
- ]+ Q, M- Q6 d, ~7 o - }
% }$ A$ ]5 _" _1 k0 Y - return q.reload();0 a. [, G8 y9 O5 b
- }
Скопировать код % y# Z$ t5 e; r w! R2 x# s8 g
# ]& q' u- L8 o: F) C7 j7 W
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
7 g: h* N8 ~% q- ?' R! iМетод reload(int questId)5 U6 f9 g5 C* s) ~/ v" V
) o4 N5 {) {/ O, Q. ]( a
- /**
2 q+ b Q: O& u5 ]4 _/ y - * Перезагружает квест по ID." P! q! p* i2 M* `" W
- * @param questId ID квеста для перезагрузки
8 a: \7 x3 P% m7 Z, K - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае/ q5 D; p4 n' x6 K' P+ R
- */# X3 j8 Y. M# A+ Y* b
- public boolean reload(int questId)0 ?1 G6 w* q; q/ E- p+ r
- {9 D& N! w8 M! M. B
- final Quest q = getQuest(questId);' Y& Q* z4 y+ W
- if (q == null)
( e) X: B( g& `3 r - {
4 m; `7 n! n& w. q* ~ - return false;
% {8 n% ]- t7 T- L. M - }
5 o1 f- q: G$ G6 w' L7 P4 I - return q.reload();; ~* ^1 {' f6 s5 [$ U% K
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
! I) {8 a1 Q, d7 W ]' J* S
3 c1 e- ?( U4 y0 @" hМетод reloadAllScripts()
& _0 z {3 \# M' E" o% | G4 X( J; m! n, D& m
- /**+ W" W% Y% N- o% T
- * Выгружает все квесты и скрипты, а затем перезагружает их.
# L- n% I1 _7 q1 x - */5 B0 v8 y7 ~. a `5 r' g
- public void reloadAllScripts(); _+ z8 ^2 ~. i T4 c
- {$ B/ ]# u% q' W% O
- unloadAllScripts();0 o5 i! y" [. B: i6 A* V3 w5 `, [9 R
- / D4 I' x, i- W2 T: `3 t
- LOGGER.info("Перезагрузка всех серверных скриптов.");4 @6 V$ a( r" w5 A9 f$ @) ^
- try
+ Q1 l: y, k! a+ m5 W - {& ~% j1 j5 ^/ [
- ScriptEngineManager.getInstance().executeScriptList();
) [/ \8 ~- Z* ?9 L/ n% E - }1 ~& m6 Q- U3 _( J7 }
- catch (Exception e)/ f1 M% H; J( X J7 M1 M: @
- {, b; b4 q0 c8 G; }9 q
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);1 w4 X- t) Y1 S9 M: I B$ g6 h/ [
- }7 Q( m. J) L: r8 `0 x
-
! A% B- r8 Q; g1 E* y - getInstance().report();
% p7 ^- T% m/ Y4 e - }
Скопировать код Метод unloadAllScripts()( A5 T9 X7 q; P- z7 n6 ~
6 d; D4 i' b6 w1 D% T" p- /**
Y$ q8 D8 H" f) j2 P0 ^ - * Выгружает все квесты и скрипты.
! z z* a; Q2 s* R" B& z9 ] - */4 x! G- K K9 s. @
- public void unloadAllScripts()0 e% J+ v9 Z0 ^" y& Y& ~; D
- {; ]& q; C* S. X+ C& L! K, M+ j4 ~
- LOGGER.info("Выгрузка всех серверных скриптов.");! d" g S' D+ a
- $ F+ y6 W+ h4 j& c) L. \) v) s
- // Выгрузка квестов.
8 Y: K! l1 b- \/ l- F! a - for (Quest quest : _quests.values())
5 M) s W# g( k6 p2 j - {
) [3 l: Q0 K+ \9 i* H+ d0 p - if (quest != null)+ L3 I4 y" ]8 w
- {
4 j. M/ W4 Y0 }0 o5 e- s - quest.unload(false);
* Z+ f3 c& \2 z- S6 m, Y - }
& m+ L& t$ v" w7 x' I - }3 c, H! p" W' {4 \, {, c. t9 P7 E
- _quests.clear();
# g: H3 ~. o5 a2 H- B) ~% q - // Выгрузка скриптов.
; A% I+ @2 ]% b7 Y, k - for (Quest script : _scripts.values())
' r: ?/ a% y" Z5 t3 ] - { X, j9 F6 x6 p
- if (script != null)* ^, [# a8 \4 n; W
- {
8 z/ u3 e: O7 { - script.unload(false);7 a8 v: x6 h+ g$ ~: g' p$ d
- }
9 h6 [4 g" b2 _- A$ J8 A' f - }% E! s2 W, j+ V& u0 D1 X
- _scripts.clear();
& z9 i% Q: s4 h% L* v - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
) O \* i U" s3 x. n0 i
2 {7 E! A. h" R; EМетод report()! ~4 r3 |- q) M+ P, B
( Y! ^1 W- L+ f. P# I* p- /**5 Y+ F% F: o$ n
- * Логирует количество загруженных квестов и скриптов.
$ X9 s) @8 E8 x+ k) y% c: u - */
. O" w! V: w0 E* a% g3 t1 I( u; _ - public void report()
' g! `+ I3 G4 N7 U4 v - {+ @- [0 \- l5 y& r
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
; a: F0 X. {: r, Q3 z+ e0 M$ ^ - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
I. ? A4 J+ @, X6 S - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
0 D2 \5 J, @% D# w4 n
0 ~0 U! v7 \- D' z! d7 [/ _/ t/ I2 nМетод getQuest(String name)
7 I8 C. B1 |. F* u8 V
4 W, e; F" r7 W4 P6 f$ o- /**4 d$ M' L' {- \: g6 {3 e% c) N
- * Получает квест по имени.# w$ p( R1 J4 O5 J. c6 i9 z* W9 a# z
- * @param name имя квеста8 J" A3 V1 A7 e
- * @return квест# W$ H( \8 B h4 d
- */1 W/ _4 r- p3 G; a
- public Quest getQuest(String name)# ~3 A/ M# [; C
- {, ]( c2 g$ B M+ X
- if (_quests.containsKey(name))! [6 ]) [2 X) e) w$ d
- {2 y8 t4 q9 M: D
- return _quests.get(name);
1 U' J% n) |' [7 Y - }8 T5 }" ]5 d- v: C- V) ]0 F' n
- return _scripts.get(name);
% B1 c d0 H2 O+ Z* V - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.2 }, f" G' O8 ^" H% I# H
. N$ s+ t* d" B
Метод getQuest(int questId)7 X- G5 g1 \ m+ K+ q8 }) |
& ~8 a' u1 y) ^& a9 Z- /**
, {9 z& W: U# r+ Q; n) _ - * Получает квест по ID.
. y* v, z6 x5 L Z; Q, ^ - * @param questId ID квеста1 C. F* U" \/ P$ d2 g
- * @return квест, если найден, {@code null} в противном случае# u" @1 L- Y* {* M' v1 d
- */
4 n2 U: m0 Y, N% R% b - public Quest getQuest(int questId)
. I2 \3 K! o# W - { i. H- A: I6 W; r
- for (Quest q : _quests.values())
. n2 z& \1 `; w2 |' H0 w. S' E - { K# [) |& G% v! F+ _
- if (q.getId() == questId)
$ u5 @8 R1 Z- k. { - {' g9 b* d1 S5 i: Z- c
- return q;
9 e; `+ G; F g7 K/ k5 N% T! ]7 S3 f - }+ s; v( v. w7 K- H) y1 t
- }
: L% B! k7 s2 ]7 D9 b7 U - return null;4 P* }7 x$ u4 K- | g! ~ x
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.7 ^! ~) k; q9 F/ x& f4 ~
5 Q2 v& _" @0 P$ B0 `$ B" H
Метод addQuest(Quest quest)9 `4 d, I$ Q9 S2 h m# P
4 F. Z/ S! c- n" N% r
- /**% [3 m3 i1 r2 q) ]! }8 D8 u
- * Добавляет новый квест.
" W$ q1 z) F- ]" h9 k7 f" B - * @param quest квест для добавления
6 Y# j* k9 r n - */
/ ~+ q( k' Q" o - public void addQuest(Quest quest)* e D' c8 @: z1 c, C6 s
- {
5 s0 r1 ~/ U6 w - if (quest == null)
]. p% w8 ]/ U - {# {% \: w# X& z" M
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
- M) O* l* S0 y" q( s$ ?7 F0 R - }
9 b% D/ `6 l1 _3 J, G2 K3 H8 u -
7 l; q" L/ }3 _( X - final Quest old = _quests.put(quest.getName(), quest);4 n& M: h0 V7 c% c2 q
- if (old != null)
- D' Q$ D2 z5 B4 D - {
2 H1 Z; n; g/ o% `+ C* e, Y - old.unload();- O4 \* C2 y- J* B9 f
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
( a+ B! D7 o5 h+ j - }
+ V* A$ @5 c }% U+ j -
- t; H- H @; @ - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)# f' D b" s, o0 O2 W
- {$ E" {4 m6 g v4 F% C
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
2 u9 Y L) o* z2 z4 O" G - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
; C. _5 H& V5 @0 F% ^1 A - }
: ^0 D9 A- f/ T) \ - }$ q# |' Q9 ^4 _+ `( {2 Y4 I
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
2 I) U4 U3 q+ M* cЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере., H" L' r1 |+ @) U! d8 A: T- [
) t/ a7 t7 e2 X! I, v: E- g
: X4 ]' v3 @" N7 B7 ]+ G1 e3 w& i, ~: \
|