Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
5 U3 b3 f! [% U3 T8 H3 y$ m& u8 Y" h) D# m
Разбор файла QuestManager.java
% z& H: [& {" n) ]% m. {' p( t/ G% I6 F9 ` M3 T
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов., Z6 o2 S/ m, ^
Основные элементы
' Z, l4 t; j N- T% X2 ~- Лицензия: y% w; o& v* ?5 `
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
; E) G# n5 W9 I" U2 c2 }2 S. E, E2 {
- Импорты
: X* s+ x& a6 _! R1 z( E0 L0 d& i
+ e1 M( g: k1 VQuestManager.java — управление квестами и скриптами.
& a& @4 I2 C5 ^# y" E+ M+ F: \( H/ l8 IПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\8 `! Y2 A9 O/ B- f$ O
: F1 W0 Y" r* {2 q
( V: ]# m( }, _Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
6 m+ x# @! `! I; f1. Лицензионное соглашение. u% R" O, v4 @
- /*
) d, a# x+ y7 d - * Этот файл является частью проекта L2J Mobius.
7 h/ [' s3 T" ]) ~2 e! R# x - * " x, N% n2 c" F$ x2 U. |
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять- |9 D! m1 m1 j- d) Y- p
- * её в соответствии с условиями GNU General Public License, опубликованной4 V6 \8 F: {' k K" G( Y j; }* `
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
) L' L8 p) i7 X8 ^1 p - *
. O% N6 D* }' u4 I - * Эта программа распространяется в надежде, что она будет полезной,- K( z Z* ^2 Q% Y
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии' z4 t& G$ m" i+ m7 J3 S
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.& y$ r0 K) V, `2 c7 }
- * См. GNU General Public License для получения более подробной информации.9 J+ q( j$ A/ A( ]( u
- * , T" o6 Y6 v3 D& A. e" Q
- * Вы должны были получить копию GNU General Public License- L) k+ c) T- y7 [, v M
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
6 |: u$ E' O3 z' b. ] - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.( G) W2 o0 ?) c/ G# b- o1 ]7 r7 L/ U
[4 n L8 |3 h
& Z/ c( @2 S! B
2. Импортируемые библиотеки) u$ f# U8 E, ~; t- T( }
1 z1 s+ j3 Q3 T {
- package org.l2jmobius.gameserver.instancemanager;
: {9 w$ t( \% s1 C. E - ( Z# M3 G3 N: {, H$ b) x5 ~2 p8 _& c& m
- import java.util.Map;$ G. g5 N; B! I, l+ c. h' [# P' Q
- import java.util.concurrent.ConcurrentHashMap;0 r' y; |5 i! P- K ?. Y) m: `
- import java.util.logging.Level;" u' M! @& J' _, _6 a R9 @) @/ |
- import java.util.logging.Logger;1 i, x2 B" ~ U
: v# E3 ]- @% r" I1 o1 I- import org.l2jmobius.Config;% ], u' ?3 b% I( C
- import org.l2jmobius.commons.util.CommonUtil;+ R1 _: n* [' i5 o2 h/ y4 D
- import org.l2jmobius.gameserver.model.quest.Quest;
4 _% j6 o- F1 l% [% e0 z. k) h - 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 — менеджер для работы с игровыми скриптами.5 `9 g% v" ^( N2 R
1 u( d4 ], j5 z# h ?+ y3. Описание класса QuestManager
5 C! \' I" I6 U6 U- /**/ S& a; Y* ?5 d: O+ Z; s3 G1 q
- * Менеджер квестов и скриптов.
* F1 h, C5 p$ _& @ - * Автор: Zoey76
8 M3 k3 j2 f9 f6 b C4 Z' x - */
h$ T5 J/ K3 R - public class QuestManager! q4 s& C( l f K; ~) k
- {9 k- _: V: E* d0 g- g; X
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());7 g% l9 [$ A! C% }, p
-
! b. L4 K9 k! a4 j5 R$ J( m - /** Карта, содержащая все квесты. */) v) w$ T p" F6 G5 I
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
# F" E8 O) A3 o+ r w! r - /** Карта, содержащая все скрипты. */3 @2 o% I& R6 u# J6 Q: b9 P$ q
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();4 B, }0 _" F( [% L1 U: g; b
- 6 I) Z' ^9 Y: F
- protected QuestManager()" ^- U0 F' \: p. Z
- {
; l9 T+ o- t# }- E7 l5 l. F - }
' o$ |2 E8 O+ s! x6 T3 ^6 F6 @ - }
Скопировать код 4. Методы
5 D9 Z: F/ f. x8 D5 ?4 ZМетод reload(String questFolder)8 F, I) S$ a! A8 B# c N! \$ [
- public boolean reload(String questFolder)
- p. q% n4 @ H4 h9 c, L - {
8 i) W& d; c. ~8 A - final Quest q = getQuest(questFolder);4 `1 I0 |( Q3 \5 R7 \3 o
- if (q == null)
: ^/ g' I- D) `% I7 ]: d6 w - {
# B3 B* h6 j/ b3 ~5 Q! p F4 c4 U - return false;
d3 `3 f- i2 b, l) @: L/ G1 D* M - }
( }: q# l+ ~# M0 l/ v4 G8 \ - return q.reload();4 J$ d, f+ ^( V/ P
- }
Скопировать код 3 Z2 ?4 o4 l; g: Y
: B2 u2 p0 b+ k/ c7 DМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.7 b: s3 |! a- Y- v/ n
Метод reload(int questId)
' A+ ?) l7 B: t. u
$ G0 t5 t& A5 d- u9 W- /**
7 D6 |4 M; [. ?/ m. s - * Перезагружает квест по ID.
{8 P" s* I) {1 v m8 ]0 G* b - * @param questId ID квеста для перезагрузки
, X4 m/ @- x- X$ U; y5 i F' P& ^ - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
8 w1 h" P3 u9 [8 E" r - */% ?7 n6 S- }; F( w/ D0 {' R( y- V
- public boolean reload(int questId)
1 G, h' l# z" O( o! E - {9 G6 V8 ]% I8 \: t
- final Quest q = getQuest(questId);4 J- b Y) L3 p" ]9 i1 d
- if (q == null). |9 z7 c5 f2 y% X9 R2 q8 V
- {
6 L9 l. @: T6 I# }' z( M( H0 j - return false;: y, d2 u- j. \( T/ Z4 H
- }
0 A) [3 e. q( V k$ h% A - return q.reload();
( t; T5 u) ?- V2 {- @# H6 u$ h% r8 a. Y - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.- f9 [" c0 P5 L4 Y% X1 [
% [$ u2 T2 k1 WМетод reloadAllScripts()5 O0 b: r% T ^" o- ?
' p! ^+ z0 i5 t% B O! z" L8 w; I2 V
- /**
4 M" N8 l- x& T) S - * Выгружает все квесты и скрипты, а затем перезагружает их.
' ^& ~& Y1 N1 l2 c1 _ - */ S d6 |8 V* l% |- i
- public void reloadAllScripts()$ y6 Q6 ] d& S% a$ b. n. L
- {
' @/ c/ z' [7 I9 @3 ]4 M - unloadAllScripts();7 b$ I8 M% Y ]) g# z
-
% Q7 f% K; k. R9 U1 `# T! d( \' s. h& N - LOGGER.info("Перезагрузка всех серверных скриптов.");
" u) X7 q" A9 p4 b, m - try
% ]3 l. B% x Z# ?" m - {6 ?$ z* X* V: M* h: E: T+ {
- ScriptEngineManager.getInstance().executeScriptList();
' K! S; @$ T4 [0 i' c" C" H - }* g% v: r3 _7 t8 w4 R. i
- catch (Exception e)
) p% V+ c+ l2 B - {
# G4 R V+ i3 G* w: t2 n$ i0 c& q - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
. ~, G5 U% ]( x: H+ {) H5 a9 |: d2 @ - }
' x7 B4 b; H* O - * z+ E; v! y( O# O
- getInstance().report();5 }+ n3 p! t1 Y6 K9 H
- }
Скопировать код Метод unloadAllScripts()
. r+ R% x# T, a4 [/ D
! u$ N r& B" e& J: m# M- /**
3 W7 w2 V4 P+ w% u% E - * Выгружает все квесты и скрипты.# d, f) }0 }/ X4 O( c& P
- */
% q7 x+ p8 S Y9 O1 Q; a0 [$ o: e - public void unloadAllScripts()
* G6 P8 P1 y+ K; ?% E) b. K - {* s% ^# f+ J' k7 L. _6 {
- LOGGER.info("Выгрузка всех серверных скриптов.");
" y6 o- W7 ~5 ?. a8 w -
: X; j1 r0 L) s' h - // Выгрузка квестов.
$ \. A& Z: b6 }$ J - for (Quest quest : _quests.values())
' z6 z6 B; [/ Q! g9 X - {
. I7 B- K) _/ Y J' B3 [1 X - if (quest != null)
4 o" q5 O5 ?9 Q - {
! ]- A% I0 r1 h7 C9 a; k- L - quest.unload(false);4 R. u: O$ t7 Z0 I l! |
- }
5 B- w& r; D1 ~% ~: U* i0 G - }7 ^7 q; `. T; i& K2 i
- _quests.clear();
* \- a7 T) k6 Y9 T% s - // Выгрузка скриптов.
: L0 x* I3 e6 {8 B - for (Quest script : _scripts.values())
6 s8 E9 s) F6 S, A( }( `8 T8 q - {" \, v; F8 l X1 n& R- Y$ d
- if (script != null)
& j j! @0 ^8 x# r. O! Y! R9 ~, p - {, k: k9 i5 f! o9 |! T' D! j8 R
- script.unload(false);" S, Q' n: P/ M8 }5 p
- }
5 i6 w' S$ {( u) W' }$ g- w - }
( [( }$ q( a, w" y' i% B* V - _scripts.clear();* e& F( A: ?) D& M
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.8 R0 u* c Q7 H; J8 X
" X$ R" p1 P! R$ Q' _
Метод report()
0 X( a1 K$ K B; N
! O- G) u+ p) n5 a6 y* f3 ~+ l- /**
# F& z, t* q' R3 R; | - * Логирует количество загруженных квестов и скриптов.
$ j+ H' b3 B! b2 e - */
" [8 ]: t) j. m3 X' F7 I - public void report()0 P$ \, J D4 k2 o
- {
- C' B2 o4 s& L0 P0 O: Q8 X4 L - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
6 D# J5 p+ s' E) M: R - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");: N, O* e' T1 G3 t2 s4 ~
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.3 ]$ i5 w" ~( A6 K
; b3 n5 m/ U4 x W4 _- PМетод getQuest(String name)
" ]; G: z, Z; Z% y# r
}# U3 _$ @9 N9 |- /**
2 N" O3 c1 h, l/ {) h; e - * Получает квест по имени.: m0 w5 l6 G$ V' W% A& r- R
- * @param name имя квеста6 g1 k8 t8 [& y
- * @return квест
7 R# z4 L& F% L1 _ - */
% K! I7 _) J6 a6 o% q% W/ l - public Quest getQuest(String name)7 d, y; c9 B: A. c
- {
' g8 J0 N# t- v$ c* U, V. J - if (_quests.containsKey(name))
' s# W1 i& I& R" ~2 m2 r% K - {
' f9 q, y4 f4 X% k - return _quests.get(name);8 @& w- C3 A, J/ M* a* X0 l, n
- }( H& n# G) p& M
- return _scripts.get(name);, p* @# J; _5 o/ H$ A8 [
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.0 Z6 L/ m3 f4 Q$ K8 T9 j
4 M: C' r; {5 |$ w5 @ n6 hМетод getQuest(int questId)
3 w3 \, J/ ]; A) c) J# ?+ d- {& c( C6 G/ L, G
- /**9 N% @7 V7 H+ R2 t- u4 W: B
- * Получает квест по ID.
- v" m" B4 R* \# a/ c& _ - * @param questId ID квеста
& ^: [1 Q) X6 @ w9 _( k) \ - * @return квест, если найден, {@code null} в противном случае" Q, A/ F) R$ J1 j$ n7 I
- */9 H9 E$ W$ p+ V9 q8 f, N4 O3 |
- public Quest getQuest(int questId)' @! d# L B6 B! q- z( k
- {: b t2 k, l" F& b: t) A5 C
- for (Quest q : _quests.values())
7 t$ H$ s0 g3 _" M! |0 N0 E - {, j1 ?! H. L; D2 k7 N9 k' z
- if (q.getId() == questId)" L8 P- t0 n2 {
- {
/ H, {" u+ v) V0 ?6 e - return q;4 ^$ C4 r9 G9 s0 B% n4 U! E
- }; G9 B/ g: v: t& n0 z
- }9 E+ ?9 B7 y( y0 p" W( ~
- return null;. h" x% y3 Y+ [3 k4 o
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору./ [: Q5 k. c' q1 A
$ w0 [% I. Y& h' u, |1 J6 j; \
Метод addQuest(Quest quest), d3 l4 c% `* v$ d$ j
5 L' x5 W, k) Q1 Q- /**, s1 N& ]* ~; |4 k8 e) H2 W* `
- * Добавляет новый квест.
4 R) J0 |! R4 z b# E+ y# ? - * @param quest квест для добавления1 C$ K* O5 D& N; O/ d
- */
1 K% K& K' R+ e2 | - public void addQuest(Quest quest)
/ H4 o! s! ^1 W - {( A6 Y$ y+ R$ |7 I1 P
- if (quest == null)
7 t' a: r# t( X7 m - {! D9 z$ K3 ^/ a! Q' a; y5 k
- throw new IllegalArgumentException("Аргумент квеста не может быть null");' B$ A0 W+ e" E. ^. O3 L3 o$ s
- }1 b; Q8 b, ? l% W. k$ g
- 6 |. n4 y Y, j: `" L
- final Quest old = _quests.put(quest.getName(), quest);/ U6 {4 T* X4 `$ i) s3 t
- if (old != null)
% @( Y$ V) o/ [" F7 ?1 z - {4 J8 L8 j: r3 v
- old.unload();
; ? w! l6 X" o2 D - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");/ J0 r X' R& [' W, O% F) _
- }
% b6 _/ J6 F( i8 y5 I. ~ - 5 Y- C1 R! Z/ x0 H; [+ J
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
0 x) a- S; A6 O5 P, T8 c - {9 U1 g1 D: D& V2 c9 b
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
( y' z6 J% i3 \0 z6 P - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");2 Z0 Y" U6 L! @! u2 I0 i4 `
- }
( o* M5 ~; T8 x - }
# H' w, m4 n* [$ ~: Y% [+ m+ j - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
& z% R, |( I& Z" tЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.1 F' h0 } \4 k4 B, X( N
; a' i9 S) O( d @* U/ T: A$ t( |- ]/ a, o% J
% S; R ~4 i; `! w! C% b0 Y( ? |