Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius [Версия для печати] Автор: admin Время: 2024-9-21 10:39 Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius Гайд по основным Java-файлам ядра сервер L2J_Mobius ) M, _) X. k P3 V( {; ^2 D/ V7 v' u: }( z6 Y3 S Разбор файла QuestManager.java+ ^1 n8 W5 s+ O s# k4 G6 S. H
6 |, z7 U# S# [! lЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов. : h( g) K& g1 s8 E$ C. C7 IОсновные элементы 9 U( {+ K. g! t* b3 ~ U- z/ T
Лицензия5 U6 p( }% Z5 ~5 `7 f+ l% L
Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии. . h8 o9 n) B$ ], `: @6 n, [7 f
Импорты4 ?9 ~5 v7 _* J5 y$ j0 ]
- E# I; g8 v: v. c3 F QuestManager.java — управление квестами и скриптами.( v! {1 u! O* |* D* U p+ W7 C Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\ 7 V' @6 S7 d& R0 m4 x5 ` " ?" G+ _/ V$ z# Y! X1 v) Q9 L6 |9 {/ m
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.. u) w' |' j0 Y) y6 M# f 1. Лицензионное соглашение - S3 y+ @3 ]0 v# ]
/* % O. D7 c% J4 n J; ]; Y
* Этот файл является частью проекта L2J Mobius.9 h4 A' ^: @8 X; f5 b6 w2 b
* H7 Z9 B% r# L% b
* Эта программа является свободным ПО: вы можете распространять её и/или изменять0 `/ G+ g' n ?# B/ n
* её в соответствии с условиями GNU General Public License, опубликованной / V% E3 g6 ~; F. E4 h
* Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии. 2 m. k5 a5 X3 j6 ]) i! P
* / {; q; N6 U2 J9 h6 C
* Эта программа распространяется в надежде, что она будет полезной, + l @3 o% G% p1 i
* но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии - U) k* k" |6 M( Q$ u/ H
* КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. 0 Y. k4 r+ S2 ?$ g' C6 n
* См. GNU General Public License для получения более подробной информации.* l6 v4 }2 ~9 J, Q
* , p0 U. g8 r& b* R
* Вы должны были получить копию GNU General Public License ; q8 s: S$ J9 f* Z- M4 D
* вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>. $ F8 T r3 D" A
*/
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.1 O+ w% q9 t! k" k8 K8 ]- e
8 H% Z8 G7 [1 e! Z9 I 8 i2 r7 U2 _9 B2 N# q$ V5 ]* o5 u2. Импортируемые библиотеки4 w2 F. j/ m& m7 r! R& U! h/ x
9 W" j) j5 t0 U; T# W' M; e
package org.l2jmobius.gameserver.instancemanager; 8 h" c k8 A4 Q7 p3 H' t- T- [: W
* e/ F% y4 i) e' l
import java.util.Map;9 P y; C& y. p6 O2 K* y6 d+ A/ \
import java.util.concurrent.ConcurrentHashMap;1 m! O4 j+ \: C
import java.util.logging.Level; $ n9 s* \* ~' ~3 w
import java.util.logging.Logger;) `! A" Q3 o* N! E' k* G
- U4 J, g. U+ w3 W4 S- W4 M
import org.l2jmobius.Config; 8 H! Y; S' V( u( O$ G
import org.l2jmobius.commons.util.CommonUtil; / N" k V5 l, |* j. E3 j& `5 N
import org.l2jmobius.gameserver.model.quest.Quest; ! K5 ?1 k9 l) \" |: T
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 — менеджер для работы с игровыми скриптами.2 M# {5 s, [- k( O# g b# T
' H. r8 t7 H) U. h$ s* C) V0 W
3. Описание класса QuestManager8 ~: u- H9 C- b
/** + U! b' a+ ~$ L6 y" \ E
* Менеджер квестов и скриптов.; U8 n. e$ O( u0 I
* Автор: Zoey76 / f) W. n2 g4 z1 g6 O+ y
*/ * V% T: P9 p0 ~$ `! ]
public class QuestManager 3 V E# h$ O# S+ q2 b
{ 2 }5 | {; [7 ~9 F1 n1 f4 Y$ Y
private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName()); + y0 `* Z, s9 T7 X- H
: k8 |/ J) m9 m) l/ B+ o1 P
/** Карта, содержащая все квесты. */+ W0 L' W8 [* L( D' r
private final Map<String, Quest> _quests = new ConcurrentHashMap<>(); : b) i8 @ b4 `
/** Карта, содержащая все скрипты. */ 4 i/ E" m) P& q- v/ z3 W
private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();7 E& J. J- Y, ~# B
* j5 p3 W, ?/ P; M
protected QuestManager()2 ^0 p7 w8 `: B" g$ z n& R7 S- v
{ + ^: G2 n* P9 m$ e! s8 Q! _
}# [( e w$ _% b# P
}
Скопировать код
4. Методы- c# n( F. p! O( D Метод reload(String questFolder)3 I6 @2 W$ P$ b! _$ S" G
public boolean reload(String questFolder) ) A8 |, s$ q& W! C4 F
{- }0 c5 }' } a4 M3 N% l- I( m
final Quest q = getQuest(questFolder); - j5 y/ E5 p O# _. H
if (q == null)$ e ^, z) [+ B2 k( `) K% Y5 d/ O% i
{9 s) i6 F5 @% r E: \' a# ^! a
return false; " }8 X& v7 }0 ?4 B& R) Z
}0 E5 U1 k1 g0 l6 C, |8 ?( \8 Z- c
return q.reload(); ) R- Y1 q% v* K( W
}
Скопировать код
; s) h) I f) k8 d/ l1 C- @. ^( N* _8 ]' g
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.6 d# M9 U/ Q/ ?/ r) e Метод reload(int questId)4 |) C5 }% w" ?0 j
* Выгружает все квесты и скрипты, а затем перезагружает их.3 x" e5 h4 X- G; j
*/ D7 r2 v& O5 s1 x1 @/ g
public void reloadAllScripts() " a$ p: O: @$ [. I- j! h$ _8 L
{ & ]. T% q5 R# A
unloadAllScripts();9 E0 i. ~% m: E/ Q% b
. Y9 e- y! W8 K
LOGGER.info("Перезагрузка всех серверных скриптов.");- f S' ]$ ?4 \
try # d @' d4 k0 p. t0 d
{ 1 x( L; Z) I1 g1 Q
ScriptEngineManager.getInstance().executeScriptList(); * W- |. O: q- P& t
} 1 W; r2 T' G% Q, t: d7 ?( o4 z
catch (Exception e) 5 C D/ a7 F1 |: G1 M6 T
{ ' W) l; l8 e2 B- V
LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);! }& I- s7 w/ [8 S. T/ ]
}6 H# O6 u0 \) E$ E. W- {$ J
% g% i" @& m+ y$ V
getInstance().report(); % a) t7 R% R1 B. o1 K- `
}
Скопировать код
Метод unloadAllScripts()$ W4 T* n& M \ c% _9 c9 \
6 M+ Y/ p j$ f
/**5 d0 ~! V o3 T1 n& u; s
* Выгружает все квесты и скрипты.9 t) z0 g% {1 T9 U9 X% j
*/ / H* m. r1 X+ ~+ V
public void unloadAllScripts() 6 V( e. m$ z6 t8 S; l
{ ; G: }. a1 m! q n6 t
LOGGER.info("Выгрузка всех серверных скриптов."); 2 M, u; c6 M2 K% C% B* Y8 Q7 z
" x w! A T: r6 e
// Выгрузка квестов. % c2 u# x' D$ G
for (Quest quest : _quests.values())0 c$ x" ]# R+ o% _0 x: H
{ $ C' L( j0 @2 w- r7 M/ v
if (quest != null)1 N6 y4 `; x5 q% x6 N! ?
{" M; {5 g, Y( q# ?! T" f# N V
quest.unload(false);& \5 Z: u5 b0 r; n' A2 U; E/ P! ?2 r
}# z3 _: z! j/ s* m, Q8 E
} 6 s0 w0 ~/ H0 J4 c0 p; ?4 f) D- q8 F N
_quests.clear(); b ]9 H2 I( n
// Выгрузка скриптов. 9 O' W1 F0 E: d$ o
for (Quest script : _scripts.values())8 b& j/ M/ d; o+ R9 u2 Q# n0 r/ y
{ ; @. R" J! }4 X% S$ y8 {& f, V
if (script != null)8 ~3 i' Z4 i& J& U
{, C7 d- ]* Q+ ~: c8 t
script.unload(false);3 j9 J9 e. D$ V" ]
} & ]8 z& c3 A! C) I" O a7 |8 T. ~
}' M) U4 a! x9 U# ^) n6 \8 z+ H: n
_scripts.clear();6 Z6 |/ P5 y5 a% n6 m' X
}
Скопировать код
Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.3 z) _" O- r C3 I7 ?8 r6 h: ]. X
5 g. \0 ?" \4 M* v- i/ v8 O' |0 } Метод report(): g4 f, r3 u9 }6 S4 a
' Q0 c) w9 T) S7 l5 e
/**, z7 }& X( A! f0 V8 r3 g* u4 b
* Логирует количество загруженных квестов и скриптов.; f+ T {- d+ h& g
* Получает квест по имени. 3 {. Y! h6 Z) Q$ M7 d" I
* @param name имя квеста4 P8 e/ q3 z* z x
* @return квест 6 ?# x8 C6 r5 y& ^) b( u0 _
*/ 7 {- r, x+ k1 z3 f9 m2 Z& y( ?
public Quest getQuest(String name)) o7 s% o6 _! W, {5 O
{3 t- s: I- S/ W
if (_quests.containsKey(name))2 T7 ?4 l2 H1 L% ^ C7 [" c* N f- j5 R
{ 4 m8 K/ u; l. Y! g+ C6 Y. Z
return _quests.get(name); + u9 H M) J! z
} / f8 {: O/ h# `1 R
return _scripts.get(name);# _# l3 p. [1 s3 n5 H
}
Скопировать код
Этот метод возвращает квест по его имени, если он зарегистрирован в системе. 5 |- a/ c. O3 c
- b1 w4 l7 `- n5 v" WМетод getQuest(int questId) , M3 P/ ?; Y" q- O% V" U ! {; F8 r- K9 F' @/ D
/** 2 \0 ]2 V" o; j) z
* Получает квест по ID. / [+ e# f5 E# P5 e V
* @param questId ID квеста ) G6 s3 V8 {. s
* @return квест, если найден, {@code null} в противном случае. C8 u7 m) ~9 i8 a
*/ - _/ j- d+ K3 D* X0 u
public Quest getQuest(int questId)3 X, u& h. E2 m6 \! e
{$ U. S& g. z d7 \
for (Quest q : _quests.values()) ' i& E& o V# q$ E9 L I' X' f3 e
{ ' d; P0 s4 @6 O
if (q.getId() == questId)! H5 x% Q" a8 b# m% n
{ 4 {' Q9 O5 l% }
return q; $ o9 u6 G! {2 F) S
}1 x3 l7 |' f0 O
}" W5 N c( m/ N& j' M
return null; ( U+ N: h8 K/ g* V1 o, L9 }
}
Скопировать код
Этот метод ищет квест по его уникальному идентификатору. 4 G3 b; j: `8 L( k
9 E2 ~* l7 F0 b( j2 r# ] Метод addQuest(Quest quest) }* F( W# r7 o- j: D1 N& O6 U* Z& K9 U3 B. u1 ]: I
/** , d" _2 I# R# M9 y$ {
* Добавляет новый квест. / Y5 F W" o5 R! t
* @param quest квест для добавления# G9 O6 v4 k3 B) A" K4 B
*/5 U: H0 D* |+ b9 G: L
public void addQuest(Quest quest) , H3 g4 J4 e3 R: A% x \
{ ! _$ O; f+ n0 v
if (quest == null). H. F) Y3 c1 l7 ^! [9 D6 m
{ . L0 g* q+ s% p0 y# M7 i4 \
throw new IllegalArgumentException("Аргумент квеста не может быть null");2 H; v+ |- z9 W" E V
} ! ^: M+ r' M1 }, B4 n2 e! _
& m& l9 b- K& m L" K0 B0 M, w7 `
final Quest old = _quests.put(quest.getName(), quest);7 k* o# w7 O5 g2 \6 S; ~* ]
if (old != null) 8 h, b: C, O+ R
{1 U8 U# P; u2 v/ U' k
old.unload(); % n* k! u$ Y) Y" K6 z
LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!"); ! u2 o* M3 h/ b N
} 8 A3 D5 L6 s( B: s. W
1 B# w5 J" f& y( z3 n" s L3 ]. D
if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS) 9 b% e' X4 P0 S; O3 j
{( F. |8 F1 D( G4 K7 w
final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();( N( f+ R" P: t( i) E
LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");- ~. |. W$ o% \1 M; f ]9 \, b
} & H7 c& ?- d; c p
}: U6 p9 _7 U" I- \- S/ ]
``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера. . {3 i( R- g/ T( AЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.3 h5 c1 n) q# U6 Q# N/ |. K4 G
0 o. W ~; K6 G& @9 U3 \; e
) C. X" m: i4 F5 |6 X4 K 2 l3 E7 F' B9 S3 j" p
Добро пожаловать artace.ru - творческий сектор (https://artace.ru/)