Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius- o8 k% d' N3 S/ q5 U Z8 L
, Y0 W8 Z W6 v* W4 S- uРазбор файла QuestManager.java# m( ]) t& p, s V% u, ?: P. t9 H
: \+ _7 ?5 E& L; q5 ZЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
3 f) Y- z/ M" `- B Q5 H2 `# UОсновные элементы
' H8 M1 I9 U2 w6 \! C- Лицензия
# O6 T7 P3 p5 P3 T1 @- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.$ Q1 f# o, a7 v3 Y& n
- Импорты
( Z3 @9 h! {; z7 b
# O4 w" F5 C' J; F _- A1 RQuestManager.java — управление квестами и скриптами.
, Q/ j6 p5 X$ r8 V$ P& Z. tПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\( S& [7 A0 z2 s' a" d K8 F
" }+ q5 P n6 z+ T: D0 @2 s
3 J% X1 M2 ^7 q# s3 PДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов./ b8 g! \9 y4 g/ u3 e4 c9 ]+ D
1. Лицензионное соглашение
( v6 N1 D# R1 x$ B2 p( H- /*
$ H6 B! c' D2 N: _ - * Этот файл является частью проекта L2J Mobius.
* [. M- e, h4 a) l' c4 i& B$ s - *
6 B0 Z. c- D2 C1 q6 J7 O2 o7 t - * Эта программа является свободным ПО: вы можете распространять её и/или изменять# R5 n8 {! P8 v: Z0 n& _
- * её в соответствии с условиями GNU General Public License, опубликованной
" g/ ~% `' y& m# U1 @ - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии., X7 K7 y8 q( t P% `
- *
4 m3 J! @9 t% n! _9 e9 ` - * Эта программа распространяется в надежде, что она будет полезной,
p; z2 ^' {; c' M - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
) {9 m: |3 i/ o$ b) X - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.2 \# i3 d6 r( a7 ?! D
- * См. GNU General Public License для получения более подробной информации.
' s6 I& n, I/ j. i0 r8 w e) A7 B! [! L - *
/ b+ I; ^5 L! X9 Q2 S' ]8 f - * Вы должны были получить копию GNU General Public License: L7 g- G+ t' ]; m0 @6 P
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.1 }' N# f$ ?+ {* b
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.# @2 O0 Q: g0 ]
, W* y# x1 @) A4 V
( ?3 W# j5 c& r5 F; x
2. Импортируемые библиотеки( O* a: A M1 r" K' l- X. n' t8 s
$ O9 D- a l0 j, T' e- c
- package org.l2jmobius.gameserver.instancemanager;* H3 Z9 \% H: G# r5 i8 J; E8 E
Y6 Q) n. \, V& ?9 K! {- import java.util.Map;
4 q% O1 d! I7 l) m - import java.util.concurrent.ConcurrentHashMap;
/ t1 O1 F: W6 z5 A4 q0 R! e - import java.util.logging.Level;
$ }# q- N/ W; [ - import java.util.logging.Logger;# }) p9 F& _) Y
' a G$ m/ C0 i: H- B' I, z% w- import org.l2jmobius.Config;
( a5 P! D4 y1 _ - import org.l2jmobius.commons.util.CommonUtil;
1 C n3 M1 j V - import org.l2jmobius.gameserver.model.quest.Quest;0 L8 e; q) n: b1 u! @' g: {, P
- import org.l2jmobius.gameserver.scripting.ScriptEngineManager;
Скопировать код 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 — менеджер для работы с игровыми скриптами.
+ B$ n& W; Y2 |5 U- y$ S/ @ p, i m# G E+ A" Q/ v) d
3. Описание класса QuestManager, _- z' P- e9 v, X
- /**
# i6 ~" d$ N+ I" a$ p - * Менеджер квестов и скриптов.
7 Z4 f/ {, K* V- [" n ]& t - * Автор: Zoey76
- [) K0 w, v! m9 Q y - */
# I4 Z* g* g2 Q* {9 Z - public class QuestManager/ o0 _6 w/ w" A
- {
H$ ^: @7 y/ r1 ^9 ^) n& P- O - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());0 m0 ]& l% r! z9 V% b( q8 f Z
-
: D: S$ m7 l/ `. d( ? - /** Карта, содержащая все квесты. */! Z2 w6 ?; c9 v P
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
" o4 ^; V" n2 J5 Q& z/ U) U+ _1 a& F - /** Карта, содержащая все скрипты. */* S c2 g4 ]) r V& S
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
" Y# e* w- y5 N2 v0 B' Y - , V1 f5 s+ M: C$ ~: l0 A- N
- protected QuestManager()9 D9 m7 t% T6 c4 _5 w3 U2 ~ M
- {
# b' T) u+ `/ ^' D& R1 } - }4 w* h# Y% d1 ?+ }
- }
Скопировать код 4. Методы: i" s: V( j r/ d0 Y
Метод reload(String questFolder)
0 `2 E) j0 W) F1 }9 e$ q- public boolean reload(String questFolder)# L8 i9 U& ]$ g7 j6 T! p
- {) d* J ~1 c0 K) t. Q) D
- final Quest q = getQuest(questFolder);+ P" ~7 X0 N9 c' z$ z i
- if (q == null)
# w3 g5 J' Q8 ^ - {
: S+ W3 Z" u7 O b4 l - return false;
2 k* Q' x; A( p) I, P8 | - }
/ ~8 S$ B( L" ]$ \5 L+ H# @ - return q.reload();! T/ c8 _( ~$ \6 d8 v5 S
- }
Скопировать код
- w+ W4 C9 O- b1 `7 `/ M9 Q$ Z
. l7 t- a+ H3 q+ R, qМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
4 [8 y- I% b0 _) C3 m* GМетод reload(int questId)
) k+ B$ A& A7 H; X4 I
. s+ `8 }6 p: I# H- /**
5 j6 U: V3 j( G5 I# q; f+ ` - * Перезагружает квест по ID.: ?5 Q/ X. x& Y" J
- * @param questId ID квеста для перезагрузки/ j* a3 B0 O- A# v
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
( y- O+ n# y5 s. F( k$ U O2 u9 m - */8 U/ A' L8 D& S
- public boolean reload(int questId)
- I/ m L8 ~$ M' x& t2 ? - {
- G: e2 m2 [ W0 k+ V. N8 l - final Quest q = getQuest(questId);. [2 i$ ^8 W! S8 h l- i5 x# C
- if (q == null)' p) J9 @: w; D1 h
- {
( X) i+ V3 Z: F S8 S; l5 b - return false;/ U: H' u+ h8 Q- A; y6 v: B; v
- }4 f$ G4 U" }0 `( K
- return q.reload();7 U& K2 ?" V/ G$ w
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
% n8 X, ]' Z/ b( q- F7 O% g
2 ~2 g: R3 B( H5 K6 ^/ B% Y1 X! T. KМетод reloadAllScripts()
5 n; \4 ^5 t5 [' f9 D7 [
5 G- ? n: b" ^6 n- /**
/ y. B) U- J- J, B - * Выгружает все квесты и скрипты, а затем перезагружает их.
7 Q) G" X8 N+ v9 ^& g2 R - */0 U, ?/ _: |# j2 \3 B( ]
- public void reloadAllScripts()
# d, H K( I, { - {
" Q0 W- Q( y4 t6 v5 Y- M - unloadAllScripts();
8 {$ c, E1 u/ \4 T3 i -
' \2 ?0 }& c3 i' M' r* G" W - LOGGER.info("Перезагрузка всех серверных скриптов.");
7 F3 f- p6 s2 [) q" e0 S - try0 o% z, B; t) j" u! j0 j* G7 J
- {) u! e- D! C( J4 b
- ScriptEngineManager.getInstance().executeScriptList();
9 T/ [. Z$ Q8 U$ V - }1 |- v: k1 Z6 G9 d( q0 d
- catch (Exception e)7 ]( z" X) l* P* \+ ?
- {- r2 @7 J' v" {, E, [$ }( U# F+ L
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
1 M! ~8 Y! H0 F0 d - }
3 T7 j. Q- N' W( z" T8 b -
* Y, L; T: H0 K/ k$ u& e - getInstance().report();
J8 W+ L0 G$ L1 H* l5 V - }
Скопировать код Метод unloadAllScripts()4 c" f& d" q# a! K+ u
_$ h8 }0 j, ?' B2 k/ Q1 ^
- /**; E' J( R/ ?) T! J8 G8 t/ b
- * Выгружает все квесты и скрипты.5 I7 f, ~, Z+ V. L( V( l
- */% G- r) t; ?, _0 m% c& w4 I
- public void unloadAllScripts()
, v( `/ W; a5 t7 A. _ - {8 O/ J0 ^: f! @0 [# d8 L$ ]3 B
- LOGGER.info("Выгрузка всех серверных скриптов.");
) h' K; E V* M7 [ - - q+ ]1 d. n9 | }4 r# M* O# \
- // Выгрузка квестов.' h: v& A8 n" Q+ B& L/ S
- for (Quest quest : _quests.values())& \# u1 g& q4 \. k: W# l
- {9 T4 N) n( ~& S+ M- b+ B
- if (quest != null)% b2 ?; P9 y# h7 v: m! r
- {9 d u2 h- Y+ z' t
- quest.unload(false);
* J" E) P9 j/ t) G V5 l. f - }
* X. U/ Z- }$ f* U: B - }8 K' A% l1 g) F& R: \5 _/ N
- _quests.clear();
. G% M$ b7 ^; ]* X" f - // Выгрузка скриптов.8 s: Y3 k2 j+ C
- for (Quest script : _scripts.values())* f: |' l. @) J
- {
( q" }: z# _9 A/ I+ z0 A - if (script != null)! Y- p9 @+ K2 Z4 ~
- {% B$ s4 ^! w( \$ v& q) w
- script.unload(false);/ D/ J+ \" q9 k
- }
: D" z; j! O0 t, ]7 X - }5 t4 T8 V/ ^, ]# E$ ~
- _scripts.clear();$ L/ s {+ ]. ]* X5 [
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
1 ?1 z( X0 z/ ~: l
2 j; M1 z, }0 MМетод report()
' k3 U% m! R) h6 I8 \& n0 z+ e" l0 A2 s0 u: P% G& \
- /**
6 T* ]" g. ^2 x - * Логирует количество загруженных квестов и скриптов.
. e! }. ^4 s5 _( @& K5 L - */8 y" g6 \! _$ z+ K6 I
- public void report()" U7 n! U* y, {
- {
0 J/ \, C/ J" \& O% ? - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
' g3 k- E* i( l1 ? - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");$ {2 J% i& S S* Q" C; ]- N" {5 M
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
3 p% t1 p: P$ _1 s' l6 B' L
5 [' x" V$ r; E" J& z+ i7 Y' ]Метод getQuest(String name)
* R/ e2 [3 [ L. _$ Y( J1 o
. x/ M: d |& e* [& n) S- /**' S' @0 U* t% o, n2 ~( ^3 t
- * Получает квест по имени.
; `+ z2 m9 q: J5 L, c, Y3 X - * @param name имя квеста2 X) x: t0 z! N ~4 I. q( ~
- * @return квест0 c; M6 ]" [2 D6 I- G# [
- */
8 \% q ~ v7 p0 @ - public Quest getQuest(String name)
. m2 k9 C' ~* {, k) O, P0 C - {
" ^3 H$ L& G# H$ `: I/ m5 C - if (_quests.containsKey(name))
! e) o2 _: z3 s) p - {) z0 P# f; |" q3 L7 M
- return _quests.get(name);
M! @( j( G* f0 M5 p; ? - }$ ~* ^7 g. n8 K! ?: G
- return _scripts.get(name);
H6 R& g e8 f7 J. Y - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
; u R' i: C& J2 A/ q! B2 A 4 u* H0 b n8 e4 v! g. Q, b
Метод getQuest(int questId)
! N6 G8 U- \3 t5 [ e% i
" O7 M9 R' P" i3 c) S+ J. W- /**% Y5 ^: ?* o3 k8 d ?* `
- * Получает квест по ID.
3 h6 f$ v" H, M/ p2 Z& A - * @param questId ID квеста
; r9 f: y/ b9 ^& u - * @return квест, если найден, {@code null} в противном случае- d9 z# M+ X/ _2 l
- */: Z# [' T/ w% P; n c5 M$ o+ K4 q
- public Quest getQuest(int questId)! T+ ?3 }/ C& F
- {$ P" T& J( l9 A; x8 O
- for (Quest q : _quests.values())
7 V f: t! H! y3 @) V+ D+ {: |- _ - {
* S- z4 R: l: z- w& O - if (q.getId() == questId)
6 Q3 K2 }" n: c( I - {
* ~8 @% D; h6 r) O; X - return q;2 Q9 W% L6 b Q6 J( A
- }. j; F( S# n6 w0 q( g. ?
- }7 E# |, O9 |9 z
- return null;
# W7 @ K, ]' [, u% e% D4 w7 s, T - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору." W" H8 A5 a! D9 a- |$ P6 a; V
2 R& T% f2 l6 u: n% IМетод addQuest(Quest quest)# P3 v" a: Z: T! p; x
0 R( j0 X1 |8 e3 ^4 ^- /**
$ e( F" _5 q9 U- a- N( d - * Добавляет новый квест.
& t: c6 Y: h5 V) ^9 F - * @param quest квест для добавления: z2 a1 C6 \0 K5 F* [4 s$ V
- */
: ~# @; A) T0 P8 N: G7 r - public void addQuest(Quest quest)
0 O& S. U8 K6 X* \5 e6 Q - {
3 [0 ?% q) C: F4 ]. j - if (quest == null)
$ m3 r& Y9 P+ y8 ~# P' T' l - {" [5 {2 {/ x3 R
- throw new IllegalArgumentException("Аргумент квеста не может быть null");! H. e+ R0 ^/ [; X6 a- s
- }! g$ F' H# K1 m% T. c
-
8 x* ^% r3 D* }5 i( c/ a- `7 M5 g1 j - final Quest old = _quests.put(quest.getName(), quest);, e6 P6 L, D' G- F7 ]7 v' |
- if (old != null)" P% m7 P5 F2 Z/ M" F7 L, b7 y
- {
# R3 d' W( |9 D1 q6 C- k% J6 w# W4 D - old.unload();
3 j1 N; L3 E; u, P ]$ s- B - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
: q6 K @% @% K7 a- _6 ^ - }
' V1 F' Z, y! |7 l1 D -
. T" ~( e! ]# Q& n) s( W - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS), ~5 x+ n- _. x1 k+ v
- {4 v+ x% w1 F/ _( z3 F5 y
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
3 ]: `9 q% t9 d8 r - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
: T8 }2 m; B- ]& s - }: O0 }9 n5 [: O$ u' ~( M/ F
- }5 ~4 Y$ c; l5 C5 e
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.8 ?+ C* b4 G: Q7 c! T T g8 n
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
+ ?" ?+ b$ F4 z3 M& E
1 }% y7 o% D4 _: t+ L. d
; |! W5 I0 D) \: `5 O
2 H4 x8 G- |! U- K% Q |