Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius4 o" R3 I( Q" I3 A: I( [! L
( N9 i0 t) R1 u# n3 @3 t) o
Разбор файла QuestManager.java
" w: _: [( A. s7 w6 z9 w& j. `8 U' i
8 }$ j, P# a' l/ |8 `" k1 ?& ]Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
. O! m+ z% ~$ ]8 f! U5 L: ~Основные элементы; G6 s2 C8 W1 m* r% f" k, O" G
- Лицензия' c) K, B" y" J$ \
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.4 _4 \1 j. j% {; Q, L6 D9 _
- Импорты+ k- L8 d* R4 U6 p
3 W4 b- v3 T' h0 {- @; }2 O' G
QuestManager.java — управление квестами и скриптами.
/ |) U1 B+ o6 d5 LПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\# L1 z, [0 Q* I. ~( ]1 y
- V* d+ i7 `+ W& f6 p& W
2 T2 t0 V: i! b+ J( r
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
! [0 ?3 y" g! m4 a1 b9 Y u! b1. Лицензионное соглашение
6 V0 Z2 W" y8 r4 p+ ~) b/ M- /*+ w- H6 q7 a2 y3 a$ W; J) N
- * Этот файл является частью проекта L2J Mobius.
. y' t# Z; r( z# E- A2 A G, c - *
3 P7 S0 Z& L d9 |4 ^! M* i) S - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
: u2 d; r! j# D: R8 h: O3 [1 X - * её в соответствии с условиями GNU General Public License, опубликованной
C3 Y2 D" x% X+ o/ x- q - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.8 ?1 D2 H, n* X- l" }4 n
- *
& D( o4 _9 t3 b; s - * Эта программа распространяется в надежде, что она будет полезной,
+ }; ~- c) @" |; [' u: W, q9 N - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
1 q7 u% W, l @) M& I - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
! S: y- \% {. @$ K* u h1 c - * См. GNU General Public License для получения более подробной информации.) P7 _% B0 b/ a5 [- a& \/ ~
- * 9 T7 Y5 S8 T* Q
- * Вы должны были получить копию GNU General Public License1 A, y: I2 h @2 r4 Q, ]2 P
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
, j- ]# e3 a9 d q" D- N: } - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
% m1 H: _0 F. a" Z& G+ ^5 `
( Q y9 K; ]! V5 |- S- b
' L3 Q! h2 q" d3 x, c3 {7 h2. Импортируемые библиотеки: m1 E+ ^( s$ `. I/ U
# f+ l' I- ~: v. V4 D! G" J3 _+ Q- package org.l2jmobius.gameserver.instancemanager;
$ |0 e& [/ ^" J
+ M& s# F" u8 U- o" W2 H% m- import java.util.Map;
& U5 k* b1 ?: t4 x - import java.util.concurrent.ConcurrentHashMap;
3 e( s: R4 v5 K; @ ~ - import java.util.logging.Level;( p" [ P& F- Z- Z% l
- import java.util.logging.Logger;4 N; H0 Q2 F: }- h( R
- D8 i# Q) y" u' p- import org.l2jmobius.Config;7 ~7 y' p p9 ?7 B4 K
- import org.l2jmobius.commons.util.CommonUtil;" y/ z/ g b2 k, Z
- import org.l2jmobius.gameserver.model.quest.Quest;) y9 m/ c! `! B6 t4 s! G; a. 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 — менеджер для работы с игровыми скриптами.
: z1 O- R6 K' L, Z# E' W$ y S( R; W, P# z8 R" o
3. Описание класса QuestManager, u3 d# o9 U% e- ^3 Y) E0 g7 B
- /**
: y8 h( L) J- B' e* m - * Менеджер квестов и скриптов.
3 N$ @7 ~! |+ E" Y; I+ c - * Автор: Zoey76
+ S7 A: M: b0 e. i q - */
/ e; m, p- }% B+ M' p* v1 g2 A - public class QuestManager* J. j- R7 J& G9 R. |
- {
$ _" }# P9 N Y/ w6 g& R9 d - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());, g' b7 k* X6 m
- 2 j8 H, l6 Z$ I& ^+ k6 f; x; a
- /** Карта, содержащая все квесты. */
- _! e0 W _1 X5 `' H* N% U2 N4 Q - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();, C7 t. Q' K3 Q5 @7 W7 z4 c- r
- /** Карта, содержащая все скрипты. */
4 e' F2 ]2 b# F2 Y7 E9 k, A$ R - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
" Z4 }* ]5 A4 Y7 h, | -
5 _* p( @: k) A' p) ` - protected QuestManager()
4 M; \6 |9 z5 [ g( P; P0 |+ ~& N - {
9 p% f+ Q2 A4 I7 O - }
; z+ r- a. a! H. \0 Z2 b - }
Скопировать код 4. Методы, Q5 m/ f4 x+ K; X
Метод reload(String questFolder)
' ~6 Z1 J7 C' p9 g- public boolean reload(String questFolder)
1 X$ {* x, L7 ~; _ - {
. I% n4 W- W; [% F! i - final Quest q = getQuest(questFolder);
! V* D9 r; |4 e8 s5 A - if (q == null)' W; z4 u9 u0 _. ^4 S
- {" w! l h/ J% M8 h
- return false;
+ y4 D% z4 c' w7 q) V) E& O - }8 R$ d) Y* x+ H# }' j9 B
- return q.reload();7 a* c$ I2 G+ ^
- }
Скопировать код 6 c( {, y7 k' c, n# U* r, _
0 J5 ?0 d4 B* b$ l( R7 v( YМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
7 i% L: z7 @8 u; P' lМетод reload(int questId)
% T4 _8 E) A% e4 `5 T$ Z5 O0 B' D" | O( C/ Y4 W# E2 x# K0 r3 D* z1 c
- /**
% y: s2 M F d! N% x - * Перезагружает квест по ID.) @2 \: t' |2 V, Z
- * @param questId ID квеста для перезагрузки1 c$ ? W- q) g
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
$ J1 { i/ f, [ A1 ^: M# A - */
* L; Q" Z& d! C. S8 F' T/ e - public boolean reload(int questId)
! d4 O. L) f# g0 n* u - {
( ~/ U6 v+ D! s) g# h7 ~4 w8 R - final Quest q = getQuest(questId);
, K; a- F0 q! _& i - if (q == null)% { t* {/ K6 p3 y4 h' ~/ R
- {
- a4 V5 K, n' `% I" u - return false;) k* a! D$ U) Y0 y- ~
- }
( {4 I i C) g% @$ U) v - return q.reload();- x# K% ]6 n$ {' C0 O
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
) x% B# w( I( }
x$ }/ E8 f' w( _Метод reloadAllScripts()
, Y' v, n' n5 Y+ |" E: k; O# K+ b* N4 `$ t) I- q4 ^
- /**
* W# z. f" x7 Z- K' j - * Выгружает все квесты и скрипты, а затем перезагружает их.$ F0 K' I& ~# g+ g8 T) [
- */
* g; e1 e6 g8 n' a3 z8 { - public void reloadAllScripts()
& {, R0 W, N: P9 A; g - {
# R) K' S% r% H6 s- L: G! V: U - unloadAllScripts();3 A5 T: L4 r2 ^) n$ [4 R
- & T! N' W* w' `- A
- LOGGER.info("Перезагрузка всех серверных скриптов.");: {# h6 U+ I' z/ M( @
- try' N* C5 B7 |* g0 N; ~
- {( _" u0 h+ d3 \# }9 z
- ScriptEngineManager.getInstance().executeScriptList();
% A( e5 H* Q3 B8 J5 W2 q - }
, ~% F- F1 { R* i8 r; s1 R - catch (Exception e)
$ G; h% ?' a& B) J" s7 y, K - {' d* Z: \6 c/ D$ e
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
# C8 e; X% L: M - }* }$ G8 }/ V; U; W4 }) i4 h6 y
-
& w; V" K/ X1 Z, U! | - getInstance().report();
. ], T* T; J- [& ?9 k - }
Скопировать код Метод unloadAllScripts()0 z P! H3 p3 l6 ^ U! v* j
4 i& A0 K. N3 x2 _- /**
3 D9 L9 N: n, } - * Выгружает все квесты и скрипты.
4 D4 D2 z, Y5 e - */ V7 h# ~( Y0 n! W" ~& r" q
- public void unloadAllScripts()
5 u0 q4 ~5 `, x0 b5 b1 r - {
: x3 C* W( w2 Q: R. K - LOGGER.info("Выгрузка всех серверных скриптов.");
% V' o( C" H6 y. r, h# C -
4 E! G4 b! M3 X - // Выгрузка квестов.
; @' a' [1 z. _ - for (Quest quest : _quests.values())
4 @# a: x0 q; T/ K8 ?' T - {
- H+ Y/ d( A4 \, D9 K/ R O% {0 G, O - if (quest != null)( M$ w1 X% Y9 T1 }/ `5 \9 Z3 Z
- {9 X% c k8 a) B5 E E6 ?
- quest.unload(false);
$ M2 H/ G& U1 n5 S - }
" e; ?, P( P+ B" O% R( ?$ R$ z - }
- Z1 G& Y7 L9 a( w - _quests.clear();+ @- Z# ~- p" g J; p
- // Выгрузка скриптов." h& \' E5 q J' R" z0 ~4 V
- for (Quest script : _scripts.values())1 A' d3 o+ G7 g9 @+ Y2 }; n
- {
( P8 s* F( \9 @) r - if (script != null)2 ]* u; ?' w6 A* X' w7 V( Q6 G
- {" x( U- T' b6 t f" H( T
- script.unload(false);
3 |/ N6 S. ?! f* y$ E0 n - }: n: P/ R! P7 \6 E* F9 C; l% E/ P
- }. `$ y/ l, D1 \; M% |% c: q
- _scripts.clear();
* g0 Q7 ^) g+ ^# A9 b - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.2 ?7 s- ~$ F, W, _) ]1 T2 X) C8 G
+ y, S6 {' `$ f! Q- j- y
Метод report()
' T( c' L/ \9 K. T E3 j, b* R& A
6 k3 z$ a( b1 V/ u- {- /**
, l2 y M/ P( q4 x5 L: C1 u, n# B e - * Логирует количество загруженных квестов и скриптов.
* z+ @8 _- R, I - */
5 Y/ X" M& ~, x! x" {, { - public void report()
5 F7 `' C% d6 V - {6 ?+ Y8 q; R3 ?7 Z
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");$ i- W) g( U& N O* h; r
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
, p. X1 F6 w$ o6 x - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
; k+ A( A i7 e- b& t; ~
8 ]" q; X+ u" n0 r, Z6 |Метод getQuest(String name)
# @# M0 C/ ] a4 i# t: f1 ?( h. v$ \ p
( x! v# p( S2 s R* n3 D- /**+ P; @7 l T! [9 ?3 U
- * Получает квест по имени.
" I/ |; q4 H( g- | - * @param name имя квеста
6 n! H3 I" A/ [4 k( A$ H" h; o - * @return квест$ l; w+ o& X7 F; Q
- */$ e8 H+ C) \- [: o- P0 u* K
- public Quest getQuest(String name). y$ s! w! t6 L9 _" k" w0 A9 q# q
- {1 M# A1 u1 u2 Y' W
- if (_quests.containsKey(name))
8 n! e6 p+ J* V* ], } - { S: I" l) d0 \* F6 t$ o# {* u
- return _quests.get(name);1 O! ~* g' `' ?1 i9 b
- }
j8 I0 {+ F' |6 o/ K" F* P# i0 k, J - return _scripts.get(name);% M9 g. o k8 W- t$ ^7 M: s
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.5 O+ b+ N7 ]$ }
$ C" C7 D- F) ?- f# u
Метод getQuest(int questId)
i8 T% f( ^7 c0 D" }6 Z: A- a# i# I" S2 u9 s6 G8 F' g4 u
- /**
9 a/ t8 s; g0 s' ?' r- X+ Y - * Получает квест по ID.$ I: d1 U2 r* E& L& }
- * @param questId ID квеста
9 _9 [: a' M* H7 t; R1 e0 | - * @return квест, если найден, {@code null} в противном случае1 |) P2 B' {9 X+ {4 d" h
- */
# B1 M; d0 K$ b: X3 j) s - public Quest getQuest(int questId)
! n `8 f2 a0 o) Y* K2 I) j. J! w N - {
- k2 t* @" ^8 c! ~$ S2 s. c - for (Quest q : _quests.values())
( L- L) @- [2 L. ]0 K - {+ n) d m. ~- e- {, Z: R- O) M. q
- if (q.getId() == questId)5 @9 m# `) m, J1 y, W) V' R' k& e
- {
8 j, t. E) \8 ^9 @' X4 G - return q;2 X! z+ H1 M7 l" s/ ~; O+ }) Y
- }# P* W- t+ b- @/ d1 B
- }
3 x0 R/ f( O5 T% D$ }1 F$ }( X - return null;
& d) x" X' ?1 Z - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
' R& f/ B# a4 ]% N, @ 0 V. |" j, ?3 q4 C+ e
Метод addQuest(Quest quest)
) h0 x) W1 `' z; }& a( z x, G3 {, o5 V2 F2 T
- /**
, a; y( o& o" J+ U# E, D) I( o - * Добавляет новый квест.
1 ?9 x* _' L% V4 j7 ^/ l5 ^2 ` - * @param quest квест для добавления
/ [( b9 i J- n: P( ^+ [ - */' D2 C! ]5 F& E4 V1 [3 x
- public void addQuest(Quest quest)/ E4 c7 @! J, t9 K5 i
- {
5 c- E- k/ B3 L* u - if (quest == null)
" }7 X# y( y6 O& [! H' P - {+ h7 J) }1 F n) H0 s( O y8 W$ H
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
$ L% R4 ?6 q! ^& c$ o0 n - }* j a" v% j Z/ E1 M0 C
- ; h: J9 }1 q- D
- final Quest old = _quests.put(quest.getName(), quest);$ d' t, S$ E# q5 z
- if (old != null)
# k4 e4 w& _8 @! W - {
, V4 _( J$ i4 y - old.unload();
, l2 J$ n6 \% Y8 }) n* } - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
1 v9 i" S: ~; F8 x - }# A" U1 t( z2 h$ O1 m; D% k
- 2 Q/ D! k! l% q1 [ {, q* s _
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)* L; X7 X6 I4 `2 o! w: ]0 U+ j1 F7 W
- {, r, { A% l$ k) Q) t
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();5 A4 {4 F% [4 p5 w
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");. y' v) d4 W( b) H. b
- }8 _2 j% ?6 @& k8 m
- }' {, z0 J7 O b; [$ l5 W' i6 z
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.) d* F I' d0 i# g' `9 C, ~ P
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
; L7 C l) t+ E) f' e: ^
' s# M+ h- H9 a) G6 ^ J
' _1 {- T' Y! Y+ Z, Z c. J& t( F, g6 b& g# ]
|