Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius [Версия для печати] Автор: admin Время: 2024-9-21 10:39 Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius Гайд по основным Java-файлам ядра сервер L2J_Mobius ) N. s |( Z; y0 Z5 L- B8 U1 `/ w# K" W4 [+ H- g- V Разбор файла QuestManager.java : V4 v3 p# A! a* d( w7 r5 v / z/ o, x- U/ U2 wЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов. 8 ~4 v4 J9 i5 e+ j0 H( _, mОсновные элементы, @0 ? _3 Z2 i3 }# ^9 `
Лицензия6 _6 z2 w; `* c' \5 Y/ p
Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии. $ ~ r8 d, K4 n# |3 e# }! S( Y
Импорты( v4 w9 c6 |1 c) `; [
$ m; ?5 V& V) j8 ^QuestManager.java — управление квестами и скриптами.+ u: \6 I: W3 }6 p Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\ ( L/ t7 Z: x& _! I! @- o& F9 ] % e0 r0 h8 x: N1 @' Z1 M8 ] H4 n9 r* `% cДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов. + o5 i8 o0 m, _, X: t1. Лицензионное соглашение' z8 ~1 H: P h/ w- q h* G
/* 4 o# O! \! @1 T9 A9 \+ y
* Этот файл является частью проекта L2J Mobius. 3 [. I: ~ D. y. `- G( {8 J+ \
* 9 ~: ~1 n, p% q( _5 @2 p
* Эта программа является свободным ПО: вы можете распространять её и/или изменять ' ]1 P8 J4 S2 H6 J! P' M
* её в соответствии с условиями GNU General Public License, опубликованной # R( E1 J2 E8 b7 N$ e0 }4 _
* Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии. , S( }8 }; ~" G) D- o
* ; s1 v. S+ l+ D: w
* Эта программа распространяется в надежде, что она будет полезной, : L3 L# x# s0 A; s' f: w, w; G, i
* но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии5 h3 i* T- |1 ?
* КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. r R S0 E8 v' x' m; b6 r
* См. GNU General Public License для получения более подробной информации. ) z: B2 T z# E2 V$ N" p: u" H* M
* o7 V6 C3 v- s/ O1 Q
* Вы должны были получить копию GNU General Public License) N5 h3 V) r) m% g0 {/ ?
* вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>. ! d. _& E. }7 U
*/
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3. - {& ]4 l- d+ b; a0 k 4 w( _! G: s/ S3 z5 x* o+ h$ f/ K. G' N( E8 u 2. Импортируемые библиотеки! N$ w7 D! q* {
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 — менеджер для работы с игровыми скриптами. 4 R9 Z( E! K ]9 L* A N0 B3 `# {- M9 a4 O
3. Описание класса QuestManager2 M3 |, H9 {: b
/** 1 y) H! F: T T' v4 a! F6 |
* Менеджер квестов и скриптов. 9 p. X+ [) C2 i$ |' ]5 ]0 m
* Автор: Zoey767 ~9 H* `3 ]. W% O
*/, {! L" d& B3 c0 l2 U; c* s
public class QuestManager. ]9 O- A) z1 W, b
{3 N( {" Z8 Y( ~. j
private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());) \' _' F8 V! W- I! c
0 ]3 x R( P" s- N! H
/** Карта, содержащая все квесты. */: f* ^% H% E. U1 a2 w
private final Map<String, Quest> _quests = new ConcurrentHashMap<>();; c% ]/ P* B) ~9 N/ L+ {
private final Map<String, Quest> _scripts = new ConcurrentHashMap<>(); `% l" L$ D5 B w4 k2 G: C
- H. T ^ W$ k7 N( ^
protected QuestManager() 5 S6 D: F" l- w* r
{; b0 Y' y: s) |
}2 L. k, N5 u$ F R @8 w
}
Скопировать код
4. Методы - D; c3 r& n- Z' ]! {Метод reload(String questFolder)+ u9 @& @; b$ r- ~+ V. y
public boolean reload(String questFolder) & f! F% A% z) b
{ & S/ ~# G4 [# ?2 l# `8 I2 \
final Quest q = getQuest(questFolder); , s2 x" A2 N( p
if (q == null) $ a) J+ R# v1 S: w: R/ B! \
{ / I9 d9 G. }* Q4 G
return false;9 m* `' q3 n- |
} T/ p; `1 e( `9 V( {7 [" S
return q.reload(); + {: N( K3 r" I
}
Скопировать код
& ~' ?% m- \. z9 L8 H& @ ( T7 v# k5 ^# [" }: OМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста. : k1 p2 e3 J) b0 M6 d5 qМетод reload(int questId) ( c6 u/ H# N% n6 c$ b 5 d& n" @6 P2 B' a
/**' R1 w) T' o! o" u
* Перезагружает квест по ID.' U5 M. w& [. q/ C) Z6 `
* @param questId ID квеста для перезагрузки! Z* H+ u/ X* L- Y
* @return {@code true} если перезагрузка успешна, {@code false} в противном случае( K3 Y/ W; L, u9 { o2 {
final Quest q = getQuest(questId); 7 X: C7 J* s' E+ R+ X r
if (q == null)' z. e6 V& U0 K, y2 n1 h
{ 9 A1 o& H* ]$ }7 v, L
return false;/ q. u; R4 G! R& _9 x" A. I. W
}0 q0 m" F& O. g. G& n2 N6 Z) P/ G
return q.reload(); . f3 m! C6 y3 T0 C4 [+ U3 u
}
Скопировать код
Аналогично предыдущему методу, но перезагружает квест по его ID.! b7 y5 I' u6 t( W. Y1 n8 C
$ T2 @* l ]# V3 {: aМетод reloadAllScripts() % e# c7 z; L" e% @* ] D! R3 g; {4 s* a' w
/** ! B Q0 [6 v. }7 J) e
* Выгружает все квесты и скрипты, а затем перезагружает их. ' Z) T' F' n0 x* V
*/+ u7 A6 [0 V4 C9 b4 s9 d
public void reloadAllScripts() 0 O/ `7 \. H# C7 J# m% W6 l
{4 [9 ? g; h- A' e5 R
unloadAllScripts();6 i% c0 b+ n+ P/ |' j
6 B! P- B6 \3 l3 e7 I: L+ @
LOGGER.info("Перезагрузка всех серверных скриптов."); : O: g; b) ~' W8 t
try ( o8 M, O6 C% \8 z l) p
{ ) o- D s, A7 ~/ a9 T0 N- F
ScriptEngineManager.getInstance().executeScriptList(); ) D8 R2 K9 S6 f9 x
} , I9 P% c# J. W% Z) L
catch (Exception e)# ]# c& [# c3 t0 }: Q7 F% H
{ , \* ^2 s3 M* R! N$ T
LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e); : \- L% n7 {/ K# f9 E6 T7 |1 {
} 6 L' K: m4 v* A6 U5 }( i, Q* R( n) ?
2 A/ a$ t& U6 [% x7 X7 |
getInstance().report();) |+ z8 O' Q3 d+ Z$ }
}
Скопировать код
Метод unloadAllScripts(): }6 i) U# i$ [/ Q
1 u1 B- D4 H- i; r4 S
/**: w5 Y$ E) r4 O# D$ K* D9 u
* Выгружает все квесты и скрипты.3 L% J6 C: S. u2 z; ^6 r
*/ 1 [6 k0 [1 `$ r2 r
public void unloadAllScripts(), E7 Y# |0 G# t: a" Y
{ # n8 P! ]2 I+ E) Z) S
LOGGER.info("Выгрузка всех серверных скриптов."); 6 p X+ ~. m* u3 r, t
5 F- K: Z6 |# b7 x
// Выгрузка квестов. & E4 P! I2 j0 v, z
for (Quest quest : _quests.values()) ( s, S3 _$ t* I `
{ ) m7 A6 A7 D( r% [5 N; n- a5 r- F
if (quest != null)7 \0 P+ B. h) k
{ 2 s" m/ n8 a, L: O& n0 O& M
quest.unload(false); 3 U l; y/ A- e1 a, \4 G x4 @3 x
}( ~* B$ r: ^, R/ ^. t ?
}& s* a( Q6 v5 p; A4 t* v! N5 X
_quests.clear();, T5 H( `' z z) ?5 A
// Выгрузка скриптов. 3 A9 |; F; {- f U. V4 u
for (Quest script : _scripts.values()): u# W7 n6 x/ |6 A
{ " b- ~9 ?% J4 F7 Y1 x+ t; |
if (script != null) 7 j( _9 X* i8 t! l# ]( |# u
{ . K1 L/ k0 i( a" |0 ]
script.unload(false);) S9 |% \" D9 H2 K( d% ]
}! D; z k6 t5 H
} % ^2 r/ H- M9 w V# d: e3 S
_scripts.clear();! R- E1 a/ Y. s% b( ~ M
}
Скопировать код
Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts. # j7 t2 X5 P* x3 [# D* i# D
0 x7 z4 t2 T( P Метод report(), D5 G, }5 x' {6 i7 w" X
! R$ N: f! K1 d0 K$ D3 t4 M
/** 1 p# e& U8 O- p( k8 F' a9 W
* Логирует количество загруженных квестов и скриптов. 1 H2 u4 T0 G) P! m! I4 y
if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS) 2 c, ?$ B0 f$ x) f9 H
{ " r1 _, R; ` x; J
final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();" ~4 z w. L( _ }' `. ~0 Q" t
LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");5 e+ z% u) k7 {' S& ]3 F1 [. r7 s) b1 k
} 6 @4 c0 p y d( @% [; @7 K$ }
} - J, p: a3 f, e1 m, y4 }
``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.2 }4 O, V2 q T$ u ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.- U9 l' x d* r, C; [3 t( I+ p