Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius) E' F" {7 _( p+ O1 G1 {" x% z; [- F
2 L& G" Z/ h& {5 |! K# V# j' DРазбор файла QuestManager.java, V1 s0 ~# }# E3 m6 [+ @
: d+ H E% N# R+ R
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.2 d- @& T% A3 Q. F+ \* i
Основные элементы) e0 ~ i0 f$ c+ }7 l" {
- Лицензия
l' w/ q+ Y) a+ B& [4 Y% M3 O @- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
3 S2 D9 n" p6 ~$ ]( v! i
- Импорты
: J& F/ \; {; W4 v" d% X& g , T# g- t2 x" l8 L9 u5 p ]
QuestManager.java — управление квестами и скриптами.
1 s1 H2 K, S7 R- MПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\# W' g8 ?; H& m1 W; I# A
( Q: ]; Q6 A& D3 {: W
) l- W& ?0 h/ P N' eДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.& R( E& F; z1 u, i, f }+ q
1. Лицензионное соглашение" J' ~9 x$ a/ }$ ]
- /*
5 R! K7 l2 n) @% i - * Этот файл является частью проекта L2J Mobius. }" }3 D: y1 x, Y
- *
' m7 j* p* [# @1 \) D+ ^( i - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
) {# l& M5 U6 M - * её в соответствии с условиями GNU General Public License, опубликованной: p m1 j: ~* d9 G1 R& E
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.5 O1 g7 V8 U V |
- *
1 P6 K$ h) C" l# q7 c7 T - * Эта программа распространяется в надежде, что она будет полезной,% \9 X, _& \5 `2 i' I4 W
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
" ]/ _: \: s6 q - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.& i: P8 D2 J: X" s( t
- * См. GNU General Public License для получения более подробной информации.
$ h2 a7 r5 a- O) r4 l" O - * , q% n5 R$ h4 e+ p
- * Вы должны были получить копию GNU General Public License* K8 j+ n* c: ^; v% A
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.+ F8 E! i9 f m7 b8 Q
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
# F$ `( c {5 P, G
/ Q& Z7 j$ C {) o
9 r& F+ c% L8 n4 N9 \; \2 j2. Импортируемые библиотеки
! J# W# Q& v: F1 @1 e
5 O0 Z5 ~. [( Q7 Q0 [8 I- package org.l2jmobius.gameserver.instancemanager;
. {, L3 ^6 v5 Q, K9 H+ Z# ^4 x
8 j! ~# _8 A- ]7 t- import java.util.Map;" X: u/ E- v) I. I0 Z: E
- import java.util.concurrent.ConcurrentHashMap;' P6 q; h6 ` u4 v+ v, m# w
- import java.util.logging.Level;0 \- g& i5 T; i4 U! g2 m; E3 q
- import java.util.logging.Logger;
5 p" t, `' i, ^3 |' x% d$ u
; p, j) N/ ?4 x& {- import org.l2jmobius.Config;
. a+ f2 K! c/ E* p% i" f9 a9 a - import org.l2jmobius.commons.util.CommonUtil;
7 `- K+ r" ~; z: k - import org.l2jmobius.gameserver.model.quest.Quest;
+ G) y' P1 @" b2 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 — менеджер для работы с игровыми скриптами.* `: V6 z( e) W9 e9 m
7 y0 s# D, A( A
3. Описание класса QuestManager
9 ^' u' Q8 D$ k" A0 J( F+ n7 C- /**
3 ~; b/ ~$ w) b, c - * Менеджер квестов и скриптов.
4 F* P3 p; t9 |8 Q - * Автор: Zoey76
) W3 s8 V, D& e( t0 X: Q - */3 l5 q/ f9 V* h. E
- public class QuestManager
' @; I% X) }* `1 [% a- q3 b - {* k( y! v+ q6 a4 ]9 N& h
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
9 Z% R1 q2 V# b* ~ M z- c - : `- t3 k- c% a/ K3 ]; C9 ?
- /** Карта, содержащая все квесты. */4 ^* A& s8 I% d" \. u" e8 |- q% _
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
' p* H. `! N; M9 m3 ~4 j - /** Карта, содержащая все скрипты. */
9 I- G1 e9 z) ~$ x - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();6 f% U& a) s( n+ [4 b3 R
- # s; M7 \/ w5 N0 s$ h; J+ b
- protected QuestManager()
+ W/ m! p" F$ A7 Q% S - {& N! j7 V) Z3 l; n$ c/ @- k }
- }
# F8 |; y6 Y& q - }
Скопировать код 4. Методы
2 d( |% l' U* z' k, N ~( n' a) MМетод reload(String questFolder)
1 L( o! K' e3 H- public boolean reload(String questFolder)( K, ?' M# U" A: k H- ^$ G
- {
$ Z9 A3 ~; j& e& o/ A6 G - final Quest q = getQuest(questFolder);
9 ~, I7 a* T' X8 h, U- e - if (q == null)
2 B x; b, a0 i+ U1 A- o' ?6 A/ T. X - {
& y+ G1 `$ j/ @9 O6 u A# k! g1 _, X - return false;
( Q1 h2 k! j# O" J) R - }1 n* K2 ^7 Q+ ^
- return q.reload();% V" Z$ F" T6 m1 {: S4 S' J
- }
Скопировать код 7 S4 a( C" n6 R% M
6 [6 Z1 C$ P+ [ [7 @ iМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
% m7 `3 o6 U2 i+ I V6 z# P0 r/ ZМетод reload(int questId)
4 D' X7 b; o, ? O
( C$ Y) I" L. X2 b6 v5 x- /**; d& l- b7 J, s% ]* m) Q, r
- * Перезагружает квест по ID.
* V# ~& w1 ?' p0 N* L - * @param questId ID квеста для перезагрузки9 J$ v$ d2 L4 @0 m# T j1 f% b
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
$ b2 D% h( T% X+ \7 T0 z6 @# ^) d - */
! Y+ `) E, S+ E! b, m - public boolean reload(int questId)
9 f: T0 \- T# W' {! V# l - {
7 n2 V% q' p5 B8 Q' U: ? - final Quest q = getQuest(questId);
* t! k0 H* a4 U+ f! A0 S - if (q == null)
( \% b0 Q* t1 L0 k, K! B! V - {. H* l, A4 \5 B0 J
- return false;
' a, Q0 D0 Y j - }
! ] Z9 b K: f; C. G7 U - return q.reload();
; |( \% a0 j/ m( Q8 a; |* r5 \, r/ J2 E - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
" d% g- U0 e! M# D
: F1 C3 i4 m9 U$ ^- TМетод reloadAllScripts()
, f: F- ?8 n7 @/ s3 z# O$ S0 V% h3 r! j5 k7 E) \7 F
- /**
, H- a2 I) {' ?& l$ P* j - * Выгружает все квесты и скрипты, а затем перезагружает их.
]! K6 c( A, n8 H4 I" x - */% d. }* ~* O6 p2 F- D
- public void reloadAllScripts()
) n+ f; _) ^& D - {
$ x* K9 q9 E E- h2 u - unloadAllScripts();
9 ~" D" h+ a+ A" G -
3 o+ C3 o' r: k - LOGGER.info("Перезагрузка всех серверных скриптов.");" V0 x% z" \8 d% e% Q5 j. V" X
- try
7 U/ H. c0 ~ u1 @4 S - {- ^& b* ^0 }9 E
- ScriptEngineManager.getInstance().executeScriptList();0 j2 c: N: q0 g$ C& ~% F5 H
- }
3 B+ G! V% h% H8 ~ F+ @4 M - catch (Exception e)! R' ~5 V. o9 k7 i9 F- b
- {
9 L9 t4 V! z, K5 \; p% \ - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);" D% _' w4 ?/ b5 E- R" X$ y7 p0 i
- }
" a1 ], M- a# S -
% ?4 y9 S+ K# x9 _ - getInstance().report();# c# O6 q1 g( g. k, ^& p
- }
Скопировать код Метод unloadAllScripts(); A' D( j$ n8 h! M" l: _& d
* M$ w4 z9 b' a0 e- /**3 t: R2 Y6 j9 D* k G
- * Выгружает все квесты и скрипты.
' m9 \& d0 f& ` - */+ K7 N5 o! w M
- public void unloadAllScripts()
$ c, b! O6 p$ \: _ - {
+ z* S4 z z1 L1 D1 i& X N; s( P - LOGGER.info("Выгрузка всех серверных скриптов.");
& X: z5 N8 _ T, }% l, u -
9 i, W& q# }0 O - // Выгрузка квестов.$ e8 D% a7 F- s2 v8 D5 b
- for (Quest quest : _quests.values())7 R1 i# \ B( G/ H& T. W6 E
- {3 o1 ^$ x1 @. X5 _
- if (quest != null)
4 M2 \; z% Y! R! { - {2 y1 N. y% D9 p6 I; G9 {
- quest.unload(false);
. g* t7 ^3 @4 s$ B. S - }8 M' _* G/ M. C
- }. \2 \* G& J7 P' t' V1 J+ m
- _quests.clear();
3 x1 y3 @3 j$ |9 G% q) K. T* Y5 E - // Выгрузка скриптов.
) e# Z1 ~# _+ c- a, W- T7 ?# { - for (Quest script : _scripts.values())
( O# V4 [& R8 \$ z2 l - {, @5 {" h: K+ s! Y+ @
- if (script != null)
# ^2 W# _/ Z( h' L+ v0 z2 g2 s" T$ q - {, D1 i, L- t7 \3 ]3 h
- script.unload(false);
6 Q$ s) i! z: N% q6 ~1 g/ H1 s - }
% ?. w5 ^& G |% H% Q1 ?# ] - }8 s1 K" a7 F$ |2 J: {
- _scripts.clear();
8 v6 F6 e7 W0 I - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.6 Y9 |! }7 i: u7 a+ m0 ^( s( ^, w
# M2 V1 L9 `# Z+ OМетод report()
( w3 V4 h- r/ [ X
5 {( l6 b2 Q) x# E. O% j- /**
% a7 H& x9 ~3 i - * Логирует количество загруженных квестов и скриптов.
7 s9 D2 l( m2 E& x. k c ?6 G - */
0 Y/ I2 \+ I1 y. }/ d, v - public void report()8 v x# ~6 L) E* w. t% f
- {
: g+ ~% L( h' D# }$ M! P1 [( ^9 _ - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");4 S R# S& G! Y4 L. @
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
$ V: `; P i& a1 W. z" R - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.: e& K- b8 |9 p% r+ X/ g4 i
, N$ s6 H3 X2 m8 O1 j/ NМетод getQuest(String name)
" e( O+ b, z2 y+ R- H
$ w; o- A/ D7 y- /**
! D* [' L- d' Z* c- l# h5 [ - * Получает квест по имени.
0 k3 }9 m. h- c: X+ y$ J - * @param name имя квеста
; E$ Y# M p u6 E - * @return квест7 y8 Y. Z' D3 t: t
- */4 v# Y0 F# g! B! C9 I
- public Quest getQuest(String name); ~6 L3 G2 ]! ~: F6 Z; o# [
- {
6 T8 `: q3 D9 X4 h5 K3 r# Q - if (_quests.containsKey(name))1 {- ~; z+ ?' ]! U" T
- {
" N* f' J% Q( _% s8 X6 Y# e2 r - return _quests.get(name);) l0 i- k+ B1 _7 k$ `% ~
- }
6 {. X7 N _- m3 f3 T - return _scripts.get(name);- M$ f ^/ W0 x: l' s/ C2 X. }
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.1 U; d* |; `+ {( {! c- _ c7 }
" N( @8 ?5 a. }$ g8 {8 x
Метод getQuest(int questId)1 k6 G) L9 D/ w2 r; J3 K5 ~7 [
0 [# R) e' j) P0 c8 D6 K1 h- /**
7 o+ D7 [# ^* d - * Получает квест по ID.+ M0 v/ B- |# g+ }4 _0 L: p; _) j
- * @param questId ID квеста6 b* Y! @) K: i) O' |
- * @return квест, если найден, {@code null} в противном случае
/ O! a8 m6 Q z - */, A! }) c. n! x/ j
- public Quest getQuest(int questId)" i7 G4 Z) O( U* C- A$ D- z( J0 x
- {( @! ]; F$ M# t* E$ y
- for (Quest q : _quests.values())
6 ~, i3 X0 S3 I0 L - { n7 p; v9 W& z- T; e. o
- if (q.getId() == questId)
; ^; |( A) A6 j8 ~" [$ w$ `* n - {) S- \8 j8 z2 T2 h
- return q;) I* h% d* p9 p: \$ L
- }
; l; W2 d2 F8 _% ~ - }" y1 A1 n/ \6 h6 S) z
- return null;; N9 L2 B5 r/ O
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.# [! m) m ~ d# y
* T% Q0 h' V* ^, @4 g1 B
Метод addQuest(Quest quest)* q# F3 N! ] t3 }, z, a1 `
% z* X* e6 b6 g* i, g
- /**
4 G4 ^) s- e4 U% `) U - * Добавляет новый квест.
+ p+ u4 l* Q$ ?# Z. i - * @param quest квест для добавления
; W) y1 e: [7 m2 S - */6 k- {7 {) s, f9 |9 M, z/ R
- public void addQuest(Quest quest)
) y. W" z) L" Z1 p5 a - {: E9 i7 l0 h& ]7 g
- if (quest == null)$ F; n% ]6 |) e: `8 K0 N4 t
- {
5 t" O# R* R4 }5 Z4 w1 ? - throw new IllegalArgumentException("Аргумент квеста не может быть null");. ~1 m* V, ^4 B2 m9 D+ _
- }+ a) b* p5 \9 _9 h' j. |) f, G
-
- I+ w/ A: Q/ E$ C - final Quest old = _quests.put(quest.getName(), quest);
0 f0 F3 I- o. Y) I {* d - if (old != null)
3 ~8 Z* I8 { P* I, O - {
! x8 E' T o4 }) G( | - old.unload();# ~. l& [% o! S: p
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");3 R5 G& s: Z- z* ^# m
- }
/ o5 M. V. K- V! a -
6 `. o4 |+ h* E9 `( B5 X; _6 n; h4 j - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
" Z* P$ b2 O( F* W) I2 a - {
' @3 l* O7 V. h - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
+ r2 c6 [9 j3 V$ i+ j/ W - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");1 ?) `! z' T1 S% S. P) J8 d/ w
- }
) B3 u5 }4 {& b4 ^' f) { - }
' J1 _& Q. i' M) X! \1 q - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.* Q# Z' H; h, Y7 |6 K
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере." ]& O5 N/ T% l! o; h. K; \
% I- m9 r q2 |0 \# r
. o7 r7 [8 O0 [# @
5 f3 r( @* X) b |