Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius/ S2 M. s6 [; m6 Q
6 d5 h6 k+ X+ u0 G2 }+ ~2 H- l5 f
Разбор файла QuestManager.java
) z/ k1 _; y: c* \' o
- m* X: o* s, j7 K0 i2 QЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов., U/ {! n6 [2 ]; Y# y, o
Основные элементы
2 P* J+ ^, H- O, ?- Лицензия& r: T2 N! L! w! V L9 X
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
/ i& U: u: N& P1 u# d, k, A
- Импорты3 q0 S7 J9 j( o3 s* w2 v/ g0 K* z2 o* H
$ \: S I' X+ _( ^" x1 Z, t" d' ^QuestManager.java — управление квестами и скриптами.
, j& d! r' ~, f* m4 z* DПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
! V: a4 N9 [8 k. b* v# P, V0 W7 h! |$ P4 C# z" i$ \, E7 x
r: }# y( x d5 w6 h+ ]1 L
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.' p) b8 a! ^0 }# Z+ O( H1 Y/ b2 [
1. Лицензионное соглашение
/ A8 X% f' s% r. c4 [+ v) R. ? a- /*
6 y. I8 C1 Z1 w) x0 x2 H7 H+ C - * Этот файл является частью проекта L2J Mobius.
7 L" z- X: u; ~1 a( |% d1 I: l3 @ - * , \3 a9 H+ u: P$ `6 Y1 z
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять' F" k3 E1 h$ {/ X
- * её в соответствии с условиями GNU General Public License, опубликованной
6 A4 @6 @4 |2 m4 {7 O; d - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.5 r6 }: D& j) ]. L4 L
- * " [$ I6 `* V6 g9 N) ^" N# M
- * Эта программа распространяется в надежде, что она будет полезной,* ^+ [8 ^( P q0 n' q+ {4 U
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии) g* U3 _/ n6 H
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
' J5 ]( J( ^2 O$ v% W | - * См. GNU General Public License для получения более подробной информации.% O. A+ N) |. u$ s0 M, k% i2 ^
- *
4 [# i0 S' v9 T! i8 u - * Вы должны были получить копию GNU General Public License g6 A6 A( T8 E, _# M- ?
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
! k) F+ A$ d& | - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
1 H& c. s% B1 | A
$ v4 e7 G& ]& o) U" N
% E n+ v+ i' d: o7 A2. Импортируемые библиотеки
1 V7 X* @% v' `" k
! t9 V5 L0 C' N; v- package org.l2jmobius.gameserver.instancemanager;9 B4 v3 F4 B" I4 `8 H
+ B- I3 I0 @+ @1 i+ M2 h- import java.util.Map;
9 O- q5 |% K- ?: Z) {: u; p - import java.util.concurrent.ConcurrentHashMap;
& a! d. H( p- V5 D* j0 s - import java.util.logging.Level;
0 r! L6 T( i H - import java.util.logging.Logger;! X: t7 H8 s) `- ~* G* k/ p
- " D3 x8 l8 P$ m
- import org.l2jmobius.Config;( l2 w6 U# M% k5 h% s
- import org.l2jmobius.commons.util.CommonUtil;
) }6 |& V1 ^( a: ]$ \( C8 ?' S - import org.l2jmobius.gameserver.model.quest.Quest;+ K, b( ~# [0 R0 K' `
- 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 — менеджер для работы с игровыми скриптами.. S7 b4 L( X4 K; e. T# J
. P3 v" d& a6 G3. Описание класса QuestManager2 O. c: x/ s# h; B$ r
- /**
% J2 f5 b( m3 U" z - * Менеджер квестов и скриптов.
8 `3 E; O' c- v$ b' B" p$ }$ Q( d - * Автор: Zoey76
# R8 i( Y/ ]# k) [- ~: o - */+ S! n0 V! E8 `
- public class QuestManager
: j2 _/ J, Z& [! L" y$ w# H - {( _2 N6 _/ N# ?2 l
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
' u' B3 q3 u2 G5 T8 O1 R -
9 t; Z4 [7 B+ ` - /** Карта, содержащая все квесты. */
8 F4 o7 P+ u6 y0 P6 f - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
$ V" d$ C. T3 a& C2 N& B+ r - /** Карта, содержащая все скрипты. */: K4 {6 K' M7 C% g$ ]8 R: B
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
9 C5 k: [/ s4 [" {8 r# G3 } -
) k1 n' t7 P: ^) j3 E$ }: o% ^ - protected QuestManager()' D2 _- e" S/ I; ^+ `
- { w# B N9 j: a5 A: i9 ~$ o- q5 }
- }. n" k0 y" n- B$ R2 c M7 q& r
- }
Скопировать код 4. Методы
4 o% U; m- W% y9 l3 E1 }Метод reload(String questFolder)
4 `" U; M% z, I! j2 m1 [9 M+ G- public boolean reload(String questFolder)
7 _, v8 x: z* V2 ~3 a2 Z# u - {
) a& O1 R6 F% U0 ? - final Quest q = getQuest(questFolder);! z. S- t2 k) w7 b# }
- if (q == null)
" R6 \$ i+ i& ^6 |8 j - {
( p5 `' b& W0 d. j- S4 L - return false;2 ]2 S8 q1 J: K6 n; w7 k
- }
) }8 l( B( e: g# W5 H - return q.reload();
# |0 u% V1 z w9 V% {4 T, z/ W2 b - }
Скопировать код
+ ?* B+ l6 A ^' C' O% d! _/ G) J6 T; s4 F! d* t* F
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
5 o: R9 l) e5 M& \( x( ~! VМетод reload(int questId)7 c9 m9 v: Z. L2 Y( x/ m4 F, N
$ U$ F. ~7 A! L' S% J' I- /**
% N& A% j( R- m. W) \ - * Перезагружает квест по ID.
4 Z; U2 ^8 m7 _0 F1 }6 A" O - * @param questId ID квеста для перезагрузки
3 |. l. X1 ]4 Q% [ - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае" s" s# ?1 p s \/ ~9 N' r! X
- */( {& a e/ v* d
- public boolean reload(int questId), |2 I. R) ]& m
- {* ]1 ~! F5 `( p0 g! g8 Q
- final Quest q = getQuest(questId);
0 H: m/ }# _' x& e2 h* B - if (q == null)
4 c z( |/ I# h - {
" B. a% K V5 ?" s6 A0 m - return false;
3 h- V/ q) v0 F8 _( X - }! f$ H" |/ i5 O9 E, }5 M) o( F( W
- return q.reload();
$ m# k- o: a, x7 N1 ]7 [0 v - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
- Q$ ]% I1 x2 V) y) P1 v
- r3 V- D3 s3 |! u: x- J& YМетод reloadAllScripts()7 z, [9 B' j( {3 |2 I/ \7 A
" u! `9 D0 L4 E- /**6 U% S* H! d- ^+ _$ N
- * Выгружает все квесты и скрипты, а затем перезагружает их.& { p* s! G" _+ D) [8 t3 v! |
- */' V% ]' `9 P- R% I6 O7 J" Q) Z
- public void reloadAllScripts()
: ?. D$ f: S; T8 o - {4 L5 x! P% [9 l* s1 b
- unloadAllScripts();& B6 m/ K2 l( u2 P. T( U6 \# f
-
6 f1 ]' o2 E( @3 z" K9 Z }" j - LOGGER.info("Перезагрузка всех серверных скриптов.");3 E5 ~/ ~( \1 p( F7 q2 A
- try9 }% p& H+ g' J- n0 N
- {* X( r- M; S+ j5 b( ?
- ScriptEngineManager.getInstance().executeScriptList();
; ?2 C6 s' T9 R5 e' p& S' u - }' G' l; T0 w0 N" F
- catch (Exception e)4 B3 O2 _& b, o' ^3 [# e* G! C {
- {3 Z4 x% O/ w$ N( {# o1 @
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);2 o2 {0 _$ q3 d# R4 ?0 u& X4 {; F, N8 [
- }
# x( |6 w/ a$ { -
/ B, v7 R& U, A/ [, `0 V - getInstance().report();
r$ [6 d* A. k( V) C0 M9 e - }
Скопировать код Метод unloadAllScripts(); ?# U5 f# a2 K
: I7 v5 }+ Y6 h/ e
- /**
8 N! U' l. d0 }# z - * Выгружает все квесты и скрипты.9 l) u# s k2 v5 Q- p" W
- */
0 ~& O1 |/ P7 `" Q+ x8 ?7 m - public void unloadAllScripts()
$ X3 {3 s% L8 [ - {4 Q! K0 M; A* T
- LOGGER.info("Выгрузка всех серверных скриптов.");
; N+ M4 |$ D" R -
- ?% Q* L8 J6 ]) @8 a2 _ - // Выгрузка квестов.- x: {! _8 O0 s
- for (Quest quest : _quests.values())
1 J4 K+ d) e( Y0 t3 \$ @1 P4 s - {8 F# {& t r1 e0 n7 C
- if (quest != null) m9 Q& U& Q& m+ n- C
- {
% e/ w/ x7 f8 p. s2 i: } - quest.unload(false);3 l# Q' ]1 F- P2 J5 k% J
- }
- t& x0 A( l: s5 ]/ j7 K! h - }; k4 @# Q- Q) b/ _' w" n) k
- _quests.clear();
9 c7 D) g& Q/ R3 G1 t; K; _) D! z - // Выгрузка скриптов.
5 U7 x' Z; w; M" h( I/ O# L) S - for (Quest script : _scripts.values())
. i) r) n f' x. P9 ?4 Z - {; P$ ]% H. G7 B' S( M5 {* ~
- if (script != null)
. V! M) q; u% z. A; @- a - {
9 R+ l( i6 X! z( v8 j) ]7 X - script.unload(false);% `/ O, @5 |# \9 B# O% o" X# k
- }, V3 [1 r# x: Y, H# W3 n) r0 @! S
- }
/ h7 a/ W; u& }. Q% D' J) N - _scripts.clear();
8 K, ^# G$ R" h+ L7 T5 H6 R - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
) `) @: |4 w( v8 h
4 Q. e8 Q3 [% K D& P: G% Y% v. iМетод report()
/ d* Q$ o+ ^ Z; H; {3 K @" z
! k3 e; S4 W; c4 A5 G2 O- /**% C2 u- ?/ y$ @* b5 R
- * Логирует количество загруженных квестов и скриптов.7 V. I& E& n8 q1 C$ n
- */6 d$ i8 `; Y v
- public void report()1 Y8 Q" k9 B8 G) J" Y" U8 o) Z U
- {3 O; H. _% p: L% C' i1 l
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
: f3 A7 C. S' C - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
# x2 u7 G! T6 T& i: |2 O - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов., ^) p) B+ W4 z' k, P7 G q8 \# w$ n
) G3 e( B' O1 T7 i
Метод getQuest(String name), Z* y% ?5 o4 Q4 J) J* a$ k
: u' U7 L# f) Z) I; F5 g
- /**
& n! [2 K2 m( O; ~6 n6 I - * Получает квест по имени.
, G8 v' n" i, d# T - * @param name имя квеста
! m/ X( b& e g. {" h1 h. Q$ i - * @return квест) d# x/ C9 Y' s* V
- */- Y" f) F7 d/ S
- public Quest getQuest(String name)0 u0 q' l0 l1 P% V
- {
, m% q( o) S; E' H9 m - if (_quests.containsKey(name))
7 _7 ?1 }9 g; i# z - {
( u& ~! v- J" |8 g - return _quests.get(name);
4 s5 i4 b) X7 W$ G8 b7 K - }$ x. m- |- z# ^" a" A5 @
- return _scripts.get(name);) L$ P2 L4 w2 v0 W$ `9 a
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.' @ @+ d0 G! N3 D! W7 Q; h: b
+ C4 N6 E! V- D e; q8 |% n# K8 G' ^
Метод getQuest(int questId)3 a, k+ r6 D' N6 I0 Y3 J
9 o/ x* g2 d y* o9 g' T0 s. e# @
- /**4 m5 ~/ S0 C# x
- * Получает квест по ID.2 `7 @ r1 M, a
- * @param questId ID квеста
# ?! R" k( f" _' t5 Y - * @return квест, если найден, {@code null} в противном случае
8 N) O# b9 P$ t$ n3 w - */
0 G. \8 W+ W! b; [3 E0 [ - public Quest getQuest(int questId)5 c) W% u/ Y7 N7 U
- {
3 n q9 T" x# N! G+ Z! S - for (Quest q : _quests.values()). [( S3 g- {& ]0 d3 g
- {1 M. j& ^- [& u% g1 O
- if (q.getId() == questId)
, ^9 y6 s- F$ l6 o - {7 E4 H0 @) h6 X0 \- G8 f ?) Y& H
- return q;7 P3 U4 }: c% H/ b
- }! f4 t; g5 P6 X& s1 y
- }
9 v) N* `! d" a! t - return null;
6 X# O. P) v1 x5 h% i - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
: y3 J. Z* g7 v# t9 } 3 w# O' e# c' Z" j
Метод addQuest(Quest quest), }/ u1 w3 G4 C/ y% S2 W
2 n" J0 q* S7 q9 ]3 x/ x- /**/ s% C+ p& `9 z. M! G
- * Добавляет новый квест.& l `! |" d0 E* {* e% @! O
- * @param quest квест для добавления9 \: Y: I) }8 B# W1 G) X
- */
3 h# P6 J. h+ b4 {/ u6 z - public void addQuest(Quest quest)' {; n$ M* M/ P5 U6 X" Z \
- {
+ P* V3 B. V' p8 H/ i* m- I6 Y - if (quest == null)
$ U; B+ r/ J- ]" _- ]2 D - {
6 x4 i+ J9 x2 n- W: m - throw new IllegalArgumentException("Аргумент квеста не может быть null");
. {: t+ {3 M6 o8 v5 ?0 B0 A1 z: x/ h - }
3 ?6 q. T& g( C - ; u5 ~3 t4 _9 u4 N+ S V5 g4 W" x$ ^
- final Quest old = _quests.put(quest.getName(), quest);
" ~, }& l9 e, j3 q: A - if (old != null)
: a5 {: S$ u6 ?. G - {$ ]1 M. q$ H% f2 o* T9 d
- old.unload();
6 q( {+ ?0 x2 r* s# _ - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");# u1 w+ Y5 A/ ^2 {+ a5 M
- }
, z- Y. M& P6 W# I1 r - : S/ J) e0 ~! `4 e/ J
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)1 s! G6 K% B& Q
- {# N; A0 D2 E% _. U* f
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
3 U- ?) Z2 ]) m1 } - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");2 n5 |' _ R6 K* h, F& I
- }2 o+ l$ y2 O9 u
- }) z: ]' s! J/ E6 a
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
4 R4 i3 q. Z: MЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
# B9 A1 J# ?: w4 H( Y
6 D4 s t# i! u
1 C2 S$ z4 Z3 _. w/ e0 P l5 _
/ B- b$ \8 h4 ^1 |5 x |