Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius$ c& N7 l0 B' b) `& T! S
. [ e! u5 K8 ^
Разбор файла QuestManager.java9 R+ v$ R+ w6 [1 R( P3 i% o
; y- X& w* f/ X4 Z2 CЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
. {) e$ M# @. p8 T" I# w. H6 d3 n- VОсновные элементы, l5 k* x8 u5 Y8 \! ]( K9 I
- Лицензия$ n8 h6 @7 T) q$ t5 B- F2 t
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.: C5 f; B V @; [. L
- Импорты
' s6 M$ A- ^( z1 T* U) }6 B6 q! n " S: ^: Z7 C. a7 x4 U$ I
QuestManager.java — управление квестами и скриптами.
2 |- B ^: L6 S! |Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\) R8 I2 N$ V( J. F/ b& E& ?( B
1 Y T9 y, Q' x* s
& j) b7 U9 f+ |' ` m2 a
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
% R; ?$ p7 `9 v% X7 ]1. Лицензионное соглашение
# N% N' V5 s0 ?( x- /*& F( L2 H) t# b ] C+ x# q; z% o
- * Этот файл является частью проекта L2J Mobius.
2 z7 z. \3 h2 \" H @ - * . C1 t, d; Y# G
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять; |" V! [! |+ s, ~1 `
- * её в соответствии с условиями GNU General Public License, опубликованной S% i+ h7 k6 D9 [
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.6 ^5 X. Z% O# | D" n1 V
- * . u( N& g+ g! N# I& ?- h8 A$ \8 J
- * Эта программа распространяется в надежде, что она будет полезной,; L. p8 F& b4 x+ V! b/ _
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
* T- J( F5 u- J* Y+ \ - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.9 g! s) `/ Z! u7 q% Q$ Y" a2 }
- * См. GNU General Public License для получения более подробной информации./ a9 W+ I0 }/ ^' T
- *
: Y" Q& C0 Q% W" k9 q: e4 n - * Вы должны были получить копию GNU General Public License
$ ]5 e5 q6 X1 ~ - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
$ c& `. Q& A* \& m: G g - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.# }/ N6 s; C& j) y* s" B ?5 ]/ [2 W
# F9 G- q/ S/ {% {5 P& u
7 q) g: F; F! }4 c5 O2. Импортируемые библиотеки0 g4 p- w$ m' H4 O v l' `
0 }) a8 U# o, x, r" ?- package org.l2jmobius.gameserver.instancemanager;- B/ }2 J, S2 `! b$ E( ^
- : M7 x& D* i# W4 Z
- import java.util.Map;! J$ ~& t ~% W3 {
- import java.util.concurrent.ConcurrentHashMap;
2 {5 U I' q9 X" }: H, C6 a/ w. L) a - import java.util.logging.Level;( h0 ^- n: _8 [) j6 s
- import java.util.logging.Logger;1 o M+ k) Q- j! s# _- [
3 c9 z ]& T, ^. z' t" H7 o- import org.l2jmobius.Config;) e' u ^! W" k: ]' B8 k+ _( D& _
- import org.l2jmobius.commons.util.CommonUtil;& |1 J" ]% L, R# J, U; u8 Z! P
- import org.l2jmobius.gameserver.model.quest.Quest;
1 }! I" h9 h& L' U9 g/ Z( U/ z - 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 — менеджер для работы с игровыми скриптами.
+ k+ d; U- O7 R7 P
5 J+ Q' v: i% ?" Y( o3. Описание класса QuestManager
# ]6 O3 e1 l3 u2 H' _- /**
5 V# t8 x4 D$ V7 c2 x$ y - * Менеджер квестов и скриптов.% Y, _7 u4 I6 N* o k0 x$ N& M3 u5 K
- * Автор: Zoey765 ]+ a$ l) N, E1 c/ H- _
- */
" k3 ]/ ?! z4 Z, T- ^ - public class QuestManager0 a% `) D% m* H4 j& p4 T$ _8 N
- {+ k/ P& t$ N0 A5 s* g( h
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());! G: ]7 s% X3 |/ k/ D& }- N
- / q8 I1 A: n5 T! y# r
- /** Карта, содержащая все квесты. */
3 `: |1 z) [, l: E8 T: A9 E( F - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();2 v/ c5 D {6 ?* w
- /** Карта, содержащая все скрипты. */( {6 D r1 k; A. ~, k: w$ [% h
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();2 p$ \( C) ~' n1 e+ V3 Z& H
-
9 `5 U( g0 Y+ A# l7 U' l - protected QuestManager()" d D/ E8 b6 K3 l: M
- {
$ {% x! z+ K5 q- d) k& Q) }2 i - }/ J2 @3 ]: T Q
- }
Скопировать код 4. Методы5 H( J t4 \; r! v- y2 E; J- H
Метод reload(String questFolder)# {6 Q4 q _9 \1 u8 k5 b
- public boolean reload(String questFolder)
' h& x5 J; |& R1 S4 u - {: [+ D( x) X3 d" ^- k" U1 n
- final Quest q = getQuest(questFolder);
9 P9 J* ?( _% q/ U% J4 r - if (q == null)
2 K5 A) c4 y' M9 y! H& r - {; y6 \ O8 C6 n5 u* _6 c8 h4 M
- return false;
, h+ d$ K+ K. W9 u! Y) r - }
! R- e& F8 W$ z- ] - return q.reload();: Q' m$ e! l- k# r$ i
- }
Скопировать код
# v" f! G1 Z, T- `4 ?2 J: g. H% L2 [- C
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
. t" S/ M: x7 |. G5 qМетод reload(int questId)
2 ^6 r; c5 {1 J4 z' q0 y7 _0 O& g/ m# U7 ?
- /**1 S5 E& j! X& @" K
- * Перезагружает квест по ID.( X' C, {8 h+ q. w- ~
- * @param questId ID квеста для перезагрузки" H- ^/ V6 f" l
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае, [" o% H/ t& z2 f5 A% W) Q' C
- */
: {* m; c7 D% c! d - public boolean reload(int questId)( P* B8 r. s' x3 L1 ] _; S. w7 y
- {
8 F) {' E% _& Z5 g6 N - final Quest q = getQuest(questId);* k3 \/ Y5 [( b: O
- if (q == null)- {/ V- f0 V5 R5 j0 g# ]
- {
4 g W+ `3 |7 I( \& ^ - return false;
" x, A" |! N0 o8 } - }3 X7 J$ ]! i: ^" }/ I% f( R
- return q.reload();
+ q9 B D- `6 L4 b9 p& F' m - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
; s0 M$ s8 ^$ F! w3 T; ] * T8 y& E# Q. @
Метод reloadAllScripts()( n8 ~1 C; W# h( {" b. @* J
2 N! Z+ V2 f* ^
- /**" Z% ?* \0 C$ R6 l c2 Z
- * Выгружает все квесты и скрипты, а затем перезагружает их.+ {# K4 }3 G* H8 v: \2 p; ?
- */) U, a" D' Q" W/ ]9 y4 h @
- public void reloadAllScripts()
5 f: V) C: f g7 ~( P4 _; P - {
: M+ Z1 Q5 r, [& U3 r - unloadAllScripts();$ Z+ k' `8 W& K% h X H2 X
-
; d! M: }1 P0 J+ d: ?5 x - LOGGER.info("Перезагрузка всех серверных скриптов.");: @! ?! E$ M% |! _: H4 n" {
- try! K# r1 w$ p# I3 o" e
- {1 k2 d5 [" k: H& ~+ v
- ScriptEngineManager.getInstance().executeScriptList(); a' x# e$ ^; f6 |# V) A6 }! O
- }
# J1 k& t0 C" X - catch (Exception e)" Z5 j. \% y; n/ y; z1 U# D% m: j! P
- {
- U% e/ v6 ` B, H - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
. X9 b2 \, {' L1 P8 h8 @ - }
1 ?/ m; _! B9 f8 Q) d% L" E -
8 `- ` N/ j- s& \- V# G! i - getInstance().report();
: N4 ^ G* h! j D7 I9 }3 m - }
Скопировать код Метод unloadAllScripts()& Z3 x' b/ ]4 y3 ~* z. i ~
& \) J7 s0 H% S0 I; } Y; R) v
- /**
* ^& C5 J% ~5 T9 p - * Выгружает все квесты и скрипты.* e! [. Y8 F% K" o- F+ g% K
- */8 T9 F! ^& N6 G9 G1 M5 C0 c8 o7 ]
- public void unloadAllScripts()$ B; x( x; Q2 Z& b! ?4 K" j3 V9 y
- {
4 {) U* a: Y" `! ~ - LOGGER.info("Выгрузка всех серверных скриптов.");. C" o' ]" l; t$ ?
-
+ A6 M: o2 d/ s3 ~0 l8 K5 } - // Выгрузка квестов.$ p; j/ w7 Y% L7 S
- for (Quest quest : _quests.values())5 n) G; o6 m; U' G L( ^: T( W7 Y
- {
( I/ O. A4 F! f6 q8 E! m - if (quest != null)7 [$ W6 S# n& n7 j' i
- {% k/ a& O' P$ R4 L0 j# K
- quest.unload(false);0 X( k8 _$ H0 [& @
- }2 C7 c9 s/ M, J, y6 j7 U
- }
& j2 u. ?. T- ]0 s! Q - _quests.clear();' Z4 w$ |- z/ K- ?
- // Выгрузка скриптов.( t% K8 T: B( {3 |. Y0 U) R
- for (Quest script : _scripts.values())
7 i8 |# M0 S, c- w+ M - {; |) P8 V3 T+ O+ m2 A' ^
- if (script != null)
% p1 I0 l3 q: [2 C; } - {
8 _/ u2 H. n2 v) b' P- B# g( E! ` - script.unload(false); i7 y e, [6 }3 w
- }
/ u, L7 B1 |5 P B - }
" h- [7 F" R r1 k7 e - _scripts.clear();
- @' m- l0 r' C( j. N - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.# \! f: u5 \, k. N8 d( \$ J
. v q! i$ T/ |Метод report()
6 b: j/ j, z& Q$ J6 f
! z$ k4 q+ u Q% `- /**
( r' Y! ?2 A7 k! p t - * Логирует количество загруженных квестов и скриптов.1 V4 \. C. i) U6 C! O1 E, H
- */) {- _+ U5 C; X5 l5 Y) Y! z
- public void report()* F5 A0 L- I2 u8 c" L
- {
, I8 n+ V; O+ O$ @5 b4 J# } - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
# p9 y# R. B) O% Y/ r - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");# U: ?) ?4 q" a* L
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
% h u3 c d* Q" \9 E7 t5 ^
. h- S/ z& f- U C4 ?: fМетод getQuest(String name)" p U, S$ D4 H1 _) g4 z/ r. B7 T
; }; u0 J9 b. n( w+ S V0 j- /**
- ^1 q+ U# E% ^: Z - * Получает квест по имени.
7 C# i+ w& K4 E8 O - * @param name имя квеста2 ~; X1 z) b9 D* I
- * @return квест
" T4 q/ H l: O+ q# p; s& p: j - */
6 ?& J7 l. e0 `& }# f - public Quest getQuest(String name)
0 P: Y# P) e1 t( o - {
& O9 S7 E% D) z/ r& {' E - if (_quests.containsKey(name))
# u. H+ F2 [1 r- U2 I - {* P2 e9 f8 Y! l. ^0 d
- return _quests.get(name);2 J& T+ C/ j9 R/ v" u! i5 y% {
- }
; y% d6 Q3 A. j( g( G" D - return _scripts.get(name);1 f+ c Y: c) ]
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.+ f* K- j8 D% I. V
; z: k4 b$ Z4 m+ e+ N/ B& T0 }
Метод getQuest(int questId)
/ ]% v( @, P- X' p# t: d
7 R. j+ Q/ B; l( W+ O- /**
5 j% U% H, [, b4 c - * Получает квест по ID.
7 ^7 l5 B' Z3 H5 [) e! R - * @param questId ID квеста
: d4 ~ Q0 h0 s' I' J B+ e# ? - * @return квест, если найден, {@code null} в противном случае
1 U2 d0 W- G* X. h" U& Z - */' u/ c0 R. q4 E- {" z
- public Quest getQuest(int questId)0 q2 u$ M' j' M4 }! W! P( s
- {
5 U2 ?7 A, Z! G - for (Quest q : _quests.values())
% ?" X8 _" o* ~- Q0 B3 Z: y: n w - {
, T. n. ~' M- M" G: r - if (q.getId() == questId)
$ ^) \2 y6 z+ W8 Q - {/ j- M0 B# J) r) F ~8 D
- return q;. a( \' U% J; C- g& h/ Y
- }3 i4 @( D$ G+ Z: c& l. U; @
- }
* F- S0 l1 \: U6 g" j. J - return null;
9 ~! q* [1 d. u5 l1 V/ }5 J1 c% f x - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.$ a2 s* |, q% R: c5 G
$ s0 u) D4 x# L, z" k% Y
Метод addQuest(Quest quest)0 T- _' ^# e8 B+ J& ~
6 d/ ]( S. s0 ~" U7 i+ g) s/ G
- /**
X# v; U7 q% H7 ^ - * Добавляет новый квест.
& H3 }: W5 U# G5 _$ E& ` - * @param quest квест для добавления
+ Z; c1 ?- m: h7 b% t. |! Z2 E - */
0 L6 g1 K7 a5 R - public void addQuest(Quest quest)
; {6 Q- {6 ^% d0 | - {
6 Z: O! \* W8 J - if (quest == null) X, R, U( R$ U* l7 M v: K- l
- {
1 {2 U; D# C' M2 i - throw new IllegalArgumentException("Аргумент квеста не может быть null");
1 F4 v- L1 Y3 ]8 W - }: }1 V1 [' u6 S4 W% L- X
- 0 ~7 t5 J4 D Z
- final Quest old = _quests.put(quest.getName(), quest);9 {7 S2 l* h: `7 R
- if (old != null)" T+ S. b1 b( q8 n& x9 a' x3 Q2 t2 I
- {
" j- ~4 l9 ~3 M& k - old.unload();
' e8 _# r6 { b6 }. w - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
9 v/ j7 A" x4 T% `0 V U - }% `# p: |" S5 |& W" E
-
( i' U' [- b! n# J - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS), W8 F3 l! `8 Y2 x( @
- {
* }( V7 b* I6 U2 w! A* i8 B! } - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();9 w& {& B. `: d' @! {- a( m
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");* S6 `8 J8 _/ Q; }" f* t- r0 k8 U
- }
2 r# P" J/ W* O3 t% c9 ^ - }
5 b, w! t7 p8 h _- n- P - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.+ {" \$ ?! u+ j: } l4 ^" q
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.* _& D) I d1 `0 g4 c7 G5 L! R
9 S1 b: F( W/ G0 K
7 i; R6 q$ F+ o$ p2 l+ m# ]: w2 t2 K4 A3 J/ i. ~$ H& j
|