Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius# X( ~5 I0 [; [, c/ Q
5 _* S9 U* I V" u
Разбор файла QuestManager.java
8 o4 O( A2 h2 h8 S! R- t& _
1 _) {* O! L0 p7 M# ~Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
9 \* I! i$ ]1 `! R! |- K1 Y3 IОсновные элементы6 n3 U( \3 n8 g% a/ C5 ?9 G% ~
- Лицензия( ?- `( u! m x; R {+ E
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.2 ~$ J! E+ {8 U1 e5 m6 V
- Импорты
$ o: F* \9 }* l' a0 f* Z$ t$ t ! Q/ I) E0 O& d( y6 z5 {
QuestManager.java — управление квестами и скриптами.
; N1 t& s2 f) X3 k. HПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\$ E) [1 Q. i0 P& C/ c! [1 A
1 `+ F! x0 s3 }9 @; O. W# v5 S" j6 \$ N- n
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
+ i$ N0 D/ W3 h: k4 r+ y' P" }' G1. Лицензионное соглашение0 ^7 U% S6 a* E( m- ?$ a" g
- /*
" Q* V; K0 q0 Q. u; o# x% D5 { i - * Этот файл является частью проекта L2J Mobius.( s. o% @. N, K! {
- * * ~5 W1 D' {7 V0 I7 X( q2 Q: j
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
8 p2 }6 M6 w$ o - * её в соответствии с условиями GNU General Public License, опубликованной! o i5 U$ [, W
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
2 e; A' \; i: ?2 w2 } - *
/ [2 r3 L+ v0 H2 p - * Эта программа распространяется в надежде, что она будет полезной,' R% ]: H# E4 Q4 Z
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии; v/ s6 d- T2 k
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
& N0 v% f' w- `3 O! n* c - * См. GNU General Public License для получения более подробной информации.
8 _ T3 F# s' ?( [0 b7 ^ - *
/ z6 ?. K! m& ?+ E5 t - * Вы должны были получить копию GNU General Public License
" x$ O9 a. Q( p3 j" ]' g1 Z( @ - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.4 O5 R1 Z6 o) l# r. v' _+ k
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
- R8 `0 f6 u# d9 _
5 |6 ~' r0 @# h. Z$ u2 V
0 ~! m: z" L0 `( L, M: L/ }* f2. Импортируемые библиотеки
! p$ C4 X) ^+ @" q* b5 i H" M2 A/ x
- package org.l2jmobius.gameserver.instancemanager;
' ?( U( Y- |+ b# ^5 V - 7 r1 {6 z' F1 n" X
- import java.util.Map;
+ T" A% S+ \7 Y' d - import java.util.concurrent.ConcurrentHashMap;
! A. {+ P% ? [4 A$ Z' J0 ^& x - import java.util.logging.Level;2 ~6 W' i3 p7 U% p& b
- import java.util.logging.Logger;
; O- @; {6 X4 a- e/ i, R
- D+ p) g7 e0 V- import org.l2jmobius.Config;7 ^) F* |4 O* @' ]: k1 W9 `2 D
- import org.l2jmobius.commons.util.CommonUtil;
- E) \7 @& [3 y. y9 W! y9 H) w6 V+ `* ~ - import org.l2jmobius.gameserver.model.quest.Quest;$ c `! T! c1 ~2 Y# s, [& I/ r
- 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 — менеджер для работы с игровыми скриптами.% ?4 X: S* F' E) ]5 B7 C% q+ c; J
6 _9 L U6 Q# g) r+ b8 S! t1 c; i
3. Описание класса QuestManager
~8 j Z# e, v7 a: x" u# }- /**1 l) ]+ i# s5 B$ p4 o {
- * Менеджер квестов и скриптов.
' y8 Z5 X7 L9 W - * Автор: Zoey76
: R, D) @: Y- G2 Z' q3 x( v - */, d) e+ b: s3 e" B5 L, b
- public class QuestManager6 P, n% e) m* ` F6 c/ i* o
- {# G& Q! n; C, t8 s; c, c
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
1 R: B& M: Z( s$ p+ a - 6 V' T% b/ C& c% I/ {
- /** Карта, содержащая все квесты. */
: C q2 R6 i) C& \) m - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
% \2 [% [7 g. y! e* O9 V3 a, A) | - /** Карта, содержащая все скрипты. */% u( P2 G* K# x
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
: i. H2 ]7 H- z6 ^9 _* C0 v -
: U9 A. Z! I* O* Q" q - protected QuestManager()7 y6 t" |5 J6 u- c8 T8 U; @7 j
- {
& C" \& g8 e: ~) W - }
) D7 [7 {; b$ ?7 O- o$ ^+ @4 M+ b - }
Скопировать код 4. Методы; V! a( \4 _1 F: ~. b+ n3 C
Метод reload(String questFolder)
1 x# t& I2 X5 u- public boolean reload(String questFolder)) m2 X- { _% }/ U0 w/ Z
- {
) ~. E4 Q1 D. v. w: n - final Quest q = getQuest(questFolder);1 k$ r2 A0 r2 c1 ^& r) |
- if (q == null). B% Y$ ?: Y; e
- {& S; w+ [* T1 a
- return false;9 U) x) \% v; i1 [ D" I: d
- }- {8 |4 Q: v/ ]8 Y. i' F) @! w
- return q.reload();
2 g1 q0 w6 |( N8 P y; O - }
Скопировать код , G6 [. ?: ]* `9 X% K* u# D
3 L" B. U; |+ D; n- ^
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.( D/ G: ]( y0 o: o
Метод reload(int questId)
3 k U/ j- Y+ c9 S9 h0 J# h
" i% Y( U9 w; R9 u' G& X8 I) A5 i1 A- /**" P% Q8 ?1 V" v0 i9 j
- * Перезагружает квест по ID.
6 u, w3 a' L9 e! D m - * @param questId ID квеста для перезагрузки8 `" E e7 x; E$ L* n7 i: o
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае1 }9 k# A5 b ?- C Z1 J
- */
, [! x: w# n+ O0 d# ` - public boolean reload(int questId)1 ^: \! o: y B, g7 Q8 x, T$ d5 {2 }
- {( f) J& ]4 L- y$ p
- final Quest q = getQuest(questId);
5 @9 F& O) n, p" v2 X `; Y - if (q == null)9 O/ g" s) B% Q. m" h2 _9 J% L0 ~9 W8 E
- {7 M% p& `. f# a& m
- return false;
2 w+ ~; g% r6 _+ `6 v, k - }
y4 V0 q) w) J8 u/ y - return q.reload();. ^ q) v+ l/ p/ ^( O3 ^7 {
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
1 T* h, B' R0 X1 S2 r) y2 H
" A. f& q' r' C# b6 |Метод reloadAllScripts(), P' |1 O; V# w7 t
' H9 A3 ^2 o* @$ C! f1 ]- /**6 k7 q; n2 }( t; w2 a9 ?
- * Выгружает все квесты и скрипты, а затем перезагружает их.
4 J; o) U( N1 \$ [) J - */
+ N: M' ~. H& q- P6 C, W! L - public void reloadAllScripts(): q: i8 Q: ~4 L
- {
+ {6 _) @( {2 O" x; r j6 M - unloadAllScripts();
/ N- U, u; b! m$ k! e - ( p$ h' t: u9 g1 [
- LOGGER.info("Перезагрузка всех серверных скриптов.");
, s" t( S, w5 A0 i) Y9 z - try
9 ]+ N9 G/ n0 q! J8 F - {, l' }* D1 ~3 |3 X! ~; O
- ScriptEngineManager.getInstance().executeScriptList();
6 |- T& P0 k9 B' }% y - }7 Q+ b8 t9 i4 W* J9 p H
- catch (Exception e)- [3 {+ y+ J8 l4 Z1 p, U+ O0 m
- {
% s2 e% Y8 o3 V - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);- i) [; ]2 U) ~
- }
$ S& A9 Y* r* g& p, ^: W - ( B4 Y/ ~5 m' q3 k& U
- getInstance().report();3 X- K' l2 N, d2 I+ b
- }
Скопировать код Метод unloadAllScripts()# n- c: X& t$ B& w; r5 e
% M+ I( ^, r2 |) C) b
- /**$ g8 e7 v5 g3 }: \ X) w
- * Выгружает все квесты и скрипты.. D$ w+ A, _* W! {5 ^/ P1 \" c5 x- _
- */6 e3 _0 t) r' E. B) ~5 w
- public void unloadAllScripts()4 o% j) H4 U8 @) E/ u
- {& V; ~* E ]& r$ c
- LOGGER.info("Выгрузка всех серверных скриптов.");5 @: \2 i7 F# ^& P
-
; M+ @% ^1 Z$ Z; y - // Выгрузка квестов.
3 u) E( o8 j, o& X6 U5 m - for (Quest quest : _quests.values())8 v+ E5 z! K0 ^& l
- {
4 w( f; e1 @4 _ - if (quest != null)) ]$ h# {2 q* [1 Y) D
- {" M% [8 L" v) g6 ]+ [; m
- quest.unload(false);; T+ h: V; n$ h( {; F2 k: s
- }" F/ i L! N, H$ D. y
- }
5 R$ n+ M' O. f9 y; [9 N - _quests.clear();" l- m( r+ u4 J Z
- // Выгрузка скриптов.$ Y6 x7 q. ]3 @" z
- for (Quest script : _scripts.values())# V! }6 K; r7 P
- {
- C6 P O, v6 | - if (script != null)* d5 r$ E2 Z* V5 _) b. z
- {
}( B/ x4 g3 f( i9 ]# e. [ - script.unload(false);* x$ l) q1 i7 x' U- C7 r
- }
1 r% F! q$ y) L1 _& N2 B - }
6 }+ a7 l9 a7 t( @$ r6 C9 \ - _scripts.clear();% p) j+ U8 P9 m! F. ?3 f
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
% f5 j( F! n. {& C
3 ^: o$ w1 Z7 M; b& a) KМетод report()5 l+ y8 a& Y! l) c4 t5 e6 h a: \
! N, `: n- I7 Y- /**
% f- Y, p' c; a6 Z5 w( w/ z& r - * Логирует количество загруженных квестов и скриптов.
$ h p0 T! y% z0 I$ T" |+ ? - */
# J6 s; N& E$ j' J3 e2 } - public void report()
. W9 q) ?% ~! r1 z: Z - {$ z7 C" D# b4 z9 b# ~ j& M! P8 h2 ?
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
) l q* B8 B* I9 ^2 ~& K - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");( Y0 b5 {# Y9 m$ s+ O9 m+ }% W
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.( B k+ E% c8 G N7 r) t: ]
$ f- W( m9 e" _! S# U
Метод getQuest(String name)( B$ [) e8 {, G: k% S
( Z& `% v! y0 k+ S7 [# o- /**: V3 W% }0 b6 D
- * Получает квест по имени.
( @) S9 a0 A' S6 S4 o( ?4 L - * @param name имя квеста0 r: u9 F# u4 m* p5 n+ m. J
- * @return квест5 }: Y$ s# X+ R2 b/ \( x
- */! v1 a2 o) t" o }" {3 F
- public Quest getQuest(String name)
9 P5 e r0 s5 b+ T9 D0 q$ Q! k - {
1 K7 W+ l V4 |6 } - if (_quests.containsKey(name))3 c' k$ ~& U& L) Q Y
- {
( Q! b' B9 W2 o8 D- `7 X - return _quests.get(name);
9 S) B6 r7 u5 v% f - }% y3 C. B, v$ F! e
- return _scripts.get(name);
1 C6 S; e2 o4 q - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.% h! k" o. m3 k* n+ z/ L
5 Z' z/ ]/ _' M P3 A9 PМетод getQuest(int questId)
. \$ y# E1 K3 f/ {
2 C4 b m, P/ Q; K- /**5 Y/ q( A) D! ^! y
- * Получает квест по ID., E( A; D3 b6 c6 d
- * @param questId ID квеста v6 I) E& o4 w" k0 I
- * @return квест, если найден, {@code null} в противном случае
0 W( o. c7 a% p/ J; t3 Z - */
5 H: w5 f6 U# V& ^9 Y+ f$ X - public Quest getQuest(int questId)
9 x1 M6 O) E8 @. \$ } - {5 Z9 O( R) J( j/ B1 @8 W
- for (Quest q : _quests.values())
" H. ?' J- J }! a% m! k( g' z5 P - {8 i1 [6 x, g5 ?' \" R* ~
- if (q.getId() == questId)
+ _2 }) {* {& f. m/ `7 |* U - {
* v1 i9 K9 ^- P$ H% D' ^! p1 F - return q;
' k3 E" `/ q# O: ]0 F1 z) |6 Z0 F - }, \6 \/ ^& H9 z% X |# X
- }; G+ _7 D! U: O; E
- return null;
! X2 y) R+ B! i U( e - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
E% ]$ Y1 ^0 \3 k 2 K$ {/ ]0 Q6 K1 J. h
Метод addQuest(Quest quest)
0 U: B# J/ B4 M. K7 I
) L7 d- t; ^( M- /**4 F6 |, d) e' k% E7 h. p
- * Добавляет новый квест.
) T7 ]& B( B9 T b/ i6 j4 a - * @param quest квест для добавления) ]4 z8 U5 }% t2 |3 [/ U% z
- */
2 H. E3 Z3 a& f$ t8 a, u - public void addQuest(Quest quest)
5 [% i8 C( W2 x; F - {* M3 ^: n1 T* X. L, E
- if (quest == null)
7 x0 h: K0 i, ` - {
. h* D: s& X* k - throw new IllegalArgumentException("Аргумент квеста не может быть null");+ @% M+ f% O% I7 v, W
- }
% c) r# z- L5 g% r. \ - ! M2 R4 q' X7 a- W
- final Quest old = _quests.put(quest.getName(), quest);2 P+ l. X2 c+ r" H
- if (old != null)9 z/ A+ F. y) Q1 H( g' x
- {0 m) R2 G6 c. G* Z
- old.unload();; K" Y; V0 J, Q- F+ V0 G
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");) x* l% o% j7 Z/ Q7 y
- }. `9 w$ {9 o$ \- q9 k8 A2 r
-
; Y. t' c7 [ \5 Y- Z l3 `$ r% v) | - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
% C' c1 S( r+ B. K$ M - {
- l% w. x$ D' U$ G% S) w - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
& v+ _" w @% h+ i% \8 b# n+ o& _ - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
0 A" M0 B7 B+ [- f! } - }0 r' T5 i4 w1 ]/ @
- }& w4 c+ C5 F' U; z0 ^+ P
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.& w! u. I: a% k" A
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.3 d# U2 [' l5 V) ]2 f
, _/ F7 L$ S0 B. ? }
, z$ W, O2 I5 T l) q
/ ]1 D& K* G, j0 `2 t
|