Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius3 O5 o' V# ^& l7 U
$ L' W8 f$ Y# G. m. Q- OРазбор файла QuestManager.java
5 x+ J/ i9 k& m# E3 p
" V6 a- D' `* R0 b" F8 j7 PЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.4 k3 O" q+ e( N l5 h
Основные элементы
/ a& P! [0 O9 r+ r$ S0 G- Лицензия
) R: l6 \- ], Z+ x) `7 C- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
9 p9 a" q8 c- z# v5 f" ~$ g
- Импорты
% \# w# E- f- c& v+ C9 H , V8 @6 B# c% I- q7 @& C9 I
QuestManager.java — управление квестами и скриптами.
. f/ }" C: o! a" Y# F: B5 ^Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
. s5 d6 T. r, S& A/ \6 t# ]$ E' Y P" O
: h# I8 [) \6 m( y9 X" DДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
* @$ W1 K: H7 ?% |- r1. Лицензионное соглашение
$ [: B& x/ K) E3 o2 F7 l1 s- /*8 c6 [7 y h [
- * Этот файл является частью проекта L2J Mobius.
( R/ n; b" z$ ^! k - *
2 y8 L( L2 l$ ?6 @ - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
! u& Z6 ]( A/ S$ @ - * её в соответствии с условиями GNU General Public License, опубликованной
' X; F8 k- ~: ^& P" I& n7 ^ - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии. W6 `3 x* K" | m1 z3 _: \
- *
' K5 U( m# y6 M, H- O+ _ - * Эта программа распространяется в надежде, что она будет полезной,
2 B4 a2 C* Z6 @! a, K% q& A - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
" f9 h6 R, x3 J* [* k - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
2 f) ^$ ]' e# P. q6 J+ Q) K0 A5 x - * См. GNU General Public License для получения более подробной информации.
) b: Z% u% U5 V5 k7 h: T- N1 W/ U7 h - * ( j5 G# j" x5 d; D! z
- * Вы должны были получить копию GNU General Public License
2 z8 d, z# ?3 F& ^) r6 G - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.* Z3 v$ a3 F0 D
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
6 `, u* G! ?" \' w( s& v; H4 f7 w- @5 J, N7 R
" ^# N5 b5 l" K( I5 `9 E
2. Импортируемые библиотеки4 y7 x" V0 n0 }
1 l1 K2 D! o) d, D3 n& s- package org.l2jmobius.gameserver.instancemanager;
+ A3 _+ M- ?" H. Z - 0 Q4 Y$ `) i' ]3 R$ g
- import java.util.Map;
0 ?# C& R+ m; }$ ~( K' Z6 A - import java.util.concurrent.ConcurrentHashMap;( r7 F8 K4 k# _2 w* b3 S
- import java.util.logging.Level;
3 `) f5 T6 e1 G/ o2 B- | - import java.util.logging.Logger;8 g: I( O) c! P L
$ E$ X7 K, Z8 j! H) B' h- import org.l2jmobius.Config;8 |. G) ?% J4 h0 t. [3 [$ b4 p
- import org.l2jmobius.commons.util.CommonUtil;
0 I; ?( m4 Z7 m2 ] - import org.l2jmobius.gameserver.model.quest.Quest;5 g% Y( P4 j+ V
- 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 — менеджер для работы с игровыми скриптами.
: Y/ k; B; N; q& Y1 p A1 Y3 ?7 L* O7 H2 N0 ]
3. Описание класса QuestManager8 |3 H4 E6 U$ R; G1 D
- /**
) f' B3 i" e' B( Z0 q, J. G) z - * Менеджер квестов и скриптов.& L; [5 n8 K% N5 X
- * Автор: Zoey76
: y H7 [. Z S0 l& u - */
# O& ?: R6 ?9 k% ^7 T - public class QuestManager
0 o, m m( W( I2 o5 _ a: j - {
5 f# Z2 U% @% j% }# F - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
' ^: x- }7 @0 d4 \1 C$ R- Y - l- N& y- Y" ]% T& L4 {# ?4 z* {. w
- /** Карта, содержащая все квесты. */+ D% k5 t. d4 D/ v, U
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
$ g# M6 V7 V7 K0 M: x - /** Карта, содержащая все скрипты. */" ~: z! f: W0 p+ ^$ c* C
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();$ ^7 u6 _* l& v
- 0 x! x. `% E$ ?
- protected QuestManager()
& e4 L d" e! g. J, x - {: {) [. n6 w1 \7 e
- }2 d1 N8 a/ K3 x! ?9 ^0 g* I0 j8 V
- }
Скопировать код 4. Методы* f9 Q4 b5 j# {, [! ~& H2 S& a
Метод reload(String questFolder)" ~% i; |& p, u( p3 J, j
- public boolean reload(String questFolder)
) d0 M) q, Z) g8 Q - {
N7 v& g3 r0 A. V# I - final Quest q = getQuest(questFolder);
3 h5 H; F; g, {6 ?8 g - if (q == null)
7 ]9 q! w2 p+ C5 @ - {8 ?& @4 [; s3 \7 r- T/ a
- return false; o3 J1 h/ H5 P7 R$ z
- }
$ a7 W6 S3 o) Q2 I* t - return q.reload();# m( M6 P3 _4 u9 p
- }
Скопировать код
) N' i9 g# D) J) ^2 V
, N' o2 S8 q3 EМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
! s- f8 \: U2 f. uМетод reload(int questId)
0 B3 S0 y4 q$ O$ ~: V9 `, D0 j, S1 x+ y! l
- /**
; j1 F& m+ X8 P - * Перезагружает квест по ID.+ _: A, f; c& \6 h1 S
- * @param questId ID квеста для перезагрузки
7 ]2 d& _( c3 \- E, e y/ T - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
9 A7 [; |1 X; u, m ~ - */9 Q5 t; c3 L$ m$ ], b8 M. [
- public boolean reload(int questId)
5 [% u& W% z3 ~" F7 g - {, _5 Z+ r$ @5 c: @
- final Quest q = getQuest(questId);
* I6 i! _8 }5 [" k& C# O# q - if (q == null)
# F) U: ^5 J/ A. `: U% d+ y3 z - {
3 E+ A @4 K6 a9 D5 U - return false;
: S- x1 F5 a. K2 ?" ?& {& v. M0 n - }1 q+ O i) w) y! H* \7 t
- return q.reload();7 e* d5 |. z/ h
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.7 y/ f6 D2 w% x9 d; S* g) ?# {
y2 a. R* P+ q( K+ ^
Метод reloadAllScripts()& K+ J% O( z, p) j/ ^
1 e0 B7 G+ `. l9 z/ i9 X" y
- /**
7 H, N( }, N2 |3 S A, K2 J K - * Выгружает все квесты и скрипты, а затем перезагружает их.
. r( e2 [4 p9 z h U$ |: z - *// s' @5 `" b% K# L6 j
- public void reloadAllScripts()0 y3 J4 @. z' C2 l
- {, J/ v- e Z8 u' ~
- unloadAllScripts();( F: _& m4 X) J5 X
-
; f& E. ~& S/ F7 Q5 ` - LOGGER.info("Перезагрузка всех серверных скриптов.");
' @ Y1 N3 ]- L, i z - try9 Z" C6 x b- C1 m4 G
- {
- @1 G$ t/ Q) g S - ScriptEngineManager.getInstance().executeScriptList();. O+ q5 E: P! _! _7 o
- }, \1 ~2 b) ] Q! s) {
- catch (Exception e)- V4 d' q# R" f: I' _- _
- {
( K; ?1 C* B2 H; k+ F - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
! @/ q* N$ C- ?' C* _( j+ y/ s - }
3 }: {$ `' s( P/ \; p7 h- O W -
# B+ f, j9 ^' i: J Z+ N" |/ j/ c5 K4 S - getInstance().report();
' C4 l( T7 @* h - }
Скопировать код Метод unloadAllScripts()7 i* Y' |$ [% [5 e" G/ i
}7 D! @9 s6 l3 n' s- r
- /**) R B" a: y. j0 j. f
- * Выгружает все квесты и скрипты.$ @: |8 T: y6 M0 u5 x6 p8 r
- */* q* c% s0 ?- o; v0 c) d, h
- public void unloadAllScripts()- n8 d# N3 p0 R
- {$ c$ r& W# M* j
- LOGGER.info("Выгрузка всех серверных скриптов.");/ @* V2 X3 @3 v. o; X
- ! ?* y8 Y( ]( L# |- F6 m
- // Выгрузка квестов.: k5 _+ e9 f6 d. J; V
- for (Quest quest : _quests.values()), R/ h+ _0 |1 ]
- {: Z) H' H8 i( I3 B4 c# p' t
- if (quest != null)
1 U" r% Z7 U. \+ y$ I - {
8 K$ x2 J- ~$ O- M - quest.unload(false);% _+ Y4 Y$ }* x- s) R8 i
- }
. R7 g3 c* c& I: H - }
- _$ g/ b$ k1 a% Y L. c3 j - _quests.clear();3 j# m' `$ X0 a5 Y2 c
- // Выгрузка скриптов.
! h) k7 |+ X ]+ M - for (Quest script : _scripts.values())
. i4 j9 r6 ]8 @- X4 h: B - {+ g! E9 i: |. A. T
- if (script != null)- E; f! a. B7 V/ x3 P4 z4 O# ?( |
- {* ]- S) W5 O3 S4 |! b% Q
- script.unload(false);
& s) r! b: _! w' g' y& I - }
9 U! W4 T( q ^+ A - }
/ L0 k+ b, _& n" R2 C - _scripts.clear();
& E# M2 i# I, V - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
9 ~! K7 ]7 c$ x1 k; f 3 a/ n5 l, `+ a# ^2 T- c! c( d/ T
Метод report(); j7 z' N2 v' V9 F/ b% ]( J. B0 Z
) u" W) Y5 f9 J1 l& `. }% i- /**8 @# x4 \# I8 S, ^6 v* x
- * Логирует количество загруженных квестов и скриптов.; R- H$ ~8 ?! J/ N
- */2 Z" O4 P8 q9 | ]
- public void report()8 Z9 [. B9 `6 H9 f3 J& T5 `
- {
' Y. K9 j% `& ]5 A2 T2 i& A. \ - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
- L8 ~- y8 E. K7 Q/ F3 Y0 y& E - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
7 w5 e9 I1 k& z- i& o6 H4 u$ { - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
& C: S" ^, m( C : t4 F. R0 u/ p# Z
Метод getQuest(String name)8 m( R, @/ V4 |4 v! q0 ]) \
3 \2 B1 v" N. L7 ]% P* `
- /** m: }7 `9 c0 ~! `" f) V& C* u1 r
- * Получает квест по имени.) W, p* [; z, N( X' S; ]
- * @param name имя квеста
* @' I' d \5 w2 j - * @return квест7 L" a0 q/ ~; q: I
- *// V2 f& ^& j, f2 G! ?
- public Quest getQuest(String name). s5 S4 R) V" G& z5 w
- {
6 M5 G5 Z5 a( X9 [ B! K# P, y - if (_quests.containsKey(name))
7 N% F% _& u/ _* `" D. C; \ - {
* V3 o5 R {* S/ I7 m1 j; p- V9 m - return _quests.get(name);. ^4 M# O Q) C5 ^4 p
- }1 b# @( Y8 q7 r" |' S C
- return _scripts.get(name);/ O0 B) s; j# @* j3 D& K* F" Y
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
- o# N) a, c& F7 _4 ~% R , A9 t8 b2 W- f, `
Метод getQuest(int questId)+ R. n) ]$ O! P0 X$ L7 t# p
: y* D2 i* w& d) I! s1 t8 h7 v" x- /**9 |: T8 Y/ Q* N0 y+ N
- * Получает квест по ID.
. v6 v% D: V" m; ?, _7 n" v6 d - * @param questId ID квеста8 u, y- x# w6 U0 U# ~) P- L" S
- * @return квест, если найден, {@code null} в противном случае" F/ C' q* K- L
- */; H `8 g6 G+ W5 r1 W) l2 ?9 f
- public Quest getQuest(int questId)
" O; h) l2 G( t. i6 @% a9 B+ W - {
8 ~" E& q( M ^; t3 s) a; @* a; Z - for (Quest q : _quests.values())
7 U( K: s1 T4 J. T% K3 z - {
4 u$ x4 y6 w4 ]8 l/ }: m - if (q.getId() == questId)1 D' F4 T E3 }( S# s) s
- {
8 K" X0 n* x3 ` - return q;! |9 g' k; X3 ]
- }4 z, X' x5 k4 @/ T- T' x# e2 m6 e
- }3 N" y+ s( ~2 A2 F4 J2 U
- return null;, Y A7 j; U* L4 |$ B# n* W
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
' r6 d, x4 j2 J" w* Q6 {9 n 2 d' k$ q o3 |" C1 i
Метод addQuest(Quest quest)
, O4 j/ o1 V) v: R+ s* d& L
. v" E/ z5 ^6 r7 \- W- /**9 W5 D; S3 o l, X' H( P/ y
- * Добавляет новый квест.
: \0 {8 a/ ?* ~1 Y - * @param quest квест для добавления$ R) t$ L/ k& X& _, k* q
- */2 m r1 z1 o# I k- t- m7 K
- public void addQuest(Quest quest)
2 [0 _5 m1 e/ Y/ J2 S! R, Z - {
% _, Q6 L4 [; L8 N9 L7 o - if (quest == null)
, R! b) D2 P+ O* N, ]& h - {1 f* Q$ S z3 A) S$ |6 U1 x; f
- throw new IllegalArgumentException("Аргумент квеста не может быть null");# L- T0 f- `# \( }
- }
" b6 y& n- l' t! `0 S# q/ ~ - 9 u- y2 \. x i2 j; e# `8 {
- final Quest old = _quests.put(quest.getName(), quest);0 G) g( Q4 @" O2 W$ S/ K
- if (old != null)
$ O, H/ a' @2 i8 ^" u' q' t - {
/ [- m6 }( L$ D% ` - old.unload();
3 }- R8 J2 c2 L0 e - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
# x( f: f C1 g3 K. t - }0 C: @5 n2 u- ?) I" }
- " h4 Y& b/ ]& E
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)$ _1 Z" Y* C& ?/ }8 H3 ]- k# W
- {' h$ x( P# W$ G1 h
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();9 K* t# s0 m0 A* ^* H6 W d3 N0 y
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");9 A- o# H% ?' i! I0 d
- }& @8 j X' C6 }3 v3 A3 D9 i
- }
8 v% k. G. Q8 u - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.) G) h% d( n/ J% y6 u* p
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.7 {1 J( S/ I$ b. Z/ \( g0 _
# R: u% V3 a+ t% E1 O
& G. q. j, z) {3 V, `9 m9 Q) f+ ]( ]1 f0 r
|