Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
+ z4 E" H# s& c% f# g; q4 F: y% B7 `0 ]) w0 A7 V' I
Разбор файла QuestManager.java; [) R: P) j) l$ L( A1 K
1 v. I P( g& s0 k# W3 H
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
2 R, t! g7 p: f) c7 QОсновные элементы
! f u4 c; }0 d0 r- G2 [- Лицензия0 K9 k2 |& I: b) s
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
5 l/ b* F8 p( K: f
- Импорты ~+ F9 W8 d6 ~: v( z, F N8 b0 U
- c: q( R h- t6 |5 P! j$ p# X! e/ xQuestManager.java — управление квестами и скриптами./ P: M2 a3 e9 P/ A6 E' |. E( r( F: L- ]
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
) o* `- Q2 i# g; X) p
0 Z8 F4 U2 J) N: y+ M9 v2 U# G5 J5 B( r
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов./ k' W: M) Z4 R# C
1. Лицензионное соглашение6 @( ~/ J7 q+ D t5 s+ ~# p* i
- /*0 Z# V& A6 `1 B' D# u. V; ^/ J& c
- * Этот файл является частью проекта L2J Mobius.' s1 c% Q9 a8 E8 y
- * " |, s9 y/ } X+ g j
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять' ? _# B9 Y1 e: W4 u0 w
- * её в соответствии с условиями GNU General Public License, опубликованной
1 q9 T4 _$ s' }% p) q - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
3 V% D1 U4 p0 ?, V! k0 t- n - *
5 i6 S1 r+ C0 R, u - * Эта программа распространяется в надежде, что она будет полезной,: {1 B9 o3 F. Y3 R: A( p
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
& E& E; S+ n( p6 l8 G9 F3 Z6 r6 K, R - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.6 i- r# _1 F0 z
- * См. GNU General Public License для получения более подробной информации., k0 L6 n/ f1 g+ P. J8 R
- * 4 V/ _# J6 ~- r- m
- * Вы должны были получить копию GNU General Public License# K$ Q: }' M, J* U5 k: e+ F V
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.6 ~: f- \# q$ B, i# B. ^% _
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.1 T1 |; q) I0 A# ]3 ?
$ U4 Q6 \1 X# ~1 j
* L) J/ X G* o9 k# R9 h4 r2. Импортируемые библиотеки
. `5 V0 o" _' S% \3 @5 n W7 l$ q! D6 K7 k* g' w5 \
- package org.l2jmobius.gameserver.instancemanager;
: V1 h6 s% B+ ^, V9 a+ W! A2 g
& G, s1 J9 v0 o9 p. I% D* p- import java.util.Map;. [5 M" g& Q, C# ~
- import java.util.concurrent.ConcurrentHashMap;
5 s+ M1 d o$ c! ?/ E7 w$ d9 I" n* n - import java.util.logging.Level;
% |3 `3 V% n! F" I2 y - import java.util.logging.Logger;
% ~& N0 Z9 W; ~+ c& B1 M5 f u - ) L% h2 f( c& f% _ W
- import org.l2jmobius.Config;
% I" b* f+ O0 g* \# o# s - import org.l2jmobius.commons.util.CommonUtil;; z( W: [* \ R; \+ ]( {! r) Q
- import org.l2jmobius.gameserver.model.quest.Quest;2 `0 H/ T( m# v2 I) O" c/ r* E9 ?
- 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 — менеджер для работы с игровыми скриптами., Q3 S5 b: w2 S3 g
+ C& \* ?$ J2 i3 i. \* q+ j* }3. Описание класса QuestManager( y( {6 T6 F. [% x* z: L$ Z3 m
- /** g3 l9 ^, Y) z% N
- * Менеджер квестов и скриптов.9 q5 H$ j0 a7 k3 N1 Y7 g
- * Автор: Zoey76
! ]* x3 C! x5 }: U# T0 D - */6 E# ?! D+ B5 d' V0 I& s$ G
- public class QuestManager0 e' @% ?; y: K! U* p; ]
- {
/ d& f0 `( v2 }2 X: s - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
( C, h: A1 D: E6 E1 W -
4 ] d" a; h1 I P3 p- C7 ? - /** Карта, содержащая все квесты. */$ {4 _; C0 t/ Y) B0 E, h
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();7 v& O3 T# g/ A$ Q( W9 k4 D) {
- /** Карта, содержащая все скрипты. */7 p1 N S1 O2 D& V7 ?
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();! N( W9 I @, O& T& T; M
- ^' ~, K5 {3 t" { X
- protected QuestManager()* H& d1 X% c6 {, X
- {
K+ G1 z0 ?; k) o' ^' o: e- T; | - }8 _# l0 a- G- }" d" `4 A( Z. [
- }
Скопировать код 4. Методы* J1 o+ B+ Q. @) p" B
Метод reload(String questFolder)
/ C# K) Z ^# `& I% G8 x3 c( ?9 W5 T- public boolean reload(String questFolder)
1 w2 h' g4 O; p$ \' e - {9 P8 R' c/ r* l3 t* V$ X3 A3 u0 i
- final Quest q = getQuest(questFolder);8 _4 }" f2 [$ x, O7 P3 ?7 H
- if (q == null)
6 m& [5 p, c7 A. ]% D - {
! k: }" f( s' \( R; g1 r# \. z- | - return false;
; C3 j$ R' O; m2 ]% s3 P% V" c - }
0 C7 g1 f K- @: T1 L4 m - return q.reload();
4 }0 U$ y9 c2 o- D - }
Скопировать код ; ~: k" W) ?" I: V1 J4 j5 S' N
/ s8 m5 o+ y, CМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
3 L- ^7 @9 b: i# dМетод reload(int questId)
, ?& z0 ]1 |6 W- S& N
1 Q# m6 H( ~% [! G- /**
$ S& e( w4 D- n; | - * Перезагружает квест по ID.3 c# t' f) v: @0 i
- * @param questId ID квеста для перезагрузки
% \& _; @3 }5 Y& ?! X/ ] - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
/ ?) {% n: {% s3 W - */
6 W& r6 K2 @% x8 v* I - public boolean reload(int questId)
2 }$ r/ ]$ \' ? - {
* O0 L* B" S3 N+ Z% N - final Quest q = getQuest(questId);
7 s& ?! F* y: o/ Y - if (q == null)$ W( A# r0 z# w; H2 y
- {
+ T" ~! Q2 b& p, o - return false;- q5 I7 ~& }7 c5 |7 K1 y9 T$ E
- }
. S) {* |3 ?* g9 Z! J. B - return q.reload();0 Q9 P/ o; L: s+ {
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.3 A! R4 @& M* Q5 S5 V
4 Q" V$ j+ p& |8 g: j2 V
Метод reloadAllScripts()
, h; \/ G5 P+ {* _2 ?# B1 c$ |: E% p$ _7 v0 I) [) g
- /**$ P! g3 ]. E8 u: T* R7 s. C8 a
- * Выгружает все квесты и скрипты, а затем перезагружает их." i* M' y \+ e0 U( j1 J8 v
- */( M: F6 A# F& a4 Z: o
- public void reloadAllScripts()
/ W6 @0 G5 I- a9 g4 b - {/ |5 Z1 {6 f- e) u: b7 o
- unloadAllScripts();
- n7 n6 M& ~8 H. S* T3 x; j" L - / N9 }! w( c1 T8 Y0 A
- LOGGER.info("Перезагрузка всех серверных скриптов.");/ o7 q+ E" _# g
- try
2 f: r" k! O% \% G, p$ m - {
8 G/ I. G$ G5 {2 T - ScriptEngineManager.getInstance().executeScriptList();
/ m# t% y6 w' C9 ^ - }
3 G; s( \1 M& D+ K7 g6 ] - catch (Exception e): W2 K8 o1 i8 h0 V" O) j
- {. C) @0 T& T, c) G. r" s
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
, T) Y6 h! i& a2 b - }( `" u! f9 ^/ P
- 0 z, P) Y, T: g
- getInstance().report();
4 C C# u4 X( ^) L; }" X - }
Скопировать код Метод unloadAllScripts()
0 s9 L. O0 w, C2 @& S, {6 g5 ?+ ]# F) r! r) P$ e" h& c- n
- /**
3 i' S( m4 ~& D; M - * Выгружает все квесты и скрипты.3 j. t/ ?+ b3 B1 t, L6 k
- */
2 I- z, n, U5 E6 |# A - public void unloadAllScripts()
5 c' S& h& S5 H" `& M - {# r+ c: G" X% v% d" W
- LOGGER.info("Выгрузка всех серверных скриптов.");
; m5 w5 u* G$ b - , x0 P# K9 q0 O
- // Выгрузка квестов.; }, D/ c* D" D7 _) \5 e
- for (Quest quest : _quests.values())! t/ k% o2 |' Z+ [
- {
. q% }# \! n! {5 \( S, ~ - if (quest != null)6 c: z3 J9 V9 D
- {
2 t! j6 T( B9 T7 b" R$ K2 \% k - quest.unload(false);4 |9 b8 J. h+ A
- }( L8 a0 I6 N, l' {4 P4 W
- }
( a' L' ]" S4 g2 n- m5 D - _quests.clear();0 j/ G: M: ~% W. n) I
- // Выгрузка скриптов." [8 x5 L. a5 |/ m: Z8 g1 O
- for (Quest script : _scripts.values())9 [% }& O% t/ z) S9 M
- {
; Y- q! @3 L5 {. I( l& F2 k/ D9 \ - if (script != null)
, n8 o, W" z# V$ A - {! g" |' }% ?1 @: d
- script.unload(false); k* s. j6 n7 I
- }
; K5 g6 f1 a4 d/ {, L# v8 n - }
2 `5 N0 R' k% s3 v: r! x - _scripts.clear();( b! X7 Z$ _+ I7 Z, d% |0 t( G
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.: {4 C' B1 {" Y& u8 _% b' ^' e6 o
$ w) z1 K. q. _1 G% P1 g; SМетод report()
9 I+ R6 T# G1 Q
4 F" Y8 G& U( b+ J. S' n. K- /**, b6 j4 @9 e5 g2 h; v5 Z; F- ~8 ?: R0 _
- * Логирует количество загруженных квестов и скриптов.6 Y, u7 V! l, w* f, i# ^* o
- */
) t0 \- C/ \8 I6 r6 |% X/ N - public void report()1 A; V; P, e; n& Q& `2 y( \6 q
- {
* j4 `' f: F2 I; _4 ^ - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
- V, ~4 a% r9 h& |- O. a/ R$ ~ - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
% f' J" u& C$ P' X) _ - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.7 L' \1 v, Q5 a; q: Z" s
/ {4 ?& R% _3 G3 U
Метод getQuest(String name), E) g9 B8 K( T/ S, X
/ Q& G z/ J: c6 V, j- /**0 x# T4 G+ _& E: z' G
- * Получает квест по имени.
* a3 A7 F. S; F2 ~% k6 V$ z - * @param name имя квеста9 L: j: m8 a- Y! @
- * @return квест
y7 A4 L- Z) X) r% Y - */3 f$ g- ]6 m0 K
- public Quest getQuest(String name)
* ~5 j+ `; K7 d6 B: k: R0 Z - {
3 @3 e% c( F. ]) q. k) U* {- y) v - if (_quests.containsKey(name))
8 ^/ ~. ?0 ]1 ~& T" a) a - {
# s- T+ R+ c* q% \ - return _quests.get(name);( }: t x% ?5 R4 I. ~
- }, k+ V0 o0 ]7 @, L6 l4 w
- return _scripts.get(name);
1 ]/ q+ ^# F$ e: x$ _4 B - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
& {$ z: l2 j3 }( q# d& R& c
! r' z& ^" h$ |+ d) ]/ Q# v! BМетод getQuest(int questId)! N8 z' y4 E* d6 v6 s# I
$ v9 [! P$ W& t- B6 r
- /**% l8 r2 B/ k. O+ y
- * Получает квест по ID.2 d$ r/ @6 k5 Z
- * @param questId ID квеста
1 B0 z4 o8 [4 ^5 L5 I - * @return квест, если найден, {@code null} в противном случае
8 g! P: K2 [( ^' ?5 ?4 w8 A9 @ - */
9 R9 h$ L0 A* f9 \4 q% K" D - public Quest getQuest(int questId)
! x$ L! i5 j6 Q" i - {0 [6 z/ g+ u2 u5 D9 n
- for (Quest q : _quests.values()) |2 E) ^' i) o9 t6 y
- {
# b5 d' b% Z- R' K5 ^" b' v - if (q.getId() == questId)
- N: `8 v2 r; F - {) U, E) k7 r9 m& S4 O$ e
- return q;; o; f) |! f8 o5 u
- }
5 t$ ]' X; |7 {8 P9 q: j. Z4 Y - }. r2 o$ V& Q4 L
- return null;
8 D g! D8 h4 i% ]: a - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.# k. V6 B! N$ A
5 i x- B" X$ S0 y$ b) h' n
Метод addQuest(Quest quest)
6 h8 \1 S3 X0 h9 H0 z+ W
- u' x, F, D$ g- /**
$ \1 T5 I1 b) V - * Добавляет новый квест.) k% {" h" q& q5 y7 m& { Z$ L
- * @param quest квест для добавления- G6 ~ P, p5 X( o9 K, g# j
- */) O. U/ ]+ G' @5 x
- public void addQuest(Quest quest)
9 x/ x6 |+ d% y8 q1 C9 [* K - {
* A' N( j0 H. p% B5 ] K - if (quest == null)+ w# E- c. R& r
- {
! v5 N J% U0 u4 `3 `' b1 m& X - throw new IllegalArgumentException("Аргумент квеста не может быть null");- e( X+ O" A/ x. D9 n7 p9 P
- }( U- P$ k# H' D( ^5 a' }" Y
-
4 ^3 ^1 P+ P: j2 l! ~6 Z9 j - final Quest old = _quests.put(quest.getName(), quest);" }, h. B5 P t7 T9 J. u) M& @
- if (old != null)+ L; V2 M, ^$ @0 \: [$ ^: n: r" h
- {% g: k: E( P4 p/ r
- old.unload();: |8 |% o* E6 X L1 H1 ~ B
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
% S& d6 V$ S$ ?) g7 I - }
( ]7 S! L. r+ G. O' U$ v1 W - 0 ^7 @% n3 H9 V
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)- r5 f6 `( u) l6 [0 l: q. K6 I
- {
4 s3 k( X# _ K$ n% p% E - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();; W j1 ?5 k/ V( F
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
4 N) ~" g' M) P# W+ P6 C9 P - }
7 z) x7 n+ O- w* | - }
3 E; j. c$ E+ G/ ]' E- b* o - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.$ \9 V9 F! z/ G
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
- J/ U; T0 f$ t
" q* b W# [6 f5 U9 u, e% w
7 I1 o- B2 x: Q6 E F ]4 t7 K# `/ p% `# |; p+ L9 B
|