Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
$ V% r1 S2 K) l4 q9 C! E" `- \$ u! a5 g' s( m
Разбор файла QuestManager.java$ D. a* |) t% G' J. q) w4 Q% T
7 v( ?$ P9 ^' O. X
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.& w# t3 a# k& j/ p
Основные элементы! B: b- `% Z# l. A) s
- Лицензия- n2 K+ _* |8 N. C
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии./ Z3 I' D2 S3 `
- Импорты
# _1 v4 \5 H# n+ D% \
/ y! B. ^5 @9 h% j' dQuestManager.java — управление квестами и скриптами.. v0 x* b! N- @2 ?
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\4 s- \# l4 G8 I9 b
5 M8 f/ x# i) I4 u; `
4 x8 N1 |0 u6 yДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.! b3 m% C) n. E9 y4 |6 s
1. Лицензионное соглашение! I6 @# o+ L' F& x: f8 c
- /*
9 u$ Q% C) m4 U; \5 ~7 O - * Этот файл является частью проекта L2J Mobius.. @% E- s- Y, t% C! z' |+ q# I/ T! O6 N
- * - {5 ~& _8 G% D% V2 ?; D
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
7 m6 O" m$ ]* m9 c: r - * её в соответствии с условиями GNU General Public License, опубликованной
1 e- a; x9 _: e5 | - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии./ e8 A! S" ]4 A' a" Y
- *
" _- i3 u! [ S: |) p- m4 ]$ M8 l - * Эта программа распространяется в надежде, что она будет полезной,6 u, k$ T# L4 ^3 M& y& e1 P
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии2 V7 x2 `' Y. P7 I i
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.' s* F3 U. w' i/ R# y' _9 P6 K3 M% r
- * См. GNU General Public License для получения более подробной информации.0 `4 w R# r, ^
- *
: R; [* z. q1 B) p - * Вы должны были получить копию GNU General Public License8 W5 C7 G3 }1 Y+ H* T
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.: K- M Z- U( D6 A) s9 `& g& I
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
3 }6 y& J$ Q3 ? S9 N% N2 P% N( z2 ], C6 v
( `3 |% X; Z! L% H! a6 B2 E2. Импортируемые библиотеки
" M6 ~9 D, \) [4 j; ^: Q6 I* X- E4 o4 o, U: b
- package org.l2jmobius.gameserver.instancemanager;$ | p4 E, ?& m/ s( a3 J
- * F9 P- k) c% @3 k% l# {: J+ r) H
- import java.util.Map;4 m9 A6 I5 x3 W1 B
- import java.util.concurrent.ConcurrentHashMap;+ @4 {1 {: `- ?/ R0 X0 n
- import java.util.logging.Level;
9 C m* g2 G) b" N) `- v - import java.util.logging.Logger;' n0 s( C* j1 w% t! k
- ' V+ n8 B, F" x( x9 K% @, E
- import org.l2jmobius.Config;
}/ Q/ H- ?! |+ d$ a - import org.l2jmobius.commons.util.CommonUtil;
, h* B. `7 v$ F6 i, @8 O - import org.l2jmobius.gameserver.model.quest.Quest;
& m1 z; D$ |' U) @' i: \ - 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 — менеджер для работы с игровыми скриптами.
& d, J3 P6 {! O r/ x: u; u/ G# Y3 h, U! B2 f' Q t
3. Описание класса QuestManager5 S, W8 x: |% p0 E1 Z8 h
- /**
& S& Q% l2 ~2 g# C- g0 k3 F s - * Менеджер квестов и скриптов.
" X; N0 P7 W, H8 i - * Автор: Zoey76
U$ [- {: O# i4 Z - */
: i; X( {, g' r; y v( s- V2 R - public class QuestManager
: F- G, X: o" N0 D9 M- g - {# v+ x/ l$ K. h
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());7 _- X0 \# O) T( F8 ]" M+ X
- 8 m- _* [+ D# T& l
- /** Карта, содержащая все квесты. */
) d& m) `) \1 U! R - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
- {; U( Z6 D1 D2 ~ - /** Карта, содержащая все скрипты. */! ?* t, V2 E% {
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();, A7 i! ^& W3 L+ X7 y- m
-
$ Q9 I! H6 w; h* q - protected QuestManager(); {8 i6 ?2 d- H( a
- {; R$ f6 H0 N x9 {3 L, Y
- }4 v, n* x1 Y' F$ {6 L
- }
Скопировать код 4. Методы0 `# C- P3 c3 ]0 Q U @. O/ C
Метод reload(String questFolder)
+ X2 X2 ]' y* S( V- public boolean reload(String questFolder). E) |4 y: |- Q
- {
# }& q! \% Z* X- x5 {7 C( ~! f" n, g - final Quest q = getQuest(questFolder);
* [" E: A& G! }2 E7 j: d+ ]$ k - if (q == null)3 L# B9 Z2 r5 Q3 W0 I4 D8 t
- {6 K; i/ q2 `8 ?2 C0 A0 a4 O
- return false;
7 c- [& c8 B$ x' m - }
: e( o- Z! k4 v6 C* ?1 w, s* h6 W3 H - return q.reload();4 l% R* c+ G5 {& l/ D" @& V
- }
Скопировать код 9 T0 k4 {( T1 B& ?% [/ H
$ M7 k* l: Z" X4 n7 \, z. {
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
$ T6 ~$ [ O9 f9 _, D. tМетод reload(int questId)9 ]" u/ C/ N- n: L3 X }/ G) v
; a4 B$ Z, K- K* u& z) I- J# ^- /**
9 h5 @* d8 z' h - * Перезагружает квест по ID.
! e2 ^: N% Y" R0 T$ A7 C - * @param questId ID квеста для перезагрузки
; l z$ W' z( l) b- Y5 K; F - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
4 I+ N9 @/ |' \& _6 A - */
6 u- U; @6 V9 E9 h6 _* @$ ^! S - public boolean reload(int questId); s' t! T) l- M* h
- {
5 N w! @5 F* f5 Q - final Quest q = getQuest(questId);
( k$ m) H3 a/ E% F1 D, s - if (q == null)* w1 R7 { d+ Z
- {
+ y/ C& x; R4 W - return false;
$ j5 X: p' ~/ g. X( t/ Z; d& R - }# e$ M4 L8 C7 ^1 N. B0 g8 X
- return q.reload();% O4 M, H5 p4 w' W. P) Z- D4 y
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
% K, e, T* g1 ^$ b) h9 [
7 o3 I4 i& \) g# m' [) U0 YМетод reloadAllScripts(), ^3 M3 Q# E5 ]9 B! ?- C
/ x& K+ g2 M* }1 I# U( }- /**
4 X* M, P4 d7 i: S) h - * Выгружает все квесты и скрипты, а затем перезагружает их.. \8 F9 _; r7 X x5 S+ t+ f
- */+ z( F* X0 F3 m
- public void reloadAllScripts()
; B# T- i0 |* R5 y8 j - {
6 e# k* _1 K4 F/ q$ E. ^. @ - unloadAllScripts();
6 [4 y. r7 v6 G& F$ {9 U7 z* L5 z - + Y; N) A+ t3 x# C9 P) g" G2 j
- LOGGER.info("Перезагрузка всех серверных скриптов.");
+ P8 w P3 t7 j0 n) v+ b - try2 g* N# f q4 u1 u+ [
- {
3 Y1 g) J4 F# D4 i# z% M' R* ` - ScriptEngineManager.getInstance().executeScriptList();
1 l7 z9 \3 a' y - }
; A3 Y1 j% L& V# N1 j - catch (Exception e)
& i- d: h" U3 i% R - {
& m% y2 ^6 r, d0 Q0 O. Q1 D - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
5 q& I1 h5 {& ^1 B! C) r& x: r - }
; v! N- e/ K7 J! d9 D -
' N0 `1 t3 E* L2 } - getInstance().report();4 X8 x" t& a4 b* K* l
- }
Скопировать код Метод unloadAllScripts()* u0 @/ @" L3 p0 ]; R
6 D5 `+ L6 k, T3 T4 q# t- E- /**
! ]; ]" j U4 n- x7 V G - * Выгружает все квесты и скрипты.8 K$ V& e" S* F5 H: q% p% u
- */
4 }7 E& c8 y" e - public void unloadAllScripts()3 q9 u2 |+ Z0 f1 f
- {
6 ]; ?) p; u) y! d& g1 {, _% M - LOGGER.info("Выгрузка всех серверных скриптов.");
9 ?4 X7 I ]; t p- ~. G% I ^ - , m6 U7 @# d) d+ a% c! i0 |
- // Выгрузка квестов.8 l. F) B+ |% A
- for (Quest quest : _quests.values())
6 ]+ F& i2 C0 ~& _ - {( i( q7 a- i; B0 S# r
- if (quest != null)
) I Y* U: v3 T - {
& _: a! N6 E( @2 o, M - quest.unload(false);
6 W! |4 Z& @. q8 |# X' S9 n# @. X - }
, h1 ?; g" s! Q7 X6 ^5 t - }2 g7 A2 b6 \; D+ h1 D! l9 W/ H
- _quests.clear();
' ^0 Q3 x R0 g: D - // Выгрузка скриптов.
( I9 `2 T& P* e) B- |4 q6 A - for (Quest script : _scripts.values())/ x4 A. O1 x1 `* Q1 F1 Q$ Q
- {
( Q! r) e4 u2 L9 g' Q - if (script != null)
) b4 C) ~3 x5 F$ T V8 P( x. V - { ^8 j8 M8 L- M( ?4 T/ M. N, h
- script.unload(false);" U$ e; R% }9 g r* _
- }
9 K+ x, u w3 j. n" [+ { - }
: ^* ^. L- f3 l3 F# ^/ ? - _scripts.clear();. b; C* G( O3 H7 l* I- ~
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
' l/ s1 G* o9 E) k" x) r. u. f % F+ K! f* \ ]9 ^4 G; U8 A
Метод report()
3 _1 f3 e3 \3 y/ ~4 K9 q! V, @3 N$ Y( G) U* u- f* t) I
- /**1 L8 a. l7 q, E6 D& M J2 j
- * Логирует количество загруженных квестов и скриптов.
- i. I6 {. y; O! i( ^7 T# O0 u0 | - */
6 u; t5 h) S. s& v: i4 J9 q - public void report()
. @) O$ p; |. ]5 Y4 D9 s% K6 s - {+ @% ~7 S# R5 t; e* [' R8 f
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");3 w' A+ ~" Q# C, Z& N+ o9 R! J0 I1 o
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
. M% K& J: a4 E - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
$ {6 S% }9 ?0 ] 6 t( s/ K! c8 ~# Q( h
Метод getQuest(String name)
1 h# c7 w; x. T! D) X8 w1 ` u. L" Q5 e& N0 [3 s( `7 \
- /**3 _ }1 ]7 C0 x1 |# s
- * Получает квест по имени.
4 E7 o1 @5 v, `4 `2 L+ j - * @param name имя квеста( O) y# {/ L1 K" j# j5 q: y
- * @return квест
1 p7 y+ ^, z2 d3 Q: d4 A I9 ? - */
" k1 j/ k8 U) v: d& R - public Quest getQuest(String name)- D H2 I- v1 m' k- Z# q
- {
1 b9 Z$ W4 h' x6 n0 ` - if (_quests.containsKey(name))
4 K, z8 z7 A; u( q; p# l - {, T# n! X! J+ J- _+ Z
- return _quests.get(name);0 x i# }3 I6 r" r
- }) v7 y& ^0 g( O) o- f/ p" ]& N* f
- return _scripts.get(name);6 o) ] \: S& {0 V
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
: B, P9 o6 P0 w4 c# L* Y* D( m , | X M9 S, V) `$ f
Метод getQuest(int questId)! M1 K9 m9 S: E- B. q- e
% ]; f4 o" x* ]3 z: A( |! o- /**
1 l( m, r( [4 F0 ]+ ?. ` - * Получает квест по ID.
0 g3 y+ k7 [# r, i - * @param questId ID квеста% u% K- R6 V% e* t' X) a
- * @return квест, если найден, {@code null} в противном случае8 f, }( e: a: B+ D0 X
- */; d `5 p# [- J5 |
- public Quest getQuest(int questId)7 Z: Z$ O' H: ^& r; r: @! ]
- { t4 f2 P) Q5 l% `( v( o
- for (Quest q : _quests.values()). Z! u+ ^. C/ S& L# J
- {# Y! d7 c. `: z
- if (q.getId() == questId)
, M+ b2 |/ a& n x, w - {) O) m) \" b- W8 j, }, \4 E
- return q;, B0 x1 z, Q& U9 ]$ j; y
- }* Q6 N" O: [/ H2 w& ~4 U/ H" D; C' f
- }
6 T* Q5 _4 v4 l4 _1 d - return null;
6 J: s$ q4 T ~3 T5 l$ w$ W - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.4 Q% n3 W9 W! \
- y; N* u9 C" x2 J
Метод addQuest(Quest quest)% ?& e% p! v8 ?. @. f# R
9 b; ?3 q! i1 X. D, x, t9 _- /**
7 h0 s) u3 \1 g% C - * Добавляет новый квест., U% T8 S* r$ L! A# j+ x& T w& |
- * @param quest квест для добавления1 a- A7 s( d# g1 s* m0 T% s! x) R
- */1 _, Z4 P: H* d0 _( J# X8 H I9 v
- public void addQuest(Quest quest)& A# B2 a' u! m$ ?$ z! W
- {& Z# b4 D4 l; y! ^
- if (quest == null)1 {( {/ R" v4 T9 E/ H
- {- d2 c. r# a% u9 Z
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
( `. e2 ]7 u" t) a' N - }0 z1 O0 n9 O/ r1 z! p5 f! G$ h# B5 @
-
0 G) ]- J, F, W$ ?$ w j" \8 m - final Quest old = _quests.put(quest.getName(), quest);
+ g% J( ~- X- H* J - if (old != null)* j: K. C3 Z) e6 C9 l% U6 a2 u( r
- {
& a9 U1 e+ c+ j4 j - old.unload();4 y. l7 }$ J9 Z9 K/ O4 X
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");9 W! K- s' P9 ^" N# O! Q
- }
( I" S. x O" t w6 g. o4 p -
* P4 ^+ Y9 V* x I) A3 E; f3 C8 } - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
! c/ ^% q; l" ^ e4 D. Y - {: X3 V" j: B% A
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
) W: M! @7 U; |- w - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
# r) b9 C6 O0 e- d0 N0 Z - }- M2 O+ X# Y* T/ R4 U
- }
2 Y4 w- Q# `8 b* Z! C; U' R% | - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.4 s6 f' h( y+ ^4 M. h4 B
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.& S; ~6 G8 k, T7 [' b/ r
J, ^3 n8 ]9 A* [1 s. S- r3 e3 D" ]( O. ^( G8 C
+ n) C8 f& ?. V% w& f$ H |