Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius w8 U! y) C+ p
' |/ _5 o0 g- D+ B, vРазбор файла QuestManager.java+ Q0 z7 T$ ~2 U" j X s& m+ k
, ?. l" {6 x: k, ~
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
! d1 M5 ^2 X |9 pОсновные элементы; V0 G9 K4 i0 ]9 N
- Лицензия
# q7 h) g- P* x8 Q2 f4 p4 J. X# H- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
- V+ O6 X* V' Y. @7 U* |
- Импорты
/ J' c* t3 g* I/ d @* v# Z
+ f9 e: G7 k, ]2 HQuestManager.java — управление квестами и скриптами.
4 f* g$ E1 N) }! i3 H, O: x& `Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
' M: X- N& S# @+ o4 @ f1 Q$ d& R( ]) i* B" d0 B
4 n, M; Y& Y4 v8 O) _& h
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.& o& T- s$ }7 s2 N$ {' W2 T& ?
1. Лицензионное соглашение" `1 g6 z5 o. |
- /*, V$ u) u; ^& P4 _6 t9 Q0 z
- * Этот файл является частью проекта L2J Mobius.1 {, R, ]: `! J" d' t' p
- *
% g: ^0 p+ D0 Z) Q - * Эта программа является свободным ПО: вы можете распространять её и/или изменять- o9 B" B+ f! L
- * её в соответствии с условиями GNU General Public License, опубликованной. N: A! n3 w, R
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
) e+ `8 j# e2 y. D. M6 q3 K - * . a( p% m" U. S5 ^5 Y
- * Эта программа распространяется в надежде, что она будет полезной,7 @ m2 b3 ?9 p+ I3 F
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии6 l5 L7 G0 z) |* z) N Y
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
0 a% ~ w- L+ O: y/ a" b) O1 R - * См. GNU General Public License для получения более подробной информации.2 C0 o- C* |6 i4 q
- * * W* y2 J2 S7 |0 W7 J% b
- * Вы должны были получить копию GNU General Public License
+ r$ x' ~0 V+ h; c, q/ r - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.0 A, s0 a: E. `0 e5 K
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
/ J" W- {5 k2 R6 ^! _/ _$ ?( t$ W( k/ l* S- Y8 |! o0 R# s0 L
% k& ^; _, w9 t
2. Импортируемые библиотеки. |& s8 T" w1 Z, z8 F j5 i
0 ^& t) v9 k& i+ H/ ]
- package org.l2jmobius.gameserver.instancemanager;0 G1 V R5 k9 @
3 Q5 Y) a+ `( F* c. a9 t$ E1 T- import java.util.Map;
3 [: v6 b0 N7 B7 z; C) P - import java.util.concurrent.ConcurrentHashMap;4 t0 m) Z# V) K+ s8 n
- import java.util.logging.Level;1 M3 U# Y. V" u/ ^- t( |
- import java.util.logging.Logger;- K$ K1 _8 l) r. H }; v0 B5 n% p
- $ U, L. u* g+ D; P7 Z
- import org.l2jmobius.Config;
! s; S1 O0 z7 P$ T- {8 c - import org.l2jmobius.commons.util.CommonUtil;
- g y# Q4 d3 m. P8 Q; S- o - import org.l2jmobius.gameserver.model.quest.Quest;
' `, [) U: C7 H# G5 [ - 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 — менеджер для работы с игровыми скриптами.$ f8 ]" z5 S& u4 R/ B# k7 S: T
( _/ O. `: }2 F! w6 C" X3. Описание класса QuestManager* w8 n' M( S0 l9 z9 l8 T! }/ b
- /**! T; C3 N/ [" k
- * Менеджер квестов и скриптов.( u) u" s& l9 L/ _
- * Автор: Zoey76
2 i. j; g! K, N5 D; u7 D - */4 `+ W1 H8 C6 a% i: E8 p
- public class QuestManager
& M- n! G7 L$ Q: K6 F7 A; L - {6 v% l' c" p. `$ n4 |6 K
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
0 o- w" O9 w$ ~, o -
# F6 o1 ^! o1 u. F# E - /** Карта, содержащая все квесты. */* h' P. A; e6 H7 J/ \( H L
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();) R) g5 w, ]6 T8 s
- /** Карта, содержащая все скрипты. */
7 g2 p2 e1 M6 B# U+ b - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();: R+ m9 Z9 L; B7 D5 t# g
- $ [" k% r! k( v/ R9 w( f
- protected QuestManager()% J' m- i6 |" |& c8 O
- {) Z' X' y' w- M- L6 B
- }
- y) y; q8 z1 O" q9 B( N8 e, } - }
Скопировать код 4. Методы
8 L P; x$ b+ K9 b. d; {% k- r7 C) {Метод reload(String questFolder)
, X& `9 {' e/ ]0 q: S0 u" L- public boolean reload(String questFolder)
8 n, s4 \/ i% F8 b - {
; [2 t' k0 u2 J+ o8 A' x5 k - final Quest q = getQuest(questFolder);$ q2 J7 K/ h4 D
- if (q == null)+ x0 Y5 k! }3 T) k7 [
- {
' _8 f7 Z2 t- O - return false;! K7 L* B/ P9 g2 g$ P
- }4 c( C6 N( l1 c$ S% S
- return q.reload();
- x; l# v0 F+ C s) h: W8 e( p; N$ W( N - }
Скопировать код " ~( G5 f6 K8 S5 u# q
8 s7 D: ], w7 k( q: E4 Z% t, f9 m
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
5 B3 Y! ]* X0 O3 ~# S9 LМетод reload(int questId)
: n# d$ V6 _# T9 b$ H) n: x2 A- T+ }
' G5 ?" q% `0 ~; r o- /**
h8 [) W/ U) s5 [3 _( ], c4 g - * Перезагружает квест по ID.
1 I% j: c+ A8 N6 h* ]9 O - * @param questId ID квеста для перезагрузки
9 ]4 S/ \, `! _6 l - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае8 A K$ o1 w4 _) y( e
- */
% n e1 K) m& l* E7 w) y - public boolean reload(int questId)- L' n& y( H/ ~% R% `/ z
- {3 Q" D g6 v& T5 |* U9 p+ d F1 p0 O
- final Quest q = getQuest(questId);% v: |1 @5 W( q
- if (q == null)
5 G# n! s. @2 P$ ~" y - { D0 V' _! b$ r, d- d6 M2 U
- return false;8 |5 P6 N: |$ S0 E6 [' q
- }) Q2 P6 N1 y$ y' v5 A, e S
- return q.reload();
" {" z9 \( X- `9 y/ o) I3 { - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
! w" @2 I; ^# {' |3 v
2 d* J- J5 Y7 k# o( y% [Метод reloadAllScripts()
" [ @ o+ ]9 }0 s& g2 E1 R9 S
: U4 G& m1 _% h! Z1 o* U; ^- /**9 G% |8 O# d, K* k o
- * Выгружает все квесты и скрипты, а затем перезагружает их.4 {2 z3 J! _ ] e: k) r
- */
3 M; |3 m i; q; J5 E3 v - public void reloadAllScripts()
( ?) y4 V: p3 D2 c: y! b - {
' c: K6 z7 `7 P) a- b2 X0 | - unloadAllScripts();
% o( c; H( t* {; t - ' j$ f( ~$ m1 z" ^
- LOGGER.info("Перезагрузка всех серверных скриптов.");1 j0 s: l' V; r
- try
/ L$ p3 B! l, z) V/ m - {/ g; s+ q- j# w1 b% {5 `; ]9 o
- ScriptEngineManager.getInstance().executeScriptList();4 O$ g1 I* l5 k- f) q* ^* e$ x* n: Z! X
- }1 \# W% E+ M3 X' J3 F
- catch (Exception e)' K% H$ V5 b% K9 }2 k' n
- {
. P. g7 J0 z7 M( N - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);; Q7 }9 _9 `* Q$ O4 Z7 V* ~% G
- }
! z4 Q' O! L! H8 z - 8 l( a% }0 k+ I$ C7 U% y
- getInstance().report();
$ C. A5 |2 S$ l* Z9 W. v3 D8 x - }
Скопировать код Метод unloadAllScripts()9 F2 E4 k u) D0 |
9 T, |4 w; D0 j% I+ Z3 l- /**
3 u" `1 ^, f5 d/ R5 x - * Выгружает все квесты и скрипты.
& M2 V' n+ p, |) m' w5 u7 S( j - */7 ^) `' ^9 b Q
- public void unloadAllScripts()
1 b5 c& s1 f, C9 ?) g& @ - {8 }5 W' D g/ K6 N: Z4 T
- LOGGER.info("Выгрузка всех серверных скриптов.");+ J/ T. y. S- U
- ( P* |- Z# D- Q3 J3 e# q
- // Выгрузка квестов., H S# }5 n# E# Z# \6 O$ }# K
- for (Quest quest : _quests.values())
8 u2 S+ K; Q6 c# T - {
+ D1 Z2 }/ C* k2 f. N - if (quest != null)
0 ~4 n$ F/ o7 C# a; F. Y& Z3 E - {/ R3 _2 f. }; E2 L+ }
- quest.unload(false);
; A8 g0 l- \- S- O - }
+ Y( D6 ~: q" c9 z7 n6 k - }
8 I) H. z/ j( V$ [% d- ^ - _quests.clear();4 w6 g' r; c, Z, R2 y j) @6 D" p
- // Выгрузка скриптов.
- M9 k! D6 W1 U, Q" C$ |7 b - for (Quest script : _scripts.values())
& r- z% n* }5 u( X7 E- N - {. J; K# ?5 F2 z, O1 ~' m. d
- if (script != null) `2 z( P) J: E+ C0 o3 j
- {
9 i, }( C! B# w$ ]. b - script.unload(false);" T; y! o- g+ A8 h: o7 [# L6 U4 T
- }7 z4 ~' ]$ L8 z/ }3 r/ e
- }# w; H: E' k; H( @
- _scripts.clear();# {( ] t9 g. ?, v# N
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.' Y/ j: L! R; e( `" x# }- c% T% y' ~
3 U, d: }* b+ yМетод report()4 }! m* z; t( a$ i: G6 m
- ~( E' w9 h6 @" s
- /**5 {+ U2 u8 x& M2 C7 |5 l4 }
- * Логирует количество загруженных квестов и скриптов.# z. S( {5 G: X& x' x5 W
- */
3 y$ S! R" C2 a - public void report()
o& a+ n, n W& I; r8 L+ J - {9 B7 B9 D) f9 e9 C+ ~1 P8 i
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
$ K' G+ `# ^; U - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
U" L' `' |3 ]6 c/ t - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
) J+ |3 ^3 O2 |5 L H6 J0 t
7 l) _+ f5 E" {2 w6 y% Y* tМетод getQuest(String name)
! L! e+ |- z4 I3 C+ S; ]1 N4 q; C. K j% g5 D
- /**1 `' A$ f& T4 h0 q
- * Получает квест по имени.! ^7 n( O4 M p3 G ?0 K, f
- * @param name имя квеста
2 k8 C1 T0 }) C& E; h$ c) R1 @ - * @return квест% f S+ H8 K/ V5 ]3 x" x( ?# I
- */5 ]$ v7 r- n3 |( E
- public Quest getQuest(String name). ^# F9 H' T& } s6 o- d6 f
- {8 n& x' S3 X, H$ s' E, l0 x
- if (_quests.containsKey(name))6 o d6 L4 _* I# k1 ^$ V
- {8 s" k" ?7 r% N6 S0 {* l9 ?
- return _quests.get(name);
5 C! z- Y1 T& [5 U& g - }1 J% @) a+ K0 P% @$ S4 m
- return _scripts.get(name);
7 j9 o6 m7 u/ L' q$ v: n5 q - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.6 J3 W, k1 ~) O! r
0 O4 x& E8 G+ ?Метод getQuest(int questId)
- G7 O" y2 A6 W# G/ J, t) c7 o8 u
4 y/ {: Q% K$ F) n# n. ?0 ]1 q- /**
3 W* |, l* ^6 U/ A: q - * Получает квест по ID.
( m6 j+ e; N: ?1 M% h. {+ j" X - * @param questId ID квеста
1 e+ Q' ?1 c3 L) u - * @return квест, если найден, {@code null} в противном случае
, \8 t: l* V7 z4 A; | - */3 x& \; S0 _8 w3 @
- public Quest getQuest(int questId)9 E9 O! o3 j2 |! ~% B9 J
- {4 k# F3 c9 Y, x0 l
- for (Quest q : _quests.values())" j' E, d( m5 M& X1 \; [) z! E8 \, Y& D$ H
- {
, K- q/ k$ w% t6 Q - if (q.getId() == questId)
6 y" H6 p* z! ?- e - {8 E8 z! e3 a) H1 o3 d) W
- return q;
, v. F0 T# r8 i - }
5 \* t6 l; V& f; d( ]6 v* _2 t - }' ]/ y! c8 l u5 R
- return null;
8 k) P9 O+ J8 M" ? - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.7 ~+ A2 {, l1 u6 t7 ~; k
* H& o$ M) j1 ~/ m( SМетод addQuest(Quest quest)
) I$ i. |1 x6 C$ ]6 ~) M$ d3 Z8 o$ s. _ G2 n
- /**% v5 D1 N, X+ M/ X" I0 v& _& m* T
- * Добавляет новый квест.
1 y8 P* W% w1 o2 T2 q - * @param quest квест для добавления" z& D, F: b: m: \ K6 {
- */" A8 G3 ^; O/ W& o8 b$ i0 i/ C
- public void addQuest(Quest quest)/ `( s& w0 k/ _% N* E
- {4 v$ O0 a, O8 k0 ]
- if (quest == null)
% K; _: m5 A( g W/ y - {
1 i2 X1 X( {3 a+ X - throw new IllegalArgumentException("Аргумент квеста не может быть null");
7 a3 O) I) g6 J# d! Y" t' M+ a - }5 d( P8 U$ k |; c& Y
- . Q8 u# P. f8 r( Z9 X u+ s z" T
- final Quest old = _quests.put(quest.getName(), quest);3 d3 O6 x. \2 p" H4 c' x) x) _
- if (old != null)
& |' ?7 d, R8 E8 ~& ~# D" _ - {$ O/ C& u& v: @/ E: m+ w, ^# R0 Z
- old.unload();0 B5 s$ N% s6 }- e1 a# x) z' R: r
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");7 a2 |9 m/ s+ n8 p0 v3 Q
- }
& ?, @1 S. X! t* \; u5 c1 p# l+ } - * z$ v, Q" U v5 {
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
# N* {1 Q9 a9 B- B/ C5 n4 S - {( j+ I0 t) t$ g6 n! ]
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
6 m: \( Y7 R+ n5 D/ J' t8 `8 ~1 e* f1 ^ - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");% R6 I: I% w) P. L+ X
- }6 b" u% w A0 O- Q3 \3 W- e
- }
( X( K" z% O5 k/ W& f - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
* C% J' U+ }( R$ |9 [" v8 lЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
. I+ H# _- ?% z4 p
5 s" g* P2 i Z4 W" H) _
* Z4 O8 ]9 e2 L2 W" [6 l/ Q) L* ?% L" e0 X5 Y& z
|