Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius9 f: M( d5 ~. A4 z ^
! B8 c% _ v0 @- j& p
Разбор файла QuestManager.java
; t$ a0 }( x$ Z2 t4 R8 a \7 e4 c7 z8 k" p t( A% h
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.+ O$ X6 _+ Z3 N& E6 v* R' X
Основные элементы
- Q1 y8 c8 H* N9 e- Лицензия0 T: A2 l0 f& I: J. [
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.! [5 Z3 W5 g& g; b8 v3 w
- Импорты
1 S3 l* v5 ?. i) k + z: p: K" x8 I' ]/ T' B5 x
QuestManager.java — управление квестами и скриптами.
" q% c! x8 \) p1 kПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\. D0 P/ t% L# b/ Z0 ~6 n4 `
6 l" P1 Q/ R) [7 T* k4 u3 y4 G4 { s
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
o0 I( c5 S) R$ E7 J1. Лицензионное соглашение7 n @3 q1 e( n# U5 D
- /*& f7 ~ O# L/ r
- * Этот файл является частью проекта L2J Mobius.
$ u" W% J) U4 K8 ~! F - * ) [+ U/ ^$ B4 ` R- _
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять6 r9 a/ R" W/ |) e/ p4 b- u
- * её в соответствии с условиями GNU General Public License, опубликованной" \( a9 t+ t; e$ E1 u
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии./ x; {. R( u- E) S9 h
- * L1 }, ~) e& X! e6 {
- * Эта программа распространяется в надежде, что она будет полезной,
) f1 x6 e, \) _4 S/ C- h6 J - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
3 _0 y7 o1 S$ u* J6 T - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.9 a9 f2 v9 u4 g( o5 t/ L/ x
- * См. GNU General Public License для получения более подробной информации.
- l4 n$ y7 t. ~0 J w9 @ - *
7 w' s) g. W( ~ j5 w, V - * Вы должны были получить копию GNU General Public License
7 H% Z4 i" K& E ~ s% L$ c - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.+ y* H& G2 Q/ s" Q) G1 z
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
" g! L {2 B8 g: A; c( w5 m7 k3 ~
$ L$ ?5 m+ ~, x; H) k; m8 H$ }8 z0 D. s
2. Импортируемые библиотеки6 G* l' B1 F" n: `+ h
5 g# S! a/ y- `% p* `
- package org.l2jmobius.gameserver.instancemanager;
9 X+ F! K# ^' a2 i: J+ }2 Q: Y4 \
+ h7 \) B+ n* ?8 n- import java.util.Map;- \4 s& O7 s8 |" a* u9 s( w4 o
- import java.util.concurrent.ConcurrentHashMap;1 r* m8 W& D% b# r- H2 y! f6 n* |1 z3 w
- import java.util.logging.Level;- l" J2 v6 ^# X; P" K
- import java.util.logging.Logger;8 G( `& |/ [7 h _" I
- 9 K5 x7 ? T& a4 p3 y0 F$ X
- import org.l2jmobius.Config;# q& i1 O( }) }1 f! k0 _2 g
- import org.l2jmobius.commons.util.CommonUtil;
. G# d( p" b; _! }# Y! f4 B+ P - import org.l2jmobius.gameserver.model.quest.Quest;
3 z* o" _# _) L( c* U - 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 — менеджер для работы с игровыми скриптами.7 {& J1 R/ e. s6 A9 ?
E0 W( Y& _3 y: f2 ?3 X
3. Описание класса QuestManager/ R/ z, ^& m" l; G6 `3 X
- /**) z9 B& t6 G) E0 f
- * Менеджер квестов и скриптов.) p2 V; Q* S. h& \
- * Автор: Zoey76
, Q8 r- G- [% ~/ l( _9 r - */2 z" E/ s% ~0 v2 L$ o+ l
- public class QuestManager
* d) w# ]/ |/ K2 h - {
6 F: R. n; W- @& B" A - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
. X5 B& S+ l* s$ H -
9 o3 m B- O; V' n, F# |7 Z% G! m - /** Карта, содержащая все квесты. */7 f* z/ G+ a( [$ x4 e
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
) p8 i4 h" L# I# F( L0 }/ D - /** Карта, содержащая все скрипты. */
3 m+ j. E9 ]; m, Q - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();, N& V* g5 W/ J9 e. O( L5 b- H4 f7 B) d
-
' h( J7 l. s, f/ d - protected QuestManager()
% h, Q4 K9 t2 @: I* |2 }+ K - {
3 T3 W# A7 ~! F) n - }
3 `7 z5 [/ @2 W5 U$ V+ E: c - }
Скопировать код 4. Методы, i5 }) W0 O B }9 G% R* t1 `
Метод reload(String questFolder)7 h6 H& o8 S5 k+ Q' i* C
- public boolean reload(String questFolder)
# z' v. N$ h+ l8 r9 ~ - {
4 x; K% _- i) }! F/ o9 N$ N( p - final Quest q = getQuest(questFolder);0 q/ {; o+ S; [3 D. A
- if (q == null)
: ]4 X) e: F; J8 M8 m+ f/ Y - {4 }. m" H+ {2 n
- return false;
# P2 c4 b2 @7 H* y) w - }
, r1 F$ H, W4 f7 y' K6 n - return q.reload();
6 S" X+ k8 M5 |- j - }
Скопировать код 0 j0 F5 y; y- ^8 ~$ d5 @
' M& }8 ~& a8 K3 F) _5 _! V
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
: S0 Y3 a( y. fМетод reload(int questId)
; S5 o1 k8 |+ e
% W* j7 a. p. b$ h+ T- /**6 v* ]( k+ H9 ~! t) z; h/ d3 {
- * Перезагружает квест по ID.$ W3 b7 q' \9 B/ ` B( b
- * @param questId ID квеста для перезагрузки
1 u ]/ P9 |% Z3 e2 u6 o3 V - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
8 _( S& q8 ]+ S$ Y - */( b- T/ Y+ u+ K; x/ C; }& @- ^8 d. U( G R
- public boolean reload(int questId)5 g+ _ f% J6 ]$ s5 I/ F
- {4 o1 I' D0 Y: z# v/ u* Q
- final Quest q = getQuest(questId);6 v: s3 R, z. _; \" S0 J2 _( Q
- if (q == null)) S. Y) x! G, m n! y* f8 W' `
- {
; u! g8 P: s$ q, V - return false;+ Y( R3 h% t0 M" u" t- g
- }
- d- I- _- M# }2 f9 P - return q.reload();
5 L5 X* i. x# J( E9 E$ H2 [ - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID., |, R4 Z/ r d e! ~7 {! c% ]
. o; ?& G: H1 v6 U* d: Z9 [2 r
Метод reloadAllScripts()
+ P9 H# y$ A* [' Z! q" N: U
3 ]$ w- Y F( R( u, w7 B% c6 A- /**4 K2 H! f0 H& W; r; C5 M
- * Выгружает все квесты и скрипты, а затем перезагружает их.' \; Z+ W6 ?$ [8 }+ g: b& }
- */
' Y/ u/ K' t! x& K' n/ H. } - public void reloadAllScripts()
! t; Q! g5 c* W" F1 J- ~+ \( L - {: d5 S, w$ v0 `, Z9 v
- unloadAllScripts();# J. e+ G1 s, ^5 s$ T# b0 N0 L" t
- $ _/ }2 X; E5 [
- LOGGER.info("Перезагрузка всех серверных скриптов.");8 P5 H# L9 S0 o8 M/ ^
- try* l+ Q' h* E/ ?0 r' E) I
- {( U8 C- F, I& P1 s8 ^
- ScriptEngineManager.getInstance().executeScriptList();
) \: x" o8 k$ a8 l5 X - }6 s& z4 J) h) U' ]
- catch (Exception e)
# ~8 P9 X c1 a - {) v4 [0 N! _/ P4 f F) e. ]
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);6 }) k! v e$ `; w2 g5 v
- }
5 Q, j0 q/ \ F' t4 a - % T$ Q$ _. V: s/ C, p* {
- getInstance().report();
$ @0 s# b6 E9 o: i8 ]1 U - }
Скопировать код Метод unloadAllScripts()( Z1 K6 ]2 v7 K+ l: V Z* T$ b
- P; m0 [# p+ Q5 E2 n( i- /**! I- N) M- d3 C! C4 i% H
- * Выгружает все квесты и скрипты.9 n0 F, L9 Y a4 `! X, v0 c
- */
4 S, e @& E' j - public void unloadAllScripts()0 d6 M; W: Z% }* p) G2 c& y& K
- {" T2 c) _( G! S4 z
- LOGGER.info("Выгрузка всех серверных скриптов.");* e# H# @; i5 ~; H
-
, Y+ J% {9 }" ^2 D" M - // Выгрузка квестов.
* L E4 s; d0 {, o2 H - for (Quest quest : _quests.values()). } v$ W3 y& N. o$ I E6 {9 n$ @
- {6 L9 e3 S, a/ H% C
- if (quest != null)% u: B' J, f& O3 K+ m
- {
& v$ c- H0 C0 e7 K - quest.unload(false);
* x3 e- |+ e* u- _ - }
4 R6 ], A4 ^: h& K8 p - }" c, W7 O r C `* U8 X
- _quests.clear();3 Z9 Y# m5 Q9 N2 K. k M1 E X
- // Выгрузка скриптов.6 f& J, K# ^# G& m2 P' N; v X: _
- for (Quest script : _scripts.values())2 z2 X4 D' B$ C
- {% d" w1 Y- o: D. r8 q G
- if (script != null)
W: {" }' _7 d4 `& `2 C - {- T7 S7 ~' U( \7 y$ c) _
- script.unload(false);$ o9 }, D1 a( h, A0 U
- }
4 j4 ]- g5 B/ O" m8 G5 h+ w - }, m9 Y6 i( p; M9 T
- _scripts.clear();0 _( k- P2 Q; O a. f
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
9 _7 l# \% V! d& |) g: C0 r6 @0 Q " z; W: [1 g4 y2 i( \0 K0 v
Метод report()
/ _$ u' c8 A; W) a& B9 a1 x2 }7 C5 k9 y9 m; A- R1 s. V
- /**$ m% }; \9 C; Z) C) o
- * Логирует количество загруженных квестов и скриптов.
: Q2 L" x0 p9 V3 f- d7 t2 p - */- Q% }/ } I! V1 E ]! A( v
- public void report()
- [, h$ w8 `) e: w1 y, H - {$ |, ?0 ~! a: O0 Y& \& e
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");! T' N, C6 X/ Q: J j
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");2 h9 O4 p7 S2 v) {$ m
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.+ S6 ~4 _0 ?, Q* F8 `" I. H
+ F; S1 q) ?6 Z
Метод getQuest(String name)# Q- z( m2 R. K) p# J ]+ C' ~ a
3 V1 `; t& Z$ G3 D. e- /**
. P1 b6 f9 T# c# K5 w0 k1 D - * Получает квест по имени.+ u1 y8 J& M3 a2 N
- * @param name имя квеста
" X0 y) M" M4 S4 A1 K - * @return квест9 v1 b7 D [" T/ w: |
- */6 W; D% q# A" F8 N- _
- public Quest getQuest(String name)
, y {3 U9 P$ v - {
6 q; L2 G: ~# P/ O7 ~ - if (_quests.containsKey(name))
" n/ y, j. Y) E - {. x2 ?" @# ~3 l$ K+ `, p& Q6 p5 ~
- return _quests.get(name);* v/ x S% T1 N+ c* A/ ~4 P( X
- }& x" P i* C- ]* X' J$ `' |
- return _scripts.get(name);* O& O6 i- V: _4 w8 C- ]
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.8 ~; [7 o4 {. }
0 M9 q; p/ q0 s, }8 s" {2 @! hМетод getQuest(int questId)
! |- O2 ?& Y# T. y8 a5 y" a* G
, h7 ^+ U y1 T- /**6 c/ f9 ~% Z3 S: k4 e! B! E
- * Получает квест по ID.
- i/ M h1 f j1 w0 i" \ - * @param questId ID квеста
3 y/ {! d$ Y$ n7 `8 U, Q# h - * @return квест, если найден, {@code null} в противном случае& ]( q8 S+ c S" j) W
- */* E' q5 K' J. W9 t, q# e: B
- public Quest getQuest(int questId)# _9 ]' a& d/ o- q" g( I% g$ Y0 J0 n
- {9 f: G/ f( O5 P$ L: p
- for (Quest q : _quests.values())
/ U5 y/ E* V: A - {- |) G Z7 W! c, I6 X- d
- if (q.getId() == questId)
( a8 d* W" ^$ m5 K% } R - {" t' K8 z! G6 S
- return q;
! n1 K. r$ C' l# Y6 h - }
" a5 c8 G5 K+ E/ v/ s8 `: B3 m. T - }
. a; i( H& n1 Q9 @! b- G0 I - return null;3 _* P' D: d G
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
5 H7 [- @' R* j5 I0 B7 L2 O+ }9 V$ U . ?% A$ h: {3 D2 O
Метод addQuest(Quest quest)6 K# M) ~2 A# F
; W, m. Y6 m& i# P* V- /**
5 D2 z: }# s9 u9 ^% U - * Добавляет новый квест.7 C+ y/ {: r$ v# B+ y
- * @param quest квест для добавления. r8 {9 |3 J+ l
- */
6 l9 O/ p. j* v9 r( R8 q - public void addQuest(Quest quest)
& ]7 x u, O9 Z - {
( F3 S$ @' V) }$ L, C+ \+ n - if (quest == null): w- a6 T. k) ^/ S5 j
- {" q% R# a' Y9 u5 S
- throw new IllegalArgumentException("Аргумент квеста не может быть null");9 R8 l Z. ^7 \; z u) M
- }
" Y1 J! `) z3 Q+ b) y -
4 R$ c3 J2 n' M) W! M - final Quest old = _quests.put(quest.getName(), quest);
0 f! z% j1 ~5 q# h5 `2 E/ S - if (old != null)) w% T. F6 R) ? e
- {* h; v' P/ h& t8 `4 s& r6 @% o
- old.unload();7 l( K- D; S# e8 Z# A; S+ ?
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
J3 n( s5 k* H; }2 ]7 I - }
3 _- l2 C% F* l7 m5 { Q7 Z -
% r+ I1 A; T+ ^: Y) w% O - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
5 r( p& h, D5 o - {" }+ P/ o( J# B1 ^2 Y$ U0 o; W
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
3 }( S W6 b T: v$ {* i - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");. }; J* p8 _- O1 P! X {0 s
- }
/ |: V; }5 P" R# S - }" c b/ k- r% b
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.5 C) E. r9 O* a+ X$ _2 A$ s
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
- `( S3 K$ U5 L7 K+ z# T; t/ ^
1 v/ F9 ]4 n. F9 W6 \+ ?
( x' c3 ?: O, D) w) U- y2 P0 N- V( S% i7 y
|