Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
% f- ~4 P/ T: e! u7 J" h; D/ C( Z- J& o3 ]% Z% ?. Y5 d- q. Y
Разбор файла QuestManager.java
& }/ n, B; y$ C/ F3 _3 i2 t) I
& n1 C3 g. w5 t/ jЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
9 t) q0 E& h3 h( XОсновные элементы
5 X6 A5 a2 u/ u" Z/ r" S; g- Лицензия9 D! p4 J _& k; R- _: U$ Q1 R
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
+ K* u9 t$ V d/ a9 T+ M# C
- Импорты
) C5 T! {& p- l5 w
+ }8 g9 H+ X' W7 k3 fQuestManager.java — управление квестами и скриптами.
; ~) u2 a0 ~# m" `: PПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\# M# P% \: ^3 M* U [3 i
' h7 W2 F y- G1 V8 O7 F$ F
: P: N! e2 B- `( kДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
$ ?6 M2 |; x8 t7 _+ m' D' w1. Лицензионное соглашение
3 Q& i- a( l; U7 t [5 `- /*
; m0 m' K) a# ?- O$ B - * Этот файл является частью проекта L2J Mobius.; H8 `& H( Q0 x# o5 m
- * 9 U& _1 a. l8 P/ F
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять: i5 b' C; x+ {4 E' A
- * её в соответствии с условиями GNU General Public License, опубликованной
) c2 T! j: V4 Y5 T - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
, u2 K8 c3 s0 B: u) C, v - *
- j. x( \) h& Q7 e% c# @5 ~ - * Эта программа распространяется в надежде, что она будет полезной,
- u0 J3 N5 k" g" u - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
0 g, [3 n( S5 k0 `! I - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
" M# `( Q( P5 `1 V5 _ - * См. GNU General Public License для получения более подробной информации.
# O% u# L5 Q( @+ z0 L$ X - * ! t1 A9 p' K1 |* _# t
- * Вы должны были получить копию GNU General Public License
. m2 ]4 _- s4 F+ O - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.. X* y. ^( x! l( h/ g$ z8 ~1 a4 H
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.7 E3 ?& D, P& G% a! s
0 T. v! r9 j3 d+ ~) N" i7 Z+ q
$ X8 k; h3 h# H7 C: [6 ]0 {2. Импортируемые библиотеки; s; B. b( u( S4 ^# q* d
" l/ j/ G T6 k, j8 I; O! S& C
- package org.l2jmobius.gameserver.instancemanager;
7 \/ E% c2 W+ t- M& u
; e' |$ i. V/ w8 d- import java.util.Map;1 e6 `$ f( q) Z" I8 a1 m
- import java.util.concurrent.ConcurrentHashMap;) z) j5 |* F* E% e$ H+ P. M1 G' M% @* I
- import java.util.logging.Level;
! d0 ?: t& H) Y+ |! h - import java.util.logging.Logger;
r$ C9 M0 |; L) b2 E/ H
& @ c. w1 r# M( [% @2 R4 X- import org.l2jmobius.Config;7 |7 V F8 `) z8 R& l. f
- import org.l2jmobius.commons.util.CommonUtil;
, B( {, x6 V' y- w2 ~+ P - import org.l2jmobius.gameserver.model.quest.Quest;0 R% U, Q. D) d) b( m& u# T1 o
- 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 — менеджер для работы с игровыми скриптами.# \, G9 u# N/ R! y: v4 T2 I6 c" @
% S+ L5 d; L8 R/ I Q
3. Описание класса QuestManager
0 |) L i% n- z P$ c8 {: i/ W; c0 r- /**
7 ?! ]# H3 g6 R5 y3 S* d- M. q ] - * Менеджер квестов и скриптов.8 H% A& z/ [# T8 T
- * Автор: Zoey768 q' W/ d" H/ j
- */" {6 l: t- m! z1 p8 L8 n" N
- public class QuestManager" _2 ~* @ u- T& x) w& l* @) I
- {
2 ~+ c. @5 k, i; O( ]: V - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());! e; a9 E/ `4 Y, f, m2 D0 v7 I
- 9 M! r B( \5 @( S
- /** Карта, содержащая все квесты. */
1 N# |: ?7 U$ s. ~& w; J - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
/ l) c) \& r O; P6 V - /** Карта, содержащая все скрипты. */, k3 K& K: U/ ?$ u; D1 L
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
4 |( s( U1 |7 u: k% g4 M5 X1 ] -
3 Y7 [9 _: ?' I4 n% S5 ] - protected QuestManager()
& m- B+ O) w# j& n! X+ t - {
' w! h5 ?/ G. X0 S& K - }
% X% W" Q! d; ^9 j) s( l - }
Скопировать код 4. Методы4 j7 G9 j7 ]. F# a# }6 `
Метод reload(String questFolder) y0 b' T& L. Q% y& q% B
- public boolean reload(String questFolder)
+ U3 J+ [; p0 C) M! f4 ? - {
4 y% T% N" @3 K/ q - final Quest q = getQuest(questFolder);3 h8 l3 ^9 U: u ^
- if (q == null)
; _! z. q8 [ O - {
' k/ C% G- Q4 m - return false;. F3 E- G8 |4 Y$ [# w
- }. P% @, d; g* F) y8 U
- return q.reload();% U& Y9 p- ]2 @$ P/ |
- }
Скопировать код / Y" Q5 l }% u
9 I7 @) J) Q) `3 l2 E! E- n
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.2 y3 t+ n: V7 f! @5 |) g& v8 A. i) I
Метод reload(int questId)8 ^1 j& X) X" r/ l( ]) Z: \/ z
+ U& O1 n/ E$ l( t- /**
8 T9 g2 E+ {, ~% x' X- T - * Перезагружает квест по ID.
6 J5 s7 ~# g& u5 |- L - * @param questId ID квеста для перезагрузки
" A: I2 w2 \- N+ v0 f6 B - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае @4 R) Z- x! Y+ |
- */6 L$ I+ J- m1 a. I: P
- public boolean reload(int questId)1 j; _. o* W' S1 {3 Z D. T
- {4 M6 J" W& u7 Q0 O, `% U
- final Quest q = getQuest(questId);
$ X5 ]. p) T) f2 M; M6 z; A - if (q == null)
8 c, F: D& R9 |1 ^5 e - {( `& K+ |9 {3 P, A& F5 _4 ^/ @. F
- return false;/ l% D u6 I" K6 n; @% v
- }" {7 [4 B9 e. Y+ w9 z9 |
- return q.reload();6 p0 n4 O- a" ~6 X5 T) G" x7 _
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.7 W/ l; h' U$ Q% s) O
; M# `. z F& F! o0 a" p7 G
Метод reloadAllScripts()
) G4 p2 s4 D" ^; |* V+ Q; P3 L$ t9 \) G" n1 u& u+ I( I* g
- /**
! Q' R6 L+ b4 ?8 z' S# M - * Выгружает все квесты и скрипты, а затем перезагружает их.
8 S8 U! [0 c5 d* y9 G' a' t( H3 a - */3 C( y8 u5 i& y( Z4 _2 m
- public void reloadAllScripts()
. ]6 f2 ]- Y1 u - {
# n+ O/ `$ @0 I; l - unloadAllScripts();
8 W4 k; U% H0 X -
4 g. o5 W6 J# Y0 d - LOGGER.info("Перезагрузка всех серверных скриптов."); S- |' r! ~$ v$ d5 W* h/ I
- try
; `. _9 I8 z. [# e - {
( A) v! i d$ l& l* I. R% T - ScriptEngineManager.getInstance().executeScriptList();9 d& o# p* i+ e/ ^' I1 @5 W
- }# O' i$ y3 @0 V; s n
- catch (Exception e)
0 p, C" p- R2 P7 V" Y - {4 D+ L# }* i6 Q: n& q5 K3 C7 _
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);* j5 ?9 m( T, r" ^
- }0 I3 C0 x/ \. v" o7 U4 n
- + x9 J* d& `$ m$ _& ?
- getInstance().report();
% b5 d. ~/ V' e9 U- n* V4 A - }
Скопировать код Метод unloadAllScripts()* S6 W) l* L# k& P/ H4 v, W: x. J
! E9 f% m9 G8 H
- /**, e# j; G; C+ ]% U, q' Y4 b
- * Выгружает все квесты и скрипты.
3 l* i. e1 C' q, e* H - */! o0 H* x* \( y7 E/ c
- public void unloadAllScripts()
8 x( [/ ^6 j1 A7 P; y& [& T - {
0 W! O! {4 _2 s+ S0 R - LOGGER.info("Выгрузка всех серверных скриптов.");+ q, b4 v2 w6 H4 `, W
-
. P* `, i7 e0 Q8 m+ S, b4 r9 y - // Выгрузка квестов.& G+ e5 m# Z& P
- for (Quest quest : _quests.values())& u/ H, x9 j9 ^7 a! a' U
- {
$ c& V% g% H( ^! T - if (quest != null); h8 N) x8 u. b
- {- _3 b4 K6 U( u+ Q, n! F
- quest.unload(false);
0 g) f$ s8 x' f* o - }
$ D, N( N7 L) V7 L - }# P/ Q0 _# g% g5 Y, J- @
- _quests.clear();) z( P( I! H3 g2 w. P
- // Выгрузка скриптов.# d2 J/ x1 c; G m' y
- for (Quest script : _scripts.values())+ F, G& K7 o' X$ }: Q
- {
4 K, O8 @5 J* e( s - if (script != null)
+ Q- |3 ], k9 N. J - {/ Q8 m' N! `6 L {, C, i U
- script.unload(false);
) A* n, k2 R: p0 Z; y - }7 ~6 \, `+ e/ M/ B5 y/ Y
- }
" g* l! i t: h/ ~ - _scripts.clear();
) i$ Z( d: {4 g0 C$ m- |# A - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.; [' G( Z0 I$ D) O/ z
9 Q. v* K1 e- H4 W
Метод report()& r+ b, N; d) g, \$ {0 I# q/ B/ e Y; k+ {
$ x& V1 t2 g# m4 j( k
- /**# \% L3 n; @+ z! h% m* W4 v1 y
- * Логирует количество загруженных квестов и скриптов.
% _1 N* }( h8 ?, n - */
, |: S& J- w9 F! i3 s - public void report()
* w. Z3 ]% k# q - {
3 v: M0 r# C* w5 o* _; a* B/ b# a - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
# x$ D9 m' z4 U) r - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");' w5 _4 C1 Y3 [0 l- `
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов." y' t' k- o D7 A
9 x5 v/ ?7 f" ]+ R1 b% a) o4 e
Метод getQuest(String name)4 U$ h2 e! R3 U4 p; R2 N7 t; U
9 U( O+ v9 y% J
- /**
( |" e" l8 @: ^. Y6 P. H( A3 G - * Получает квест по имени.
& ?% ]/ a0 k E4 x, {- e - * @param name имя квеста
; H( r, G3 J! T: S! } - * @return квест; o" b: [3 ]$ c' @: Z
- */% a7 T6 D, M( v' U3 O$ [+ s( ^
- public Quest getQuest(String name)
9 G2 B. W0 t1 M; ` - {$ S. {. Q6 _5 i' y% N, x5 t9 F% {
- if (_quests.containsKey(name)): G0 |8 }3 S$ r
- {& g& ^4 _# [+ t) I+ i5 w7 ~3 \
- return _quests.get(name);
" H: K! I1 w0 T$ T - }
' |% \$ {; L6 R7 A) n$ | - return _scripts.get(name);8 U+ w& A$ p0 C; B' {. x; r
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
' A3 G# W: r+ W2 ^; X, J - Q; ]) K4 d* T* p: v/ g! R
Метод getQuest(int questId)8 Y, A$ y2 n! g
7 ]" h' o3 h: T" E1 u
- /**+ ^( ~5 f' G8 u. B6 z
- * Получает квест по ID.) g& _$ |6 Z6 _( y' C
- * @param questId ID квеста
Q% G3 V/ W6 J ?9 ]) O3 I - * @return квест, если найден, {@code null} в противном случае
: y( O, ~5 W% D1 I0 I - */
: s3 v( x* |' V) @2 H - public Quest getQuest(int questId)
v4 W1 k6 E6 N1 E - {
9 B4 C$ u4 a% j - for (Quest q : _quests.values())
" w7 m) ^% _# w: D - {( k$ i- w' F7 u; `+ }
- if (q.getId() == questId)
, e( J# ~0 l: r9 b - {" x& y4 U4 q5 G1 N$ w
- return q;8 t1 c& b* C! @! u# Q5 n
- }5 z; `: j2 q2 S; F; W; g' B7 Z6 t: Q; Y
- }
k' d( W T1 c+ p - return null;2 O* S' o3 Q) ~- n' t( }8 v" V
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.2 w6 w2 _3 Z8 G/ \
. U9 n3 w: ~4 X, E, F3 H# CМетод addQuest(Quest quest)7 |2 }- q0 {8 p/ R, m$ ?% c' J
: ^; d+ g" S. R G$ m1 P8 R- /**) G! g8 j- t! [9 z: |5 }& S
- * Добавляет новый квест.
$ d7 y! p* I$ U: ?, y0 Y- s4 ` - * @param quest квест для добавления
( I* _% I; H& m, L; q7 J) U) S - */% k* f4 _* j4 p1 Z
- public void addQuest(Quest quest)
* e' e; r, J3 p! g9 G - {1 c. {+ E/ u! P' f
- if (quest == null). j2 Q7 N- v0 S! @/ X5 l
- {
) r. y) W$ J. W5 h$ h) @ - throw new IllegalArgumentException("Аргумент квеста не может быть null");( y; C3 j' r* A" V
- }' i1 v; N7 ?! \8 f9 o% w" I; e4 h
- ) \6 ~; F8 z) M! r$ y6 X1 ? u3 e
- final Quest old = _quests.put(quest.getName(), quest);: R2 L5 n% ?3 i1 T1 E
- if (old != null), \. O" |2 G0 b/ z
- {. v: B- w: _8 [9 L2 w$ D5 g
- old.unload();- i6 u4 M L) y) n6 }1 n
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");1 V/ J ~4 b' h7 Y; x$ k
- }! L4 ^# g) u* R: N* }2 f0 ]: w
-
( x/ p. G. e% _ ^- O6 r7 A+ y - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)& Q! e+ n, z2 W7 n) q+ y
- {
# \5 L# M @. x) e. H# ~ - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();3 u; j' C n7 m- d$ H7 G* T z
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
* t @: S G' X0 t- ^ - }) u# r# u/ s; x. m/ R
- }; j: P) W% e4 t
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
2 G2 y$ u, v# d4 VЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
4 u9 X& a7 l. C# V, {; O, W" f# W: w7 p1 e
1 ~5 S' m5 I% f4 d! b8 O
$ Y: o8 C t; [9 }
|