Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius% ~* }; }) N% e# r3 ^4 A/ r9 T8 N! Y
" y" C. D- g- X u4 E0 IРазбор файла QuestManager.java
& i' @$ d; F. Q: J, l* u% f B/ I' c
+ ?7 e7 j1 T6 j! o; o# O2 [4 T6 cЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
' T; b1 ^6 g6 V cОсновные элементы' ?' r4 [7 D' C# _& j
- Лицензия
5 M* c/ c: ?, {0 s( o2 [- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
' w! T# B+ H! ?4 n) t. B
- Импорты
6 ~, S! w5 f) q, W% B) ^ ( x$ K" V% C* m
QuestManager.java — управление квестами и скриптами. G- S N8 x2 w6 ]! a9 ]2 p
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\; f: Y2 C& w" b
o& q9 M X+ T: r( H4 }1 E# a2 W+ a6 ?+ ]% d/ K6 ]! l; S& j
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.6 O5 J( v# [: b% F
1. Лицензионное соглашение
6 k/ L& ?9 L. s* q- /*/ W) h$ N+ V" `- g1 @) O) ~
- * Этот файл является частью проекта L2J Mobius., d* `6 f5 J5 B @( |: v; K
- *
& k- \+ t0 F7 E" L# V! y - * Эта программа является свободным ПО: вы можете распространять её и/или изменять+ U. ?+ o+ x5 w" K1 N3 w2 y! O
- * её в соответствии с условиями GNU General Public License, опубликованной9 v# w" B+ P ]4 n6 o
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии./ O } r4 g' O5 @; ^
- *
; I/ M; u" W# n. d, K! x9 \ - * Эта программа распространяется в надежде, что она будет полезной,
- y& x; `7 |, }2 s) d$ V1 A - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии' r$ a# F! E0 w2 x" t d
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.$ Z' \ M* F- m X
- * См. GNU General Public License для получения более подробной информации.
7 M1 Z5 Z) e' U2 d1 U) g0 p - *
5 T) w' A- F( `! O) v- c - * Вы должны были получить копию GNU General Public License* X; U- w! ^/ `2 O
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
- F8 U/ ~/ B7 N3 ^; v - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
! `- p3 a' y4 u: F9 R& C( x/ y( ? [1 ^3 }. y
! D# K5 X/ r# i& [/ w$ Y+ P. I
2. Импортируемые библиотеки
1 D8 P- A0 c0 A* t- t- S$ J: Y# x7 k$ s/ o0 p/ e' p$ N
- package org.l2jmobius.gameserver.instancemanager;) z1 E0 W; E, q, c- q* {
$ B# Z" D4 k8 ?' C& K3 O4 E8 m, l( I- import java.util.Map;
, ~* K: {! T/ L+ E: p$ S - import java.util.concurrent.ConcurrentHashMap;
- T: x1 Z+ [; b N4 e2 o - import java.util.logging.Level;0 U' P, m/ Z4 \1 J$ e
- import java.util.logging.Logger;
5 T7 g: X7 l7 R# ~# a% R$ H
* P. }+ o' a7 \% z- import org.l2jmobius.Config;
; ]8 m1 o% @1 K% T7 M9 U) @ - import org.l2jmobius.commons.util.CommonUtil;
4 I% v, P2 a9 V/ [4 ~0 F' m - import org.l2jmobius.gameserver.model.quest.Quest;+ A' G; n# U( \+ e
- 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 — менеджер для работы с игровыми скриптами.
* n/ T2 \6 ?7 q1 w" A. e( [$ ^: K; X3 M& B
3. Описание класса QuestManager
8 S" C) m, c+ X6 E- ~0 n5 P# t- /**
9 s3 z& O& |& P3 L" J& v" p - * Менеджер квестов и скриптов." k/ V6 p% p5 w
- * Автор: Zoey765 Y, q$ ]( A( {2 C+ D
- */, @3 \4 X% P/ z0 ]( r
- public class QuestManager# N: L/ e+ j" v) X6 N7 x" j
- {
2 r- C1 ~% m% e. l0 W3 F - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());9 S" E% h- b( q
-
8 L+ e# G; Y" W+ e- t' J9 T - /** Карта, содержащая все квесты. */1 j. F5 |3 ~' X, b1 z' x
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();" ^. M! _& F2 _1 E& }, x0 g; D
- /** Карта, содержащая все скрипты. */
) a9 y/ Q r8 I" ?1 o$ N - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();- @" W8 W$ ^% P! N
- 5 A2 q! l/ _6 ~ \
- protected QuestManager()% N% I* \& c; y+ K& I' ^
- {, f" c$ e1 U( ?6 l8 V9 |: o+ ^- b
- }
" z7 C k y8 j+ M9 ], q - }
Скопировать код 4. Методы: D! j- U' `; D' U7 q7 L4 ~
Метод reload(String questFolder)
# m8 q/ ^" x* |. s4 `4 j7 u- public boolean reload(String questFolder)
1 F! ^" U6 N' r9 j+ m! C5 X - {* h F& ~9 r# @5 Y7 | L
- final Quest q = getQuest(questFolder);# z* y, a. R" Y# q# o
- if (q == null)9 j& ~" L. t; @$ J
- {$ Y' k& T6 g: e2 m
- return false;, W7 P# r2 k; W$ O9 p2 m) O
- }- ?& t6 a# v! h
- return q.reload();
3 @: \( n: ?& b% G4 t - }
Скопировать код + [3 k& `3 ?/ d
( e$ ]4 |6 R: J& Z: K9 W
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
t- }4 d2 I+ p- sМетод reload(int questId)
6 l+ Z( [3 V+ b9 o' j2 Q) m# w( B! _' }$ u7 J0 l# T6 b# m
- /**8 f: e1 t8 o& [
- * Перезагружает квест по ID.
; a% b# ~5 L: a - * @param questId ID квеста для перезагрузки
; `2 U! |. X6 }7 J% {; s& { - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае& Y& k P# s/ w, i' Z- W; ], H6 p
- */, ^. q* C+ v( [4 R, z8 H1 L
- public boolean reload(int questId)
& w0 p- |1 _' ]7 z, P& r( x - {7 @3 t- H7 ~8 g
- final Quest q = getQuest(questId);# E* u" n& c1 Z! v. M8 A$ X7 X( s
- if (q == null)
, O, @, \1 a: {- k - {6 M: C$ t6 W2 S4 ~$ V w5 R' Q6 g
- return false;
! w/ n# H# y( n) t+ j" @8 l4 H! ? - }
! ]6 @' p% x2 X( B - return q.reload();; d! W; D5 C1 ?! W
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.' j9 K3 B | ]7 }' Q: U
# b& q" E% Y: N2 ?, NМетод reloadAllScripts()$ b) h- U, a6 ]; S: O# X
7 ?& c) k+ q l, s$ Z8 N4 C
- /**) E" O1 o/ `+ p+ t t/ S
- * Выгружает все квесты и скрипты, а затем перезагружает их.
8 p) o6 r4 F6 q5 S. Q - */: t' p* u8 p$ P- o @
- public void reloadAllScripts()
. a# y4 N8 A3 h1 T - {' g, K9 u2 C% n2 o
- unloadAllScripts();
& I7 s) L3 G9 g/ l1 Y7 _ -
6 m0 d- ^+ C6 F5 i5 A6 j' Y4 K - LOGGER.info("Перезагрузка всех серверных скриптов.");# w- |! ]. r3 ~( h" `; j7 k
- try
. J* T! b+ i% ^; } - {
5 X, R+ ], E; o - ScriptEngineManager.getInstance().executeScriptList();
+ h0 ]. C$ c' ?( [- D* F4 j# b7 h - }$ g( V8 O- k; x% X/ R q* @
- catch (Exception e)
( I3 n9 |* R' H' l6 [& f( V - {* [& `5 i8 G. F" } X
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
8 O& K K/ m- ?/ j0 j- P( Y - }1 E7 U% ]6 C/ ]& }! }5 n% o
-
, p( A1 X- ^; C- k9 H0 [# \ - getInstance().report();, `* ]$ j3 w) Y% }& F6 g: Q/ _
- }
Скопировать код Метод unloadAllScripts()
' f* P, A; L' V' \+ f2 G: u( x1 E% p+ b9 @# }
- /** s0 [ G9 B( y
- * Выгружает все квесты и скрипты.
$ |/ i/ y* p% ? - */8 a: U2 `! q7 n+ B+ S! B, d3 H
- public void unloadAllScripts()
+ u w% c& |3 G5 H7 o$ c - {/ D8 Y5 O' O6 [! P9 z& E5 I
- LOGGER.info("Выгрузка всех серверных скриптов.");
8 M% w( ]" D1 D: K |( k3 w) T3 ^ - . n) ?' E7 B2 b3 D3 ~9 S2 ^
- // Выгрузка квестов.* m0 ^$ p* j; [2 L$ ~% e' |
- for (Quest quest : _quests.values())
. W; |9 ^" a; i - {) L P& n* u- I9 k( W7 i+ h% y0 S% \
- if (quest != null)7 J" h- h/ b3 I% P1 `1 b
- {
" k$ @1 \- w, O1 J9 B( n, B2 I - quest.unload(false);) B( a% L3 L8 m( R' r
- }: _" p2 `% Q& L0 p. ~* w/ z$ g
- }: K+ ]5 f% g0 A. Q' D
- _quests.clear();
0 Y, H& d( }! Z5 x& _# E: y - // Выгрузка скриптов., C6 B+ z+ H6 ?+ N
- for (Quest script : _scripts.values())+ F9 A4 S% c) n% i
- {
8 S1 T5 ~' F/ _& x/ H1 f9 B - if (script != null)
- J6 A* G4 w n4 S9 A# Z - {/ H# H8 y& \+ S) }5 l
- script.unload(false);7 ~( o& m" h8 R* Q& l7 v
- }
* |- y/ p- Z ]4 |- p: _/ \ - }. b/ p; _- n; g9 b/ B
- _scripts.clear();
" x8 n$ M" Y1 M: m C' s0 R - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts./ |3 E9 q: e: g2 w* b& @8 c; c
, Q, B, g( w* w1 O& V* w! K* L) e4 oМетод report()0 M8 @5 B. N. e
) M; b! J8 [/ Q. k1 R- /**3 m! H+ ?$ n. C7 r# \
- * Логирует количество загруженных квестов и скриптов." O$ M4 x& z0 }- ?
- */' U4 }! E' @* I: t( ^
- public void report()/ Y5 n# ?% L Q- ?$ K+ p( [
- {
' Y& G8 m) I) y) I - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
& l3 P& v& T6 X: e8 M; m D - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
! s, A3 F+ U% [. r - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.& x% r. E4 i$ M+ j
8 ]1 A( m4 g2 ]# h+ R$ w: EМетод getQuest(String name)
" ^6 H" I6 @" [& `9 p. l
. ^) r# S6 E Y6 k8 ^0 M# ]' y- /**
( A# M e1 d$ x% A i" N - * Получает квест по имени.
( v. K, O2 z) b6 c; ` - * @param name имя квеста" M% S( [ D- A8 n8 ~
- * @return квест
3 \$ o4 s2 r+ Q - */
1 S* v' i. X: B/ D5 H - public Quest getQuest(String name)3 o* Y2 [) R- S$ i
- {
+ w& ]( ~, _" @9 u - if (_quests.containsKey(name))
* ~2 W! ]# B! X: l E* d - {
. c# ~: j1 c1 r) a8 I - return _quests.get(name);- @9 ~* R" u1 j% M* n
- }
1 e- b3 R. w3 ~" Q m - return _scripts.get(name);; Q! Y, U3 G8 u! @/ i
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.. N9 A- h, o' a% a
) s% a4 p5 M2 \7 w! D5 _" yМетод getQuest(int questId)
9 e7 i$ P1 V. t4 e
8 s1 `$ z' d6 @: J2 e! X- /**
* m+ T# d: S1 Q5 P) } - * Получает квест по ID.. ?8 F0 M) y2 O% d& n% l
- * @param questId ID квеста1 |4 F3 A) \+ m. ^
- * @return квест, если найден, {@code null} в противном случае
8 Z8 l$ S; ~/ B3 }8 m# f - */
2 H4 D. A- k4 Q4 P - public Quest getQuest(int questId)
7 r2 C e0 `0 y( `( j - {* w5 ?& H. O: Y! l: v
- for (Quest q : _quests.values())
/ A. k, m& [4 _" P4 | - {8 }" f7 M! L4 J# F
- if (q.getId() == questId)
1 _8 Z( r! ? \3 T6 Y z; z0 G6 k9 m* R - {/ n) @9 ?4 [* L' m/ c4 J+ T
- return q;
& {$ ?6 A- m1 \8 m - }4 w' x3 Q% g7 I, R( |; `
- }; d, x5 d# ~+ d; V( t% z8 k+ P
- return null;
- k8 u, K' R$ m$ _ - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору." H4 _3 C8 o1 |
1 R" k% h* S p! \Метод addQuest(Quest quest)' y& x6 c" K7 @! Y. Q: H
, H' K4 [% D, F! y9 K
- /**
2 [: I& K4 ?* p S a - * Добавляет новый квест.; T3 d# n) E+ O x* x" o$ I
- * @param quest квест для добавления1 Y C a: w' y
- */
( F# p" c8 Y; |/ z' r - public void addQuest(Quest quest)
7 e, o; A3 y- q, d" L7 c, ~) R) a - {
+ l7 V* y$ m; _) e c - if (quest == null)
0 U- A7 P6 ^6 Z: ^0 T7 ?4 A& F - {
+ E; c( n6 i+ ?2 }8 g - throw new IllegalArgumentException("Аргумент квеста не может быть null");
/ d( b- B5 J( t z' a$ V' f4 y$ N - }- m) U" z" Q1 H0 J c3 k- ^
-
, i; O; ~. @5 U& [$ ^6 a( `. ~& y( r - final Quest old = _quests.put(quest.getName(), quest);+ V+ h% N' O! r' f3 |
- if (old != null), M' O* l5 V" u o/ Y$ P: Q% {
- {5 h6 h9 {& R, C- b
- old.unload();
; U2 A% b& b* z- F% D3 `" e! U - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
6 v E. O* {+ X. q - }; ^5 q2 C% ~: x
- . m$ L W' D, j* A& M! i) b" T: z
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
. r) _3 G+ ^) i% N* H* Z% M$ | - {
, B2 ]4 u% O# i/ S! i - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
$ k' w+ W$ R2 t9 ?6 w8 G - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");/ Z6 @. n0 o R9 t* s' B
- }+ |- R" l" V) g" {8 b' S1 `
- }
8 @9 u5 Y- Y5 o, M8 H9 M - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
! u% ^# v4 F% S) e$ k- yЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.0 a" `3 Z2 p) t
/ ^3 Z0 e+ Z1 A* \: t$ l. Y5 E9 @: `7 i8 ^ M2 t$ V& V
& N" S/ h) r4 l2 [0 j |