Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius [Версия для печати] Автор: admin Время: 2024-9-21 10:39 Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius Гайд по основным Java-файлам ядра сервер L2J_Mobius7 _8 {& S N! O9 t$ U' x4 i& ?
3 J: m1 [/ i1 h1 E- ? Разбор файла QuestManager.java - ~+ F0 ]. E' t* R4 B6 C( @ + f# J- E9 P. x3 G8 h2 VЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.$ z. p( f! p3 o; v9 X+ B Основные элементы) X3 e# n1 n& @0 o2 H
Лицензия7 H. k7 [# w& e
Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.$ |: i' M; G3 [
Импорты B0 W6 K; r) A" V3 C
0 |) ~% O5 d& o. pQuestManager.java — управление квестами и скриптами. % Q( ^3 e. U' C0 fПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\, @1 g! M/ U" t8 n( z% ]; X1 \
) H% n w0 u( L 5 G5 ?8 ]+ M. MДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.+ a8 K, x/ v$ N; d9 c 1. Лицензионное соглашение $ P( V' V, h) [6 Y
/* 2 A( L' m p. V2 s% _) v \
* Этот файл является частью проекта L2J Mobius.$ z( p- }, @. n. _, h5 J
* 6 C: v( [% t* W( R
* Эта программа является свободным ПО: вы можете распространять её и/или изменять* {7 S$ N9 G9 u. ^3 o
* её в соответствии с условиями GNU General Public License, опубликованной * _$ @4 P& A( Q
* Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.- ]8 f, W$ M& M5 F4 ]- N* Y
* * P4 ^: |* m* U5 i8 u* O
* Эта программа распространяется в надежде, что она будет полезной, # ]$ p/ R$ ~4 v/ a
* но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии# d8 v* u- U# V$ r; b, _& v" a7 g9 ~
* КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.2 `$ `! G* q/ W' r2 K* C+ K5 S' q+ t
* См. GNU General Public License для получения более подробной информации." e3 }% G2 v. y! D5 H# Q
* 7 a- }2 G3 ^# Z* a% k+ P! X
* Вы должны были получить копию GNU General Public License$ H7 [8 R; Z( b5 j: B0 p3 p
* вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>. 5 C3 J! u- d) t% |! x9 e
*/
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.7 Z: M8 x7 D! f C) @. H0 G Q
# S' V6 y% Y' J8 y- x, L) P: X7 c5 q, s5 H" F) {& b' Y 2. Импортируемые библиотеки5 }% @) Y {* h4 p! I2 s2 _
1 S! C, ?. ~" s2 |, n: O/ q4 \; }
package org.l2jmobius.gameserver.instancemanager;: W5 D1 {; U+ }2 M8 p
1 a P' }+ G- G3 V
import java.util.Map; 0 Q" _( T5 ^1 W! h7 Z
import java.util.concurrent.ConcurrentHashMap; 9 o r: c: }1 @9 {5 H2 ^2 H( B
import java.util.logging.Level;2 z8 X T$ r: A3 b; C/ i
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 — менеджер для работы с игровыми скриптами.8 {3 M, b* @, O1 J1 `0 k% K
* n- O$ h2 Q$ t" s, b2 r; Q9 J3. Описание класса QuestManager0 ^" B, n* {; Y4 k) q3 J& B% G! D) ]9 u
/**0 a- L+ C6 N- t) v; q( q8 h
* Менеджер квестов и скриптов. K5 b& B6 j& L: [& Z; L
* Автор: Zoey76 , k, ~; l4 ^8 x* V1 u' f8 b( c
*/ 0 @5 D$ L) k$ } S! \
public class QuestManager& ~2 Q8 \+ A7 w3 |: I1 n% x
private final Map<String, Quest> _quests = new ConcurrentHashMap<>();9 Z( m4 v+ K) ]+ k4 X1 `7 }
/** Карта, содержащая все скрипты. */& P- C- H) f. }9 s( m3 b7 T6 A
private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();1 `( s5 X5 u! y' Q e2 T" d2 v9 ]
6 ]5 \: i* d+ i% x' w
protected QuestManager()! G8 v2 ~/ _; ]
{ 6 }5 g4 H2 J% w6 |% @: c7 W2 a
} % h" b4 _8 J4 b5 \* M! X
}
Скопировать код
4. Методы: J/ m4 n2 J8 ?% f( `/ o, x: K Метод reload(String questFolder)3 k* ^& D& r V2 M9 _
public boolean reload(String questFolder)2 u/ [6 N* s' b; U1 v% k% I+ _- i
{- t$ b5 |( b( C0 O# P6 A
final Quest q = getQuest(questFolder);) _4 \% Y( N, r G
if (q == null) ) |4 `7 x9 Z( @
{8 C# j3 \; ?+ A6 L+ C( W9 Z& b8 c
return false;9 }* m( [* Y! @' A/ H, J5 ^; S/ L
} R6 n* t* ]& c& y" R! c- T1 j5 R; q
return q.reload(); : @: e l& x) x) C; o
}
Скопировать код
9 B h7 D/ T9 F. Q" S! U8 ~( d Y* d
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.% K# j+ E/ Y+ r Метод reload(int questId)- W* [6 ^( J$ n3 v& n
4 t( z& i: R, E- h& ]
/** 5 \9 w. y0 V( _3 d) N
* Перезагружает квест по ID.% Q7 [1 t9 w# U* P
* @param questId ID квеста для перезагрузки3 ]( ^* _0 G+ p4 x; Z
* @return {@code true} если перезагрузка успешна, {@code false} в противном случае 3 {+ A/ ~, Z' r- E k- \
*/& q7 a2 T3 L8 S3 q6 l& }' `
public boolean reload(int questId), j2 a9 K9 R3 d/ _" B4 N E
{* P5 T) ?. c3 S) n/ n6 y% u
final Quest q = getQuest(questId);4 H2 b# f) R* h( e
if (q == null)1 ?* q+ x$ q C
{ 9 S, z, _9 }8 L
return false; . \& [: C" \7 Z& @/ N; g
} ) @0 {% Y; Q- V d6 N$ a- d
return q.reload();; z2 W% i- R5 I! T+ z
}
Скопировать код
Аналогично предыдущему методу, но перезагружает квест по его ID. + U' g: Y+ Q6 m8 q- p4 d
1 k4 ~5 C( d9 vМетод reloadAllScripts() 7 A1 v& G9 O6 J. M b3 o1 r5 T, ~: E8 @7 I( H- \! u
/**9 [9 L% a9 ^; W7 x
* Выгружает все квесты и скрипты, а затем перезагружает их.: o. M. \% O; m2 V+ |5 O
*/ ' X9 z# h6 \( |& n; I
public void reloadAllScripts() . n, g3 b, p; }+ c
{ + c9 x* s) e, i8 |. d
unloadAllScripts();' ~: A/ K: A4 X
$ N. i9 h. x8 L
LOGGER.info("Перезагрузка всех серверных скриптов.");% c& U" I3 u( @: q+ V
try5 {' x5 O0 |; A9 V u" s, [
{ 4 \ W" u5 i7 [
ScriptEngineManager.getInstance().executeScriptList();* G8 M+ p" ^9 \; G/ j) m
} 2 Y& ]1 N; B9 t: ], N
catch (Exception e) 0 w! F3 R- A: M ?" v
{& W" x' o% }5 J% u
LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);4 t G* i$ Y: Q" V+ w& G* I
Метод unloadAllScripts() 4 s- A; o9 ], l$ @) F8 w6 O; U+ l% G& ^" S, l
/** |& w6 Z$ T3 `
* Выгружает все квесты и скрипты.+ J' ^' e# l, w9 x3 l g
*/ # q* [0 {" S" K7 o0 a( E
public void unloadAllScripts() ( o w: z8 x, |2 U0 z
{% w; w+ j: R v. K2 f4 [( O
LOGGER.info("Выгрузка всех серверных скриптов."); + G3 ?; W: [6 a, c
5 a. J6 h* T2 k. L2 H
// Выгрузка квестов.# Y. r; Q7 O( }' U/ ?% j5 x
for (Quest quest : _quests.values()) 4 `1 T3 U+ J& l K7 G0 H2 A5 ?
{8 T& i9 t3 B: z
if (quest != null)0 ^9 e/ G3 m- n( Z3 ~
{$ W4 T3 u9 k& k$ Q7 M4 ?; B
quest.unload(false); Q- ~9 O5 r) `" W' m$ }: @
}: x% L' W6 A& ?9 |) C% g+ k7 a; J
} ' t# H3 J9 E3 k. w6 c+ a
_quests.clear();' d: D2 o6 D! L- V7 z: R
// Выгрузка скриптов. 5 h8 s5 ^/ k! ~: l4 j
for (Quest script : _scripts.values())' L6 {6 J( y$ w. `, d, W; \5 ]
{' K, p" x$ ~3 s G M
if (script != null)7 {3 M( m/ }& Z0 M- D! n8 h5 T
{8 Q% Q& _/ H/ m
script.unload(false);2 d3 A$ @# M5 w: x p2 F
}8 W% X, t* x& W# T
} 3 x, `3 G; J1 P' ]4 T; o. r# [
_scripts.clear(); 7 i: `8 \% j- \! T; j
}
Скопировать код
Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts. 3 e9 i# G1 ?* S) w! r5 _. j! C# _
9 F3 Y1 X$ z5 @( }9 X3 m1 K) T Метод report()3 ~( J' j% W6 D8 \, c/ R# E
9 m3 O8 W, i. A$ \
/**0 ]1 z* h# a% F; O3 b: r: |: A
* Логирует количество загруженных квестов и скриптов. - N4 z( f5 l) y8 V; v0 G
Этот метод ищет квест по его уникальному идентификатору. ) D( r1 w8 j9 j: i
/ s# u9 f4 R# w* ]& tМетод addQuest(Quest quest) 2 a$ x7 j- ~0 y! M% g2 ]# {. ^" ^( i, k" q% `: U, c
/** % t1 U( a3 o5 A( |! R [* N
* Добавляет новый квест. ; ~6 Z$ M1 ]+ S& q9 W6 s; g
* @param quest квест для добавления5 V$ i3 s* K7 D6 L! f8 V
*/ + c8 N- z V/ ?& @
public void addQuest(Quest quest) 2 e: r2 w( c: r
{" C9 Q% d0 S- h6 Q
if (quest == null) - f' \8 R3 E1 w0 l7 U
{ 7 J( k* ?. { J1 @4 h
throw new IllegalArgumentException("Аргумент квеста не может быть null");) u3 a7 X& o- c: S5 K
} ; M5 V0 v3 a2 N" w* v3 I b
5 @0 Q- {" ~: F0 H
final Quest old = _quests.put(quest.getName(), quest);. M4 D/ n: U; z) g7 }' t
if (old != null)- Q2 w5 D8 q$ h8 c+ ?# P
{* U. ]0 q: k; M/ u' z
old.unload(); 2 h0 [" _5 L2 C9 e- K/ i# E5 I9 J
LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!"); : P k; K7 I( |% O' c' {
} " ^8 A" j/ f) s6 {2 R8 n6 b
% D9 f& h# ]6 B- |8 u
if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)1 h4 L' h% S5 m R( z
{' {* \0 e, Z0 C8 z. y( c
final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();0 P A6 O" I1 Y2 k/ h' f+ G. D
LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + "."); / w2 r. H& F! W' ~' a7 C k! p) C
} + @! v+ j9 o/ a4 J, p" N
}. u( M% H9 I, s" R
``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.; A' `; n+ w# |. c# i ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере. ! e) ^7 s% V9 _7 v$ c w4 n2 R. {2 m# k. r0 R
8 O! v' c; `7 u6 z# r
5 ^3 T: o- s, W$ ]2 v3 E6 O7 {$ D5 r
Добро пожаловать artace.ru - творческий сектор (https://www.artace.ru/)