Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius [Версия для печати] Автор: admin Время: 2024-9-21 10:39 Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius Гайд по основным Java-файлам ядра сервер L2J_Mobius / Q0 s! N5 S: d1 I: b/ e. ]8 ~ 7 P0 X5 g, H3 n! _% f' p9 _Разбор файла QuestManager.java; X4 S& f2 {! g' d
# t. k$ l' H ~Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов. ) @+ Q, Q1 Q* ~Основные элементы, w, k# `% j( t- F+ j5 t
Лицензия6 T' U2 {/ F2 A, d, n- h
Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии. b+ o. v+ l! x2 p* D
Импорты) n# e/ T4 d, ] F6 p
) \" x; @0 g8 G" c/ Z. J QuestManager.java — управление квестами и скриптами.7 Z& R1 k, A5 p% ^$ [! n Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\ 0 x6 c, h- g% n6 ^ 5 D: n+ w( N& L I, ]" d# {% U7 Z( A3 U0 Z
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов. : t5 c' V8 U/ b" Y5 y1. Лицензионное соглашение' a" ~3 P, f# _
/*: y# N" H7 w* T1 @% y
* Этот файл является частью проекта L2J Mobius.7 p& n# _; C6 C
* . s- i) B1 y0 n3 p
* Эта программа является свободным ПО: вы можете распространять её и/или изменять, V9 c9 n9 l, W2 ~$ S6 b
* её в соответствии с условиями GNU General Public License, опубликованной! C `) W* z* s h/ N# F8 b8 N
* Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии. " D0 T8 W. A, L
* 6 G$ h3 q/ q V& S f( m
* Эта программа распространяется в надежде, что она будет полезной, 4 p% g' T' Z3 w" P0 h1 I
* но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии % H8 ]* S, q. a0 }5 {2 T
* КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.5 c9 `& N7 T, ?2 l
* См. GNU General Public License для получения более подробной информации.& x( ~7 }4 ^- K& H5 E5 i
* ! y8 i- z1 X6 q. g4 Y1 V8 y8 b
* Вы должны были получить копию GNU General Public License: J0 n6 j! q. {6 q
* вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>. " {$ n I! |+ A- b: w; E4 s
*/
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3. ' u* `9 z5 B6 F 4 g) `2 E; _! h2 q. x8 o# E % I1 H/ X9 e. @( n1 v6 t2. Импортируемые библиотеки& G d% y j- R0 z# Z( T
3 x6 C: D; G8 N2 I; F# \* ?
package org.l2jmobius.gameserver.instancemanager; ! E* t6 Y. n5 a, [7 L, A4 {
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 — менеджер для работы с игровыми скриптами. . S( D4 N! D0 M4 f. |+ c7 y) u9 G
3. Описание класса QuestManager% G3 k* k1 f- ` ~- M! F
/**+ q% J6 i: f& W5 O$ d
* Менеджер квестов и скриптов.* q A& e0 q0 p' Z7 m. y6 n
* Автор: Zoey76 1 v. i6 f# e5 _" u' V
*/7 U: U; @3 w6 n( \, p/ O& Y$ Y
public class QuestManager1 _7 D1 ~4 r, Q% Z; e% ~0 d
4. Методы ) C, t# O$ `5 @% ~ KМетод reload(String questFolder) , K8 c. I; v: y( C; K6 F: o8 E/ c
public boolean reload(String questFolder)6 o+ k1 j$ E' i7 `7 |
{ 9 Y9 x0 A1 T( m5 ]
final Quest q = getQuest(questFolder); # w! r* t; C) H, X
if (q == null) : D5 H& E# G8 I$ L6 {7 M
{" R! \ g2 ^7 n2 f! c2 {' c
return false;0 C1 H& o' u3 W
} / f0 D9 a2 p* ]% f6 Y% N% u1 h
return q.reload();# e4 C, `; [5 C+ Z, g, A1 j
}
Скопировать код
) p; _' n$ ^2 f3 x ' }; Q7 K/ D% p+ F9 a) T$ @Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста. 9 n1 Q+ D9 j3 V9 l5 l7 _; v5 VМетод reload(int questId)6 L3 M; ]' M6 @0 y2 T! A* }
3 e3 h- m3 D% d. f- `6 \* }
/** + H7 |, l1 f; D
* Перезагружает квест по ID. f5 h5 {! J& n* G& n
* @param questId ID квеста для перезагрузки + R* w& L* \2 p7 @: y9 O. P
* @return {@code true} если перезагрузка успешна, {@code false} в противном случае' i9 z2 Q- e! M- v" r0 x
*/; S. a4 Q, p0 W" |0 G# c9 I
public boolean reload(int questId). d6 g: Y! Y# s* \ `: K
{1 v+ ]$ D- g7 W' a: S# j9 z# g
final Quest q = getQuest(questId); 0 C. W, @- Y) R5 Y. Y
if (q == null)3 y6 u& S* R$ I5 m
{/ K+ _2 S0 Y q3 b
return false; ; p/ v: ?, L5 ~. E6 x! d U
}7 q. O0 l; b4 t v
return q.reload(); ) N/ T1 Z, ^0 \2 r/ j C
}
Скопировать код
Аналогично предыдущему методу, но перезагружает квест по его ID.0 T1 n: I0 p" ~% G/ t' E
' O6 w& x0 h6 t, E8 C Метод reloadAllScripts()$ k3 R- ^0 R4 t2 I
( m: q) N* u& u! @
/**5 \/ R( R: I- S2 F8 z
* Выгружает все квесты и скрипты, а затем перезагружает их.$ W- h9 m) A1 i
LOGGER.info("Перезагрузка всех серверных скриптов.");8 j: ^# z! G, f
try5 G$ W; H& @7 \4 s) p( L
{( o! H8 d$ p5 ~ ]* s( D) V
ScriptEngineManager.getInstance().executeScriptList(); {; X/ @* D# T9 s: b
}) F) }2 Y; e8 k
catch (Exception e) 2 d% }" |: B0 L& B2 z R
{ $ z3 j: n, o, X/ U
LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);( @4 Z) b; @! V$ ~9 j4 ]
} P* S5 J2 r& v+ ]* f# B2 _
. v S0 ]6 Z3 s3 |7 J
getInstance().report();+ g: o: G9 k$ L( N2 }1 c
}
Скопировать код
Метод unloadAllScripts() 0 w: W+ O- @4 j2 w2 N2 T2 T, K# B8 w5 w* O$ Y: i- q4 t. O! k3 k
/** / F4 u8 y/ P' J
* Выгружает все квесты и скрипты.3 w9 X6 t, s2 a0 J$ p* Q& K
*/* F0 n% p. ?5 n, u4 [. ]% w% Y
public void unloadAllScripts() + J6 \0 }( {- J1 G2 z* N; R
{ & a: H" c' I9 R9 N- j; s1 p
LOGGER.info("Выгрузка всех серверных скриптов."); ( J. x( ^6 V( x, b2 a- Y0 A
# O4 @4 Z' q T; T# n/ X- U
// Выгрузка квестов.1 I; B* J( m \' }/ Y8 |, L% i+ c
for (Quest quest : _quests.values())) ?# }# P! Z& x+ R# H N8 X
{ . D$ \! v* i( w# t* M* I
if (quest != null)4 u; c2 G, W1 p; T
{& H6 `+ F4 s: D, G, F
quest.unload(false); 1 [. {( {' ~. _, m9 v
} 3 e1 l# V( M$ h% W6 Y' l8 o# u0 c
} + I$ [+ a& |" K! ?" P- \ `
_quests.clear();3 N. ]$ A5 [5 B6 \
// Выгрузка скриптов. ! B0 W6 x4 I9 Y: D9 B" A, S9 c
for (Quest script : _scripts.values())7 ~) [0 W: V8 u7 X z
{5 b3 @- u" g) E! d5 [
if (script != null)) G1 `' u7 b& G6 Q& C) |2 R f
{* d, h' [6 Z3 a0 ~
script.unload(false);5 Z9 ~" X9 i$ f7 H+ T
} . X5 i3 X6 l7 N* R7 j6 Y: | `
}$ l& R) l, p0 Z5 ~0 U9 Q
_scripts.clear();5 L/ i. ? q2 H! b6 x8 W1 E
}
Скопировать код
Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.8 g1 h9 b3 r" S1 t {6 z1 d
- R) K$ x% F7 {9 H2 c+ L1 FМетод report()* E1 v. s: ]7 T" F
1 I& ?4 Q9 U* k, W+ P6 J/ b8 v
/**/ S, G0 l* }* x8 v3 m- q2 e8 f4 o
* Логирует количество загруженных квестов и скриптов. 9 _8 P# B$ K0 q% c
*/ + J8 J9 m1 G3 T. ~7 S3 c
public void report(), V8 p+ j: L2 z0 w) j% [: p7 z) H
{' k% Z/ K% P1 W/ W8 Z
LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов."); . \, F8 X; T5 Z. t
LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");, S) u6 m. K1 p# T8 n1 d$ S
}
Скопировать код
Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.- b, h) a' y+ @* U ~* s# E B
/ _* c; K! ~: p, b7 P3 I3 S Метод getQuest(String name) * M: v' Q: T5 H7 ?. p$ d* N; g- I' H
/**. y; ]3 Y: x \# G% f
* Получает квест по имени.; U* \. m# L/ w2 M) C
* @param name имя квеста4 `: k) m. Q" G7 _/ J
* @return квест1 R! v- @3 B4 R5 k9 A: Y5 O
*/% _$ d5 ?5 Z0 w% @
public Quest getQuest(String name) # c- @. I b; i8 B( E2 p
{ + I- {1 Z3 ~1 q9 H1 h- w
if (_quests.containsKey(name)) 7 M' l0 [, W7 Y: d2 q
if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)% T5 K4 H, J5 V+ F
{ ) T( {# h% d1 J$ ]% _$ Z5 \
final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();# W j/ W+ d: y# |9 Y7 v
LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");+ D3 E Z. i" Q1 [ w+ J1 ?
}5 g3 I5 V( c& H6 h
} 0 |6 V5 c2 F7 q( s( O9 q
``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера./ g& a/ ?2 X5 ]1 K" Y4 j( V6 w1 J ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере. + `# u" H" T: u/ l& ?$ @* P$ n/ L% J' Z# b: N6 i
6 n9 i! d& e) N) z0 F4 o. P/ X) q$ t
Добро пожаловать artace.ru - творческий сектор (https://www.artace.ru/)