Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
- w- [. h, U4 r# @ j6 f* H7 g& x* a- Q$ _$ h5 ?) E
Разбор файла QuestManager.java( r/ I9 y( R2 j4 _6 u* |/ b6 F
( X' E' T* `. K
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.; q% J- T+ G6 O) z0 r
Основные элементы$ g/ {, V. f0 @
- Лицензия* g6 ~- `0 f' Y# \
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
" ~& |( Y" q- m6 _) R* d. ]
- Импорты" Y# c2 G' l8 Z: ]
8 S( q. p: }; ^: D, v w* cQuestManager.java — управление квестами и скриптами.1 s+ X; a2 _' i1 b5 n$ p4 q
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\/ [% m7 }' F7 T. F# v3 n( o
" l: \# k! |; |! q
0 e0 I, E; L' j* Q$ L$ h* rДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
/ J# _# O4 X/ [0 h* |1. Лицензионное соглашение4 A+ ^* G7 w q3 e
- /*
1 b" z$ G% |) S O% m5 M* U9 I - * Этот файл является частью проекта L2J Mobius., D4 r& b, q* y; }+ V
- * : o0 B1 _+ r$ y4 H$ J8 v3 b" K0 ~
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
, J" V% {( x$ a/ f4 n# q9 M% ` - * её в соответствии с условиями GNU General Public License, опубликованной4 w; w u8 |& S' E
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии./ u: O# R N* H6 F( _5 l
- *
8 _- `! S8 ~! E; {- O: Y - * Эта программа распространяется в надежде, что она будет полезной,4 r5 E m6 }' Z3 F2 E w, H+ B9 k
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии5 s: D2 I3 e/ O- x- X: L1 r* O
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
' U1 x; V2 X' K# u5 g: X3 R* l% } - * См. GNU General Public License для получения более подробной информации.
3 r+ ?* \. i5 ]3 V$ Z9 G) h$ \ - * 9 W7 f. A7 O6 M
- * Вы должны были получить копию GNU General Public License0 ~) `3 j: f3 D
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.' B2 g% P9 f7 m ?' z( Y1 n8 E
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
# S5 f( d' v, \' v2 K- O
* k4 E& p) X$ n" d5 ~+ n$ g7 ]4 w# }- m
8 _1 J+ v5 E( p: O; @2 e0 c; X/ |2. Импортируемые библиотеки
- z8 C/ M3 S7 t1 w o+ a" n
0 \2 u; S g5 Y: S- package org.l2jmobius.gameserver.instancemanager;
. V4 y0 u8 o2 a - ) }( M( u3 e7 S, P3 G
- import java.util.Map;
# v. {# s y1 z& X) E" c9 i! ? - import java.util.concurrent.ConcurrentHashMap;
9 t2 U7 N+ C+ d' A5 Z0 [ p - import java.util.logging.Level;# O _2 O; Y/ `. K: s2 D) X- B t
- import java.util.logging.Logger;, g: u, Z( `7 Q% B9 s# v
4 l6 a+ Z- |+ m5 {* L( b2 H$ m3 G2 h- import org.l2jmobius.Config;/ n5 E4 s* n. G) v! a
- import org.l2jmobius.commons.util.CommonUtil;
/ L" e' @4 h. D( ]) M - import org.l2jmobius.gameserver.model.quest.Quest;
! K+ {" g4 f9 _) J L& {0 B - 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 — менеджер для работы с игровыми скриптами.
5 ]; z1 a3 k1 K; O7 S! \5 y# T7 u6 b! N2 J; S& ?$ R
3. Описание класса QuestManager) t8 e# {) z. x+ P
- /**
5 i2 ]: t3 B8 U1 B! X - * Менеджер квестов и скриптов.; M+ }9 ~" q# F' F
- * Автор: Zoey76# W% m( S4 b) z) ?" d, i6 R8 O4 Q2 w
- */; K$ @1 ^4 m( m& F
- public class QuestManager# D( O/ A) I0 g1 W! S* z* m4 U
- {
+ K* y! @* N# p+ g& q0 r- X! M - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
6 T, N* X8 l) f1 o8 W$ A - , g7 U: S! J. c- t& v3 M
- /** Карта, содержащая все квесты. */9 R6 T, Q$ a/ n/ H3 u
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();- A# q! J. K; p2 ~$ ~( U* s4 @
- /** Карта, содержащая все скрипты. */
) ?( O0 [# J- g) M/ s! t4 \( C. s - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
9 a( R) i# m/ i% u -
C( N+ K: I' j; J - protected QuestManager()' g% Y/ p5 u+ m3 U8 M7 ]# [
- {
8 q* l7 W5 S2 |9 b9 f - }
/ B* t0 D; R S8 ~, v2 d& F - }
Скопировать код 4. Методы' z1 s6 b. T$ x% `4 x
Метод reload(String questFolder)7 m3 K' g) R$ b! U& a
- public boolean reload(String questFolder)" Q: z( h& v" q# n: r
- {; F7 X* e4 \) E: i7 \
- final Quest q = getQuest(questFolder);
8 \0 v" T# ^& T( | u - if (q == null)
( ?+ a! H4 ^# p1 B, N - {
e; w* G" p( M% H - return false;
}* v) k* x2 q; [: w - }- u! L+ b' P- x) H, K
- return q.reload();
4 K. {, x0 O7 K+ J P - }
Скопировать код 5 [& B6 `) x1 E o S1 x/ H3 Q: T' e/ |
8 J% s, b/ H9 L W" b4 Q' zМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.& G* b" R" u* x
Метод reload(int questId); k) T6 x6 n I# H" Z
# G. a4 h% L2 Y8 J
- /**
, {) x. v& D/ s8 K5 K. M: B - * Перезагружает квест по ID.
- r6 K9 u- x% z& r - * @param questId ID квеста для перезагрузки9 p9 c0 j7 _' Z" `' F7 F" w; E
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
1 H; `8 N9 i k# U - */* O) f' J, b- U- n- ~' S2 Q
- public boolean reload(int questId)3 [0 ^$ q* ^2 ?: a% H* N9 M) L
- {% ^; B3 L$ Y$ j+ h, I
- final Quest q = getQuest(questId);- Q' x! L0 x; p) b* Q
- if (q == null)$ G) C" I: ^ C4 {' H
- {. {8 M, `; w( B2 s3 G9 E- _
- return false;
P9 y: Y2 s4 v6 `; h+ o# g - }3 e5 d" S6 d& Y W6 v: {5 ]
- return q.reload();
* z; @, f( j# o! X) T. j8 M" n3 D - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
) N* k6 S$ @+ |! z: S
% Z- Q4 u& R( m) gМетод reloadAllScripts()) v7 A8 ~: s7 W& _. a5 }( C
1 I' S/ @. U- J. n& H$ e
- /**3 j% B+ N8 Q4 _ \
- * Выгружает все квесты и скрипты, а затем перезагружает их.9 J1 m1 _2 e i5 Z0 I0 `
- */( _9 J2 S) n! X% c; Q( I2 U
- public void reloadAllScripts()
9 W5 U3 U2 I. v6 m' d. l# {* Q - {$ J9 d, N2 a. U/ r5 x5 r. ?/ k* [
- unloadAllScripts();- k. x# H6 {% A
- p. I3 q% K$ n0 F
- LOGGER.info("Перезагрузка всех серверных скриптов.");
8 i$ ]2 B5 B1 C% P# C/ T9 a - try+ s# m0 c+ m, ?( I
- {
+ F( h+ i P6 }3 s% d6 G - ScriptEngineManager.getInstance().executeScriptList();
' y8 h" }5 C# {; K - }% e V) u1 }0 \! C2 t/ ?
- catch (Exception e)3 Z7 b" M, Y- S6 V+ a/ }
- {
$ u: v" w% p5 K* d: R7 W$ g - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);) O6 W' u! w/ S! l' J
- }
% Z* X1 o( m5 ]6 j5 y; P -
. \+ e: h$ s) c" k6 Z! u - getInstance().report();
9 J# U- h. ^2 L" X4 h - }
Скопировать код Метод unloadAllScripts()5 U# O- t1 b3 {
" x* r7 c1 `, f3 A) ~
- /**
. V$ A8 U+ `, \- X/ R7 t - * Выгружает все квесты и скрипты.: F2 a+ c4 a6 n$ H, |
- */; s$ y* _% z. V5 {( H$ D
- public void unloadAllScripts()
/ a: z- h: Q, t! ~ - {0 x. M- b) |0 X! v/ {+ P
- LOGGER.info("Выгрузка всех серверных скриптов.");
6 w; \# O' j& b! ^9 z- C( v - / U' w5 u" D% D! }9 s* t3 I
- // Выгрузка квестов.
6 Z( B. B$ ?( \) O; b r - for (Quest quest : _quests.values())
* ^& S# b+ o' D - {0 a l2 c6 d+ O q' n0 J( p- ]; v
- if (quest != null)& m; P& d# g" q
- {+ P6 J7 L3 s) Q8 @
- quest.unload(false);
$ v3 h( [8 ?4 R r - }
" J. S! f' f3 H+ H - }( y/ l0 U. C; c' [
- _quests.clear();1 @! F; f' w2 _1 T& H
- // Выгрузка скриптов.
6 p0 ?3 X5 V) v6 Q7 }1 ]- J2 ~ - for (Quest script : _scripts.values())
" v6 ~; W2 ^' \" u+ S% y2 }! j- { - {7 _$ O6 w0 U' |% X; x, }
- if (script != null)( r- f4 ?1 Z/ w/ d- G4 J- H7 j
- {
: _% ^0 K6 |! G' s% D- A - script.unload(false);
4 E3 q4 ^. s [7 L! \" _! _& H - }
1 j% u# s# d5 `1 f - }
, \3 z* e2 Q5 x8 [0 b - _scripts.clear();& U/ S! r. p. {+ b3 g- H3 y: G
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.4 U: n7 B/ ^3 Z6 @: Y+ \" C
; y4 ?' b' P4 f, |/ G8 {# N
Метод report()! F# N1 j3 N6 v2 [- S9 N0 W
1 r+ I8 ]/ Y' y9 U! E- /**4 }6 o2 P" m" C% M. f4 L2 F; v
- * Логирует количество загруженных квестов и скриптов.
) b- b; {6 t& v; D - */
9 D2 ^; O0 b/ V4 O7 h - public void report(). w7 \) ]. ^- ~2 X+ m: G
- {
! \8 v+ c/ k6 E( \/ O/ E - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");# R7 ? U1 O: d- p/ A
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
( d. K, Q1 G2 U6 S& }; W# a" _ - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
4 v1 o% _8 R H! C- P3 Q7 H
0 ]2 m+ T# f N. e( z' j! E( ?Метод getQuest(String name)2 m" v6 p( r2 k
2 ~6 d0 d3 l. a- M( q- G% F
- /**
% f' i' E' [9 `2 W. \: Z - * Получает квест по имени.. b, u8 P2 A+ k( L' S5 ~* L, c+ e" R
- * @param name имя квеста8 m6 |5 G: L; Z
- * @return квест
# K2 `% ]# R2 |1 _$ q - *// U5 Q! g ?4 g& k i9 A1 t
- public Quest getQuest(String name) o0 U- I! b/ ?$ {+ e
- {
8 v; [7 v+ k3 \( n/ M2 |# F% o0 s3 Y0 G - if (_quests.containsKey(name))) ~% P+ x, n/ c
- {
) }5 `' M1 K5 }2 C8 K0 _1 E - return _quests.get(name);& ?1 f- W4 e* _( `
- }# }& B6 d8 A' B' _
- return _scripts.get(name);
4 {0 h* ]* [; B ?# n - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.5 w' ^( v, @. R+ f
2 V1 e, o# _/ E& w7 n" V$ `! b
Метод getQuest(int questId)
4 A P* A. \ y& {! {% e. H5 b/ J3 e
- /**& S" r/ B: \2 S/ I5 l. u
- * Получает квест по ID.8 y& r& @6 _5 Y
- * @param questId ID квеста
5 E( C. b3 A: [2 B% I6 D6 K5 a* ? - * @return квест, если найден, {@code null} в противном случае6 k0 s; Q. u6 f
- */& m- E" u& X9 P' t f
- public Quest getQuest(int questId)
) J. Q& D5 z" q6 `! E9 V$ W) Z7 H - {
, g6 [: c4 N0 L& z) q1 M2 k - for (Quest q : _quests.values())" P% i8 P: p) V4 I$ c
- {% M e" d( h3 F
- if (q.getId() == questId)0 A% _/ K: p p
- {9 O/ s0 v! n8 p$ W
- return q;1 M) n. n! F+ `2 L. _: I
- }
1 M1 D/ n' R' U( W2 r" }$ q - }& V6 a( N+ d6 @7 z7 g; ?7 ^# F
- return null;
7 y. R& Y; t8 q9 n; [% {9 i6 q. ^ - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.: c: \; g& o" v+ {/ Q' D
|9 N r& {; t: ?
Метод addQuest(Quest quest)
+ q, F) t* l1 S+ ~
0 M- B1 e2 |; y7 Q/ s- /**! `3 C, c3 T* g B" u
- * Добавляет новый квест.
4 \8 N% ?7 s% O0 b" { - * @param quest квест для добавления
' w7 n7 O& X" p - */
3 D3 \/ w* G: s0 g9 p7 W - public void addQuest(Quest quest)' Q, z2 w( S% i& F% [# S. u
- {
' ^7 w( {0 x% [3 F" V8 p9 F9 Q" ]* g - if (quest == null). }7 y" N5 L X5 ^* L5 `
- {& [" f/ F/ w; v
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
. i, f( U& K, i! X2 ?" Q - }( r9 Y! D1 w6 \6 I' S" M: K9 M
- 6 }9 r- _0 m/ i1 ~; `; L% N0 l
- final Quest old = _quests.put(quest.getName(), quest); F" H+ t* o3 z! @: F4 G
- if (old != null)& Z1 V. F/ ?) }
- {4 l+ I3 n7 u5 {/ h# W t" K
- old.unload();
9 ~1 U8 i! s C2 B7 ` M - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
2 v3 k0 a, c* C+ t( l0 S - } J; N& i$ t; _1 C+ g8 @
-
' I, {5 y8 n; \ - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)4 o* {% z# E1 r, L
- {
) I+ S1 h$ e2 I - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();% p9 [& P: V6 w% {3 S0 }
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
# Q& ] B; ~4 Q: _; | - }8 K0 k M# I- U# F
- }. @, T8 O9 |1 Q& ~! _4 D# A& [
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
$ s/ W& u; C6 P, K; F0 {1 h PЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
; e/ Y4 C+ V7 d' c0 k$ Y. }8 i' D! B/ `; ]
0 _) X4 p' k7 ]9 I9 g. `/ w! z
# A+ U8 W5 y; N+ \$ V |