Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius [Версия для печати] Автор: admin Время: 2024-9-21 10:39 Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius Гайд по основным Java-файлам ядра сервер L2J_Mobius " N' e8 q) U2 R5 t9 k; a& y% |0 x8 B, T: d9 ^1 |9 n8 o Разбор файла QuestManager.java5 n! j$ f1 p9 m* ?, l6 ^
) {$ k: \. W- f
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов. % P7 Y8 |% V1 H3 n( s4 c; r2 pОсновные элементы+ t" B4 G' u. N
Лицензия 3 _! d& L: ]; u! G
Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии. 9 {2 \0 K+ y- c* f( K; R
Импорты 0 b- a8 r7 d; e) l# a
F# p- h/ b/ x# m$ t3 @ jQuestManager.java — управление квестами и скриптами.1 i4 {" @0 E& M7 V Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\ 7 ^$ Q. Y- _; E( S$ Q7 W) V+ Z) i3 ^7 j/ u6 {
4 J+ {# ]/ l# O. y, w. b) L! F
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов. $ Y. l& W" a9 x3 p+ |# n1. Лицензионное соглашение V, e6 z" z- B2 o
/*1 L6 Q# {& x, z$ R6 L; }0 L* g; p8 k
* Этот файл является частью проекта L2J Mobius. 1 O( T% c4 U$ | v% b% d
* ! @1 `/ Y4 {4 Y: }0 V
* Эта программа является свободным ПО: вы можете распространять её и/или изменять " l' F- D8 U* B. X; a% Q$ |+ ]6 M5 D
* её в соответствии с условиями GNU General Public License, опубликованной 0 H7 `6 [. e; D( ^7 W% w
* Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.1 p- \3 [" N3 I
* / o" ^0 t9 D1 g6 V5 w
* Эта программа распространяется в надежде, что она будет полезной, " d6 m. H4 B9 w
* но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии+ G, b( x7 H( s; `
* КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.4 T7 R2 Q& G: A) B6 g5 @
* См. GNU General Public License для получения более подробной информации. 4 f u6 q5 j- F( x) V
* 6 T9 P( H9 S; g- R. z' H; b
* Вы должны были получить копию GNU General Public License + l) Z; q& R: }, H8 \" u' a5 s
* вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.2 L5 G) u+ u$ X+ F) \
*/
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.1 x8 r9 d$ Z0 `. J
+ R% B, x1 M7 A/ r, @# [, R, z: o! J* z5 }( U4 J1 {! [ 2. Импортируемые библиотеки $ B' ^; e0 n' D L" g4 D6 t6 S
package org.l2jmobius.gameserver.instancemanager;6 i6 ]& w% y0 |6 I9 ?# t' D h
+ W7 }- I$ ?/ j- |4 f; ^* _
import java.util.Map; . o0 ]; H8 W) i& u" d6 x
import java.util.concurrent.ConcurrentHashMap; & t. m8 P0 w; w2 Y
import java.util.logging.Level; $ [2 Z( _! U H- x; I( [$ y
import java.util.logging.Logger; " ~7 B- q, R( n3 p- \9 Y
% V+ g( ?8 a% }! ^. ~" ]
import org.l2jmobius.Config; / {8 t+ k Q& Y! z+ w! b6 V& U
import org.l2jmobius.commons.util.CommonUtil;& E! |* s5 ]2 k! J$ r0 g. w
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 — менеджер для работы с игровыми скриптами.# R# D# ~# q% }/ X/ w) d9 r5 r
5 N( D: v& U' ^' X( a% M x& z; @3. Описание класса QuestManager ' V2 n7 b' I1 t0 n
/** 6 c) |; K! C' O
* Менеджер квестов и скриптов. & `7 M& T, S1 n7 d3 e
* Автор: Zoey76 . w* X9 ^- T# B, T
*/ 5 ~# z) R6 a( a) A# y; ^; c
public class QuestManager0 x0 e- b$ u! f) q+ p
{" U6 D9 T, v5 Y2 ?3 r+ A
private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName()); ) E# ~5 @0 [, m+ H. ]4 _
5 d1 D/ d) ^# P( M2 a
/** Карта, содержащая все квесты. */$ K' N8 p, j* [* ?0 J
private final Map<String, Quest> _quests = new ConcurrentHashMap<>();: ~( ^; q" D& ]" ^! z2 D" R* ^
/** Карта, содержащая все скрипты. */% ?# G, {3 D5 v9 @7 t
private final Map<String, Quest> _scripts = new ConcurrentHashMap<>(); * u: U, U& e! W( N8 @
; _! f0 v, o1 F3 s. U$ p
protected QuestManager() 1 c/ w6 ?3 ` e q
{ 3 _9 O8 \6 M T4 |4 W7 p5 H7 u1 M
} : o) S& W4 b. A2 j
}
Скопировать код
4. Методы 7 K7 s8 t) c3 j, _Метод reload(String questFolder)" e$ c% e% V* |3 r& K
public boolean reload(String questFolder): D% j1 O) `% E. h6 M% D( p& U
{5 t, t& d4 `: d6 O: N
final Quest q = getQuest(questFolder); " P2 Y" `5 B/ L) y1 s a6 k
if (q == null) 4 w7 D0 j$ t( b3 y' r6 \) M! L
{ 4 q! V, E& o2 I9 }# F
return false; ) R$ M2 o0 O( A, i
} : g; R* l+ I) O8 v9 E# l& H) p7 S
return q.reload();% D3 G, R+ z7 @7 Z
}
Скопировать код
8 d1 B0 k& d& b4 g/ {- V! o1 Q! ]3 q! p
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста. 7 O! K2 i, o6 U, {3 E+ [Метод reload(int questId) . b3 A0 O; q+ I# T. l8 l 2 `1 k7 K0 J7 _, z+ ]
/** " i! I4 {+ b- Z* }- w
* Перезагружает квест по ID./ C; m# o" X3 O* j3 i6 P
* @param questId ID квеста для перезагрузки ' x# d, ^; ] D& I0 m6 o) ~
* @return {@code true} если перезагрузка успешна, {@code false} в противном случае , s( L% L# c7 n! Y
*/7 {* E9 x7 W$ M
public boolean reload(int questId)7 v( r' n* Q% \! t4 W
ScriptEngineManager.getInstance().executeScriptList();+ i6 L# t3 Y, O# G2 ~0 t
}1 M& V; ? L0 H. @
catch (Exception e)6 Q F$ U( d# B2 z8 k
{% K" [# X0 b! g; f
LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e); : l+ y8 E6 N; Z/ N' _8 a2 }
} / j4 K+ B5 t2 E) U1 f. X
0 S' k9 n4 z1 P) H5 J9 A4 Z
getInstance().report(); ( @, q: E: ^3 p! O7 |
}
Скопировать код
Метод unloadAllScripts()* ]3 A8 F x: C% v+ z. w) B
3 O8 n5 @4 _! D3 J: z
/**% z( a! w( B" C1 r7 X8 u
* Выгружает все квесты и скрипты. 8 B+ D, c$ f+ |
*/ + M% Z; A5 p# j1 C
public void unloadAllScripts() 8 u n) k3 S. z
{ * L; X* O. M' s& M* r
LOGGER.info("Выгрузка всех серверных скриптов."); " C8 U# X, u) o4 o6 s' v- w* L
2 I/ U5 \5 g, ]) ^# q4 Q) Q
// Выгрузка квестов. ) a/ J# Y4 l8 I, U4 i. I
for (Quest quest : _quests.values()) 8 S- y8 b$ X3 z
{& w' H5 [8 `% F3 b* \
if (quest != null) 2 P) F) V2 G8 T; ?$ l" S
{ ' W$ u! }5 |) b" U4 Y! [
quest.unload(false); , }+ h6 ?+ _ f3 J$ b
}0 E* ?$ ]2 t* F* X# j% b, p0 e( C* p
}" o5 r. X* v* T4 b' D1 [/ R$ i
_quests.clear();! z6 ^2 D- i# W+ w
// Выгрузка скриптов. : L9 R0 p1 N& f8 `
for (Quest script : _scripts.values())5 s* p$ e& @, s# T
{+ ~" k7 c. u3 d3 I
if (script != null)+ ?6 J2 Z M. D
{( B5 p7 X" W0 H3 [7 v
script.unload(false); ; i O0 g+ m2 N) `( o
}7 b& k4 l% F! o$ D- P; Y: t
} / Q8 ?1 [ }2 [5 b! B5 j
_scripts.clear();( D) \; d& E) ~: W' } m2 O
}
Скопировать код
Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts. t: Z5 g" `! j2 Q- v1 ^$ ~
public void addQuest(Quest quest) ' m8 Y* A0 f" A$ w3 a7 r; P4 T
{ # x7 R- U9 l. g6 ~& \4 E3 P! ^+ L
if (quest == null) ! ~8 g* }) M. p( _* o
{0 }$ W1 p5 d/ }
throw new IllegalArgumentException("Аргумент квеста не может быть null"); ^! L3 g5 K+ A/ Q
}* A2 ?. }6 X! W7 t) z% S1 |3 R
$ k( F6 z# R, Z( M
final Quest old = _quests.put(quest.getName(), quest); 0 g) `# q4 {" ~+ D0 \
if (old != null)6 z! F! P+ X( E3 P
{ ( a2 [, G- t( [+ r
old.unload(); ; V) c. ~2 J- ?$ z
LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!"); - j: U, B$ @; T1 J; W/ a
} / _) N: ~+ r( D0 Q n$ S6 v
; X) ^& w+ o/ L/ n: @, p
if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)# w; f9 A' j2 [. M! P" _
{ 5 y0 Y3 H S2 t# s4 k
final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();/ f8 s2 N9 c# @& D
LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");; ~) P, f1 b5 k, {4 t
} - F$ B2 q2 v) n9 Y
} H" |* K, ]% N: c
``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.5 {) l- C* T/ X4 C! G ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.. v% Y& E/ ]6 b; v1 d
- p, ]! B# i1 H+ @& u8 t* m7 j
8 g0 j2 [. P; F& b% ?# ], I7 Q9 ^* q8 R
Добро пожаловать artace.ru - творческий сектор (https://artace.ru/)