Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius5 r' Y0 {; ^. x% M
, Y2 J+ m5 P! N. ^6 X# I
Разбор файла QuestManager.java% ~4 Z* v% a1 `
0 k1 {6 z# l% u6 _2 U3 fЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
1 i; H! h% N% Z4 }$ _- OОсновные элементы
/ e! x* [: A/ f+ t% g; {$ U- Лицензия
% f6 [. Z0 ~# J" t4 m3 `9 Z2 q- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
! U# X4 {$ Y/ J2 Z& M
- Импорты9 J' K) d K# @7 s2 t2 e
1 j3 C8 I9 C8 ^+ Z7 _" q6 cQuestManager.java — управление квестами и скриптами.
* O& }+ E/ E# G! k/ X: m, n: SПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
3 J7 ~; x% {' F! I. A0 Z) U, U& E' [2 [
! k" d% {1 g) Y* [3 RДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.! Q Z) ]# n# n9 ]6 o6 r
1. Лицензионное соглашение
/ V* \2 B/ R2 O$ l" l) f) Y- /*
( c0 L1 u0 I1 z) u( C9 S. f/ b - * Этот файл является частью проекта L2J Mobius.
4 Y; @& S7 d& j/ E$ o" Q: O - *
% B7 ?9 P7 r( A% M8 g0 ?5 `8 b - * Эта программа является свободным ПО: вы можете распространять её и/или изменять/ f% W, Z4 g1 S
- * её в соответствии с условиями GNU General Public License, опубликованной! Q+ X2 c0 s% v2 F# M/ q
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.- w( ?& T% E, z; s" a. A* q7 w3 U
- * j [- ]' \) u5 Q' B
- * Эта программа распространяется в надежде, что она будет полезной,& H) y9 V+ B g6 Z
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии$ Y! X6 s' |$ x4 h) f% f. p
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
+ w: ?: r0 C) Y: i& H* o - * См. GNU General Public License для получения более подробной информации.
: \0 {2 C1 ]/ `4 J& x8 F - *
- e9 F! b" o% G* ]( \% w* W - * Вы должны были получить копию GNU General Public License
- i O$ E8 Y6 A! X: c9 d% K - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.4 A9 D# c% W- |' h: _
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
' R9 A. p7 J( _- |: X0 U: {! b% e4 M( e
! O7 v/ ?% Q; j$ G1 i2. Импортируемые библиотеки
/ C6 h, W" h& Q& ^" h/ f
; H, m" e% Z) G. k: z* {* ]7 S- package org.l2jmobius.gameserver.instancemanager;7 N: S. z5 {+ [
- : d! k4 A' ^; h i2 g" U
- import java.util.Map;9 X! L0 M5 o: D$ Y1 L6 @' _
- import java.util.concurrent.ConcurrentHashMap;$ G! k# l. {$ `
- import java.util.logging.Level;
) }( H' _; R. n& `4 t7 M9 K - import java.util.logging.Logger;5 n" L5 b& a! ~# m) M
/ v- h& F6 R' ?8 E$ U* P8 L2 o- import org.l2jmobius.Config;* d8 p" J% u. C% m
- import org.l2jmobius.commons.util.CommonUtil;- ~; ^# P7 ?- O; i0 g
- import org.l2jmobius.gameserver.model.quest.Quest;( u) q+ F: U6 T& \
- 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 j4 e0 b. l: s {
9 I5 _) y/ j- w6 I# M% N3. Описание класса QuestManager
( p: |$ n3 h8 K C D# C' f$ @- /**, W! p o5 ?( M) G
- * Менеджер квестов и скриптов.
7 L- Z4 E4 S- T8 D3 _! M. c - * Автор: Zoey76
' N1 X% d4 R" J$ ^% p - */# g" h3 y4 b _3 x
- public class QuestManager
+ w4 a: M7 P7 q" N, G, m3 y - {
1 K8 P# a% R5 E - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());4 N5 |0 V( |, i
-
8 r' t! `1 g0 Y7 O" ^1 ^( b8 l - /** Карта, содержащая все квесты. */
2 J: ^! U E% v8 `4 S) q$ h - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();! Y% G2 l/ m0 B: \& ~! _
- /** Карта, содержащая все скрипты. */
3 H/ D1 h5 y1 I1 N/ u& ~ - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
/ D% F, c0 [3 x6 x. E - 9 E( {" r& y$ K# L8 l' V6 [6 l
- protected QuestManager()
. o8 f- ]* g0 I8 W" s5 g - {7 k, }9 Z) j/ Z# k8 C Z- P
- }0 S4 r( n; a+ e3 G- ^4 s. [5 ]
- }
Скопировать код 4. Методы
: }; d; _6 Z B; o2 y" c- ^: jМетод reload(String questFolder)
' I2 _6 s5 f6 |4 f" w* @- public boolean reload(String questFolder)9 Y7 q, h+ Z# ?0 X7 |
- {2 \( }' D. g; _# }+ u* o
- final Quest q = getQuest(questFolder);
8 a2 j6 n: @: }; A - if (q == null). D! z/ Y% b& A4 p. }% W! m
- {
% ?, [1 h" y+ n0 U+ e - return false;
" @ B9 r7 k, D V - }' t% J% } r3 i% x# |( T8 k3 ]$ h' ?
- return q.reload();5 u1 A# R. L5 v) _5 K8 B& ?
- }
Скопировать код + i' d) Q- |. |( B, O
x* B) ?$ E2 |0 }, z" V
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
) ]9 ^& b" u2 O7 p+ J9 L* UМетод reload(int questId)
; o1 ]( g& _* e2 t3 _) U/ Z7 | W" M( i0 a; \! D
- /**+ g! K5 A0 f. K& M
- * Перезагружает квест по ID.
% n, v% [' {: R" R - * @param questId ID квеста для перезагрузки, d) [' o0 v+ L* |! d
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае g+ r0 o! a5 E/ U
- */
, c% L2 }/ f( {$ H7 j1 S! ] - public boolean reload(int questId)
, J2 M+ `4 d0 l( o- K - {# N; L& u# A% j2 N- }
- final Quest q = getQuest(questId);: _/ V; R1 E$ ?& H. l* g
- if (q == null)
7 x* U& ~7 g! K/ V$ o, {# }' C% G - {& q8 z" X/ _( a# T$ q( w
- return false;
: A% Z0 D7 V, J - }
; u& B; J! C8 Z0 l$ ~# ^ - return q.reload();3 q9 j6 w& ^! l
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
6 L8 b/ x4 R& i# q9 w# a2 W ! {. R, X$ }- X* z z% x4 n
Метод reloadAllScripts()& i" r$ j2 T) }& S! d3 S9 U8 |
& u7 D$ T- j K# j& H
- /**
7 ~, @+ k8 n+ B, x7 P - * Выгружает все квесты и скрипты, а затем перезагружает их." W: g6 _' ^; E8 Z
- */- r/ Z r& S2 [ G
- public void reloadAllScripts()
# M3 N c& U8 B5 Q/ _6 y - {
. T1 E, z( u, V3 t8 X; b9 M - unloadAllScripts();
0 P5 `' V N3 O. I0 ]- Q7 w) c, v; O - ! N0 J3 u9 ? @8 V
- LOGGER.info("Перезагрузка всех серверных скриптов.");
# s0 n7 b; T+ S) l. C% w) \ - try
7 N5 `9 x' M0 _8 y& c - {6 |8 B2 y9 f* ~7 s8 C
- ScriptEngineManager.getInstance().executeScriptList();" L3 v) h4 F/ I5 O5 j1 h6 W
- } b( W9 F5 ^* g+ F) R) t
- catch (Exception e)
+ d# ~& C$ M: A8 l+ ] - {, F0 `4 M2 [' o1 g6 y
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);% n9 L# V8 K) w( d( n& [: l
- }9 U# {. K) }' k* `. t: P
- g3 k6 {/ Z, h! o2 v o1 j/ g5 }
- getInstance().report();
! a: h( ?, j) N1 v& T4 ?: B- G - }
Скопировать код Метод unloadAllScripts()( U+ r) Y- h5 D# Z9 [$ m+ l
' M% y# E2 F2 e C6 h0 _- /** D* X9 U% N, ^
- * Выгружает все квесты и скрипты.
. F; F5 X# h+ U0 s- v - */ p1 A8 M) y# l+ S$ ?8 {
- public void unloadAllScripts()& T5 y% [! m6 ~4 d, p
- {, ^. v' Q# O, z* {$ K: ~6 Q+ K
- LOGGER.info("Выгрузка всех серверных скриптов.");7 M$ o& d% [& {( Z- m' V$ _* o
-
6 s" t1 \8 A W/ r - // Выгрузка квестов.9 g+ ?( ]2 m* H8 J
- for (Quest quest : _quests.values())& r* g. y* }* ^$ {8 i: Y
- {
' _/ Z: Z) y+ O& z! V7 [- a - if (quest != null)5 @* @0 k i) v, ?2 m/ ^5 l1 D' x
- {. ^% j3 _4 X: U0 I0 f1 m
- quest.unload(false);: K+ {4 Y K6 p0 a+ B" ?
- }
. Z' y! p1 \" a' d" d' @ - }
7 A& z( _/ @/ x8 j1 P# O - _quests.clear();
5 B/ M5 W& i3 j: o - // Выгрузка скриптов.
( N6 e6 Z0 \1 e `8 b+ i - for (Quest script : _scripts.values()) m' C0 o' j, C; V" a, J3 e
- {7 r1 z$ ]$ x, A
- if (script != null)1 E; e; K- A" G7 [) n
- {
0 I) r; Y& {0 p1 I7 _# c - script.unload(false);6 t9 ^. R$ u* m4 X) A9 ~$ P( [
- }' R. E; l0 m2 O' B: h
- }
. J) |2 J9 N# v3 ]- t8 I - _scripts.clear();$ N" `) ^7 Q; ^1 ^* ~1 V- a$ D
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.5 L( V9 q* C, i$ i& U
) p& p6 J7 Z' M- F' I
Метод report()- F m( p h" V. J" c8 {* O
1 t# r; F. N+ P% L! e$ m3 m8 t6 E3 \- /**7 v% t: @0 `5 {! H+ G
- * Логирует количество загруженных квестов и скриптов.9 I/ I4 o6 D# ~; ]
- */* w5 i' |% u+ h9 t- o
- public void report()9 w( j/ R' N& C
- {' `- G+ [3 B1 `& Q& M
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
6 }4 G8 W7 i* @/ m - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
9 t/ R- z0 d8 H/ A+ i! ^ - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.; a9 V$ I/ E" Y/ b1 Q- \" g
) C: \, a9 j$ n2 J( J @
Метод getQuest(String name)
& E6 K+ p, m# {( p- P( ?) N# _2 G
- /*** [4 V# r8 V: [" x2 ^/ x
- * Получает квест по имени. W, u% L/ N8 T C0 p; Q' c$ d5 X
- * @param name имя квеста
; D' t7 T. _' h+ [7 W6 `" G; ^( S - * @return квест2 I/ N! G- T4 D) @
- */
1 j) V; ^8 a) E1 T5 O" h - public Quest getQuest(String name)/ i9 O2 F. ?6 H/ }7 X& s% w
- {
% a4 i/ Q0 Z- D* ~& U( v2 s# C$ n - if (_quests.containsKey(name))$ D7 a3 }; G1 U5 B: h
- {
# l6 I( l1 W/ {1 y- H$ z, o - return _quests.get(name);
$ F2 O" }* ]* u7 Q+ l$ x. t* x - }4 u7 T, w9 G. ~; d& N* B7 G
- return _scripts.get(name);
/ [: l4 \; v k* [ E* f( P% ~ - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе." f% M7 D( c$ g. w9 m/ @8 G+ ]
H# @- o7 [1 h/ P, {+ K3 s1 y, v
Метод getQuest(int questId). t' g x" c7 g
, P* j' _% h! y. w- /**. s0 H* l9 C- L) T$ s
- * Получает квест по ID./ O' ?- B. K1 g6 p' l
- * @param questId ID квеста
3 V9 X4 [" ~8 O - * @return квест, если найден, {@code null} в противном случае) v( a$ T; q% I
- */
% U! I4 x( G- K0 ] C* }3 i+ \ @ - public Quest getQuest(int questId)
! i% ~2 f8 D0 I) q1 | - {
, l1 H; c- B9 I9 r, |( {& j# k - for (Quest q : _quests.values())7 \% ]* ?! M0 e; b4 Z& g
- {
1 }: a3 H/ @/ i$ [( k4 O4 |7 u5 V5 I2 ? - if (q.getId() == questId)
" q& r* x# l# M" K. d - { O6 K) N+ ?+ z4 i. f$ m; y$ e
- return q;
3 v x1 b0 m$ B" N- N# u, M - }
& o1 }7 U K, s& a3 q5 N - } k9 G# [- u: c: i, ~ K
- return null;2 F" f* A& S5 f
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору." M) ?5 q4 p: l4 h" t2 p
" D$ @8 d* K6 C" p/ I9 o- JМетод addQuest(Quest quest)
" {' L( u, w, z: m9 N. [& J; n) B" O+ U8 w* k2 z2 c+ C
- /**
3 B a. i6 l) a" d$ l/ r2 Z! W. s - * Добавляет новый квест.
% r2 D$ _. {7 H: ] - * @param quest квест для добавления0 h4 b$ e8 q* x( O& f; D
- */
/ F3 L( a7 G j& @1 m) n" Q - public void addQuest(Quest quest)
9 k! F, d5 s7 E4 `1 R& @ - {
$ \+ E- H5 e5 B2 ^ - if (quest == null)
# C+ O4 V U& u/ I" s - {
9 l8 D2 ~3 P6 a8 i - throw new IllegalArgumentException("Аргумент квеста не может быть null");' F/ x( y4 z6 ?% A- }
- }
7 p1 E9 l" w6 ~# W4 h! f -
7 h9 D! I ?, @3 `( ]. }5 L - final Quest old = _quests.put(quest.getName(), quest);
2 a# b4 Q+ i- ^0 n7 f6 _" Z - if (old != null)0 L8 n( _6 d$ @2 f
- {
! g+ e6 t1 \) V - old.unload();+ O& Z0 R5 J+ ?- M$ D' r! `* V
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
2 d3 g5 o# u7 i - }
3 D% e, w3 q" f/ }& t. L -
1 g0 w, [9 K3 I6 W, A - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)! i, m& F8 d0 u
- {
% R3 k4 Z5 m3 e - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();! {) M# s/ b" M7 I
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
5 b1 [; p. q: i! G$ M* c* Q5 u - }
+ W3 F% Z9 |* k) a3 W/ e$ o. s& _ - }$ S, l; V( f$ O c* \! V& T+ R0 f* n* u
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
) M. n9 L# j& E1 N5 kЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
g" ]# b0 s1 z* j3 p! M6 `: Q* R9 f+ n( F- z# {+ f5 ?; B
- @, ?1 [3 O+ O, k0 l' d5 ^: y2 Z# k! ~
* Y6 ]. s7 s. k. J: w, G1 G4 u |