Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
. L& c8 Y' q% L* p6 d% ~( z0 s: S- ^+ l/ l" l, y
Разбор файла QuestManager.java4 c4 V9 p/ `0 O4 K/ _: }
. `) n4 p0 P$ x, e! i A
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.9 v/ I' ?8 o7 n0 k
Основные элементы/ ]$ b( |: F0 r' m
- Лицензия$ m6 d5 K5 F! N1 D& f* T# M" e
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
% j* D+ a8 y8 h, z3 |1 b7 e1 P
- Импорты
% {% T* [- v, _. F- b5 [% M I
) s5 b$ x1 h5 |$ |: ~QuestManager.java — управление квестами и скриптами.! {8 }& {& _1 P6 ]. H' i5 f
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
, C* }! x7 |( x) y- t7 b0 w% K; P) ]3 x
" |9 I) j. }0 p4 N7 O/ K2 P- t
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.. D" d$ ~ Q# \" q# I1 M
1. Лицензионное соглашение7 T2 A1 L9 p# p
- /*
, f$ D# z! G8 e) X' H3 v - * Этот файл является частью проекта L2J Mobius.8 a% E$ l; B3 g% E$ R- h
- *
/ v V ~, y% x" Q; M [7 m0 x( C - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
. }. W* v$ P/ }, b - * её в соответствии с условиями GNU General Public License, опубликованной
; @1 k* F" \4 o8 o" s( M5 @& ? - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
- l& `0 p2 w, A+ {/ u* S5 C - *
( U, U" C7 e) X' i3 _$ J. H+ U - * Эта программа распространяется в надежде, что она будет полезной,
6 g" N- ^$ q* U( C+ P8 s3 C - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии+ v; z O* W1 b0 E, h
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
; s$ X8 k) }0 K7 w3 ^ - * См. GNU General Public License для получения более подробной информации.& a5 g4 h( t( T; U# r* u
- *
! }9 ]. g3 H6 H7 C# |) N ? - * Вы должны были получить копию GNU General Public License
7 G a! p; s7 E9 n0 V: t+ b! r - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.& I, c& f. l3 Q8 X! h4 u, ?
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.( y# u4 ?/ _- W: W0 i# t
6 d9 [8 P+ d6 u7 H# W, d4 _( s8 O$ _7 X: M4 C
2. Импортируемые библиотеки. m" u* O+ [6 N* F( H
3 D6 ], P8 R2 I+ O$ J' f- package org.l2jmobius.gameserver.instancemanager;- |) d. I5 ^$ I6 D3 e; i- F. P
: P; b& ]& I# Y) g" q- import java.util.Map;/ u B% O4 P c' O* I
- import java.util.concurrent.ConcurrentHashMap;0 p4 _1 |* s3 e) ]% U8 x5 _6 l3 Y
- import java.util.logging.Level;
, q' l p$ b0 x |8 X) l/ W - import java.util.logging.Logger;. \% z$ @# n! O- V/ `2 G
7 \; z8 e% t$ L- import org.l2jmobius.Config;
0 h8 o3 O: T; i - import org.l2jmobius.commons.util.CommonUtil;
; K2 b- {$ G% U. O8 ^ - import org.l2jmobius.gameserver.model.quest.Quest;% Y$ _7 _" O: s; e* `
- 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 — менеджер для работы с игровыми скриптами./ U& m. K5 o. K1 U4 G, m! e, h. H* r
* \8 @* M1 \8 P" ~2 r. x3. Описание класса QuestManager& r; [1 Z5 l( [/ `
- /**
5 a: y& ]4 U0 T) S9 M - * Менеджер квестов и скриптов.
* Z2 A- w' X' t y- k' U/ M( J/ q \1 K - * Автор: Zoey764 D3 R6 c+ ^* Q' T% @
- */3 Q @. `9 F1 f$ i2 @# v3 x5 H
- public class QuestManager" v q+ R4 u' W- e% R( v+ m, J3 L0 {
- {
! C" O* w# q- V( `' G- u* s7 O& k - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
2 |/ ^: [! C+ r' E -
/ T) q' C! K8 D- M3 Z" h - /** Карта, содержащая все квесты. */9 N; E. H7 Q" D. L
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();3 Z, j" r& b5 T2 u
- /** Карта, содержащая все скрипты. */, @ k5 u3 I1 t: m
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();+ _, d% [0 ~3 Z" T1 q2 P2 C) R5 t
-
. J* e) e; N# g& m. K0 N - protected QuestManager()! p& m0 \4 N. R+ w5 I, A3 s- D/ Q
- {
. b1 K7 s/ _9 w: C& P6 [5 I - }
% r1 b. s1 ?; v1 ^ - }
Скопировать код 4. Методы, Y# V% f) h! w
Метод reload(String questFolder)4 G& I; n# P0 f z: u
- public boolean reload(String questFolder)8 Z$ O6 x3 [7 j% O2 l2 F
- {
. Q9 p. h7 M6 G+ }/ s4 a: ^- h( ~ - final Quest q = getQuest(questFolder);+ B* D" V) |( P
- if (q == null)
% g* a3 R" i6 R) V" n* K. | - {3 i! _0 U, ^5 \% ]7 V
- return false;- \9 y5 U+ E# I/ M' @! }5 E$ }# O
- }
8 ~# F+ d1 R- H1 t3 `& i - return q.reload();% F$ C7 T3 ~1 e( x8 n* e+ J) N: H2 E
- }
Скопировать код 0 J3 ?. u2 f: w" E: a& i3 Z* V
- H2 e, v4 ?3 r$ m: u% \Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.( y/ U/ n0 Y* C; N
Метод reload(int questId)
+ @, o" K, J* t4 n/ H* K @0 o9 A9 M
- /** J$ |$ r! s6 V
- * Перезагружает квест по ID.
' p! D$ k8 B7 J4 u - * @param questId ID квеста для перезагрузки
+ W( t, S0 U/ ^ - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
! N4 b f: |' Y5 L0 f - */
5 n' z9 Q' C! d- {9 d - public boolean reload(int questId)
R* e. s1 l: z8 X - {' \& Y. ^- ^ m; K
- final Quest q = getQuest(questId);
: a$ J5 A8 ?1 }: h; g - if (q == null)
a6 E6 ^: u! B2 r) K) z+ r - {
4 |3 N6 J3 o8 t4 {( f - return false;9 y* o# ~$ O4 j, ^
- }
) W% F8 i% A7 G4 j1 P - return q.reload();
5 }/ A( ?4 l3 Z! j* A- `7 n" E2 u: A - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
% E' W* o7 A$ w) n, y# D/ e- b ! K# R9 r! H, A: f$ j. H% E
Метод reloadAllScripts()
: v: f" b, N0 {/ ]; Q% L' r% S0 N7 X
- /**
; ]: B: {7 e) o - * Выгружает все квесты и скрипты, а затем перезагружает их.$ r4 B0 {2 h" N( B$ j, S3 T
- */, P. N* ^1 n0 s" h3 ]; {
- public void reloadAllScripts()9 X9 U5 Y6 Y! N% D" a
- {! m0 Q! e8 |2 U% w5 d- A) p8 @. ` J
- unloadAllScripts();' D. M" R2 d+ c4 D7 ~
- }( X9 Y$ r$ Z! X. G. e: }# Q1 q6 t
- LOGGER.info("Перезагрузка всех серверных скриптов.");& n! E' r0 G% }5 V. k5 V9 D) S
- try: I' U9 {3 x/ K& q! p" V* X! E" i
- {' G/ ?4 n- _) f" _6 N# A
- ScriptEngineManager.getInstance().executeScriptList();/ x) a; O- u) t. Q$ P1 y: [9 h1 v
- }+ p" ?6 Q* |6 s5 P8 q5 w
- catch (Exception e)+ D: ~# `% f1 D" ~2 x/ }/ {4 h
- {
" g4 d8 U. q+ ^" |- i- M - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
7 D# {7 P1 Y4 M# a/ N' t; ?4 c - }
0 Z |! ~8 }$ v5 ?6 L0 L -
* {& n3 k# M1 v3 L o) @3 b2 x - getInstance().report();
' t4 E9 H& U1 \6 ?' h - }
Скопировать код Метод unloadAllScripts()
_- S9 \. h- _! S, Q
( r, ~1 w: a! ^" n- /**: j: V" |5 q# r# z+ X9 J/ Z
- * Выгружает все квесты и скрипты.
+ z) [7 g! D: H, F) e* | - */$ ^, ^+ [/ |3 A5 H% s5 I7 x/ w* D
- public void unloadAllScripts()
% L- Q1 P) M3 `4 k5 r - {
9 h T; y! A- o) d. e! C - LOGGER.info("Выгрузка всех серверных скриптов.");
2 J1 ~3 Z, Y3 P, z% t4 F -
+ m7 Q& F. j& ]7 s' B, \% q% s/ ] - // Выгрузка квестов.
p7 |! I6 g4 V! m* C5 V' b1 { - for (Quest quest : _quests.values())
7 b# J! M" [) s" _% S - {& M t/ Y3 ^& Z& v% ~
- if (quest != null)9 ~4 i* Y3 Q, R! t% C* U
- {
3 [: a' Q8 b8 ?5 d |" [) n1 [ - quest.unload(false);
% u" D7 W8 x; q# e: j - }# D+ o& T# r& x' R4 W0 }# y x! k
- }
$ c+ v; W, m) L7 K - _quests.clear();' f9 t8 {1 J4 t5 K- T2 H8 i, t
- // Выгрузка скриптов.
- n8 Y, `* R* N3 C! O - for (Quest script : _scripts.values())
$ T+ `" s% k! @ b - {
' Q, [- f7 \8 N4 B3 p - if (script != null)8 }0 d6 C0 g1 k6 j. e u. d
- {
( N J& \7 H# i8 p - script.unload(false);
* G, q& D( W r7 { - } x/ v$ ?. l/ {- B
- }
" h( D' v$ z& P# D% y - _scripts.clear();
# N, u$ x1 w6 O+ S* w. R$ b8 _7 @ - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.2 N2 u" ?9 {! {& {& c
]6 q' D) p! N" e5 N
Метод report()* e' W) T+ c' _. j, y
" `+ T [9 p# y7 A* S) s: e
- /**
8 }( M* ], U9 }2 d - * Логирует количество загруженных квестов и скриптов.$ `" L2 r, \0 B$ w
- */: o0 i4 |9 K$ t
- public void report()
5 t! d2 d* S6 P8 w& _6 P - {
; R) ^) O: V9 A6 `) j/ Q - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");# @2 r# e+ N7 z
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");& a' m7 @- i! Q {+ }# B/ A7 t. V
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.3 p- {6 c* e& D
! p+ A) P. d7 p! ?9 M# c, Q6 |& P
Метод getQuest(String name)! {- r, ]( v. e0 U
- R: e! i5 H. b& `# t
- /**% j1 [% {8 ^$ K y# s9 i4 k
- * Получает квест по имени.0 V! t) J3 ]: ?+ k+ o
- * @param name имя квеста
% T1 P+ J" K2 q - * @return квест
$ I1 d/ o: L1 W( L - */: I0 }4 Y! R6 B" A' k! _1 ?
- public Quest getQuest(String name)
/ {' e! m, V) r5 H - {
( _$ c! z5 y& {( _2 w* Z5 c - if (_quests.containsKey(name))
" Y- o! R$ g w0 n( L. ]$ ~) T - {
. D# A& r6 x [. O - return _quests.get(name);
, S/ o9 N' s5 J: z& c$ { H - }+ B3 j! w3 P/ j9 f8 x I# X1 Z
- return _scripts.get(name);' O1 h' k/ S) Z
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.+ w6 l8 T. ~8 n
8 X7 D" D; x/ _4 VМетод getQuest(int questId)' U1 H: ]8 w3 h Q! V6 w( {
( E; ^4 ~% a5 W. Y# S
- /**
4 M9 W8 ]2 D2 }; `2 W' Y, \ - * Получает квест по ID.# U- h p6 h+ p$ M
- * @param questId ID квеста
" I$ c" }" a: }4 ?! w5 [+ R - * @return квест, если найден, {@code null} в противном случае
, E; S9 U7 R/ k, u! g9 u - */1 W: M; r- n% n' r
- public Quest getQuest(int questId)& a/ A7 [4 S D d4 [. _
- {' q+ Y/ U. C- I& Q X h
- for (Quest q : _quests.values())
# k5 D/ E' n; f3 z' y& @+ X( j+ G - {/ z9 o5 K" v- x. u% S
- if (q.getId() == questId)$ V+ H0 Q/ G; p* E: C* z
- {6 P- S/ B$ L' Z8 `8 N& Q
- return q;
, v7 Z( l) u6 D* {0 z5 u - }
1 H. @ V( n, w% ?- s - }
- h5 l2 R! W$ n( ~0 v2 h$ Q5 c - return null;
7 P8 F/ n: C0 m0 E3 y4 n r: e' \ - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
* t9 o( w! p0 o, w
' C! }$ Y+ ]' m' T$ i! K0 zМетод addQuest(Quest quest)
4 o6 q4 h& ~0 a) F
: v" B- Q4 T! C4 [- /**
6 T: A9 Y' {/ `" J - * Добавляет новый квест.( j: ]+ P* `: Q; ?+ X, F
- * @param quest квест для добавления
5 v7 ?$ N) u+ W' ]' K2 A - */( m5 {' H1 G5 o+ d7 N$ M! F
- public void addQuest(Quest quest)
& E Z( `+ h1 t- q ? - {& a2 b9 ~9 m6 n2 y& b# G6 n
- if (quest == null)
6 z% t: x8 k5 S9 {9 | s9 ^8 v' O+ p - {
7 X' r( N2 w z4 y" W7 d% A - throw new IllegalArgumentException("Аргумент квеста не может быть null");* g! c# J9 {- E( X+ S
- }
/ ^+ O* H: {' w$ L - # y% w: u, Z9 u# F0 h$ ~
- final Quest old = _quests.put(quest.getName(), quest);9 m& D1 O" Q- w3 A+ f. m
- if (old != null)
! ~+ {$ w' g' g" Z. K; J - {" C. w* y1 z6 t
- old.unload();. @; n( D- l, k/ u# @9 m' C% p
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
3 X: a1 j: N- v. T8 @. b6 e - }
* v4 O/ W3 ?+ G7 [: x+ ] - - T2 v6 E4 N# m) x. J" t; M
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS). u, f/ ?8 N1 M; \
- {
; B; r; i) M! m& t& h - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();% _3 B# Q; ^3 ^
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
: B- ~9 s g2 A6 { - }
% R! ^ _! h; o$ i V - }
5 j3 j/ R+ D6 V B8 F2 W" x7 i+ W - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
! y( H1 K* |1 n+ ~+ Z XЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.: E- V" w4 t( @
* k. ]( p$ R+ R% ]8 B2 u
$ l+ H& N! u' i. V! a9 x7 h
& ^6 e" [% b% i) V: y |