Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius% K6 t, t! D# y% I0 x% ?6 ?, j
4 i1 D2 u0 |# D" M. h) [
Разбор файла QuestManager.java7 U- c- V& J! X2 _& ~7 x
: x3 f5 t' p4 E% L& k. J- c; u1 aЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
- T8 i9 i5 s/ D3 h: B5 c; GОсновные элементы$ G$ n: O) q0 q$ c7 [
- Лицензия5 d1 d/ C2 o; R) Q
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
- q' E; S2 u$ R' R- o) t5 w
- Импорты, i7 u6 h) `1 ?( M; h1 Z
. C" R) X. b( ^+ i7 l2 X* B* O% N; e& ~QuestManager.java — управление квестами и скриптами.: o6 p; c- P# _9 h0 S- L
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
. }9 x. L# [3 h! Z6 B
+ @5 Z: q; [6 U2 G5 N3 ?; e: I8 v6 b3 S
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.( o# j6 m9 A3 X Z. k( N! i3 C, [
1. Лицензионное соглашение
* r3 S5 ]0 O" j- P0 e- /*3 d7 h E \6 G: c
- * Этот файл является частью проекта L2J Mobius.7 f# k6 ~* s* a5 z) c H' z
- * 2 P2 S q( m2 X; w- `/ u( {
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
1 g2 E Y6 n' C6 ~ U0 S - * её в соответствии с условиями GNU General Public License, опубликованной
6 I5 X, z* \8 p% o - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.. T; q' h( m3 g. l; l0 t
- *
! o. ]/ e) P, E, I - * Эта программа распространяется в надежде, что она будет полезной,# T! }7 u% v* M1 w2 W) V9 M' r
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
$ S/ }1 U3 G/ a - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.$ |) F2 N7 ^- t' p2 Q
- * См. GNU General Public License для получения более подробной информации.
$ d5 m, U$ ?' w! { H* s - * 8 B) n7 C, Q1 m. Z
- * Вы должны были получить копию GNU General Public License$ l5 Z# \: n( V* O1 c' v
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
! x i/ Z: v; ~* z - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
3 u, h3 S6 d% c8 y) Q
$ r. ?5 L* g& @, p9 ?5 h. U
5 c. h" H& w6 I( v2. Импортируемые библиотеки& F9 b K% F. D) u
% }7 I' q& h/ I; p Y9 }- package org.l2jmobius.gameserver.instancemanager;" q2 p; [% {1 ~0 f+ f
- ! ?# X. M4 i" T; ]5 J( j. ~
- import java.util.Map;, ^+ H1 w5 ^: t @
- import java.util.concurrent.ConcurrentHashMap;
! o2 @+ l4 Y+ C - import java.util.logging.Level;
" T4 G" F" X7 O2 G9 r0 h6 P - import java.util.logging.Logger;
. i7 N; @0 F$ p/ l, E
2 d9 Q1 Q. E# s7 V( Z" l/ i- import org.l2jmobius.Config;4 @& q0 ?! P; d! e; U
- import org.l2jmobius.commons.util.CommonUtil;' f4 o6 Q* q; n% W5 n" E9 S. o
- import org.l2jmobius.gameserver.model.quest.Quest;% n+ i; v& D& t# @2 `( J
- 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 — менеджер для работы с игровыми скриптами.3 p* F# g4 x& l3 q
5 `* ^$ p( _1 U3 L! |/ Y8 z: v; m4 a- }3. Описание класса QuestManager
a2 e$ E8 w! f! H$ u, t7 I" z" p7 o- /**6 c6 M6 R7 F7 a( G5 h: S1 ]
- * Менеджер квестов и скриптов.
" x8 y+ A" z' K - * Автор: Zoey760 O! L! B( ?5 w: j2 a( A6 }2 B
- */$ f1 m( Z$ u! V3 ^& `
- public class QuestManager R( P) o/ S# M2 O
- {
: b! T& N0 c, Z* I" C' y/ o. u+ e - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
4 L! C1 W% D: \; G2 `2 H -
5 o% L# h! |$ b" S5 f9 @6 [ - /** Карта, содержащая все квесты. */* ^1 V' ]; P: |0 K1 m5 |
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();) I9 M/ b `7 o) ~2 _
- /** Карта, содержащая все скрипты. */
! R+ T% ^& r& f; [2 a& E - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
~3 l8 g# @/ K6 P. S -
7 e+ Z5 X1 @" Z( G' N8 `4 } - protected QuestManager()
- t2 k5 H2 T: `' t1 e$ v - {
, { \2 t ]2 l; ^ - }* m0 Q' S, z! [, I# V S' Z2 B: h
- }
Скопировать код 4. Методы+ Y" m8 `2 @3 K6 H4 ?' E
Метод reload(String questFolder)
; N9 l/ C, m3 s" j- \/ s; T- public boolean reload(String questFolder)4 j; m) I( F3 z, P5 K3 Y
- {
, f; ^5 a1 I* x* x, C - final Quest q = getQuest(questFolder);5 M$ K: }- M$ e. e" h- K$ D0 J3 r
- if (q == null)
) I7 c, p* w. _+ l - {( `# T. m; n; m& E. u
- return false;
. c8 O) Y- Z* v5 T - }2 u. M3 C% I2 J/ ^" ]
- return q.reload();, D: z* [2 U1 m" N4 N$ |
- }
Скопировать код
8 N/ C- Y: P: j3 [+ j" D6 v A& K+ M' E' z2 |
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
- |* S& m; a |; Z9 z* u; d$ dМетод reload(int questId)
: L; r% c# P; H' ]9 S+ k4 d
2 e; R4 s" S) Z0 [- w- /**# E$ \- S, j& a+ M$ B' [. P: a
- * Перезагружает квест по ID.
) }0 {! z3 w% S9 I8 ]0 Z l; ~/ @) r - * @param questId ID квеста для перезагрузки
. v: A# g3 s# q: Y6 l+ K - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае' n: n& F3 C" `
- */5 F+ T* C3 K# d( l
- public boolean reload(int questId)2 M9 b7 I( j* M5 r: r5 \
- {/ w6 M; u' Q! \$ c" H
- final Quest q = getQuest(questId);" Q8 n) Y; C- z3 K* f* D
- if (q == null)
; c& a( a; s) o$ Q& A/ u& v - {
$ C+ K4 x. E; }* V+ r) X6 z - return false;. w6 n6 w: K- A: |7 m( Z3 [
- }- Q" ?" g! S, ]! _
- return q.reload();5 z4 B. f9 K: d7 U/ Q) s
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.$ N$ F! a; |& N h7 b3 S
$ Y% V3 a2 u+ N' ?Метод reloadAllScripts()
+ M( X% ?& e3 J+ @! Y8 m7 @7 B7 P) g( s) D1 i
- /**0 j0 Q6 @/ t5 o3 W5 N
- * Выгружает все квесты и скрипты, а затем перезагружает их.
2 K* H2 ?8 _7 `/ `- a5 x2 |, n - */. E$ L+ E2 ^) V9 f. i' L
- public void reloadAllScripts()" m' }5 u% I, f$ t, P2 c6 _
- {0 ^3 O U6 H, ^- D5 K5 `
- unloadAllScripts();
' B5 ~7 M2 E r1 t4 h, m -
9 L a6 Q& Z" x% U$ | - LOGGER.info("Перезагрузка всех серверных скриптов.");
1 `' g j" X# S% r$ J% f - try, L- M0 ~) ~/ b
- {
+ y# |' y, h8 d q7 l - ScriptEngineManager.getInstance().executeScriptList();
" ]$ I5 b* e# Z2 v- p- W8 ~ - }
& J; N, U4 i M5 i% M - catch (Exception e)
/ [ d* K9 t5 [4 S! U3 I* M% ~ - {) ?5 Q1 a$ [; J. d7 R& a
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
, Z- _# I5 z' o4 H8 C - }6 r- G+ S. g2 O* K
- 9 J* I% L5 l% {7 ^: E
- getInstance().report();- ^5 z) \' y! I3 _1 ?" {7 _
- }
Скопировать код Метод unloadAllScripts()
. ^* r1 \; P+ A5 R' f. x8 m3 i& c( E5 a. C* b$ ^! o( G9 _
- /**
2 S2 T* k; n, O6 i( _7 C - * Выгружает все квесты и скрипты., u8 g$ W8 m! C1 b9 d- o4 V
- */5 b, m0 n5 z3 Q2 h. g
- public void unloadAllScripts()
4 I( Z8 A; J+ m2 n6 M% i - {, J5 \0 f! k6 i2 E7 A" t
- LOGGER.info("Выгрузка всех серверных скриптов.");& a* H% v1 L- w
- 4 a- g O8 S; E h6 W
- // Выгрузка квестов.
Z4 p4 f$ P8 z9 H& S5 f - for (Quest quest : _quests.values())$ |& z- H( q1 ^5 E1 D( ~7 w6 c
- {
5 k4 b+ [5 A6 q y( M - if (quest != null)7 M) m( p7 ~# U4 K' h
- {
1 j# l: E. O& [2 J& f - quest.unload(false);
: k$ n$ k# N0 | - }& X+ @/ y* O% x( g1 x2 U' h
- }% b3 U4 u6 F# b8 d' K: K$ f: n" b
- _quests.clear();4 v3 \+ j5 R- a& I, H7 u- H
- // Выгрузка скриптов.% h1 F' @/ P1 u) W; @3 g( R9 h4 L
- for (Quest script : _scripts.values())) N0 A6 N# s; B( R& L" |+ u
- {3 O# Q( I( |2 J# L
- if (script != null)
, W' _2 w, s7 O - {
: z( |+ ?$ I% |9 } - script.unload(false);
7 ` N4 M- r4 U7 s# a( G% Z - }4 k$ y* b. |0 y+ @% T# I' c5 u; J
- }% W8 n3 \& s( {4 ]* y! A& i' k
- _scripts.clear();
$ j' d% Q3 J" Z% b4 s - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
0 z9 y4 B q* { e: i3 f
( J7 b% l9 {& T1 v5 M! |0 U! iМетод report()
) Z# G& V0 @6 s8 j7 L
3 V$ S# i* d6 J8 H' q" f& S7 F- /**0 B7 ~) H5 i7 e% J
- * Логирует количество загруженных квестов и скриптов.
/ _9 p& g' n% c0 {* s7 W - */5 f" w0 e* D9 W) U
- public void report(); [% ?& ~5 F3 F
- {
, t, ^$ t$ N' Z3 \ - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
2 p- p6 E4 s- _0 ~" ] - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
) k$ `! m2 K: x7 H8 e) n* W - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.; J' ]6 E7 d" F8 o( m8 E/ W
. {: \9 _; L+ r
Метод getQuest(String name)
" {% f* `. F9 P/ k0 B. G& p/ U; p
# C! e% e4 A# Y* \; G- /**- ?$ O( a. @" V2 j$ i7 C* _& w
- * Получает квест по имени.
0 z) s; X% i c: q# { - * @param name имя квеста- _6 v- ^ j$ k$ o/ m, D
- * @return квест
5 X3 ]; ]/ L# B9 u1 @- T - */
5 F$ H* \. e2 x ~; i7 z" k - public Quest getQuest(String name), N g c; p0 Q1 {3 F
- {/ V! ]) M H$ ]
- if (_quests.containsKey(name))
1 }1 H2 j- |% Q! q' d - {7 E* m3 m0 V% ~- b0 f6 Q0 b
- return _quests.get(name);6 _" z( m- m/ A8 ?$ r' D' B
- }
* b" a4 }. m G# z5 j8 U - return _scripts.get(name);
6 H, d: n) x7 M# W2 ]1 T# v - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
% D6 ]* i* P3 T/ o9 x& l 3 ~( j& w8 B6 x# E+ R
Метод getQuest(int questId)0 |. s9 k1 ^' l# C) [$ t$ _) T/ q
0 L/ j1 e$ T3 h$ E' A9 w7 I
- /**4 X8 [2 m' @5 Q1 T8 E
- * Получает квест по ID.0 I* U: S1 ^7 B* ?0 T
- * @param questId ID квеста5 m4 y5 L, j# ~& s: n9 h
- * @return квест, если найден, {@code null} в противном случае
9 [. K$ ?5 s W0 H8 l# N h5 z! X - */
/ t! m' p& N% `9 q% h - public Quest getQuest(int questId)
& U" z) R" D. \. v - {
$ P( b2 f+ p4 ~3 ? - for (Quest q : _quests.values())% m- ?5 l* i4 W( \8 }3 X
- {5 G9 u3 O% Y/ @% o' G" k" ]
- if (q.getId() == questId)
7 t$ F8 l' c: X2 N7 h - {: @" A3 q2 d' S$ _" w) J. c
- return q;
q; s0 P M6 g+ N - } H V) D+ ]/ m' \
- }
- Y/ C, U2 z) c - return null;
& X. i! q+ \; g - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.; w) f1 F: u- D0 z
" a9 ` J2 U+ u! P0 t( b% n# i5 |
Метод addQuest(Quest quest)9 H" E( [8 {% T K, }% e( n; Z
& h+ ]4 k3 F3 C6 m- /**+ H7 s( z2 O4 i9 P% l7 b
- * Добавляет новый квест.
. h) P9 ^5 r$ W. @ - * @param quest квест для добавления) ]# Q6 }4 n% S1 L* |0 I
- */" T- J0 _( O( d `3 D* o
- public void addQuest(Quest quest)
) W+ e- C) x7 p: z, i' f# ]- c - {& T' `3 ]* _5 }$ T) Q
- if (quest == null)4 I% I: A( P# G& H. \ X" e' `
- {: P3 u) g2 p) e8 G' k
- throw new IllegalArgumentException("Аргумент квеста не может быть null");7 P/ {' r- F6 |% e$ }7 z5 g
- }. o( W( { ^, ^, m* n( Y% H+ n
-
7 k0 y% v! W% |0 I; `2 u( V- [* f - final Quest old = _quests.put(quest.getName(), quest);
( l+ p( _3 g9 i) P; h4 Y- Z7 ]/ K - if (old != null)
" [! q! H: {5 W - {
/ h+ p5 ^5 P4 w* {/ l - old.unload();
9 l# ]/ A8 z8 q& r& L3 N9 P5 x/ \( F - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
- E' V+ P4 b( y - }: R$ d( _ {1 P; h2 ~( e$ f
- " k9 g4 E4 R3 k9 l" f C
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)& K0 Z" j, S1 j1 m5 h0 G$ c( @( w
- {6 H0 Y6 ]8 z8 H1 ?2 t, f2 x
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
0 r* b& X4 b1 m+ M - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");' t6 W) c- ]* @3 n# K8 S
- }
4 o0 P- j- A$ e2 g4 d - }
- G! j' N$ T" \# \! K# F5 u/ t2 l - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
8 K5 P4 G s' OЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.% k2 r6 ]& _ M" O! R3 o0 Q5 S
8 H9 s0 W; v1 l: W3 Y
. w, i. T+ {2 J4 A8 X1 z: Q' a6 r7 e7 I8 V: Z$ W/ Z9 H
|