Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius+ R. G/ a8 }/ {+ T! v u
8 ?5 D+ V. I$ tРазбор файла QuestManager.java
S0 N6 k3 I3 k: d* Y7 d2 D1 A$ D8 D/ H9 A1 T6 X- S- m
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
- q) h; k7 X, ~! a# aОсновные элементы0 P, J: Z& ?$ s2 }& L8 _0 s6 o( w
- Лицензия' J2 A# [( h0 u! H; U1 P
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.6 I: D8 L3 l v/ e( L, A+ D! F
- Импорты
$ M7 u; e: K# G , g; A) E) V8 \2 B# s
QuestManager.java — управление квестами и скриптами." P. l5 t, m( D
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
4 u. ~# w7 ?: L' E+ O; |1 M6 n8 N3 [& m& D2 w# t {% P# {+ s
3 D1 k4 G- ~- L/ m' kДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.; q; i# G' M. P z4 y8 w4 c2 f
1. Лицензионное соглашение0 p" o- Q ]( i/ Q4 r% v# \
- /*
5 b1 o( }2 W( j3 k" c( }9 }( ^/ z' D - * Этот файл является частью проекта L2J Mobius./ X! |" i$ Q# x! N2 D, b
- * 7 P9 e4 V" L4 n; B' S8 ^
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять# R0 E' R+ n& c, _) ?
- * её в соответствии с условиями GNU General Public License, опубликованной6 v5 E$ ~! Y/ ? k% Z1 i% X
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
4 {2 E$ O9 J. X5 J1 g% x - * 9 @, \1 d5 X$ E/ x% y
- * Эта программа распространяется в надежде, что она будет полезной,
2 y) U7 S: A3 U8 I9 N - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии8 d! o3 [! ?" L" a7 X$ A2 ^3 k
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
; q, H% W& n5 ^ - * См. GNU General Public License для получения более подробной информации.
, E9 _) ]" C% q - * ' U- t+ O5 A+ ]# C0 {
- * Вы должны были получить копию GNU General Public License0 u( F6 @0 D4 Q$ s
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
$ N, e n- @) ?4 | - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
, k* ?' u! t' W B9 X; v
* ?3 U9 X8 b& B( y- N) J' n: Y4 L3 p" g
2. Импортируемые библиотеки
# N8 y& A( W0 s* t
# T9 Q/ H% Q7 m Y6 f$ I- package org.l2jmobius.gameserver.instancemanager;
" ^/ R, F% `6 _+ s
5 b( y* h9 R4 F6 T5 K& S; Z- import java.util.Map;
# n9 P0 G6 i) N' N: ^ - import java.util.concurrent.ConcurrentHashMap;! A- G) W9 B/ ^# h% t
- import java.util.logging.Level;/ x& m; u9 [- l' ~, G( z
- import java.util.logging.Logger;
& s8 H/ o) d# I' ], g - ! Z' K9 e1 a0 j7 r5 N5 U
- import org.l2jmobius.Config;' b! b; ~, K* e& X) l: F6 l
- import org.l2jmobius.commons.util.CommonUtil;4 A3 ?4 R' _9 I! X
- import org.l2jmobius.gameserver.model.quest.Quest;, b6 g {/ y6 w8 o
- 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 — менеджер для работы с игровыми скриптами.
) e! h9 T. ?7 X. Z3 K8 F8 A
: ~ S/ q1 }, T+ W) }3. Описание класса QuestManager$ e$ a7 r0 ]7 B
- /**- {6 @% G& G- C
- * Менеджер квестов и скриптов.6 W- v; h5 y; q* }: k
- * Автор: Zoey76
& `( h5 ]- j+ G: |2 r! G- Q - */8 _0 u8 l/ R4 K$ ^) j
- public class QuestManager0 q( z6 K4 _0 w! f/ e1 M# y
- {' X* B7 [* o2 g- Y
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
0 w, y* ?* _6 b9 \# y# W4 F% ? -
7 i- O9 D5 `" d6 i) Z - /** Карта, содержащая все квесты. */2 O* I! e5 M1 n' f8 u7 P
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
! u% Q: E/ f* M+ ^ - /** Карта, содержащая все скрипты. */1 p9 ?5 m- q0 P G; T- J
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
# d- A( s( O6 E8 }1 u9 n- D -
( d- i/ D/ r9 y8 z5 }; w - protected QuestManager()
9 d6 T6 {8 k& g1 a x9 o) f- b; f - {$ e! }) D5 `& f5 C& C
- }! x" r2 p- W2 s
- }
Скопировать код 4. Методы J ^* d/ J/ j2 {
Метод reload(String questFolder)
- X* C% W, p. @( j% H- public boolean reload(String questFolder)- U* E# }* z3 |, }+ j# M1 C# `! F- e
- {( \4 x+ c. s' R6 K4 M g' ^. Z
- final Quest q = getQuest(questFolder);! A/ X( p8 v: j. a
- if (q == null)% j" ~8 J) o3 m$ o T' f
- {6 C# m, r" c$ Q' f$ V
- return false;
2 K7 ]! Z% S& A2 @ - }
; [4 }2 W; e B0 b! X - return q.reload();
w- u0 |3 L& `) ? ~& s( x! ^ - }
Скопировать код
+ y7 e" L$ n* @) ]# \9 T2 u, ~6 c; k2 e( j: }% q( ?* g
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.5 A. d' x7 l! o& l
Метод reload(int questId)
: R" e& V5 Q7 i6 j& a9 ~9 w7 _$ j% P+ d% P- {
- /**; I5 S" ]) z6 [+ G! t2 s5 O
- * Перезагружает квест по ID.0 b: ~# s7 L1 e; N
- * @param questId ID квеста для перезагрузки" r( g$ R: E0 p( b
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
4 |$ i3 h. o- \/ u& z9 K$ A7 h - */+ n' Z) c0 q" R+ m" W& a' \
- public boolean reload(int questId)
9 G |# X- }! {/ Z9 J! x! P. e: p l6 e - {
" Y) \1 J& r+ c& A* f6 } - final Quest q = getQuest(questId);0 m- U" U8 F) X& ]* ^) X5 C4 h
- if (q == null)9 r$ M6 h$ L) v( ` o7 X2 _7 V
- {
, X/ g3 e" d" h8 ]# Y- F - return false;1 W+ \% F* B) o$ S
- }. M" X" \! M3 F |
- return q.reload();
: {) x" m6 m6 b) D+ _$ O - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
8 i# j+ w$ R4 l8 B W+ C5 U
9 ?+ n' _ y: E; ^1 z) b6 @: j- v% ?Метод reloadAllScripts()
; O# y# M2 L2 X6 T
2 I! g/ E. B' Q3 V$ y* q% x. t- /**+ O! g8 w: h0 f6 w% F
- * Выгружает все квесты и скрипты, а затем перезагружает их.
5 B. y' K0 X' L* P7 O - */
7 \$ u9 N% G! z1 C& j% A - public void reloadAllScripts()( o: O6 ~0 W3 p' W4 J8 n
- {
3 _" u3 O: K F0 O/ g( s) W - unloadAllScripts();
1 c- ~9 z Y2 h) S! m$ d - ! F$ ~6 T7 x" }2 v+ N/ H
- LOGGER.info("Перезагрузка всех серверных скриптов.");
! k2 c1 s6 M. j6 T - try0 K) s8 Z$ l+ Q1 k
- {
: X3 F2 H5 U; Z" q - ScriptEngineManager.getInstance().executeScriptList();
$ k8 n: f) m& n - }
6 n( \/ `" w- `( P4 C - catch (Exception e)
. z; R! R: ~, {+ o' K - {
i5 N" F0 V# e7 Q9 @& B% u* J - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
1 J D# e1 L: E% ^ - }7 m2 c7 {' }, N7 o3 P" F: j: N0 Q
-
/ ~2 j, W& u) B# W+ s - getInstance().report();: E1 D' Z0 [ ?& x
- }
Скопировать код Метод unloadAllScripts()) W; o2 o# g) o! v# t
. R* D, i6 B" ?6 G0 L$ }7 w" T
- /**# ~ |7 ~0 r1 x) I9 f
- * Выгружает все квесты и скрипты.8 H% C& [& ~* b1 b9 P6 z3 P6 l
- */$ s: i% J; P: F5 v: e% [
- public void unloadAllScripts()
) L$ K p) a' c# J+ J - {- T( L* U7 q4 S C/ T, E
- LOGGER.info("Выгрузка всех серверных скриптов.");+ a& A- W% r( q8 Q
-
) L* F, P7 y# r# a- ]- n - // Выгрузка квестов.
5 {1 L6 ^, c+ U! [6 Z) ` - for (Quest quest : _quests.values())7 I. B5 A4 n% y. K
- {
5 u8 `5 @; l/ |- g; g5 E - if (quest != null)) x% c+ ]) c+ I4 D+ L. ? b
- {* `3 P' l) x2 T- Q( @
- quest.unload(false);
% h9 v o$ S) p; ]* d" P - }
; m) n/ m1 v5 a5 X, X# T. d5 O - }
B% E: B$ |) ^! r( _9 l8 G - _quests.clear();/ [$ ^4 l5 g! w: |6 I; c
- // Выгрузка скриптов.
/ G9 t- |- E5 i+ D; p - for (Quest script : _scripts.values())
+ w$ c" k4 L+ [ M: E - {
. R1 u- i" j. M: k! y7 a - if (script != null)
5 o& l" ?9 ]) l - {/ l% @6 }3 H: q; y" o( {; v
- script.unload(false);3 b2 Z& {, _" @9 ] u* }# M& X
- }
! k; v: _5 b& \. O- r - }
; z: Y1 }; ?4 E7 [) ^ - _scripts.clear();
6 L$ E8 R8 E. y, k+ E0 i - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
# }$ f! {* b: P# x: J/ s a' A5 A8 G$ g
Метод report()# i. [2 O' a8 P
+ `2 w2 O1 g3 Q- /**' {0 y, H9 q/ Y3 r$ [' [4 k. D
- * Логирует количество загруженных квестов и скриптов.
2 L6 t9 N/ z, C* g - */
. ^2 }+ W- t6 K7 K+ v/ G0 ^, | - public void report()+ i9 K" x. v& {# O1 _4 S
- {
: I' j# a! k! c. f% R5 c - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
8 R1 ?7 Q5 ?/ W" s, r - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
$ t# d2 d% S5 G% e3 X. N - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.2 q. d7 r1 q! I
; Z3 Y* F' ^5 K) P- U
Метод getQuest(String name)
( K8 q4 R9 i& o* A4 J) R" ~3 z8 d5 p5 [3 o
- /**2 |/ r" q5 ?0 `2 i) K
- * Получает квест по имени.) z' o3 Z" C* ?; |7 u+ m: s; k! F
- * @param name имя квеста
$ Z, G( A4 G0 ~! f- D6 h: m: E - * @return квест& g! M6 R. F8 X5 f
- */$ X& g' v2 N$ e
- public Quest getQuest(String name)6 f# K+ Q# _4 Q
- {
1 g, n4 q' L, G4 m; y% f+ j: [ - if (_quests.containsKey(name))7 R9 Z( C! g: n4 G
- {8 I) \0 ?& ?- N: N* V# t$ e& y
- return _quests.get(name);
+ j( A# y" m; x! m: K - }" Q+ s* B* D; v i% [1 P5 R
- return _scripts.get(name);
$ y+ S9 D+ |8 ]) u% z& C* l - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.( a1 H$ ^ \ E" z3 _
& J! N, W) @) B. N2 E) u( d5 _: ~9 p: v0 {Метод getQuest(int questId)" K2 h) m0 K& y7 m: W$ n7 q/ _ a- ]
" J) |1 C8 N5 _# r+ P
- /**% g. `% P& T, H
- * Получает квест по ID./ E. L1 I! ?5 P5 A$ [. x9 W% q
- * @param questId ID квеста
$ e2 C( [3 P2 @; M6 ]/ B - * @return квест, если найден, {@code null} в противном случае
% Y. ^7 A. p* r. N - */
0 o. R& |8 b* p8 ]0 J% o1 N5 ~ - public Quest getQuest(int questId)
" H# G, D7 U: ^ e - {: I1 H$ ~+ N9 _# |) _0 i+ L
- for (Quest q : _quests.values())
' D/ ^3 |' J" }& l' H4 v - {
/ E6 J$ C/ e' ^$ S' I k |; M - if (q.getId() == questId)
1 `& H! g- d9 c, M - {6 z8 P) Z' j% o6 a
- return q;3 Z, }: f/ K, q" W
- }2 a$ a \. C8 i) W! G$ Y
- } D3 O% j' |9 [
- return null;6 l. G# ~" t* P
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.2 E; l. q3 m$ T' {
; \0 Y: O6 d( M/ _8 f* hМетод addQuest(Quest quest), u: y) u. }3 R [4 u7 c; @
8 D5 o9 q9 K0 k* C |% q
- /**
1 v! I E% O. w i1 X: L+ M* L - * Добавляет новый квест.
. c: Q" F" D, ?6 d8 |5 z { - * @param quest квест для добавления
3 i+ s' R( D3 |5 K: s - */' r" _6 `1 a' M3 n4 L
- public void addQuest(Quest quest)* m7 A9 P0 ?: Q% H( _) L1 y6 c% o
- {
+ z w! }/ v/ R$ U# H4 Q$ ]& v' {/ @ - if (quest == null)
% F6 H/ e7 U- S F# v - {
4 B# e1 y9 l3 U ^. L0 a& W - throw new IllegalArgumentException("Аргумент квеста не может быть null");
2 k% g. \& [+ m3 ` - }' t/ v! S( ~$ k5 `2 n9 m, M
- ! B8 m7 C7 T$ |7 r8 ]" ^
- final Quest old = _quests.put(quest.getName(), quest);
8 `! u0 W5 ^1 Z3 R! ? - if (old != null)0 a+ {8 |; w) ]
- {
- Q! d3 }' G; W5 w: Z! E% D- | - old.unload();, e8 d, { K6 R9 ^
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
3 s9 G1 w4 j2 R8 m2 ] - }& K2 c) V+ l, b! a1 k; p
- ; h0 Z9 x3 {4 d% e% |# X/ Q
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
$ F6 [; x5 t0 t0 c J- H - { E3 M: E9 H: v1 Y9 I9 a5 e+ G. c
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
' E7 | p# A( a - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
$ ]8 N4 ]( b! T- M8 E4 P) j - }( g1 R1 f% i8 z% h. o# x6 a. {4 X
- }
9 P0 S8 N8 l9 ^; q* z! K, b - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.. ?) V5 v# L1 ~) a' _# [! j, n
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.* v7 g! _7 Q f7 O- q- T x% e
. n- c, l7 p7 c4 R! }9 ^# y6 E, k! h: @# c
! \( C$ W' [6 L, u. I
9 H9 y3 V% M2 x. W# V& q8 ~8 d
|