Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius [Версия для печати] Автор: admin Время: 2024-9-21 10:39 Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius Гайд по основным Java-файлам ядра сервер L2J_Mobius % p/ e# M! P1 m- l+ }. e) c* K- q: [6 k- V' F Разбор файла QuestManager.java / h: {4 r% W; m6 q7 _9 M" g: |6 N h0 t$ A7 d/ }* m' T* w
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.6 m6 V. ]1 a2 ]9 H2 d% U Основные элементы' W$ J* ]% ^! {8 o1 D$ F0 k% r
Лицензия / d- T8 u% `$ R' l* m
Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии. 2 F, E! l* l2 C! F) T
Импорты% F" A( ]/ x8 _5 [) g
* `# G$ a8 _. M) C, v! A; s& h QuestManager.java — управление квестами и скриптами. y# c* B$ Y( c# y Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\' q/ y) m7 l2 }% T
3 X* X( i2 u) A7 U$ @
. h' b5 o% M* h& F1 W. t8 TДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.3 P% ]6 W D6 |7 ~ y E: e 1. Лицензионное соглашение- K1 L0 e5 X+ w; H' j' l
/*; g% C- w. j# ~( G) ], E
* Этот файл является частью проекта L2J Mobius. ' U9 |; c) k9 a Z$ i
* ) [# v/ q& i( \6 q4 W
* Эта программа является свободным ПО: вы можете распространять её и/или изменять + T0 m$ {# g9 F- N. n4 q
* её в соответствии с условиями GNU General Public License, опубликованной" u" b/ o$ k I! C S
* Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.6 b/ P4 Q j0 C
* " e) e6 ^' G, c& J3 @
* Эта программа распространяется в надежде, что она будет полезной, " M: e$ J: p6 U& u* W! @# w
* но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии 2 m, l: Y3 M) N5 X* ~
* КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.& u$ ^- w H; p. d* z1 D
* См. GNU General Public License для получения более подробной информации." k! j4 x1 e- i M
* ( o) d1 }2 X' o$ @) q) B8 L0 h
* Вы должны были получить копию GNU General Public License: ^+ C! Q8 E" V
* вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>. + S5 I2 P( l; q5 e; B: O' ~$ {1 |
*/
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3. " K: `) B' o9 \5 p% u: c8 h % c; I' c* F7 d' N $ F6 ?/ m- O S$ w! Y2. Импортируемые библиотеки % K" ]. n! [ o0 V( i! k' a ' t; D! S& b2 u/ l' P' _$ _- r" z
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 — менеджер для работы с игровыми скриптами. ! v* z$ ~ I5 _# ?' j$ | % b1 s" {& _/ S0 T* s+ B3. Описание класса QuestManager/ O6 ?# D0 c0 W* I, A( {4 |# I
/**" V" T K8 v8 r; K
* Менеджер квестов и скриптов. - p. Z5 ]* v0 t) [7 k; E' M
* Автор: Zoey769 s9 Y# M, L* a) ?: J
*/ 4 n. Q& v; p$ G" E* x
public class QuestManager & O* ?+ Q) U4 }; d8 |7 L
{. A4 A+ w9 c! C3 J) j2 n- c7 g! A! c
private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName()); " h% C! R' \/ u) ?# k
4 Y& q3 e. D% `7 j
/** Карта, содержащая все квесты. */ 7 @/ t( Y' J# h3 m" ^( X' e
private final Map<String, Quest> _quests = new ConcurrentHashMap<>();- \0 v5 C; ~/ T" W# K
/** Карта, содержащая все скрипты. */ ( f# M; w0 u+ S( i( g# \3 {' q
private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();8 x2 \; {5 F2 j H* F% Q
4. Методы 8 b; ]. f; p" ^0 k) D' A4 Q8 M) cМетод reload(String questFolder) " z% S5 H5 p% {( ?" W
public boolean reload(String questFolder)1 q: n2 |% K0 Y$ ?' h+ V
{1 S f9 H: i5 u/ d# l
final Quest q = getQuest(questFolder); , |8 n9 I# A: _: q: F+ K
if (q == null)5 \& p) c! {& T
{ 5 y2 B- {- i2 l' S2 T8 A9 \' j( N' @9 A3 z
return false; 2 @; n! ^$ r3 w- J: P
} 4 o, l9 P+ G7 X+ [' u5 Z
return q.reload();* Q' o) L; N8 L3 s
}
Скопировать код
9 @- r% `" l4 v, p$ P+ _' H
* K5 r8 y4 d7 e, ]7 yМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста. ! n8 L4 m% y; J7 _& X" v8 xМетод reload(int questId)* b& y$ I" X E: T% z9 \
' G5 I) f5 s- V: w. Y. G
* Выгружает все квесты и скрипты.: t& L- n/ E' c. n+ M6 _: `7 e
*/ 3 }* } Z4 I) d1 n& f$ S* B
public void unloadAllScripts() " n: p2 T% ~1 p& s
{. s6 L. o& L0 F. x0 S" g' j( ]
LOGGER.info("Выгрузка всех серверных скриптов.");' c1 Q. u# X$ J4 Y# q4 h
7 x3 O6 R+ L- ~" Q
// Выгрузка квестов.. S0 m' J8 H7 C+ A# V M" X
for (Quest quest : _quests.values())5 C8 A% e0 c/ ^& D2 m
{ 1 A9 n% j: D: O8 J1 ]
if (quest != null)1 k0 x Y: A3 I2 @* o( G Q
{; g' y7 u# Q) w1 V) q! l
quest.unload(false);; i& `. \* O( u1 i# ^0 d
}( o5 u. B* B9 i- h$ |
}8 G9 L" d6 m; z$ U* w8 \% m
_quests.clear();7 C! r U# W3 G; e0 m5 T
// Выгрузка скриптов. : F! x& B6 p5 u
for (Quest script : _scripts.values())7 w8 U; D5 C6 I+ K' X: d/ q
{ 3 o& _7 R/ w# V- ^! W- C# c
if (script != null) . _& S6 H7 S; Q9 B) Q
{ 3 {6 a6 d8 Q' L5 P- Z4 a4 {
script.unload(false); # @8 o7 }8 ~; I4 p( ^% j
} 2 c* ^- J$ |; |0 @* o) y
}+ ~" G) m6 h( b7 x) A x
_scripts.clear(); . C9 n" F6 v" J
}
Скопировать код
Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts." x) O! Z0 V2 P q, _ U# V
- e1 _4 b0 B9 }* ] Метод report()7 ~3 o4 w g- E1 U! X2 V
" H' \* z" C/ {- B. B
/**- m& @8 k. r9 y* p* v
* Логирует количество загруженных квестов и скриптов./ L6 `! E5 ] u. Z4 q* K! o6 i4 _1 l
*/ 3 Z$ B6 q$ R" N5 m% V
public void report() 1 T# f1 o4 g$ s0 [& w! m% I* H
Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.: W0 B6 v# u; Z/ }8 \8 I: i# J" I; o
4 a6 v# t( g c I" L0 c4 Z" M Метод getQuest(String name) d9 v9 v0 P* _5 ^, P6 f; B$ M |0 O& Z! y$ w$ P* B4 J1 z/ J
/** ; A! C/ ~6 s$ L7 q" n; R- |; |
* Получает квест по имени.3 c! f1 q6 I8 r$ m6 L
* @param name имя квеста " o4 U! |0 J3 V9 L& {
* @return квест - @/ v$ y$ k/ j, x
*/ / p8 I6 z3 {! ?2 T# C$ c
public Quest getQuest(String name) / C: s# t1 W; X- a8 u
{: B2 U: `( m2 b7 l
if (_quests.containsKey(name))" E0 Y& Z' t' p( t6 {$ A" S" v
{ 3 J# o. h$ d( e# m/ i/ a
return _quests.get(name); 3 W" H$ C. k* V: K" t
}' r5 \5 n$ I; e) e2 a, L
return _scripts.get(name);1 r1 l. I: N7 M3 \5 i( G. g3 [& K
}
Скопировать код
Этот метод возвращает квест по его имени, если он зарегистрирован в системе.; p8 Q8 d. q i7 `: B
: G+ x% |0 A8 a- Y2 pМетод getQuest(int questId) 8 h* w! T) J: l2 R- F5 {# ~- |. F , t3 l* e8 R/ x! k D
/** 6 n7 F5 a% L! h" o! s/ \ {
* Получает квест по ID.$ e4 s; o M$ p; w7 p0 J6 `
* @param questId ID квеста4 N* `" \# R+ O5 k2 _
* @return квест, если найден, {@code null} в противном случае % }3 x& I: ]6 v) v; b7 J8 T) m
*/ : {5 C3 h; |3 ]) i
public Quest getQuest(int questId)8 b/ J$ Y/ ^$ G |6 @
{ ! G7 \1 }$ v& J: [0 g+ p6 Z& V4 ~
for (Quest q : _quests.values())1 @; |! {9 U; y
{; B' W! i K: ^5 E
if (q.getId() == questId)( p! V) ?- M2 L* O" q
{9 b2 L- l$ I/ d# f& ^( _* i: M
return q;: b8 w& M. \% `7 K3 a5 @4 w
} 8 b6 g; b7 |- [" ]* y& }. |& z
} 4 R6 _/ y% f$ a; Y/ @! ~6 L
return null;4 \* p, X1 z7 n5 f B9 i6 W: ?( }
}
Скопировать код
Этот метод ищет квест по его уникальному идентификатору. " s$ Y/ w$ Z! h9 J
* A6 R% _8 G. L3 G6 x' y7 N/ _ Метод addQuest(Quest quest)0 m2 R5 O! |# [$ D' N3 Y& ~6 a
& [; Y# h+ B. p7 g1 W
/**/ h1 m6 g/ Z8 h+ u( T
* Добавляет новый квест.8 u( P1 t" N( [
* @param quest квест для добавления6 G& ]: r* b5 S/ e
*/4 ?4 {) j# @# p) C1 I; G- ~+ n8 ?# o8 w
public void addQuest(Quest quest)- v$ x4 R* ^$ ~" t/ e1 O* K; z
{ 9 }/ n+ |5 k$ w% _0 G; [5 h8 ], A
if (quest == null) 1 J, Q- Y) B; V* M/ P8 ^, p
{ @' D# ^0 a# Q
throw new IllegalArgumentException("Аргумент квеста не может быть null"); 1 ^ x, J/ v e2 M9 |
}# q2 s& |# Y& Q+ A* R
1 d# ?# \. s8 E1 I- h4 v) |! Y
final Quest old = _quests.put(quest.getName(), quest);6 Q3 ~6 m; u% g* M
if (old != null) 3 N4 \! V! l0 b! k8 m
{9 Z5 g3 Y8 F6 e2 V6 |
old.unload();2 P9 Q! Z& ^ U7 Y$ x
LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");; U5 }0 x2 N* O
}- K$ `& h& Z- Y
: L7 f" F, b( O8 h, w- x3 M3 J
if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS) ! {4 z5 A# s) M+ U- p+ j$ a4 Q5 `9 T' ^/ O
{( @# X) M" X S. h3 V; X
final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName(); 9 o, }* X/ u# h, ^, j
LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + "."); ! m) r- G" U6 d1 ^' g
} 7 q+ J/ U' J! l6 N5 i2 `; J
}9 r/ U( K3 X$ J( A! Z B% J
``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.* c5 _5 c% C/ i, F! k ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере. / b" R. U5 V& p! Y+ u1 m. U9 F' }8 q9 ?) u5 y: S; u
, c" [6 g; D' k" n+ F+ j4 j
$ I, M' k2 J& A! z; B% v. y& s
Добро пожаловать artace.ru - творческий сектор (https://artace.ru/)