Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
' M% G9 h7 D7 r$ T- n. R5 M+ f$ G7 y4 z0 M! a
Разбор файла QuestManager.java$ H7 p) A/ j( U7 Y9 n6 x+ S/ F
9 q4 }/ l7 k- N _+ d6 v* fЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
/ j/ V4 i7 K; U( PОсновные элементы
) [& ^ z" ?$ A# L7 _; D" }# q- Лицензия) y* [$ N: L5 K9 G. L9 V7 s9 k
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
2 h/ b9 ]& D' Z8 A6 D
- Импорты8 {; H/ J5 T8 a5 a g# f3 h8 I
5 ~ j" R$ D( V+ s! W g! u3 sQuestManager.java — управление квестами и скриптами.
* \$ g6 F y# e1 ?" w( L6 `Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\# j/ y! Z; C) R: \$ B0 U
8 Y4 |+ t$ t8 {3 a5 t v
: M5 M. Q$ L+ Z" Z5 f2 KДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
! }1 {' q% Y1 w* s1. Лицензионное соглашение0 n c! U; O$ N
- /*
0 n2 p- Q2 w& C. V5 j% t$ c - * Этот файл является частью проекта L2J Mobius.
* g: z' _- f9 i0 r! r - * $ Z) V: C* G: x
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
: W7 R% M0 D3 q - * её в соответствии с условиями GNU General Public License, опубликованной
" ]& B0 i6 N7 ]$ N - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
# m' D$ R" a0 b( @# o - * . U8 ^. D% ^% v! k6 m$ i& P, ~
- * Эта программа распространяется в надежде, что она будет полезной,
# o6 }: a+ g1 E2 O0 T- ?% Z - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии8 w, J+ }9 g4 w" h3 P
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
. A' W& W! D; V9 _1 M - * См. GNU General Public License для получения более подробной информации.
6 c. m' Z, \; `$ } - * & o7 M! x* f) r6 C
- * Вы должны были получить копию GNU General Public License
* C$ f `5 G! I - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.7 ]/ F6 y; {4 T0 s* C3 n3 K, N
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.* C) ]- I- p2 R% Y( j
4 c* q* L, `; k' C6 A1 p/ ?) h) ]% }" H# e; D; @8 t( k( m
2. Импортируемые библиотеки' a- I5 I- G2 A# e7 C- o2 x
7 C/ I0 v9 x6 F4 r1 F/ m
- package org.l2jmobius.gameserver.instancemanager;/ D, n6 h5 P! e
- " |3 y) f% u) J
- import java.util.Map;
' e) E- L1 [! ^' `$ Y+ B - import java.util.concurrent.ConcurrentHashMap;% g! [/ u1 |6 P4 J: U5 o
- import java.util.logging.Level;. B/ y4 ^) |4 e" L9 T
- import java.util.logging.Logger;& f( O8 Z0 Y1 U5 m# F+ M3 I
- 1 H: p8 R& u8 R6 h, v) I
- import org.l2jmobius.Config;* }) Y3 E# H# \: Q8 X& }0 x/ {
- import org.l2jmobius.commons.util.CommonUtil;5 M' j6 O9 }4 O3 B. o/ Y
- import org.l2jmobius.gameserver.model.quest.Quest;0 _+ r7 y0 o M
- 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 — менеджер для работы с игровыми скриптами.) c1 x' q+ R" D1 Q2 u" e
, |" ]* L% n& I) r& E
3. Описание класса QuestManager
! g5 P) S4 }# N: M6 b& ^+ `- /**
* q; [7 M$ Q5 D L - * Менеджер квестов и скриптов.
0 D2 F/ o/ N2 X+ d" t0 u/ v - * Автор: Zoey76( t! n6 s8 W3 R4 u0 Y( `& W0 g2 k
- */, X0 j. O0 ?( k6 V$ Y
- public class QuestManager
8 h- J) z; n( e% X - {
# V% l2 r# K/ i9 [& h4 x6 |! C - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
4 }! a7 R: {7 O3 O9 j -
6 A9 Q: a7 k- j5 O y) c - /** Карта, содержащая все квесты. */
6 Z7 b1 u( @' j `4 u; l - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
4 M6 C' u) E- U2 e$ O# o - /** Карта, содержащая все скрипты. */
5 R R$ y% O- h - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();+ l8 i" P% g. @* a
-
, `& O/ `# R% e0 g0 O: [5 Z+ u( x9 d - protected QuestManager()
2 Q, p: W2 n9 M8 z; y) s - {
4 E0 P7 W( _ D0 Y L# d1 x - }
6 I5 k6 @: U0 ?# g! {9 a/ o - }
Скопировать код 4. Методы
9 G3 I8 W* ?9 @. @* Q& jМетод reload(String questFolder)0 a) a) q& V' w A* V1 c0 W
- public boolean reload(String questFolder)& o! m2 p6 q) x$ m) P
- {
7 S% O. x# o+ X - final Quest q = getQuest(questFolder);' B8 d L; ^3 ~& u* o; p
- if (q == null)" u% E+ @2 q$ G% z1 {& f" F9 r
- {
" R8 q& w/ x1 _4 M- c0 n; k - return false;
" g# P' ~8 o5 l& \ - }
, C* A: R8 S9 Z& R* y' A" @+ i0 ~ - return q.reload();& w. i9 d1 o" d
- }
Скопировать код 5 _6 c' k, m+ q# y8 s- K
$ n. F8 W) u* {
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
7 s; A) u( F" q8 r# `9 N* T' k; f: jМетод reload(int questId)
. r( N5 c' K$ {7 D2 p: w" E- s+ U# y* v) H$ w/ Q- f, {. ]
- /**8 e+ T" p [7 x! U6 [2 J0 |
- * Перезагружает квест по ID.
( u# G: |! c W - * @param questId ID квеста для перезагрузки
' H/ c' H! B% |2 o% s2 \1 d, T - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
: r# P# O$ {* [7 j - */
, c$ V. w5 s! A9 v0 j9 ~; U - public boolean reload(int questId)& j% U7 W( X. B+ R) i* }
- {( w' p. y1 Y, V+ h3 P6 B, P
- final Quest q = getQuest(questId);
1 F' d+ j$ g: z- t- ^, z9 H - if (q == null)
" v: W; |/ k; k5 N - {
4 n4 b: N g1 v, w% q - return false;1 Q8 l9 V7 ?# e' f3 C% n* X$ O
- }
1 z# c( m: {; p - return q.reload();9 u6 S# D3 h. |! l
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.3 k! A- X' s4 I0 Y
. z/ P6 j; H7 j" d0 n- t
Метод reloadAllScripts()
* N' ^. Y4 a# o+ n. g4 d+ n1 y {4 a! p4 `0 I" y) D
- /**
: D$ e8 m( B! J" E5 s - * Выгружает все квесты и скрипты, а затем перезагружает их.3 o. c; S. y+ E
- */
4 k" c4 r. M& { g" |+ h - public void reloadAllScripts()
$ K* O; g: r& S - {2 x( u2 r/ Y2 E$ w3 d
- unloadAllScripts();
& H8 _" w ^# k3 [ - - n! o* Z( L* x+ N# ^0 V( ^
- LOGGER.info("Перезагрузка всех серверных скриптов.");. K; \6 T! J- N3 f% d) F4 G& Y
- try% Q8 F N4 h" I
- {
! f; a# ?) e1 [. Z( Z, }9 A$ P# {# E - ScriptEngineManager.getInstance().executeScriptList();
t8 N, T3 t# D1 Q - }
1 F! J! x. Z- {5 n+ e - catch (Exception e)
% @0 d0 n2 m) }* Z- ^+ D6 T% G6 ] s. \ - {: v1 @( H E l- U }
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);+ f9 P6 ^& p, P) g: G' X
- } D% e3 H5 y! E2 w$ I }1 w) ?
- 0 u* A* g8 `0 a2 N) P
- getInstance().report();1 u" g+ n, b5 q5 [( B! d
- }
Скопировать код Метод unloadAllScripts()
+ H* \- p5 ^0 W1 L8 G5 w E- q7 Y" `5 C: o/ t3 P' Y3 N
- /**0 ?7 B9 k/ P* `5 {" E9 C0 ] o
- * Выгружает все квесты и скрипты.9 R1 S6 d- z& d9 y, k6 s& r' }
- */. x9 K0 A& p: _1 s9 \( U% I& c
- public void unloadAllScripts()
& h' B7 Q$ d% M: O) S* p$ b# a - {2 c3 P+ a. R) a- w8 `, ?4 I
- LOGGER.info("Выгрузка всех серверных скриптов.");8 |) X4 k' ]6 k; m; d9 F5 \! i- I7 L
-
; Q: k5 H# y7 e# u2 S - // Выгрузка квестов.
9 t( G p: X1 I4 @& W; _( u } - for (Quest quest : _quests.values()); p) d& R" S/ R2 J) @2 C& B
- {
% Z7 a8 u' o2 P6 h2 l. U - if (quest != null), v2 C. X9 D9 m3 N, z/ k
- {
+ K$ M5 y" L) Z1 K( `- B7 r. D0 I9 t. k - quest.unload(false);% U$ D D* t8 z G6 a
- }
* i& ~) \4 B8 ~; ` - }, d2 Q- D0 g' O6 s
- _quests.clear();% W+ e# E5 \7 w9 D' Z
- // Выгрузка скриптов.
9 `% h& n* y' K/ ` - for (Quest script : _scripts.values()), N* L; X" Z3 g8 S3 S
- {
( {1 C& x) E! p# u) ?4 {. A - if (script != null)1 t, v2 F0 l8 ^
- {
1 @7 |- x" q* d0 e4 v - script.unload(false);6 ^3 q% q" R" k$ C0 B
- }
: ]$ z7 I2 u& a) H8 x+ j - }
$ e4 N7 z5 Z! e/ K$ Q1 X! x) Y - _scripts.clear();* g# c$ L j' I: D/ a. c
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
+ R' C3 Q9 d3 P; U
3 |. N R3 v2 k+ fМетод report()
$ e2 M/ H0 a6 K [% j6 K' s1 _7 f1 {' J0 q, Y4 @, I" v0 _" H8 B
- /**
7 H3 o# G i; S) ]1 X - * Логирует количество загруженных квестов и скриптов.- b2 x, Y" f* S x f3 u; _. m
- */
& Y+ W) J* p3 C7 Y) i - public void report()6 E" G% ^% c; T5 o" ?* S5 C
- {
+ s# D4 V* d# ]6 B! b - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");& N/ o, ~( S2 V' a( v+ h
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
9 p1 v g, t7 P: s5 D) j$ i - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.# C0 a) k# q7 C- ^. t" h
( }* ^" q9 p; V6 RМетод getQuest(String name)
u% p+ c% g+ t! E+ G% h/ n8 l9 l4 N4 ]. H
- /**
2 c. W6 t0 }$ i; ~4 Q - * Получает квест по имени.
8 }% ]; u% I% O9 C - * @param name имя квеста
8 F% F/ x- q: r% c - * @return квест, Q/ d; M f4 ~+ `* _, `* h
- */# `" q% E6 G H
- public Quest getQuest(String name)
! P' R P3 V# {/ i/ r1 O - {+ f$ y+ [. T, Y; P. Z, w
- if (_quests.containsKey(name))+ ?: A/ L' H( m9 u+ J
- {( J1 _. j; K" r) S
- return _quests.get(name);; y, a7 M3 C! X( }
- }
/ d) m# h, y. t- z9 l" h - return _scripts.get(name);9 e5 S+ z. M$ I8 J. D
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.& V/ u+ g7 a4 X4 T; V$ U+ T
+ p1 j2 D2 V2 X* p, p; C& sМетод getQuest(int questId)
3 K' e/ v1 B% f4 n* W$ D7 g, b. ?' C! C8 N0 ^
- /**2 j0 t! j( t8 {) z5 V
- * Получает квест по ID.
! S8 c5 T6 K! h3 p! o - * @param questId ID квеста
5 q9 h# [8 g, @! G# r6 N% I - * @return квест, если найден, {@code null} в противном случае
$ o$ j; Q3 n& W1 I- S4 K& T. v - */) K8 i0 m- l: M6 H3 t1 D
- public Quest getQuest(int questId), A' _3 g, `6 F6 c
- {
: T$ J/ _& C" _ - for (Quest q : _quests.values())
/ r$ L+ _% t, a! H, P X - {
, e6 @7 k' P1 W8 D4 p5 O - if (q.getId() == questId)" F4 s9 \# U( q0 x, V
- {
& g' Q% N2 `* K6 @* [+ V- h - return q;
4 I7 E |/ w4 U1 B. Z - } X3 L9 U, i( h
- }
2 F0 Y4 e6 e, H+ y8 V - return null;
) R; z. @! q* @' }% n4 _ - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.0 A4 }* S* J4 j- f* N9 Y) `) u
; A: p9 p% z4 a+ l- h) f
Метод addQuest(Quest quest)
1 c! q: e+ O, q$ ]/ W. Z8 I9 v0 I6 ~ A* r2 ?
- /**+ f, L a: o3 M9 ^5 c6 o
- * Добавляет новый квест.
, j2 ?% ]2 C# L$ u$ Q - * @param quest квест для добавления
4 a! x. ~( u4 ?3 o% N - */
9 }+ z/ K" a O+ {2 V9 O - public void addQuest(Quest quest)
; g- _* e: R' B; W P( h! J - {2 l7 J* J s2 R2 e
- if (quest == null)
- @" h6 t& ^& }) t/ {0 Z3 e - {
% B5 Y5 v5 @6 n9 N1 \7 @' \5 i - throw new IllegalArgumentException("Аргумент квеста не может быть null");* X* m) N' ?4 o( G4 {" N) C
- }
- s: |3 Z4 R8 m, U -
+ X; A; Y! ]$ `( I3 a8 n6 u - final Quest old = _quests.put(quest.getName(), quest);
) q k5 a% l1 ~4 x; x - if (old != null)* L* x+ x) A$ j, @: E: W
- {$ _4 W0 z, @. N4 t( m
- old.unload();
8 c% l, }% A7 p I8 k' w - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
# X& x! P' ?( A* i; X - }
d* T% p2 D4 r; m4 L; ?6 h - 5 w* n! _4 \" U
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS) {' ]2 J2 o i) Q/ {/ q" T
- {3 N% e! K/ [' d4 j3 \
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
' r7 k. K& x0 O X3 M* a - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");4 Z* P: H5 `% v4 h
- }% a% N& J$ ?- ~ l6 e! w
- }
( H! V) H8 g: D7 c% ]( C0 Q. u# ]9 t - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.* L. F8 K/ V" m' x4 a" p4 l
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
! I3 u3 B% y& K' |8 }" K! K, O9 A6 C& S& F, q
- ?! Q9 r3 ^1 V, b8 A4 u7 n) l
9 j' x! S7 w* H6 V7 R6 j |