Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
* `; ^/ I( h0 V" [& e' B' I
8 R+ I2 y+ |% ]7 l7 kРазбор файла QuestManager.java0 P6 y8 ?6 A) N$ d0 s. b9 u8 X
& ~4 a* }. R h6 \' E6 D; }) [6 ]
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.! r$ A- M4 O0 D5 J
Основные элементы
& B; i: h _* S q- Лицензия
% c) v9 m, M2 x/ t- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
9 d; E Y+ w S; v5 c" E
- Импорты
3 u/ u7 S5 r4 e 8 J8 z5 f* D) w+ O4 f1 p0 {/ Y
QuestManager.java — управление квестами и скриптами.
* U) q5 |/ h! g SПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
. O3 M( l. [- q1 l/ u2 K
/ J8 B2 e! k* j0 @$ K
: {% n2 q9 }/ _7 t( i* O2 IДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
8 h: A! Z8 K& u1 G0 e/ {1. Лицензионное соглашение
+ G) l5 f2 Q3 y9 K4 }' ^- /*% z$ R/ L. C. ]
- * Этот файл является частью проекта L2J Mobius.( ^. U1 W, @$ s5 d
- *
1 ], x; E5 O, z# m+ ~- E - * Эта программа является свободным ПО: вы можете распространять её и/или изменять" [6 w8 \: J3 Q; j: Y% u
- * её в соответствии с условиями GNU General Public License, опубликованной
7 h8 R2 h9 ^) ~: g8 \( S4 E - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
5 i2 M a$ `" y/ Q" Z2 \; @* n - *
- w- Q# x, Y$ M0 ^ - * Эта программа распространяется в надежде, что она будет полезной,7 |9 ]" W9 U _4 V, V
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
! ?5 M4 X8 V! ` - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.! L( X! c1 c# R, m8 c( Z0 {
- * См. GNU General Public License для получения более подробной информации.7 [( G$ O* E1 d3 f) B2 u
- *
, s" ?! d s% Q& g4 i0 {! C; ^ - * Вы должны были получить копию GNU General Public License# n6 L7 {, ?3 K' p; n5 L- Y+ O
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
B3 @) Q4 G- R; I4 l7 b4 ] - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
) V8 b V0 H7 Y4 a4 V
" x& T; m' v1 k, b* E) R4 B8 }+ M2 f. V, x" d% @
2. Импортируемые библиотеки5 m8 y/ `. y, N
' j0 z: @% v* b- package org.l2jmobius.gameserver.instancemanager;
# I+ i0 c& S$ m0 j1 f
/ E6 H( u, e; n4 l7 |/ a9 C- import java.util.Map;
6 D: v* r0 u& j- Y: g; ] - import java.util.concurrent.ConcurrentHashMap;
6 t9 |& S' W9 I3 |$ y9 Z2 ^ - import java.util.logging.Level;
6 x# k0 N0 q- S3 [ - import java.util.logging.Logger;
; Z1 K+ o% z* I! s
8 Z5 v4 f2 e" }5 [4 K$ Q+ H- import org.l2jmobius.Config; I* V/ ~& j% G0 m
- import org.l2jmobius.commons.util.CommonUtil;+ F" }. P+ f M, U( T4 `
- import org.l2jmobius.gameserver.model.quest.Quest;( [$ I9 H9 k6 N
- 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 — менеджер для работы с игровыми скриптами.& i# U- K0 [5 J- F. ^% C4 U
: o4 g% H. x8 p3 y( f: E3. Описание класса QuestManager
* o. m7 Z, d( P ?8 H! _8 C- /**/ W6 u- \: A8 M5 y9 r
- * Менеджер квестов и скриптов.
2 o5 G6 B+ t: m$ Q3 Q' p2 }9 U1 E - * Автор: Zoey76
8 {% \2 V E I4 {1 V - */% p4 r! w9 f, y; C M& ~
- public class QuestManager/ @& T$ q" n2 A" A6 L( K1 x
- {
$ E6 A& v- o4 L4 i1 b6 B8 o - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
& Y. j) w4 E" D( k. U5 H+ D -
: ]- q- |: p0 A% x$ g2 p G - /** Карта, содержащая все квесты. */
( C5 J5 Y4 x3 Z4 c - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
5 J1 G) v7 _; M3 [- }; e - /** Карта, содержащая все скрипты. */% Z& c4 `2 S% v4 G
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();2 t4 i0 I, L0 B h
-
: c: b) z' q: ?1 K, y n/ D) z - protected QuestManager()# u0 B6 X7 H# X9 n2 T P3 a2 |$ R
- {3 Q( i& p2 H& B3 v* [
- }9 m' \9 [9 S; |9 X
- }
Скопировать код 4. Методы( n+ H @4 J* F$ p2 o
Метод reload(String questFolder). ~1 O; }7 z3 g6 A) t/ T
- public boolean reload(String questFolder)
- H/ e0 R1 T7 a9 Y" | - {
. e0 N2 U/ f+ [7 Q7 C& P5 b - final Quest q = getQuest(questFolder);
! u0 ?6 i+ ?! w3 X7 w N - if (q == null)
3 f1 S1 ?: Z3 C# A+ N5 k G - {
. \; A6 G( I& q+ ]# H8 d$ ~ - return false;- p7 k1 [& F- A
- }
% R2 Y8 x Q3 @' t2 ?0 N# @1 h - return q.reload();0 i3 `- y+ u1 n+ o( v% [, [
- }
Скопировать код
! s# m' ^6 h ]/ Z% E
- t- c5 ^) g, eМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
% W; W: U* O2 D3 ~Метод reload(int questId)
3 x8 N/ v3 H8 I; v# n! q; Y0 Q, E6 V r* N5 s) D
- /**5 M/ p# [. g7 R2 f0 v: T/ q
- * Перезагружает квест по ID.
& S& W- q/ G F5 t: A( o) q - * @param questId ID квеста для перезагрузки
; ? O" C" Y; ]* p) _, I7 q - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
- ~" u( E4 x6 S* n; D6 k - */0 s& O( b! w$ }
- public boolean reload(int questId)
' ]% A; f! ^" o3 H5 k - {
9 c( i: h) N- [" R$ C3 T - final Quest q = getQuest(questId);
4 ^* H+ Y! s" H3 A+ e7 k# v - if (q == null)
4 T% S; J1 ?8 e. }" f - {
% ~, C8 \" i" q! _$ a% k1 i- w8 ` - return false;9 G7 n% g6 I" [7 b9 d2 l% C% h% [
- }+ k/ M7 ?, R- s/ W9 h& f5 m* k# Z
- return q.reload();
8 C. K% U+ M8 C! _* ~( a0 P - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
) w) ^ U" Q6 F 3 ^: ?+ a# i; q& Z
Метод reloadAllScripts()/ U# i$ n0 t+ P8 ^7 s; S: ?
2 D$ p$ P% I! R" W8 V
- /**
7 ]' W5 G$ z/ R, ?7 a0 l$ ] - * Выгружает все квесты и скрипты, а затем перезагружает их.% x9 K* x# G& b1 F9 ^8 m
- */! J$ V9 ~1 X0 h
- public void reloadAllScripts()8 i9 U0 {, r2 |5 O3 O
- {) T! z9 c `3 F- \! B" G9 I
- unloadAllScripts();
+ b, g$ v/ `' _- [- b8 o - ) S- [" b; ? }& ^" u' [9 L
- LOGGER.info("Перезагрузка всех серверных скриптов.");
1 L- {: w' j" j& k+ ]6 j - try
) u7 r/ r1 ?! M, } - {
% T2 O/ P9 f+ r0 G0 ~ - ScriptEngineManager.getInstance().executeScriptList();
; B3 j& D. z. }" b/ z - }# @( b) r4 s" }* y
- catch (Exception e), \& h, X/ A( ]/ G" e- r( {; u
- {. i* r5 n- V9 i& u6 z; l
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);& q9 k! x3 f/ [2 q* [
- }/ M1 ]0 c* W/ }5 ^
-
$ Z, y- n' q' I6 W$ C# C - getInstance().report();
~. u; p) R7 `. w5 ^, }7 g+ @ - }
Скопировать код Метод unloadAllScripts()
" P) ?1 W7 A2 O& Q
; E- x$ ?) Q5 q0 D \( @: c- /**
; q. b* S& M6 X b% b8 c - * Выгружает все квесты и скрипты.+ m/ U- m( K' d- R
- */
B- @$ L2 P" f! I - public void unloadAllScripts()
( I o8 ~" _' J. o W - {% i& o! V! e% x! {5 J, ]
- LOGGER.info("Выгрузка всех серверных скриптов.");1 I* n5 i$ C4 j) x' @1 S
-
0 b0 u" K- _$ ^8 ?% d. D7 h6 c" z - // Выгрузка квестов.
7 w0 l8 r/ ?3 K; {9 X( ~( o% \- Z) i - for (Quest quest : _quests.values())6 e& j |( Q6 n
- {0 G6 z% y& z' |9 Z7 @! N, ]
- if (quest != null)
) S& c( Q( A( M# S8 T8 \" i5 q/ @ - {' O2 a* m4 b3 b( H
- quest.unload(false);
; Q: p! s4 y! u/ b - }
- e& B/ r" K( Q( v% l' X - }
; Q$ j7 b9 x; y. r0 M0 x; d - _quests.clear();6 n6 \4 i5 B' R$ D0 |! K2 h, ^! D
- // Выгрузка скриптов.
6 C1 x1 g. m" E% J) y% |+ a - for (Quest script : _scripts.values())- ?, P3 f3 q0 k! R. ^
- {5 r `8 c* |; H$ @9 k1 Z, u
- if (script != null)3 z) Z, _1 w. F e
- {8 T; F) A9 s; Q
- script.unload(false);8 X) v6 G$ o+ V* N3 r! [' _
- }" l& A& Q; k# M: N
- }9 c$ J6 W2 G, d: G! F/ O
- _scripts.clear();7 A" n1 ~ h5 ^: {
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.+ G6 O- P. T) [) G
" h* A" `( }$ \; t2 x# J6 Z
Метод report()1 s( R) S( ]6 F9 y% ^0 X* o- G% l
0 X7 A9 h! \( r/ m% x- /**
' o0 g1 T; U" @ f3 l$ d - * Логирует количество загруженных квестов и скриптов.
& m4 c4 _. r' w7 p& }' J: `1 [ - */
, W: X' r6 { ]3 m6 [8 c - public void report()
# n8 h# R' R; E - {/ H: Q; R$ e/ g, @
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
+ p( c$ B% U! Y* @+ s" l# O7 e3 j - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");# Z4 Z" A3 Q0 n
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
* F7 c& _) B9 b8 W& b( }' a1 v
' A2 o/ s! \% d7 cМетод getQuest(String name)
, e7 M0 n9 j! n* t; T6 h7 m& u# }$ |& ?: K% E
- /**
# z8 `' O) U, ^' v) K3 a# i5 M - * Получает квест по имени.
! z% C; r2 m# H3 b; I, e4 t. A: W - * @param name имя квеста
- I$ z" d# m; u. h - * @return квест; M; n1 ^& Z- t7 ]# ~
- */; z# a4 H: f" h0 g+ P8 \
- public Quest getQuest(String name)4 J9 c) U, Y X G w2 M3 b
- {& b( t9 r' R: T) V; @- i9 S
- if (_quests.containsKey(name))* [" |4 G9 F8 O# P+ K0 W
- {
1 ?& p {2 v, r9 n3 v, U - return _quests.get(name);
' t( p1 p- a& {& s+ Z; D; ^+ ^' M - }
) g; k v2 |. Y9 O4 L - return _scripts.get(name);
/ F/ Q1 x% B, T( y - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
/ z+ U2 e- l9 h$ j. z8 w7 o + A. c" `9 e j7 M0 P. P
Метод getQuest(int questId)
# k: Q9 O! P/ w; T9 U$ }% Y. \% ~" g! X6 z& R
- /**: q2 z* n& U. M( {9 f+ f& l
- * Получает квест по ID.
$ o0 Y5 v5 D% E8 h9 C* W - * @param questId ID квеста
$ S3 a @, D k% p) n5 q7 _, m - * @return квест, если найден, {@code null} в противном случае1 Y, }5 v2 t! g: |' k
- */7 ]5 L' b) K. _% f- s" S& O
- public Quest getQuest(int questId)8 J: h6 o5 s! V. T
- {
- a/ h' F9 m6 w' u: _, e7 [ - for (Quest q : _quests.values())
: H% ] I+ \+ L: c$ e1 s2 N" k - {& P# E( U( T) s1 ^
- if (q.getId() == questId)
1 B: k: O! G1 m" |1 |' O - {
# a; k1 n$ s0 G8 c - return q;
# R5 p+ r; k& ~ - }9 A; \% y i$ }8 u2 y4 ] A
- }
% X6 Y" k3 f) d7 B( o8 ~ - return null;
4 L8 @9 e+ r9 [# y# J$ p9 M0 u - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.$ q( P7 M% i, F! g
* n+ y \$ V+ U1 r. t/ K
Метод addQuest(Quest quest)
7 ?2 o& _% Q! k, M; P
# |/ I6 Q# Z& S* [8 p" a- /**) c- L- R4 B* b$ Z4 l9 N/ S6 o
- * Добавляет новый квест.0 K. o/ x9 Q) s1 Y3 y+ _
- * @param quest квест для добавления, y' j% M" x! G- L( ]" @' @
- */
% r3 J' M3 e0 Y5 u - public void addQuest(Quest quest)8 l/ P3 Q* D" C8 `
- {
. H) ?5 P1 ^7 B3 d: s! ~ - if (quest == null)
/ g8 u6 ] t1 j4 I+ K - {
1 n4 X4 Y# P) S - throw new IllegalArgumentException("Аргумент квеста не может быть null");5 G8 V+ V+ }) S" Y) N+ e
- }/ ]+ G& y+ U# w* a0 q
- : N1 A9 P5 B+ ^: k
- final Quest old = _quests.put(quest.getName(), quest);3 m- b+ N% q9 \# D% O, Z& g
- if (old != null)
$ L& U, ~/ K+ ~; ^& p - {
$ _: _& j! V- i# J - old.unload();7 o! R/ Z2 T {7 ]6 V$ S+ `$ X
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");# r v4 V' w! g8 I( W" O3 R! E' x
- }9 P% C7 D s" I+ t' T4 R- D
-
+ @" f0 S8 O! @) _ - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)% @9 A# r4 ` l6 |/ e1 c9 E; |
- {0 D& P3 i1 \& B0 L( a7 [
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();: n! t( t2 r$ K
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
q# x; p8 b* r. q) W1 G B. I - }
2 ^# [+ U6 s1 i! l4 ] - }6 Y% p+ i$ _7 w
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
9 _* ]$ ~8 [9 R# R& c# f, V5 oЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.) w/ @7 f. N- m0 Y
. q+ M. B% U( Y( L% G% f9 O* w# d
! _3 T3 A }1 r
9 u" u( s- [$ m7 ~, u5 ~
|