Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius! F5 M. j( y( v { l
) z- T' N! Y/ }# e9 D9 ~2 o: I8 h5 |1 B! Z
Разбор файла QuestManager.java* \8 K2 d( h# d4 }- ?( Z
5 V# y7 O. V; w- I) Z% V2 [, ]Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.2 k( w/ n' p, I6 I0 \- Y
Основные элементы* n8 R3 \7 V' K% @
- Лицензия" A0 q! A" {3 W% r& G X
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.& J# n5 g3 \- M
- Импорты
+ A( s( \$ a1 C . O& N% ]5 ?& S0 C1 {
QuestManager.java — управление квестами и скриптами.3 I& \; h7 S {6 y3 i6 |& y+ A
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
0 | M+ E1 ], m9 ~$ B7 K" z! l9 `: a0 U
0 E8 ]4 i {% e9 r. [" q
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.8 K9 O- E7 S, O+ H6 q1 ^+ ]
1. Лицензионное соглашение4 p% k$ e* u- R0 `
- /*
+ n, |8 o8 w {+ [) Q @ - * Этот файл является частью проекта L2J Mobius.. b3 b' L7 v& F' u. F) }- b
- * ! w D* V# T* }
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять9 i; P; } p: A
- * её в соответствии с условиями GNU General Public License, опубликованной5 r9 |7 X, ?+ G* X0 u/ b& V0 B% Z
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.; E# S$ G. b- e
- * 6 e7 _$ h! D, g# {
- * Эта программа распространяется в надежде, что она будет полезной,% z# b& E' H0 B3 x0 a* V
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии) O4 h8 ]" ]+ I
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
& q0 c [& E+ G2 u - * См. GNU General Public License для получения более подробной информации.( M: A0 M; d1 p" M
- *
+ X7 u8 Q7 y5 g3 f% o1 _. T - * Вы должны были получить копию GNU General Public License* j1 {' m5 F* P( `7 b& P B
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
- H! E' Q6 Q; P; `) t4 O" J - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.0 W' E- Z6 ^, f/ B$ O/ U
; f9 \2 N) C2 k% ~( P4 c
" m/ x) @ T/ E* @4 ]2. Импортируемые библиотеки% D7 s) k) U3 a1 B
* R6 o& |+ x% h1 L" X5 F; @+ V- package org.l2jmobius.gameserver.instancemanager;3 @: L* P, e. G; b! ]$ x0 M
: o6 w5 U) f8 C6 Y. `- import java.util.Map;' S6 b/ G7 ?3 {1 n3 w1 z; ~3 q
- import java.util.concurrent.ConcurrentHashMap;
8 k$ \6 c& b; q0 A - import java.util.logging.Level;
% s$ l3 S: k' x- _7 z% C. |. W - import java.util.logging.Logger;
4 F* v# h- S9 G - " r- T" v k5 Y5 O f! O/ g3 A! G8 z
- import org.l2jmobius.Config;/ F8 Q& c* e( }, K3 x$ e7 u7 Q
- import org.l2jmobius.commons.util.CommonUtil;
# v3 v7 e% I. C5 |" ?- F" K - import org.l2jmobius.gameserver.model.quest.Quest;
$ A m$ V3 u% [8 X1 Z - 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 — менеджер для работы с игровыми скриптами.0 i# N+ K7 F7 w" t) i
9 E' b5 @/ E* l5 v
3. Описание класса QuestManager
# w$ ^, j! a- n, U& r7 i- /**' ^$ g3 Z; c( { R/ \
- * Менеджер квестов и скриптов.6 v0 d* x- x" x& D4 P4 A+ K% m4 I9 p8 U+ |
- * Автор: Zoey76
3 c+ o f+ [4 p% B3 e - */; d+ ?9 b% M2 ?: Y
- public class QuestManager" e/ j" K( y% E( L4 @, b; [
- {" G+ y- ^( F0 ?0 o* s
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
u" E+ T/ O/ X -
& d* s5 r( p2 p \) j8 t - /** Карта, содержащая все квесты. */
( }0 {' I. n) z+ ]8 h* L+ @ - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
( F$ t- M# b# B# ? - /** Карта, содержащая все скрипты. */
1 A( X/ A8 q8 i# E- P) k - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
: F/ r7 [6 g9 Z& r! Z3 M -
7 i% Z/ S- M: D+ ^, k- p3 H - protected QuestManager(): B$ I& A* z# M; ~# l
- {0 x, @' K" |, e; } z' F2 U. P
- }
/ p3 F+ ?, e2 T9 D1 _- i/ W - }
Скопировать код 4. Методы- ~: V+ q6 ]8 _4 c. J
Метод reload(String questFolder)# h) { a) F* q/ ~$ V' S% u, ^
- public boolean reload(String questFolder)
9 K9 Q$ N; S# R* t+ p: q - {
% c4 |" N/ B- Y3 l* R1 p - final Quest q = getQuest(questFolder);
- P- V7 X! D3 ~( O - if (q == null)5 q. D. g! Y9 L8 {' C1 d; A* F ~
- {% m W: j) P9 I
- return false;
3 @0 F6 S: @. N - }
0 v! Q1 @! F' s1 N8 K" c - return q.reload();8 |+ y3 V1 {) Q+ ?$ K
- }
Скопировать код 0 H" Y5 E. j7 E7 h; z+ B" @' ]
c! s2 b. m+ g4 _1 _$ u
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.( H9 G- m4 Y9 I2 a4 u, }
Метод reload(int questId)
& B& N7 v3 E9 T9 Y2 R
9 {: L4 C7 D0 {$ j" A- /**
; `2 N/ e( }, O& w4 X# _" R- p: ? - * Перезагружает квест по ID.
! N* j! ^3 a% {: `7 B' S3 S - * @param questId ID квеста для перезагрузки
5 z! k2 } \1 l2 n. ~8 u - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае/ u5 q7 K* ?4 f/ Z
- */1 H( i1 b& m" V. d9 w" F
- public boolean reload(int questId)
( o9 ^5 y* r: l3 z E1 h - {
$ f) z+ `! L6 K- }, r+ R# _, ] - final Quest q = getQuest(questId);% V r' X- }& d9 t
- if (q == null)
* S' G' I: N, E: h7 r - {
2 |( {" }+ L# t$ D. |4 N. e/ o - return false;
3 f/ C; u) W3 ` - }: U& }2 l& p; |' W& {
- return q.reload();# J @: ~* F7 `4 [
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
+ F( ^! \% O* j q H! s7 F
7 g4 y* |- K! U7 w; ~Метод reloadAllScripts(): e6 y6 p0 Z$ r8 D) C' D& ?0 G
% p. v* J* c% b# C4 b% K" _- /**
$ C; e% C- G/ \, N7 E0 J; x - * Выгружает все квесты и скрипты, а затем перезагружает их.
3 v: Q& i+ z" @7 o3 \1 \ - */' g, m6 r1 f: |8 d5 {1 d; I4 Y% U
- public void reloadAllScripts()
/ F: c: E; \. ]$ R- z; Y$ E! S: z: o - {
M/ p$ C- s3 k& A6 b. r0 L: i - unloadAllScripts();
4 I/ f: ~' M4 Y- V. E+ m6 V - / _- ]7 N* t, f6 J, ?$ A' ?
- LOGGER.info("Перезагрузка всех серверных скриптов.");( ~4 u6 Q2 X$ W# H
- try# ?: [% F/ h6 Q
- {4 N% S( ~+ Q6 N! X' q" N' J
- ScriptEngineManager.getInstance().executeScriptList();
/ q. d; ^" t4 r M7 ]$ ~* @ - }, |8 s3 i) V7 g' y( b$ d& ?" ~% C
- catch (Exception e)
- A4 l' M% p) e d' s4 k- {- u& ~ - {: v9 W' @+ F: y5 {' g9 h8 P1 @
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);/ X3 m! A, E0 k1 k9 M+ W; Y
- }& o) R5 E9 Q3 Y% @; O
- 6 [; x+ Z$ h+ X) u. Z4 t
- getInstance().report();
! t& V$ s3 q! J6 ]% i- X2 f. v - }
Скопировать код Метод unloadAllScripts()! H7 C- j( n& ?4 V. f
: Y5 o3 L+ ^: V5 d( g* n- /**
5 R, B3 |4 W3 o; N! |! K - * Выгружает все квесты и скрипты.
2 F1 a7 d% n$ e5 ]( Z1 L4 M - */
* c1 B5 {! m6 Y0 k- ? - public void unloadAllScripts()
# m1 y8 A+ {& S - {$ p6 n( K/ K* g9 |+ |" O
- LOGGER.info("Выгрузка всех серверных скриптов.");
- V; W% z+ y8 N) A$ T8 q) j - 1 d6 y+ ^( P( a/ u" @+ f. |( P6 M6 c
- // Выгрузка квестов.
9 C' v6 R, x: [& |+ @2 A - for (Quest quest : _quests.values())
7 T% m* G: d9 O9 f: f - {+ c+ S" h- y. r9 X* |
- if (quest != null)
6 ^; U( }# {; V& C+ W - {
+ ?6 L5 d; u( u! e$ L - quest.unload(false);
" v' y, S @; ~. J2 o, j - }
* \- D- H' }# ]! \. `- n7 a7 F - }5 H2 K. H" I- u; T% {; |6 P
- _quests.clear();
5 C0 { [4 ^- \7 ?& V, h - // Выгрузка скриптов.& o% f4 a2 i" m
- for (Quest script : _scripts.values())4 _! ~! N8 h. [$ Q
- {& o( Q- y( C, C; Y- J+ i
- if (script != null)0 U. n: I; M9 B2 s& H) M6 q6 B
- {4 F {2 d: I) F" z. f. i
- script.unload(false);
" X+ `4 @' l0 k0 l - }3 I/ V: z9 y0 ~: A
- }& f# T/ b: q- K# t6 H; }9 x$ W8 P
- _scripts.clear();
R) i; R' [: J; N0 M; x' J3 ? - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
! V; G, f0 \' N& |6 z% ~5 c * E' S' H4 }" |# T. c- L$ D/ y5 B
Метод report()3 |: _& P- v8 \; D
4 \# j& s: g4 w+ T* u- /**- W3 @5 ?9 U3 C) |5 l1 c0 }" ^
- * Логирует количество загруженных квестов и скриптов.
8 M' n. M& ?, u - */2 n; o6 U C, o
- public void report()1 Q! T9 L `8 H3 y
- {
6 L+ c4 Z5 h; d' N. l8 \' @4 [ - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
0 O8 o; i ?" r; y- ? - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
. ~/ \2 Z$ `$ ?7 o" D - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.: A. C5 Q, W1 x9 C) a+ C" o
+ D/ c/ n/ G3 n) r$ y( n& j# z3 mМетод getQuest(String name)+ Q) [) X; Z4 O4 [
( |) F6 Z' S6 T) r( o& T- W
- /**7 Z& [8 T; W7 I$ _
- * Получает квест по имени.: o6 r& I$ n( u5 p1 n$ \* \' j
- * @param name имя квеста K, V9 c i/ p
- * @return квест
0 r4 b" t2 D# t7 C/ z - */
/ h1 F8 g, t/ c. s; S - public Quest getQuest(String name)
# [& R$ Y' m; f5 `3 l - {
5 S! j; E- [* j. G! B: n - if (_quests.containsKey(name))
6 f s# Z) J9 n! K$ Z1 |* f - {
) A4 R+ o T S5 b ?4 O/ p - return _quests.get(name);9 t% G+ V2 a9 c, F5 ^/ s$ N5 U
- }
% P7 m- u2 o. z: d% r5 { - return _scripts.get(name);+ r0 {' q1 z S4 N1 ~* u5 W% q7 D' ~3 o
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.. |% x4 I. B' |" ]* {5 r2 N
$ j- `/ Q" Y; o% P
Метод getQuest(int questId)
Y- M/ \- B. K! n4 h3 r8 D1 m8 d n; y3 Z7 }& P! C8 @9 A
- /**
+ i" \( ?/ M/ H" \: x/ q6 t, Y0 [ - * Получает квест по ID.
) M& d+ B/ Y# D- H9 A - * @param questId ID квеста; Y% a; G1 O. k5 V R
- * @return квест, если найден, {@code null} в противном случае
3 j8 e4 H4 J2 g, | - */- [( C9 K0 f- o: z. v
- public Quest getQuest(int questId)
4 f9 ?0 `. Q0 B G/ t - {
6 D& M$ n& @9 h - for (Quest q : _quests.values())5 Z, \5 E8 G a; X8 ^- t
- {+ V+ h+ }/ J8 ~2 Z: Q% ?. [ \
- if (q.getId() == questId)
7 c& _, L3 K4 ]6 w - {" W, |' j! U# e1 g- p/ G
- return q;7 K! [4 E! j5 y
- }: n7 t8 Z' ?" I% |. ?5 S" Y
- }5 a8 R. `( F' y9 Q( T* {
- return null;
5 {) n& s+ s! t" o3 A& s - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.* Y" j' ~3 J% \, ]
" b2 P* a, R% J4 F4 }
Метод addQuest(Quest quest)
+ D" G8 N- L2 [0 q9 v% }7 X/ Y
3 j8 n# H$ D) M- K, h6 |7 a- /**
+ g' }9 Q) Z# G7 O. O - * Добавляет новый квест.% E( \& z0 i2 ?: o1 l7 R, k
- * @param quest квест для добавления1 V8 N' w) P4 p2 k4 H3 l
- */. Y" o1 Y; E* F9 N
- public void addQuest(Quest quest)
( Y6 m3 \0 J3 w4 e - {9 O3 c7 Z& D! q6 f, ]+ l2 a9 c
- if (quest == null); M6 M$ F& N2 p" Z
- { |9 x5 u A/ R; s: B! [
- throw new IllegalArgumentException("Аргумент квеста не может быть null");6 r3 N# z0 @- P( B
- }
6 a) [4 Y, m5 E1 j* M+ D' h7 C- H - & o( q5 a! o: D! F
- final Quest old = _quests.put(quest.getName(), quest);) I) n3 ^8 q# [) e
- if (old != null)
% t5 y! f) E. B) l4 O% @ - {0 Y' U0 m9 |1 z& }
- old.unload();
9 r1 }* U1 e8 g5 | - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
( B$ C. Z# ^) d' @% ]9 Q x- w - }
: @. m5 l+ {$ Z, }8 U t - 5 ?0 R+ ^1 u2 o
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
& C, \! _" |0 c3 W - {) k' f$ b3 K/ T& i
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
9 d; P( V i2 a* Y - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");1 R- C3 E5 K! z9 W# w( o# O
- }. Y/ L/ C" M5 l/ h- n- u* J
- }
/ G% i4 C1 g9 b3 @# I( ^6 P - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
5 a7 s a3 a, KЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.2 K9 i5 A& |) M" u5 e
0 Z) o# f% O7 S; @+ _4 l) S; T8 T& i4 S$ ?: B3 U: l; |! J3 V
/ b m8 C0 \' ~/ x- f |