Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
, o% s5 z3 S; p
* e% o2 i6 |9 ^6 HРазбор файла QuestManager.java2 z% z2 M8 R/ D* W+ D( @
W8 O/ d. r4 V/ J6 V( }
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов. g) i/ [% N2 h5 u9 y; g- X
Основные элементы8 S. S# M& J) t0 s! j! k( }
- Лицензия; ]3 Y4 L- D' v; F8 x# O8 j: a
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.. x( l: U0 P/ K! r# _5 |9 G
- Импорты
+ [ i8 V3 z& f, r5 b
4 s* A4 G" g2 F3 ~( f8 i$ e# \QuestManager.java — управление квестами и скриптами.
3 _! h. u- i0 Z1 ^# wПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
) [9 n5 s/ j! e. i2 g9 n; M: F+ @; X( r0 Q0 c; n3 I }
0 b( \9 [0 J, K: C8 S' PДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
+ r* r4 g; K" x9 L1. Лицензионное соглашение" X* K6 M% g4 x0 o- Y @
- /*
' t4 l5 t6 y1 z$ a; s, i6 \ - * Этот файл является частью проекта L2J Mobius.) N# @& V0 P a( r" x9 M9 K# \
- * + M8 u9 _9 T7 g- y4 \& n' S
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
* m5 `% e9 h6 K* ] - * её в соответствии с условиями GNU General Public License, опубликованной; a7 R; V& z1 [: f
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.5 g9 N+ O" h" R. F3 a5 m* o
- *
6 A6 M2 w: u% s& N" R' g; V8 C; W) Z - * Эта программа распространяется в надежде, что она будет полезной,; t! I$ f% G8 n1 e) G
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии& c# r9 q* D6 `1 ?& {
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.& E1 s/ y' Y) F# u
- * См. GNU General Public License для получения более подробной информации.
1 t* x7 C9 B! o0 g - *
, O6 U) v" n6 I5 J: o6 { d" C* | - * Вы должны были получить копию GNU General Public License
. F* u5 l7 H' [; I6 V; w2 G - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
/ S+ Z! f S! J$ ?) w- E) V7 K - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.; }8 h! [7 u: N4 L
% F4 O2 [) O; }" F0 Q, F1 l2 O1 Q7 _9 S/ l* @0 _9 B5 c
2. Импортируемые библиотеки+ H/ _$ Q9 z6 t) ^6 @5 v
& @, n R& Z: n
- package org.l2jmobius.gameserver.instancemanager;* d6 Y4 ^4 x7 l$ `( H: a9 [# \
7 F$ {8 z/ i, Q! v7 A8 F" v; O& s- import java.util.Map;
4 g a# e& |3 f& d8 \5 I - import java.util.concurrent.ConcurrentHashMap;
' |& h$ I. B0 l5 K- M - import java.util.logging.Level;
: ? V4 w Y0 Z# v - import java.util.logging.Logger;; f6 }4 [. ~3 t5 M4 R$ @# K
# P9 Q* P9 Y! _" O6 W% C- import org.l2jmobius.Config;, Z' O$ ^9 g/ W6 g. C# Z
- import org.l2jmobius.commons.util.CommonUtil;% \1 o( b; e. C; H& q. k" p/ ~
- import org.l2jmobius.gameserver.model.quest.Quest;8 V" |9 s4 i8 q3 x* e5 y
- 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 — менеджер для работы с игровыми скриптами.* [, `$ Z( u* ]: O5 J
. E" I6 Y, A& y; J1 k3. Описание класса QuestManager8 K" T2 b ]% l6 b5 K" H0 h
- /**; x5 x- }) i( B/ T) m
- * Менеджер квестов и скриптов.' ^: v4 X6 d, N3 {7 y/ b( C0 B
- * Автор: Zoey76
+ Y; C) [! M8 b. b9 @, b* p - */
7 I9 I- Q- K! Q: Z6 |: [6 Q - public class QuestManager Y% M Y# k2 d4 ^7 e8 H
- {( d. S* O) A* J8 i- ^+ i/ G" F
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
$ L2 V' y8 O3 _1 Y5 T9 D* ^- b7 ~ -
& V0 O3 d0 L- m y- z R - /** Карта, содержащая все квесты. */) @( @, s$ p& c- P" m
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();$ E! I# O( [3 ]* }+ L
- /** Карта, содержащая все скрипты. */* E s3 I2 d; J0 D: ?4 y* D! y
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
7 P* S7 j9 B) l- u; z, V - 9 Y5 g; r ?3 Q+ t8 j8 |, l
- protected QuestManager()9 b" n9 S8 i5 B$ h8 |- O
- {0 k# {5 N2 E, P- \# O# u0 Y* w( x5 _
- }
/ V m) }* m$ N% }& b! Q: O - }
Скопировать код 4. Методы4 {4 C1 U1 [9 X# R7 Z* r$ w! E; b
Метод reload(String questFolder)3 f. b. A R/ l+ {
- public boolean reload(String questFolder)# Y5 D' L! u/ ^% b
- {
! O' }2 P: h! Z' n+ v$ D - final Quest q = getQuest(questFolder);
: c8 z( j; n5 e( e( j - if (q == null)& v3 A/ r1 F( N; P
- {
7 A9 I; K. k( F( R% p - return false;
( d* M1 }/ ?6 r9 c7 m4 m - }. T: m3 G2 I+ g
- return q.reload();4 q# ]1 F0 [" H& ?# \0 m. T. U
- }
Скопировать код
Y6 t5 u$ }9 A
; g$ p5 |, c1 ^ g) YМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.1 J2 C/ p" U8 } x4 n7 P l
Метод reload(int questId); N; H, B3 F, m# S* G
' J3 }0 n! d g# j- /**
3 Y# z( r% n3 r) e* R - * Перезагружает квест по ID., a9 N/ \+ Y6 `' V+ B: K
- * @param questId ID квеста для перезагрузки% D3 q% Q" |2 f0 s8 G! U
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
/ b+ C; {$ ?# C' S) Q0 F. P" ? - */8 R v- V" q, z2 I
- public boolean reload(int questId)! }& q A, z/ S% n/ _! ]2 }2 Q1 {
- {
( {# h, @: Z# L - final Quest q = getQuest(questId);
# X1 W/ Y/ L, n0 b# Y. p9 _ - if (q == null)
0 K( i3 K/ U) I) h; k - {
+ L7 Q ^/ H |+ N - return false;& R+ Z6 a; b+ l! e, e8 ?
- }7 M( x% ?9 T+ E$ V; ?$ |- Y
- return q.reload();$ D% f9 M1 f$ Y# L' ?' y$ R8 z
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.( c# i" x) h% n- \6 y1 h# Y' a
7 L, ?6 V2 a- B" C a4 L4 j
Метод reloadAllScripts()
+ Q: S: F+ g6 i* x& s6 J9 m! c# g+ }( x: ~7 ?6 R1 O/ @ m
- /**; M" e4 P4 M: P
- * Выгружает все квесты и скрипты, а затем перезагружает их.$ `3 l- _2 q3 Q6 |4 u
- */
# S$ n2 K$ ~: a - public void reloadAllScripts()9 r' w. X. N0 {( Q
- {
2 z) ]" m# V4 s2 w% s; t! w - unloadAllScripts();$ i! U+ [% H6 M' J7 l) E
-
6 s, a x1 Q( Z" [" p1 o - LOGGER.info("Перезагрузка всех серверных скриптов.");
4 `: q. I7 z6 o. _3 T - try
7 U' Q$ I/ L* c) F0 I) N. P - {3 W' A$ ^7 R& E Q+ Y+ }9 y
- ScriptEngineManager.getInstance().executeScriptList();
6 o+ s1 B& i5 _/ T - }% [3 r/ S' q! f6 t- ]
- catch (Exception e)" H2 E& v, v1 {' ]; N3 N* e
- {
2 k2 w$ q7 @0 v - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
' Z" [) p# h& t6 D - } E2 S& O* W; }4 k' a0 r* c
- ' H" w+ o' g9 ]6 ]3 j
- getInstance().report();
* K6 r( I% C5 D- }, H - }
Скопировать код Метод unloadAllScripts()) O, y( R# o; l. a! |
& @5 R: U- F) M# b7 a8 r
- /**
+ i. ^4 M: y6 @+ W9 j - * Выгружает все квесты и скрипты.7 d' r2 r: {$ g( o- u( i3 C
- */
9 o6 E$ L5 Q- B4 T7 x* K - public void unloadAllScripts()7 o: t. d7 Q+ Z, j5 @( |7 X
- {
5 |; l' x) N5 A5 e - LOGGER.info("Выгрузка всех серверных скриптов.");
/ o" h0 p6 E! X3 O1 H% H; m' H - + Z: S+ u0 z/ W, R3 T5 B2 o
- // Выгрузка квестов.+ P, K0 I' B( `$ G/ v# h0 K$ m* O O
- for (Quest quest : _quests.values())
( @* t+ _7 O, Q9 m4 ~ - {
- Q0 K3 q1 h1 I- F5 l - if (quest != null)1 t4 Z/ Z7 s; P
- {
: C& T; y7 }6 u9 G - quest.unload(false);+ K8 g$ P q/ _. j2 t3 }
- }
$ C/ p" F; t* H& @8 \ - }
+ F/ b' Z! F: _# F7 R ` - _quests.clear();
4 h8 \* s6 E8 m$ o: K - // Выгрузка скриптов.
9 E4 m1 f2 u* P - for (Quest script : _scripts.values())+ ~; O5 i% P* j1 h D
- {
- H+ ^: J9 S4 ]7 Y - if (script != null)
2 s5 U8 [% ]4 y% G6 F - {* K) E+ y' f" H) V: \
- script.unload(false);2 J; {/ u0 b1 B+ [4 x
- }
, \+ M! Q* S% s& v: V - }% C6 Q7 g3 I. C* U
- _scripts.clear();
* Z1 S; e7 R# E - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.% C/ o J7 M" h7 r1 |2 E
" V7 [3 P: e( m) C
Метод report()
$ d3 C7 t2 I5 O
& C$ ?0 U; L6 {& B6 g r- /**
1 S. t, p9 G( O7 f5 B+ \/ H1 U, h - * Логирует количество загруженных квестов и скриптов.# Z, q' E, r" T# v+ D2 T! J% |
- */5 X+ o$ t8 z4 F$ v% z7 Z, q) G% D
- public void report()
9 i @4 Z3 m- g; k - {
; w5 `' u9 H$ q: i$ L" t- j- w2 a - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
9 H$ r1 t2 ]; L' E$ o - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");! X1 E; ?& E% ~$ m' r- _: _
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
" F0 ]" R# M7 k! P
; H, K4 n5 e" D' VМетод getQuest(String name)
6 ?3 N& [9 C7 J( g) H8 k
) j7 M4 f0 S% p$ a/ U- /**' E0 b% m0 j+ ]1 N, L4 l9 U! D
- * Получает квест по имени.1 H% r' l9 b9 L$ z. c) g
- * @param name имя квеста
3 M) W2 x: I3 f' C - * @return квест# _) f+ ~* C# V3 @
- */* ]1 ^* V# Y' n; e* M" L' H
- public Quest getQuest(String name). x( |3 [* K$ X# j3 W. C6 A: E+ t: e
- {
" D8 t) M/ s# d1 b) M9 _9 `- Z' y - if (_quests.containsKey(name))
' W, M7 _% @, L7 q - {1 \/ U9 G+ B+ r7 H6 J: I# o
- return _quests.get(name);
1 I$ r" O% l- }6 Q$ `1 _/ y! ^* ` - }
- o8 ^, O1 P# o- Y5 D - return _scripts.get(name);3 W2 d, [* D6 |+ T7 y
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
& d0 L8 h- s' C# s3 i
* n6 x( z# ]/ `' g, aМетод getQuest(int questId)- t% A9 C+ x- u$ a% Z0 k W
9 Q2 R) V' m7 _5 n- /**7 ?( T' S+ D- G1 j3 b7 Y
- * Получает квест по ID.& h n7 o/ l# C: @* O2 z O; m2 U. z
- * @param questId ID квеста3 ^, T5 t+ c0 H; i$ z$ v- x
- * @return квест, если найден, {@code null} в противном случае( `( [" X- L3 j2 y& q* k3 P0 X* a
- */- ?* }4 W* P9 J
- public Quest getQuest(int questId)0 q! R! Z" N2 I( z0 U
- {
I9 N' Q5 Q& P4 c9 F9 B - for (Quest q : _quests.values())
- ?$ K/ n5 |' M5 I7 T8 s - {
/ e9 V- ?" M* H4 m& Q9 Q - if (q.getId() == questId)2 `* _. c1 x5 t3 e' ?/ B
- {9 V) M, H9 n3 d, J) _. @$ K
- return q;
0 H6 ~5 n/ ]- R( z; V - }! \5 C2 |0 f, Y' K9 V+ l
- }
6 r" N, P) _4 S, n8 V$ x! y+ v - return null;
* ?. n# z/ M+ `' W9 f - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.3 `! b, t5 q; A* ^; P
" i2 ^9 R; m1 \Метод addQuest(Quest quest)2 G. i- y# _& H0 o7 ~) t+ H' Q4 l
. w& w( h$ S/ o: O' f, T7 {
- /**$ ]0 q. t0 V" m% \) h& l
- * Добавляет новый квест.5 G! ?- }9 O3 m. [# ^. }! A) s* }
- * @param quest квест для добавления
8 |* u9 }# Q, ~3 I- j* s0 E - */
+ a3 W9 B3 q/ s) Q; [7 s. [1 O$ j - public void addQuest(Quest quest)
& ]3 g) z& Z7 n' [ - {9 V9 _3 q1 O0 D# ^# `2 U: V
- if (quest == null)1 l, r! K9 e1 e. Y3 t: X
- {
}7 a" L' w5 v0 E2 j/ K1 M - throw new IllegalArgumentException("Аргумент квеста не может быть null");
# ?3 p I; L$ ~1 e8 ^$ R - }
! m- u/ ?$ ^9 D6 z1 T I2 R - 9 I- N! T' d. n# E& T; d( j
- final Quest old = _quests.put(quest.getName(), quest);
; o Q1 [3 `2 ~0 Q - if (old != null)
/ n9 o |8 J2 \+ a' ~ - {
! s% U0 l0 k. X) _! d( m - old.unload();
' x' D$ \. X$ p4 A) U) F - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");1 {- Z1 b9 ?! U! o) w6 _
- }
! S3 P6 N( X( D* Z, Y" ? - ! I2 A& A: O1 V. q
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
' @1 K& P& {9 g7 J- N+ ^ - {
! R. [" q, [( P, l* F" P - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();- `: z2 p# M0 W7 z1 I+ h
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");/ ~' R7 Z* t: f2 o& O
- }
1 H2 a9 T# [$ T. y - }
8 b) ~. I. q" i - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
J! o( V9 D# e. gЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
4 n3 o1 ^5 x% N& w: s) F8 {* R0 y# I; l( z/ {0 z$ Y8 n
: e2 R6 h) r r5 n( a
1 P9 k; p5 P1 n$ S* ^+ e! H9 l
|