Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
' B: |: c' W2 k5 y: t1 F* B! P# p4 z4 O
Разбор файла QuestManager.java
- Y: ?- V3 m# Y9 |9 k& r# b% j
; x' E8 o3 L: O: \, P2 Y+ l# gЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.. P0 c: |4 J# T& w
Основные элементы. r. z, J) h5 L
- Лицензия
# a6 ]. a- ]* E5 B1 v! X, Z- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
8 g* \0 W5 j; ~( c4 p
- Импорты" L8 H0 |4 _+ _) ?3 p# x0 c
& l% J$ @1 M4 b0 Q& c4 T E# A) xQuestManager.java — управление квестами и скриптами.' K# {) v; r4 @7 [" f2 J, F
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
{1 [! i5 h6 v a& X8 a
! H, Q0 }1 g6 ?7 U0 B# n5 {6 i1 Z+ C3 B& r! x
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.0 e! W; U* ?& h: @8 P) X! j2 I
1. Лицензионное соглашение4 Z$ }# t- `. `/ M/ D; t1 X/ j
- /*
7 l, E8 _: ?- g# ~8 w U0 a - * Этот файл является частью проекта L2J Mobius.
, b: a$ I$ B0 A$ a& Z' h+ C - *
4 V& S' a7 L5 Y k; K$ H0 h - * Эта программа является свободным ПО: вы можете распространять её и/или изменять+ h" @; B- g$ M& W- }1 U( R5 U
- * её в соответствии с условиями GNU General Public License, опубликованной
! R, }5 ?, d6 T4 a - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
4 }5 x& j& d7 e/ O' s% P2 r - *
9 e. S% a2 A. O: E' i5 q o - * Эта программа распространяется в надежде, что она будет полезной,( B0 e% j( p* N5 |- p% E
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии. w6 v' P: v1 o2 e% a: b. {
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
, V2 }. o# |) u0 X0 G) ] - * См. GNU General Public License для получения более подробной информации.& w P5 |0 r f8 B
- * 5 A7 F9 m8 S$ ?+ g# E+ i
- * Вы должны были получить копию GNU General Public License
6 [8 N8 A5 ]# u) ?" A6 i - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>." N- R" R& v% f% `
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
7 y6 @& n" T7 Z, _3 T
% d" h5 q5 v) l' _% ]! }
: @7 l h' }1 S) ? \2. Импортируемые библиотеки0 i* s% x5 H' ]' ]0 A1 a6 k: r3 |
# j* q& h3 `7 {0 c" f
- package org.l2jmobius.gameserver.instancemanager;9 h6 ?9 F" R: ?
- ( K# C' [2 w4 y$ t9 e1 Y0 I+ Q# w
- import java.util.Map;
/ c' D0 h' \ |1 E/ V$ `- U; e5 _ - import java.util.concurrent.ConcurrentHashMap;
: g+ n- i9 T4 N. q - import java.util.logging.Level;
$ R. n2 v9 D* i- {" n# Q" r - import java.util.logging.Logger;
2 _" c+ U% ?# b* o. J( M& \ - ; |7 H7 Y8 E/ y0 M; w
- import org.l2jmobius.Config;
# W% ]' E6 {2 Q3 t! M - import org.l2jmobius.commons.util.CommonUtil;
3 ?* o7 r$ ^ p! o+ K - import org.l2jmobius.gameserver.model.quest.Quest;
+ ~% C k6 _3 _9 u - 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 — менеджер для работы с игровыми скриптами.
3 H6 j) h, P7 m8 q! N9 D
" A! p* K( P! U3. Описание класса QuestManager
8 r4 Z8 b# I2 o" j: ~& Q. u- /**
5 R* X w' o3 S; z- A* ~ - * Менеджер квестов и скриптов.
5 c3 q l, J* h P) o0 A' v( D - * Автор: Zoey76) M! C. J4 `1 t7 M& c7 M& v
- */) c$ @/ O1 T8 p4 v1 j' V' G
- public class QuestManager& V. z' H- I* V! u
- {, p6 n* _. H- u- D9 V2 N+ n! Y2 E5 l: R
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
! B) C. v: i( v" X - / G# F2 I) K4 j: ]3 n1 o/ H" I
- /** Карта, содержащая все квесты. */% F" K* e8 J( B
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
, }' q* @, t |. {6 L: @4 J - /** Карта, содержащая все скрипты. */
& q2 {1 K& l9 \+ y5 f - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();5 h! ^: D5 H% a8 {8 N" n x0 g
- : s3 }) |6 b# \! `; X3 G
- protected QuestManager()$ `/ y0 w8 F3 H& Y" T
- {
1 X4 [3 b+ n9 `: p/ K m2 c - }
+ f9 Z; X* c' P9 Z - }
Скопировать код 4. Методы
9 n$ Y2 `. j z3 q2 F/ S2 z! YМетод reload(String questFolder)5 |: W1 S3 F% H. F8 S- Q) G. l
- public boolean reload(String questFolder)
~' H' S( K# p% G! j - {
+ E. [7 H5 B4 ?+ n$ A - final Quest q = getQuest(questFolder);/ ?! c/ W0 O" g) z! N" }$ H
- if (q == null)
; t# m" l8 b& k7 o3 L- [+ ? - {6 o8 J: }1 V5 B4 G) l. E$ x8 F w
- return false;- K, ?1 ^; A$ V
- }
" P& {: x, d, }8 j/ g5 W1 [ - return q.reload();
' g$ v. u" Q* h - }
Скопировать код
% z% ]" c! X( n2 z- P9 u3 L) H# \! a& }# L& l ^# n
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
3 E4 ^# m5 M0 c p0 C* S& x: o9 I7 vМетод reload(int questId)
+ W7 E, `# K% H- a7 b
$ }! u/ n3 k' r. _, L' E- /**6 B6 X6 p! @& N
- * Перезагружает квест по ID.3 R- C8 J& C) k- w8 {# B, c4 z
- * @param questId ID квеста для перезагрузки
: o) {5 W5 G* Y- V3 F/ q3 e - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
9 r# t( `, c& N1 B - */
& k" o4 ~, W6 T. Y8 v - public boolean reload(int questId)% ^' [' V# _3 n
- {
1 ~+ v8 S: @2 g5 S - final Quest q = getQuest(questId);
& l# h, l/ i8 _* {7 v - if (q == null); m" {9 s$ `$ k: i0 ~$ Y
- {9 z9 G8 V5 h' J
- return false;& e9 }8 u: j0 E1 J
- }
, Z: j+ v" Q$ x$ D - return q.reload();
* v: a* j, x: _% G - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID." Y4 ~: {( V: j- w# ]
5 i0 ?! M; R) w' i/ \
Метод reloadAllScripts()4 f$ b; h7 K0 j
$ V% Q1 f, @4 S4 k, E- /**0 Q1 l: t1 p# f8 U! D: {# p
- * Выгружает все квесты и скрипты, а затем перезагружает их.( d! P5 b1 ^" s0 x) _
- */
3 N/ b9 A8 M3 U& Z: e8 f - public void reloadAllScripts()+ P5 M% P" r( H" d6 q$ y
- {/ z( L/ V. i U
- unloadAllScripts();% f: g5 \) \% I& x S0 J I# F5 J
-
( x2 v" S2 T4 D. r8 Y - LOGGER.info("Перезагрузка всех серверных скриптов.");7 O& x. y% `6 ?
- try5 l; n& m$ G7 J, p8 Q9 I$ H& ?
- {
% n' [- ?' Y* M1 `7 R - ScriptEngineManager.getInstance().executeScriptList();# R) ]9 s& v- g$ p2 U7 b) g
- }
6 G" G3 L: D% E: a" U" ^ - catch (Exception e)5 V: \* c5 j* i6 F
- {+ O- Z( ]( o. X9 M
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
' l* b0 y; L$ b+ l - }
% Q* Y% X- F; ]+ g - 7 p9 I( l4 x) }0 h+ \! Y
- getInstance().report();
* b" a6 d+ `& q/ J - }
Скопировать код Метод unloadAllScripts()1 g( s8 o( x( D7 o. r" x) h
1 V% C1 g& E9 p p
- /**4 k# l" h& e _4 I# I' Q
- * Выгружает все квесты и скрипты.
4 V1 e4 L7 u# v- G# h) r$ ~ - */
+ B2 p1 z: c/ E8 i - public void unloadAllScripts()" E# k2 u% l9 f
- {
; ?, l# y, u/ n$ c9 V' A( I% M - LOGGER.info("Выгрузка всех серверных скриптов.");
" s, m# G" Z6 L9 E* E" V9 V* s0 r -
, _2 `" u1 S, y2 I! q. r9 ^" g6 _ - // Выгрузка квестов.
4 Q b7 S1 @( k4 q' O( O% L - for (Quest quest : _quests.values())
- K+ o( e& o" R: a/ [2 H - {
) p( x' u5 U- @. a) l" o2 g( d - if (quest != null)* o) m0 s/ l; S$ N& L
- {- V; v8 W' [( m3 d& d& X
- quest.unload(false);
9 T7 h2 j# a; \% L9 S - }
, I7 q! j+ j' Y1 l - }( C* O% M$ T- T
- _quests.clear();* b/ J K* U- j; O, n- w a" n! J
- // Выгрузка скриптов.0 l+ [2 l0 Y8 m$ x: O$ ~
- for (Quest script : _scripts.values())
, N8 O/ w4 s! G* R s - {7 u- \( i: y, h4 ]
- if (script != null)" U8 j ~+ L `0 O! n5 E$ t: {2 {
- {# a5 _9 z6 J, ]+ P
- script.unload(false);
0 U9 t' y3 u8 x( c" P* y - }( _/ ^! u" A. x7 s* O
- }
& h) k. ?4 |! @! ]" i( C - _scripts.clear();
" s! f. ?5 q1 o7 [4 O - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
2 D; F- g. a/ b* V; p$ Y
' P$ v6 F' y0 t tМетод report() }0 _3 w6 v, n4 i+ f6 l# U
, r6 i' R5 @- J# s h- /**
% {7 g) D' t; u3 x& o, F. K - * Логирует количество загруженных квестов и скриптов.
/ K2 A u- Z, g: i+ ~& e, J. J - */- ^- e! M; N% W
- public void report()$ H& }! W- g8 M8 M' v* ]. z+ ?& Q
- {
8 r% ]7 M, I2 {4 n2 ^ - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");% w! O+ t/ n( d% B' ^7 H1 k, x
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
4 w3 D3 H; z, C0 [9 L* ~) d- a - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
9 k! C; |& k( f& _5 u
& H* e& c* E4 M# L4 J+ {7 O, h% eМетод getQuest(String name)3 y: Q6 {. r! j5 I. Y2 `8 S: v1 X
: k& E9 |& Q1 ]6 _- {
- /**5 }6 Z l. ?# I ^1 S6 p
- * Получает квест по имени.
, y1 w y/ d: b5 N8 s1 \ - * @param name имя квеста
7 E! G5 T( W/ i) x3 J$ M - * @return квест+ J5 e, x5 e# a6 v+ h, \
- */
* [% J4 [1 [! }' ]; {2 I - public Quest getQuest(String name)
+ v9 k9 B( J. d* I3 P0 D' g - {
/ k/ w, R' V* p; \6 I - if (_quests.containsKey(name))
2 X# P; c9 A% M5 |# F - {% j5 ~1 E7 @0 F& Y9 C. Y& U
- return _quests.get(name);4 a* C' t, |( g2 {7 \
- }
7 F' r" E+ r4 S ~, \, V - return _scripts.get(name);0 D, f2 a1 D, m, M1 d) H
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.( n( X2 y& p0 ^: B9 G' s
d: C; O: @* L$ {+ U* kМетод getQuest(int questId)& }# w$ p$ w8 @ M6 Y2 H
' U$ v8 C" N% Z( K3 m- /**
7 W; p X0 ~% K5 d7 m% s - * Получает квест по ID.% ?- V4 s$ F" m d+ k
- * @param questId ID квеста
% e& k3 c& E! { - * @return квест, если найден, {@code null} в противном случае2 l/ @5 \! l0 O$ g$ F
- */
1 d! V5 {4 e& c7 L7 [, p - public Quest getQuest(int questId)
6 o0 C4 F4 Y, y) v - {
4 d5 q1 n% i& p8 y, x - for (Quest q : _quests.values())
8 L; a6 `1 T! l6 I9 [0 n - {
- _4 k! n9 o, `6 U3 _5 j - if (q.getId() == questId)" ]) r- A3 w; R* m' C) w; [
- {% i# f$ |$ X, e
- return q;
% g$ m" N* z0 l( p6 [0 I - }" t6 z! \/ X; J: W+ L
- }, F; r* Z7 i; j9 o0 ^7 m
- return null;$ U, y& F8 z# ?0 ~8 }
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
! n# ?* ?2 e* f ; [, m" q3 O3 G: n/ {' |
Метод addQuest(Quest quest)4 ~/ L* V1 a- N4 C, U
8 d% d$ b# k0 G* L9 y
- /**
/ ~! t% \2 S! ?. o$ t0 j' a - * Добавляет новый квест. s+ v1 y# r' t# a5 u' z8 P
- * @param quest квест для добавления6 m4 B5 N, Q" S; Y
- */6 f T7 J% m7 G+ N/ P
- public void addQuest(Quest quest). A9 G) J4 y( x! w" w7 ^
- {
' \4 {$ R F" g8 L( B C6 F - if (quest == null)
% h$ D2 r% ~/ F# y! _0 H - {
1 o1 H& J9 ?) m z4 F8 N1 p! @" z - throw new IllegalArgumentException("Аргумент квеста не может быть null");
4 v; @$ k) t9 s/ j - }
: _2 X: Z8 W4 l, e8 P& O - ) a7 u; e3 E5 Y8 E
- final Quest old = _quests.put(quest.getName(), quest);0 i/ v3 ~5 s. _) e5 O; v( m
- if (old != null); |0 \; C L- [ z3 }4 w
- {
2 O, T1 W, f1 u* j; Q - old.unload();
$ P7 T* X& Z9 E7 r+ n - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");9 Q8 w4 L, f0 j; ^ X
- }
# m9 }: K6 _, P0 ^) H -
* z2 g: g2 R- `) c2 u0 |) Y" O - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)/ t Z4 p& h' e: l1 g I! t: v
- {+ y0 \: V; D$ p% T; _
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
' B5 ? g- d; M& L/ ` - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
I8 j M8 ?1 s' e3 O5 a9 C. p - }
' a4 Q: Y3 H9 k: W9 o0 R& [/ ~ - }& n+ U" L5 z! [& \: m
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
0 k; r) q( B6 L4 B4 `5 d" w3 fЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
8 J9 B2 u% `$ J8 y- Y
9 _. X7 v# Y/ W6 |: K
, D( u+ {4 g. B1 Z, j2 I( U
2 |$ X$ s. p3 {* e( W, y1 S |