Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
4 M( Y4 c. T& g1 T1 y
- A% ?7 C) n" k4 T# s: RРазбор файла QuestManager.java9 a9 O5 d) R5 h( k& c4 h
1 m0 r8 y; Y5 V9 g# ]$ p/ |9 u* Y
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
1 }: n& k* v/ g9 d. n# H- N2 A) aОсновные элементы2 d3 O4 h& H; v3 l( Z5 X/ L
- Лицензия
, D9 e& ^: g' A+ r- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.9 X6 T: {+ ^% X( f- m9 r+ p
- Импорты
% d1 t0 B' ^# `0 U$ Y6 T1 _6 _, l
) N& ~3 R9 n& d% ^. kQuestManager.java — управление квестами и скриптами.
8 F5 x5 l1 A' C) Y6 C) LПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\/ [6 W3 D+ Z0 t& s
9 r& J+ N% R) f/ k
5 ]1 |1 i8 b0 @5 r+ _
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
& t0 P3 K) Q# T' |% k8 U" G' i( i1. Лицензионное соглашение
' v& G: K2 @3 g! M3 N( e6 ]- /*" ]4 S2 f. V! Y5 G1 |) t
- * Этот файл является частью проекта L2J Mobius.
+ \4 R$ K) Y+ H, t4 v - *
; f- Y: G5 E3 a, A0 A0 R% a- r4 w - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
. n' |4 D) l$ U y. ^0 w - * её в соответствии с условиями GNU General Public License, опубликованной
7 D: C2 m# G, P - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
" d& {$ X% ?5 ~* G; N - * ; M4 b& Y8 }' ^/ W3 u) }( X# Y
- * Эта программа распространяется в надежде, что она будет полезной,
* J5 ? s; H& ~ }. \ - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии) Z( X O W5 }+ X3 g
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
4 D# w' [9 s; e( D" s - * См. GNU General Public License для получения более подробной информации.8 E5 B' {+ L4 P; X$ C, U5 o4 C, t
- *
4 {+ z- N0 V/ U9 H5 y% y U - * Вы должны были получить копию GNU General Public License8 ]! e( E8 f5 V& K
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
% u) O6 g5 b! s1 N( @ - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
: Y% r' e1 X3 D" I& {
5 ?. r8 a q! M. H- Q5 i- U [7 T! ^/ ^
2. Импортируемые библиотеки% m+ i/ \$ G# d8 r
5 z d: F1 w* x' K9 |- package org.l2jmobius.gameserver.instancemanager;
6 ]) h( l! `+ q6 e - l! }8 E$ ?, W. q5 r: _
- import java.util.Map;: R2 N, R4 v# Z7 L# k4 |$ }4 h
- import java.util.concurrent.ConcurrentHashMap;
/ v+ N8 a$ s; d2 C# @+ _$ r1 Q - import java.util.logging.Level;
! }" a. J- e" F& r4 Z9 l0 a1 S - import java.util.logging.Logger;
% D$ w I$ F: a: v" w9 Q1 x
. L5 Y) A- R. B. q8 b- import org.l2jmobius.Config;* h% v& t$ Y7 d H9 F; ]
- import org.l2jmobius.commons.util.CommonUtil;. C+ ?# Y# L" M ?' u
- import org.l2jmobius.gameserver.model.quest.Quest;
- w2 G/ B) w4 a" Z% I - 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 — менеджер для работы с игровыми скриптами.
D9 g7 z8 ~- R6 Q; }
* f' g9 L$ M `% P6 ^5 R3. Описание класса QuestManager
- J& s `7 J& v1 l$ L- /**1 ^* h+ t$ _4 d
- * Менеджер квестов и скриптов.+ p1 _! @, l( k7 ?4 x& y F
- * Автор: Zoey76
- [8 I4 |" U# I6 U, q - */" L/ ^4 w7 A1 [! {3 f* A C L
- public class QuestManager. y- E& `1 ^$ u) R" Z
- {6 k/ Y2 U+ H% p6 K6 d
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
- b% c% z% a- c/ W -
. Z5 l. J! [/ M7 O - /** Карта, содержащая все квесты. */
7 J0 o& K. K9 \6 A- t - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();2 V2 A& A. b+ X; F/ E* g9 E
- /** Карта, содержащая все скрипты. */
% ~0 R( R- F, @" P W, W - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();! s$ o% i) f6 `+ M
-
8 r v" R! E' Q6 t# ^9 S' \ - protected QuestManager()
; W# T% U7 N6 i7 P - {2 o* k$ P# n5 a9 S! r2 O/ M
- }
# L; T- f' G& F- ]& P7 ~% V - }
Скопировать код 4. Методы; ~2 y" S/ ^6 ]( w+ \
Метод reload(String questFolder)( Z9 ?1 N% q9 G" I' W5 P* o
- public boolean reload(String questFolder)4 `0 i8 K/ `1 N" H: e
- {
4 M) R3 @7 g- I$ R, Z0 p - final Quest q = getQuest(questFolder);8 j& S; j* t8 m7 U% r/ A8 R: C
- if (q == null)5 Y$ G' u, i) S0 z
- {
7 f1 H) G7 i6 W X6 y6 Q - return false;: {& o0 I! i1 e& n
- }
: L, U$ Z8 Y7 E2 n5 U; A - return q.reload();
( x, j& _$ g& a a/ N( u3 B) {. E - }
Скопировать код
/ R% g% a8 v( z! j( u, [% a' ?- r- D# T8 L& J
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
, R: a' z4 P! |6 _9 IМетод reload(int questId)
3 W' N6 {* w B A/ x+ u# ~8 W; b2 c' X2 O2 V" j
- /**1 O" B9 Q' p0 y& [ @
- * Перезагружает квест по ID.% F$ p8 g8 ]' b4 Q( c
- * @param questId ID квеста для перезагрузки
+ |* c0 _7 N% `8 l - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае: D' v/ H7 T; q+ E; z
- */3 l$ T6 D+ e5 X8 g \) l+ e0 l
- public boolean reload(int questId)/ p3 n% K0 D% Q4 Q" {3 [1 B
- {
- I. \1 V; l0 d, Z* B - final Quest q = getQuest(questId);
; K8 O/ t3 v7 @. d: O- ]' x% V3 N - if (q == null)8 j2 D- X3 u! ~9 ?
- {" ~* q6 s7 k! s, d
- return false;/ {' s. T5 T/ ^) w' p
- }1 k) ~8 S& L9 l* X3 M+ ^4 q/ ^
- return q.reload(); @; b e) f1 `# V1 `& Z0 e- Q
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.. K7 z! W; Y; L4 H" T A
7 e; L( R3 Q2 p7 lМетод reloadAllScripts()1 I. x; p' y5 f& w& s$ X( Y
; n, w$ e& d8 g" u7 H- /**0 Y7 ]- Q% a0 f! D
- * Выгружает все квесты и скрипты, а затем перезагружает их.
( ^! y% W" L9 g6 e' F7 n: ~ - */
6 T, Z' p6 z* t - public void reloadAllScripts()
) b/ _. Q0 a8 l# a& Z1 s& F- a1 r - {7 d6 @) r# s' X% q
- unloadAllScripts();5 ]3 d. R6 q; H, U, L" S& {& f
- ' r, F" `; q( ^* O( u
- LOGGER.info("Перезагрузка всех серверных скриптов.");- S6 f- U9 X9 u) ~
- try, w# r9 K! n- X* d. k3 s
- {% V- D+ t% `# I( O/ K$ c* d* l
- ScriptEngineManager.getInstance().executeScriptList();
% ~0 |, A4 {. `" z6 L5 k; E- ~ - }
1 o, k# m r: X - catch (Exception e). F& s9 t3 L; d/ E: F8 k
- {8 L0 _1 F# w8 d& s4 A
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
& V7 l3 P4 O5 C* i - }8 l9 a+ ^4 t/ a8 ~6 p
-
+ ]2 [4 g7 V6 _) I) g - getInstance().report();! o) o6 n4 r0 ?: F) z. t% n
- }
Скопировать код Метод unloadAllScripts()$ m- z# ?8 _7 u- |/ S/ G) t5 W
6 D1 b. ^! P7 U# U- e- /**
0 H3 w# z" l$ a - * Выгружает все квесты и скрипты.
. x+ y9 a1 I( c# @# Q1 H* { - *// j4 x" P s6 z
- public void unloadAllScripts()" e& {! _! E, q; g
- {
* n4 g# Z9 m, e0 e/ k$ p) Q) ` - LOGGER.info("Выгрузка всех серверных скриптов.");( J; r. d+ {( s8 C& I7 S4 W2 H
-
0 a" S8 |6 l/ O5 s% E3 o - // Выгрузка квестов.: n6 N) c$ K9 I7 K6 _* g3 O
- for (Quest quest : _quests.values())
. \1 X" Q: g1 A4 { - {5 \% n6 B. i8 G+ A) C
- if (quest != null)
, A- u+ ?& n5 @ - {: h$ z' m) e5 b( z1 t
- quest.unload(false);
* G0 u! t) ^7 P/ U/ l* u: ] - }0 X) R9 E! D; P0 g% P
- }
; X8 O! @8 ^) V' D: U - _quests.clear();4 t( f% C: [% P9 H% W
- // Выгрузка скриптов.
- Y9 k. p2 C) Z* _' J6 u( K; E6 ~5 D - for (Quest script : _scripts.values())
4 S7 R4 K6 e1 T# s7 X8 V - {& q8 A6 Y0 }) d: c" F! E
- if (script != null)
0 R3 U. u/ X% B2 O- A - {' w7 C: l9 u# P# ]5 e1 M
- script.unload(false);
b( R+ V( V* b, X, `9 e$ a - }# @- m% ^ x6 t. T7 w( q
- }; U, s- k3 I( Z- d
- _scripts.clear();/ \( {% G) C; Q! f ]5 n
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
5 ]: B' l# M/ U9 B" B- V8 ^' F & D; F# P( {( X2 \6 `0 L6 \
Метод report()7 S: }6 Z1 N2 z# v6 B0 R. ]$ |& P
$ j% i+ r; C! r- O
- /**
- A. F4 \( V" [( }/ m/ w3 x - * Логирует количество загруженных квестов и скриптов.. V5 [. H' |$ A& I. y% V* @
- */! C4 j0 m9 |0 a" A" Z- D
- public void report()% ^, z O7 Z! x8 E4 b! W- e' }7 k
- {; {% i% v4 f7 V6 K) v
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");) S; h/ G) d7 T$ W
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");9 F: j6 Y. I/ q) v; u3 \/ h: L
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов./ V9 q2 @" ^, m* y0 H1 Y' {
+ L+ g. I E. c S* y
Метод getQuest(String name)
9 F. @& ]! u9 D3 l" l# L
) n# @/ C$ E4 f% v5 l- /**
! c7 L$ |; r( h ~, h5 x - * Получает квест по имени.5 U3 g% p; Y. M7 g7 Z# ]$ i+ \
- * @param name имя квеста
9 C: o3 t! a$ }7 H) h - * @return квест
b2 l1 G: k. V( r* t - */
( h& E' | G* C6 G0 y% x( O8 ^ - public Quest getQuest(String name)
5 X: a+ \" B( T4 O0 P - {
. {: x! q$ C7 K: X+ p8 _: h4 L. r - if (_quests.containsKey(name))% n0 D6 }+ x) z9 {
- {2 \ G4 z; S8 H% ~/ g
- return _quests.get(name);
' c. t. x! O$ f. t9 v/ s9 w' J$ ~( ~ - }# p! b1 p. {0 S/ s% x
- return _scripts.get(name);
$ ^3 h7 i- j( }) L* e; \ - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.+ g1 T" H/ B" f& g6 Y
: E- ~3 o9 {1 M7 }- d @
Метод getQuest(int questId) g7 x$ Y! F( g& \/ L2 v( p0 H( Q$ g
\" i" \! d6 ]- o- /**
" {: P( m, M) ?3 F/ E3 [4 j8 | - * Получает квест по ID.
U, v. R: L/ n* z( I3 V - * @param questId ID квеста
9 K4 M* s0 o1 H! I5 s) Q - * @return квест, если найден, {@code null} в противном случае
9 E3 `( b) ?% e( L& ^" B3 ] - */
5 g( [, C3 |( ], o - public Quest getQuest(int questId)' ?0 h2 U( A# v" T- R/ A" j( J
- {
+ U8 M3 V; ^% `' q+ W. [' S - for (Quest q : _quests.values())
. L' K$ @: |6 } ^, I4 c - {
: b: o0 ?) `# {: k, N. } - if (q.getId() == questId)
* ^9 Y# w: X3 B. O9 i+ H - {
9 w( J6 o- J) C" w* u) l& `, E - return q;
& |3 Z3 \& ?" _: J, z - }
. A4 |" ~1 d& _9 k1 Q7 A - }
- S3 `/ h X3 y6 V0 `; n' J - return null;* I* t4 V) L7 Z& f7 E3 M) ]
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
0 N% N" l$ X) C0 y6 d
6 j( ~* T) `8 P& WМетод addQuest(Quest quest)# r# F" u* `" R5 B2 ?
; h/ E% p, {; D5 E% L: F- b- /**
$ z% [2 Y, ~: { - * Добавляет новый квест.4 o5 }. k8 p7 n/ @" m* y
- * @param quest квест для добавления
; t- L" s' j. g8 @& p - */- @8 ~) N7 p# `
- public void addQuest(Quest quest)
& s) O: v) ^5 Q3 ]9 S - {
4 u( A* A! M+ M" ]- F - if (quest == null)
( ]9 t- m2 G5 w. U& H - {
( J2 L9 B4 W; h: b E: a+ C - throw new IllegalArgumentException("Аргумент квеста не может быть null");# a* Z) I/ H. |, F' h. w$ l1 j0 Z# y
- }
- A! I6 t7 a+ [; I; _ - ( R: K* @! F! J! K* d/ E- c
- final Quest old = _quests.put(quest.getName(), quest);" f& p9 |8 F: ~) R# Y6 _: [5 F
- if (old != null)
# k3 \( D/ v! t [2 n* x% @8 A0 ~. S. J - {7 y4 m& J7 }5 x% Q8 T' [
- old.unload();. W& e' V" M( M( q1 P. n
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");7 I b4 v. f9 F, \: r/ r8 J [
- }& O% k+ [. O8 }' v4 n
- 0 c1 F6 S* d6 u0 I8 K' o7 P
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)% H3 a0 R5 E4 G) D- v. Q6 W% g
- {- }6 U, o) `& J2 b( v7 L# y
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
5 F" b# U" i$ p$ R/ s/ P - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
$ I) d0 y& X. C B7 ? - }! U; y( K' Y4 y( V
- }. e% x! j( e# `: }
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
y' ?: B) l- HЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере. e; _/ T: z. f' U6 [& g9 m
! M5 Z8 |+ y. o6 k* ~ ]! Z8 g8 W8 r7 U( n% r
# q' `: d7 Q% _. L |