Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius7 i) l8 H' n C. F: A& U/ J
$ w2 f1 o* S" x$ o
Разбор файла QuestManager.java
9 }7 O5 k" |2 I% U0 z$ O B, d7 v" O1 \' o& V4 a
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.$ V4 S- Y, Y# l, V" Y
Основные элементы7 R3 m7 p: D+ _2 ?. ]
- Лицензия, o7 b9 B7 o( l+ T2 `9 ?
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
' u3 [1 z. X% b3 r2 ^
- Импорты
; t7 v( [" H4 h5 P6 x) ` ( z. {" @6 s- S; C! Z# ]8 F/ G* H( W
QuestManager.java — управление квестами и скриптами.
3 s: B2 H# F \6 }3 c9 YПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\4 z! K$ T3 p3 U
2 J- n; E% [0 A* \0 K2 v
; x& n7 [+ Y; T+ V$ MДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
- o9 n: a/ {- e ^$ }+ R' ?1. Лицензионное соглашение) x" ^ @1 @) r# I: h
- /*. p, f8 l# L% r7 h- o
- * Этот файл является частью проекта L2J Mobius.
8 O/ c! H; v; J4 B - * 4 q9 H- l' a" {, K! u) c* w
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять* N/ A0 i# h# I2 d
- * её в соответствии с условиями GNU General Public License, опубликованной! _( I. @" c/ _) S1 H# i
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
& n* z! Q; U- Z" }8 n5 o5 p% \ - *
! R' [6 m$ M4 u& N - * Эта программа распространяется в надежде, что она будет полезной,
+ L% [# V' T3 e8 X - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
- j: P% M) e7 V K! I! F$ G - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
# g* F9 b# N, {- N - * См. GNU General Public License для получения более подробной информации.; z, }7 ]9 Y$ {; M
- * & |. ^5 b" @* S8 f* e, \0 y
- * Вы должны были получить копию GNU General Public License G/ D! V* s& _8 X; f. I; v8 W
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.$ ^3 l0 v$ v5 t3 I
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
5 J' | _" e5 d. \! g7 y$ p
+ P9 b0 R" V! G0 o7 ~) T1 F
9 x# b: E6 D F4 P: }7 {2. Импортируемые библиотеки
& k% @" r; @& T# K1 Y/ |( r3 x" W/ y* @
- package org.l2jmobius.gameserver.instancemanager;
, r( M! ~" w$ w9 h
, b' i1 e( p9 f2 Y- import java.util.Map;
+ \1 l, D0 ^; t g4 ]0 T d - import java.util.concurrent.ConcurrentHashMap;# O7 A$ Y1 {+ I6 ~9 o$ n7 w
- import java.util.logging.Level;% q$ P8 {0 e Z9 y. u/ f9 c% L
- import java.util.logging.Logger;
+ h! c+ y! B, ?$ \0 y5 n, ` - 3 E$ H/ y T! n1 E8 ?8 X
- import org.l2jmobius.Config;: M3 w6 t; U* E' y
- import org.l2jmobius.commons.util.CommonUtil;! \, X* M/ |% Q5 R/ U B' h3 r
- import org.l2jmobius.gameserver.model.quest.Quest;
4 `$ y- g! d: l1 {' } - 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 — менеджер для работы с игровыми скриптами.
\ |8 _- C: _) w, u! ]/ O' c, h4 O( ^. R$ x0 B4 E. }
3. Описание класса QuestManager4 ?- ~: S9 Y+ G# P* M0 G
- /**
5 ~$ G. t0 M9 y8 S, J/ {" e4 r - * Менеджер квестов и скриптов.1 B& F8 g4 _4 g1 z
- * Автор: Zoey76
; R# q4 o& f& }6 r - */4 ?7 q% j& W0 K* |$ P7 g2 I# u
- public class QuestManager
9 R, Z; b+ {; ] - {
) B) v! Y# {! V! }1 N - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
z( T% X0 H+ f8 I1 J* S3 a2 p3 m - " @/ x1 K+ e$ V o2 |; e8 ]
- /** Карта, содержащая все квесты. */
; I; X8 Y* u( M; z L - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
0 b( j% Q/ ?/ C - /** Карта, содержащая все скрипты. */
# |/ K4 G4 y, f% {) m; u - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();' G$ D7 l1 o% U- d$ E
-
* x+ m+ p1 y4 o# B7 i - protected QuestManager()- k" O3 }6 N( ^$ L
- {
5 B, v- w- c8 F) c' D- v2 u4 T - }- v6 j$ z; @5 m% x0 D; S9 Y
- }
Скопировать код 4. Методы% r( D" V& U: |1 u+ z
Метод reload(String questFolder)
4 v4 Y! R. F- B+ [% ~: ?- public boolean reload(String questFolder)$ T0 q+ E: x$ ^0 }$ t* D+ e
- {
! r( E! C7 M% w. x; i u - final Quest q = getQuest(questFolder);* ?; O! M1 C# D% K B2 H6 d
- if (q == null)
2 t W: k d& S5 ?/ R - {/ X6 E3 b& A) b1 G! d
- return false;
6 p. y( h& G) }! g - }
7 C4 K$ M9 h9 `& O - return q.reload();' @4 \- M ~. e; w
- }
Скопировать код
5 h) z& Z: t, m* K) T. u. {* M2 o) m) a3 M! |! `
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста./ E! p% v0 k* r- B% g) x
Метод reload(int questId)
4 g/ z g- I! f% e7 c0 B+ d4 u7 b. [6 E9 g( n
- /**
, S3 s0 ]) z$ Y$ \ - * Перезагружает квест по ID. |+ T" }$ w& c/ {* }9 h
- * @param questId ID квеста для перезагрузки
1 J$ A3 X& T+ d - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае; u$ Y5 `$ r; k7 W6 c- s
- */& g8 ?3 q: V7 G8 } h+ N5 l4 n0 K0 n
- public boolean reload(int questId) R! g# J4 w: O! Z( |+ ~# R' o6 I
- {5 @: s+ u K7 M! A: N
- final Quest q = getQuest(questId); f/ H! x! Q4 S4 \
- if (q == null)
2 i4 P5 m" C/ h. Q* I - {; e3 T; b! J& G7 j
- return false;- ?2 a: X' g7 W" Q
- }
4 \$ s+ p! i& X3 S0 B7 F6 z - return q.reload();
, g. V" _; q3 a; w. r/ q - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.7 K6 n5 ?0 R; n- j9 L4 @
( ?$ e1 G* [5 V- dМетод reloadAllScripts()
( y+ y! R8 v; L/ w- W& K" p( s3 E; ~ _( q4 e- {0 S8 E
- /**
3 j- ~1 ]. @) T! B& G - * Выгружает все квесты и скрипты, а затем перезагружает их." k( w/ O6 @. ?, V
- */
5 g% C6 {* b: a* F) \1 k, k+ \ - public void reloadAllScripts()! o. {8 Z& r- c6 S4 L! m) h! i
- {
, {; ?' T: H# r0 ^+ [# R - unloadAllScripts();: j. F; N% ~6 Y/ h3 N
- 1 E8 }9 S5 u _
- LOGGER.info("Перезагрузка всех серверных скриптов.");
) q6 n8 k1 F, D2 x, M# C - try
) z1 b/ x1 @- X' I1 s1 E" }% v! d - {0 e3 b% a" n r
- ScriptEngineManager.getInstance().executeScriptList();
6 Y) T+ z/ Y5 C; ~ - }( Y+ U. N+ O2 t: w( ~( e1 C, h
- catch (Exception e)5 F8 [/ p5 B* H1 q# {. W
- {' _0 s+ |# q3 @1 b+ B
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);1 K% f: e3 r, X V+ c4 C& Q g9 P
- }
; h* h% l0 L6 u) G3 n4 E& D - : y4 L; b) g2 F8 n6 F6 f9 ^- X6 h3 l
- getInstance().report();. m3 m) ^# e" m4 B) g1 b' D
- }
Скопировать код Метод unloadAllScripts()
0 K T9 G5 N* t4 }9 l8 A' e5 r, m, \0 y) j8 X
- /**
6 A3 o! G4 E, H3 V/ F% B3 \ - * Выгружает все квесты и скрипты.9 H. f+ u) C6 W0 E# N
- */7 S; I- e9 l* d) A1 `8 T8 x% N G; s
- public void unloadAllScripts()
$ u5 G/ P+ E) f: l - {
: p8 |! x7 j6 g$ e/ J3 Y2 w - LOGGER.info("Выгрузка всех серверных скриптов.");
( f( j% l) l( F0 A - 3 Y/ t! V0 }2 q- q, m
- // Выгрузка квестов., f, f ~4 n, X# I8 S5 }4 H
- for (Quest quest : _quests.values())1 h5 c/ ?9 D" Q, P* q
- {! b9 H* i3 Y0 m# v/ ~$ Y6 i8 O. F
- if (quest != null)
" [) c7 a' u* C* A% g - {
8 E4 Q- S+ F' e1 f' J/ n/ n - quest.unload(false);
6 e3 B3 b- e- o$ ^3 x- y" z - }
( |) q5 h7 {7 @, [ - }$ T2 U+ L- H- a' ]7 N- e2 R0 ?
- _quests.clear();" G* c: E6 t/ @8 D6 `
- // Выгрузка скриптов.
" C8 c) `8 x1 [1 @5 ]- _ - for (Quest script : _scripts.values()). x. z* X' H. |: O3 U
- {$ M) t, E9 R% ^+ u' P
- if (script != null)2 B- N( H% e& s: H8 P+ h+ B
- {/ r* L! ~ j. `4 G' M- E0 C
- script.unload(false);% F9 k" I: R- [8 ~! o/ ~
- }6 y3 G* m# p8 X% L
- }: y: { q. l6 D. K/ s& t
- _scripts.clear();
4 Z! ~3 q g }* k! P# x - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
z8 W/ `6 w0 ]8 E- N
/ V z8 C+ i4 b) lМетод report()5 G8 g1 X1 o4 J# J7 q% ^7 g$ }: ~
' U9 F+ ]7 G. q3 T, u {1 ^
- /**1 y! T9 ~& E- \3 m' s }
- * Логирует количество загруженных квестов и скриптов.
* _0 c$ b& t9 R8 r/ L - */( I. q* X* s# D8 e6 C
- public void report()7 k. |9 { M, S0 k5 T
- {
! K" x4 b$ ^, ^, |3 ? - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");# y2 q+ l+ N, @; y. s
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
; z+ ^7 r" z: V+ N! R6 z7 A - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.2 V0 i/ a' C2 s$ |& q, C
5 {7 M. U% ^& p8 a) A0 y5 u
Метод getQuest(String name)
7 D3 y! H5 q: F$ e( S+ H
. ~ \2 C% W& U( `. Q- /**5 f7 s& |7 q* V( p# G: D- K a" k
- * Получает квест по имени.2 H! s. d( }0 y" R8 u; ^
- * @param name имя квеста1 T% Z( ]9 v7 r8 }
- * @return квест; u" Q0 [8 c8 E- w4 q7 p( I* S- T
- */
: V# T c. V6 t$ ^* N - public Quest getQuest(String name)4 Y& m; ]# E# B3 ?4 r
- {
5 I0 @$ o; _+ X2 w - if (_quests.containsKey(name))& B" I! C# Y- |% S2 D4 K: P
- {
% {5 f9 A9 _; g; I - return _quests.get(name);* e8 [4 {1 S# a% |
- }
+ n+ M0 b" K4 G% W" h: ^ - return _scripts.get(name);
# X6 B- V7 q9 c& [& K5 x; g. J; M - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.! c" [) ^& U8 q
5 }' t" N: B. ^; k7 a, V- o4 t8 MМетод getQuest(int questId)8 p! }# M; x3 y& P. P& |1 u
( z# A3 ?6 c* `4 C- /**
! D* X. x0 P% P/ c5 ?% E - * Получает квест по ID.
) Y, p3 s7 f9 w1 N8 o4 T - * @param questId ID квеста1 j! m# A0 v, j0 k6 ?
- * @return квест, если найден, {@code null} в противном случае
( C5 v' o" O/ k - */
: H: j7 t$ \$ C" m3 T - public Quest getQuest(int questId)
; j. ~- z6 F2 z. m8 |$ F: @ - {* W+ Y3 F* Y( b ]" Q: W
- for (Quest q : _quests.values()). d8 _+ K8 X T3 ~. }9 G9 L, d
- {/ I* U) @$ `3 L
- if (q.getId() == questId), o. Q& A3 e) F p* p7 g# v
- {
7 W6 [3 s0 J1 K+ F! w - return q;
2 v5 [' n7 n* g8 h - }" c! b7 ^' V2 J2 l! B
- }* M6 c# W8 x" \4 n, P& x) [
- return null;
' G9 P& \% f/ X' G- K2 e - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.' t1 [/ F6 d- B' z7 [5 R
, |3 H x4 Y" n0 ^; g& L0 s
Метод addQuest(Quest quest)
' J/ F" f# V: z& Y7 C
) a i7 J/ z% s8 [2 F- /**
' X1 z5 ^* {( Q - * Добавляет новый квест.. g3 N3 V0 k6 I0 ?; ]$ P0 _ i0 {% q
- * @param quest квест для добавления
p9 u, C. r6 g! A0 q - */
; w; d, w( e5 J0 T" Y - public void addQuest(Quest quest)4 X. T7 K5 P8 T' [7 D" V6 V
- {
1 f: e) W& T. g - if (quest == null) @8 n. w4 O6 [# d8 m3 I$ B
- {: N3 o: C$ r( h/ u
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
" U0 K( F6 J2 b% [( m% B - }+ Y2 V9 t( V. ^; w8 J0 o
-
+ P. t9 h2 \, {" o5 [1 M - final Quest old = _quests.put(quest.getName(), quest);
$ e; O5 v* W6 W4 X& a - if (old != null)
9 T. {! ]- o/ D0 H5 T - {
$ L2 L" h; V! t* m2 P, r- f - old.unload();
5 C5 m; D4 o+ D7 k" l2 M# v+ F - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
$ A1 U2 M; r [$ D2 | - }5 X: D* J- w* {% j
- ) a1 x! s0 q: J
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
/ c) f8 M; d0 T - {( t0 T- {8 k* F( Q5 x H
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();0 l# K# D8 b* Y1 y4 e
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
6 v( w7 }: J' ^3 x) n: X - }/ Y3 E1 o( F- v7 S M! ]
- }1 k7 Y5 O, ~3 ]5 `4 J
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.; j4 r5 D6 F/ ~ f |
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
5 C6 W0 d5 }2 V( \! F( D, v! \% ]7 i4 n+ C/ {: s
/ p$ H9 [. C( ?4 b: }
5 p+ P+ N& k' s; K; y6 g |