Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
" w) D6 Z n' g( z- m. Q; O
6 F, e; v/ B0 ]/ }' `: m, j" Z& F5 oРазбор файла QuestManager.java
0 a1 U/ M" E, E7 ?8 e# x, _& k
2 E1 o9 l7 K7 T4 q/ bЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов., n4 e) J7 c. @% [8 p5 R7 N( @
Основные элементы# n4 ?/ Y4 p! C) @) A- B$ ~
- Лицензия
6 y, S; {# ?( d8 s1 O- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
; [& f/ q% X1 w( u' G2 y" l
- Импорты: b( E1 \) z( y9 c$ B# d
6 w( k& {# F* K% |. O
QuestManager.java — управление квестами и скриптами.
5 }$ `" y, J1 {' tПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\0 K( t# V2 m' G1 \1 U6 Q& ?! d! @& K
" q& T# r4 n2 n/ W7 u
2 n/ a5 [0 n; i3 G6 n/ q9 a ]
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
+ m. j. u, x, _1. Лицензионное соглашение9 k6 s L2 x; J1 l" O, ?- m
- /*
3 ?) |; n2 Y! ^ - * Этот файл является частью проекта L2J Mobius.
5 h# A' I/ K+ S) U: U1 c2 @1 ]4 q - * 9 U k& t' ~2 O
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять3 S1 Q4 p3 S) j+ J
- * её в соответствии с условиями GNU General Public License, опубликованной" s' X7 U4 @4 G
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
. F3 N) i8 K2 R% K' d - *
7 P0 b3 v, @& { [5 P - * Эта программа распространяется в надежде, что она будет полезной,
1 u( n2 u- C4 c3 o7 ^$ V" k - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии5 a7 c7 {7 o f
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
8 Q& I( ^9 b- u% w& z; i: {3 y. q - * См. GNU General Public License для получения более подробной информации.
" B! s# y* K3 Y) s0 q s - *
/ Z3 n" @' D' [: E) u - * Вы должны были получить копию GNU General Public License
( j- c" G6 D& X8 U+ c4 q$ s# C( Z - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.+ d7 _3 a' `" _6 h
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
9 W. k$ z, _2 q7 N! }7 K
- H$ B, \" k" K
' s+ o+ @# e' A2. Импортируемые библиотеки
2 E: V1 \- J+ t* a" i6 S& c/ h# \1 M+ l7 k) L
- package org.l2jmobius.gameserver.instancemanager;* a8 y" P5 d7 m+ ~9 J
- & j/ n6 E; `) s8 v
- import java.util.Map;" G( M) h6 U6 u2 @5 X: J" B
- import java.util.concurrent.ConcurrentHashMap;5 X( `0 _" [. l% i$ ^
- import java.util.logging.Level;' C: N: l" f- I! z2 W; ^
- import java.util.logging.Logger;+ t) p$ @) P H$ D/ N* V
8 ?; z F! F6 x0 j g3 I! R- import org.l2jmobius.Config;
( [ V& a6 w$ u - import org.l2jmobius.commons.util.CommonUtil;
4 N% n8 q1 `% q, V' j - import org.l2jmobius.gameserver.model.quest.Quest;1 u: S0 |6 E( Z! K1 |; x
- 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 — менеджер для работы с игровыми скриптами.. Y* u; d8 n4 W: B6 T" m+ Y3 y s
8 o' r$ G. r" I
3. Описание класса QuestManager
d! Z K. b8 N- F+ s$ D+ g- /**
6 d5 }2 e9 W( ~* v! U Z - * Менеджер квестов и скриптов.
" M3 M1 \! n, ]; ?4 | - * Автор: Zoey76
8 @- ?9 u) C; k) a; s& W7 j - */
) I( o9 I( e; _( c/ B( o - public class QuestManager
: \- {/ u! P' W3 {5 |8 T: Q - {
8 m+ ~$ ^' T2 W8 H- B - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
4 ~. D+ {. E3 o0 M - 9 w, J# [* Q3 \7 u5 G
- /** Карта, содержащая все квесты. */2 }1 a& u! a5 }. F) @
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
2 m. o1 X/ Y1 ]3 a) K% C - /** Карта, содержащая все скрипты. */
' A+ e3 u, Z) Y1 J1 K L - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
+ o" l& l- J' p! ]: ?* C5 R f; Z7 u - 2 n0 W, e; [7 h7 o) `; C2 q
- protected QuestManager()
4 {/ h8 t7 `# n7 H- Q - {
" ?8 n5 J0 @; d - }
6 v5 T( `$ U) C, M - }
Скопировать код 4. Методы
5 {6 E) e6 V+ w5 n8 fМетод reload(String questFolder)
9 d" y6 w0 o* c5 {- public boolean reload(String questFolder)3 B8 m$ N0 t8 A1 I, w+ O( t! \. @
- {- I4 W) u2 O7 h% K, L6 v
- final Quest q = getQuest(questFolder);1 S2 M( O( Q8 D+ S9 \: a2 A; e
- if (q == null)
, z0 C$ P$ f2 i3 Y5 o" h - {0 {7 u+ L7 _1 Z9 i# d, q; |& s( m
- return false;& } u- K0 p; X: v' I8 k
- }1 L- C" V5 w7 H. O* I: D% R' i
- return q.reload();
0 Z O$ w3 I& h% I, c0 w - }
Скопировать код
, s* h# m5 E* x/ _8 a( E; L5 a6 s. W1 G! W
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.% Z+ m4 i3 {, M; l1 U& a# @2 G
Метод reload(int questId)
( x" I1 |0 l2 i
) X% h. C% e0 e) ?- /**
: s' s7 g4 k3 O! Q9 |7 q4 [ - * Перезагружает квест по ID./ m3 g! {# _; n4 U7 H
- * @param questId ID квеста для перезагрузки+ n$ `/ j! [9 f; G2 e P
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
6 h( ~3 Y7 k) g- Z* E5 H7 W - */
* x! V! M* p4 Y; R: m - public boolean reload(int questId)2 J" u, l0 E; P) y1 J' d- f
- {+ G( S! ]; p! j) y+ P; k0 d s! u( y
- final Quest q = getQuest(questId);
# z2 c: O, s. G' o3 j - if (q == null)
1 M, ^' R$ D+ e - {* w; Y2 G# L1 Z) r9 s: F
- return false;/ C5 T, T; x& S3 n' f, C
- }3 p* j3 q p: i$ s4 W
- return q.reload();( C3 s3 H9 R3 p7 B! V. X9 @( Z$ H
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
' K+ y- d* l% V) t" U: S6 l7 V
! O. r% U! P4 S7 E0 f4 I% TМетод reloadAllScripts()( d/ H- P! s" O6 |+ }: F6 X9 ?' o% \
( ^2 r6 e* Y6 T- E7 `6 L# m- /**3 O' C5 F/ D1 b# r3 ?7 l
- * Выгружает все квесты и скрипты, а затем перезагружает их." L+ H4 F; M) X
- */
$ }8 d; C0 b7 C& j - public void reloadAllScripts()9 l, d3 T7 b! y* X9 ]
- {
" [ i9 w/ t. x1 U& A - unloadAllScripts();
4 H9 E9 X5 N, R9 J8 e - 4 J' Q# w( X- @
- LOGGER.info("Перезагрузка всех серверных скриптов.");+ p+ {! ^3 }& Y+ s. R+ F2 m
- try
1 T9 I; {" O2 B7 e" w$ q" h - {8 x* \1 N0 Q$ H
- ScriptEngineManager.getInstance().executeScriptList();( O4 }. H5 P0 M8 u I
- }9 H" S6 Y0 A& \& v
- catch (Exception e)
7 N; U: h5 Y8 }8 N$ E Z2 W - {* ]' V& _- e' N
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
& \6 _1 m$ j0 U8 G1 q - }
* M+ P8 | I- F& o. ~+ K - " T4 `" t( { e& |6 F
- getInstance().report();- b8 N: | k# _7 ^9 @8 w
- }
Скопировать код Метод unloadAllScripts()/ x; N. D5 P" \' U$ i3 T( F
: j1 F; A+ q1 R3 {, B9 ^
- /**
0 R5 @& o: B& \$ v) h5 E - * Выгружает все квесты и скрипты.8 t- x- d$ _# Q6 |4 j$ _
- */6 N$ d2 V1 j* f8 {: `" W9 [
- public void unloadAllScripts()
9 j# S; P" `; A, K - {
* j( A) \# F3 e# X/ s& G1 v9 F' n - LOGGER.info("Выгрузка всех серверных скриптов.");
^2 O4 i& F `. S -
7 v% ]3 C! O) q P" |% n - // Выгрузка квестов.# B9 G9 F q- e: G3 ]$ j7 @$ @6 c
- for (Quest quest : _quests.values())0 {' o' n" [7 l9 X' R/ h
- {/ F2 i% Z4 R5 G! h
- if (quest != null)
3 ]( \' B9 N& b3 @ - {
4 U; s# m+ ?" B7 n, ~ - quest.unload(false);
8 h. g7 p# h' f! M - }
9 V/ @ {1 [8 ? - }
& q; Z9 H4 t \$ J - _quests.clear();
0 ^ @: Q H$ y - // Выгрузка скриптов.
6 ^7 f1 \1 N! v7 O, f - for (Quest script : _scripts.values())
/ R7 {- Q+ F* K* j+ C - {
7 V4 T1 h- r6 ]1 M5 D2 t - if (script != null). q6 n$ I2 ]/ `# o; Q' E
- {; g/ ^- j4 s" Q0 F& J; E4 Y: z
- script.unload(false);( G6 J+ j5 D# Y! E4 p0 Y1 B/ J ^
- }
; E: v- H1 f' _" n5 q - }
6 V$ W9 G" I6 E L; ?9 O - _scripts.clear();
) _1 u$ U4 ]& K- D1 |& j - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
/ m$ q7 W# f8 I, I3 o9 W$ i+ w : u) X H+ {- i# g' O! `+ a
Метод report()% g |1 N6 ^0 T
( e3 r0 ^0 Z# z P- /**& [3 s3 \, t. }( p2 r7 }; W5 v( n7 u
- * Логирует количество загруженных квестов и скриптов.5 b! G, K+ Y# t$ k
- */
% h% T0 u3 E! N B0 f - public void report()/ Q0 C! z2 y. n
- {& X. c5 c7 g' W' U% R
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
+ h7 ^7 P' L+ ^4 y. K) {) h4 G - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов."); m+ m8 V+ `: w4 a/ v. v
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.+ t3 V5 }5 D: u+ H! w- i- y
" b# M* T5 D; x- ^! B
Метод getQuest(String name)" N0 r. p" `3 C( n3 ~
4 s3 _0 r# b( L- v. w+ t6 }' A- /**4 g0 s8 a0 g x3 q* V& T/ T
- * Получает квест по имени.4 ~9 b# h" v* t# U2 B. {9 ]
- * @param name имя квеста7 s4 M9 M! a5 F$ J
- * @return квест
( q+ W) u3 m$ w# C4 u8 X' E - */6 M7 E" [3 [& @ T
- public Quest getQuest(String name)
+ r+ I p# R2 @$ w: ] - {
! t' E7 }4 L& ~' o - if (_quests.containsKey(name))
) ~1 h* K" [0 @ n6 S ?* | - {
. I/ L9 w" A. e2 M' c- W - return _quests.get(name);% D q3 L* w. g* B, U2 d
- }
2 c7 x" e7 N) g+ J8 }/ Z - return _scripts.get(name);" q; }3 {# m- n+ d7 q
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
3 X- e; i' J$ a2 |
0 {# J+ i$ E6 w0 h+ ^8 xМетод getQuest(int questId)
6 }) I6 w7 c$ x% L w/ H# F9 M6 [& v6 s0 w: w2 ~& E8 ^
- /**4 P! q; q+ ^0 {5 q1 Q% H* \. p
- * Получает квест по ID.
9 T7 R# Z; ?& \8 \" ?! ~; T Q ~ - * @param questId ID квеста' R) `9 q# X) C2 t: V
- * @return квест, если найден, {@code null} в противном случае
: @ n) `3 |2 W* o6 Q" q - */
- M# [) ]6 W4 ^$ _, m - public Quest getQuest(int questId)9 @ S! E, ]& T& @' w
- {$ R! N$ }& [4 L. Q8 D! Q! B
- for (Quest q : _quests.values())
; z* j0 }8 r! l" j. v - {3 u* [% Q0 W: `& I5 ^6 Y0 i4 x+ l
- if (q.getId() == questId)
c7 Y. R( d# E6 f/ F$ Q - {
- @+ s" |0 D' k: y - return q;
* }/ Q! J) P$ h - }
" g- I# R- i3 k1 ? m - }
- l3 d$ y' W; h8 b! \ - return null;
. W. k9 I& M& |2 ` - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
) S6 @2 F; w& K1 ?7 j/ x 6 @6 Q1 W/ a2 {
Метод addQuest(Quest quest)
! f* J* F6 B! C% T: n9 S. Y
# N3 x' N6 E+ u9 U5 I6 l$ q- /**
8 F6 ?* e0 y4 f2 }% H - * Добавляет новый квест.
, ~% T, V0 H7 k# D - * @param quest квест для добавления
: h3 i8 s; D, X! Y - */
- ?1 U7 y% V0 E4 k8 v, n" U/ T - public void addQuest(Quest quest)
1 W# |% P# o) E& S Z% C& A4 | - {
7 }' ~4 V0 p- a! c V+ X - if (quest == null)( A O1 c4 X2 {
- {
9 m4 T3 U4 E& r) E - throw new IllegalArgumentException("Аргумент квеста не может быть null");
/ j1 s) D9 w) l, S. h - }# o r* \6 u& U+ D, w* s
-
1 p; p: p9 @3 M6 m( i - final Quest old = _quests.put(quest.getName(), quest);
0 J, W: |" B) R0 z4 u - if (old != null)6 z+ W( L' g* o% V4 p8 S
- {
" q3 U, `8 L7 u; j5 \$ g& u% H( x - old.unload();
( s; L$ F$ p+ X% A: W8 t+ C - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");; \1 u3 o6 P4 k8 g
- }
4 O1 a9 m, F. F - & ~/ k' a: m1 e6 ~
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
: J- |% N& }* T. n; }# Z - {
; V9 [0 B3 _7 D0 s7 y/ `' P - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();- b% v' E$ b+ A
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");+ ]; W/ o3 G& ~ f1 O Y
- }
2 f& C- e! O( S6 M - }
$ O6 T$ _7 m. O; M& e0 ^+ r - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
( [$ P# o' b5 xЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
8 N: D; c Y& r
+ X& q; {! F9 N: i$ v4 O
. W5 e o; \! x [3 ^; t, n; B8 ~ g/ ?2 x: q
|