Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius4 r0 \8 h9 \( D. |% M2 S
) Z& V# F3 g8 r! [, R- j
Разбор файла QuestManager.java
8 W9 T7 R. f: b: o- N6 w2 Z2 X9 W! f0 m5 F# D) k8 D2 V
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.8 M! h& Q* W% P9 m" _: o; ~ D9 G
Основные элементы8 S8 {7 p$ q) I
- Лицензия
$ q8 R0 q/ f V- o9 q" y. U. c5 e0 A- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
. o) c0 b1 N1 K% J% R: H
- Импорты% s9 g7 Q( F8 m
3 C( t' B6 i6 C( o& l- D5 x( n5 {QuestManager.java — управление квестами и скриптами.
- Z& S0 M, e- Y' ?0 l' `/ c: l/ VПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
2 t7 J `+ ?8 ]' c9 Z) D
4 p# v; ]( I- a, V4 {! F" d& K$ W6 j3 f
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
/ X+ _4 d. f8 f/ e& r3 j1. Лицензионное соглашение
3 X- [$ g2 U( [- I- /*
3 @; B. n5 V! n( {! J8 C; @ - * Этот файл является частью проекта L2J Mobius.
; o) Z/ L' `; |2 U+ C. ]* F - * X; A3 M5 J7 z* p* E
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять* `9 Y0 o; c1 b
- * её в соответствии с условиями GNU General Public License, опубликованной& y, g2 a# D" B' M. ~ |5 [$ Q
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
0 H+ _4 ?+ o7 C" b1 `$ q; u$ l - *
4 Q1 C& j- v* M8 c0 C - * Эта программа распространяется в надежде, что она будет полезной,( O; Z7 Y) m% K2 o: J' q; r5 i
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии! f6 M9 \! f# s
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.5 T& J, k! j6 b9 o7 b% K6 ?) [4 F
- * См. GNU General Public License для получения более подробной информации.
! M- q0 Z. X7 `* F0 v: |7 k - * 3 R) }: L% u4 x3 G) s
- * Вы должны были получить копию GNU General Public License
2 J' J( S8 V3 O - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
3 v" ~; C# `) t2 [8 o. _% \7 B1 w; ~ - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.# V6 U0 \# b2 X* ^
: @2 @' {, |9 `% h. U9 ` I, c% I9 `4 D) ?
2. Импортируемые библиотеки8 d9 B# J2 M' v$ m
& S( w) [* Z. z# [- package org.l2jmobius.gameserver.instancemanager;
4 j* K& ]$ H$ l8 ^
0 e5 P/ P9 G( x4 |' o- import java.util.Map;
" j: l+ V0 [) e4 t! y - import java.util.concurrent.ConcurrentHashMap;
5 ~! Q! ?& a$ Y7 a: y/ z - import java.util.logging.Level;
/ I6 L ?& [6 W. N: F6 [ - import java.util.logging.Logger;
: |+ ~9 v9 k6 n! n" v) H
$ ]3 B3 o' n ~4 d) l- w, `8 L" \# n- import org.l2jmobius.Config;0 j' D, |3 Y, {0 p Y4 Z
- import org.l2jmobius.commons.util.CommonUtil;
! r) F, C" a/ v - import org.l2jmobius.gameserver.model.quest.Quest;
8 _ Y- s4 [0 C) 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 — менеджер для работы с игровыми скриптами.
& }. i5 U2 n1 `
: w+ d* v* b' o3. Описание класса QuestManager
- ~5 f8 R* g8 A# f- h- /**$ P- J" q( J* P. W7 i
- * Менеджер квестов и скриптов.0 `, K n8 M9 J! T% x* n
- * Автор: Zoey76
7 u" ?) o, f6 O - */
9 s0 S! T" h- Y: O2 p0 K9 U - public class QuestManager( z% E* x: h ?- l
- {
+ g R2 B9 {& }/ s+ ?1 E( l# G - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
9 N+ e# {: q" m9 G9 D -
" s, J$ T1 N# J6 c0 @# C7 W - /** Карта, содержащая все квесты. */1 M! a. _" Q/ `. E
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();2 @% A) t4 r; S* \5 M) A
- /** Карта, содержащая все скрипты. */9 i( _( H* l. p) G4 h. f' l
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
5 k# Q. z3 b; ]9 x* W - " s/ x; t2 b# z9 i0 f& ]
- protected QuestManager() W. G3 F3 }* l, k4 O! c: y4 ^
- {, P- O% W$ D9 Z5 J4 x; _% |" U+ X
- }
: @) `6 `- h8 N: @" V4 w - }
Скопировать код 4. Методы! \3 I. [& B/ ?$ k3 u
Метод reload(String questFolder)
4 c8 Z9 l' r' h5 Z$ b1 Q( W- public boolean reload(String questFolder)
- H! I$ i% u0 E" n! K - {+ i& s% Y2 G, l$ L9 H. I
- final Quest q = getQuest(questFolder);
, i5 S! X* x& z* \ - if (q == null)
9 d7 x& x+ S# t, t! P$ ]/ t - {
% H D- P/ E$ w1 D5 J Y3 B1 H - return false;
/ ~0 m: ]" z5 W r5 z8 b/ A0 r - }2 I o4 `5 W2 ?" L7 A9 o) D% Y- p% z
- return q.reload();
! I4 g" M$ n0 [% q4 ~- \ l - }
Скопировать код 7 t, A1 c: y0 P1 Q p2 C( f
. p. b: P# L6 t( ~5 R. d& nМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста., N& x8 B7 f2 z/ L
Метод reload(int questId)
5 R6 \; T, M! }& q4 B ~) m9 Q. a) n$ y& Y3 _
- /**
& H2 g& B! h* T) i8 M0 l5 @ - * Перезагружает квест по ID.3 p! \- N- |. ^ C: m
- * @param questId ID квеста для перезагрузки2 v `, r0 e9 e* V
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае, y! q+ F# Z- l" J4 k
- */
u% r$ \ K- \6 k+ \1 e - public boolean reload(int questId)# Y# F1 B* b" S+ {9 ?/ c; g
- {
3 H/ d! }8 e' W/ L$ J! n - final Quest q = getQuest(questId);1 G+ d) ]0 u& h: w$ L
- if (q == null)
1 b- h0 c! B/ N1 w3 P - {# P; Y u, Z" V. v
- return false;
" s7 J0 O8 Y8 i7 x' C* T/ U) d- N - }
9 ?! t3 e% a' s - return q.reload();
$ c& ^2 o; s/ H0 m - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
* c+ w- Z$ o" q; b* w0 }/ v( R 3 _) O$ _" T- h# I5 h! _/ P3 X
Метод reloadAllScripts()
' ^& S2 V6 f2 T& ?& S1 F; v3 g; ?" |& c* z2 B
- /**
: R6 F9 S% n U6 S: z9 ?, ` - * Выгружает все квесты и скрипты, а затем перезагружает их.
* N4 T/ d4 X1 l3 C - */& p' k6 i6 b/ B! f" r0 ]7 L
- public void reloadAllScripts()
+ ]/ m. ~% g3 E - {8 V: E0 H5 @; U% f- u# ]. b: L
- unloadAllScripts();
: x9 a+ A% Z, Z" c1 j. v$ n, r -
; r; P+ B* Z' _3 O - LOGGER.info("Перезагрузка всех серверных скриптов.");& f* \3 h: A4 C0 ]& A
- try' g6 k3 u* H+ X' f, e4 S
- {
3 w1 Y% E% T$ P/ _7 p - ScriptEngineManager.getInstance().executeScriptList();9 A1 u' ?- F: `" u: [
- }
/ V4 z4 M" l7 q4 P - catch (Exception e)% a. S% c1 ]. N0 A6 ]% x5 f
- {% d2 m2 Z$ T( ]
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);* l' A" O- |$ d7 G& w7 ]9 N
- }% {# t- V# v6 K( U
- , t1 G% O: I$ q f7 m% C3 s+ W
- getInstance().report();2 O/ l3 C! R \9 T9 p$ }; `7 H- n
- }
Скопировать код Метод unloadAllScripts()! i6 W, D; ?9 u: o( \$ c* i
( F. X @2 S" X% w. p4 A0 j- /**
P ]7 s E+ ?. u - * Выгружает все квесты и скрипты.4 N3 y: _, m6 ?7 e" J
- */- L5 a/ X- N+ d' g0 P7 \
- public void unloadAllScripts()
$ e6 |$ R6 N+ @) l! w# j - {
! [( \8 q |7 B6 _$ h4 `: m8 Z - LOGGER.info("Выгрузка всех серверных скриптов.");9 u2 l( |/ |/ a1 s! T
-
\( M \9 @2 g- T0 U% X6 i- B - // Выгрузка квестов.
9 o8 X- ~) U) U. W - for (Quest quest : _quests.values())+ ?' K" o7 V2 {' t# d% s
- {
& e3 M P% \ x5 ~6 E3 [ - if (quest != null): {7 q) R# x. v' F( h3 k4 i
- {
5 Y3 f$ d5 B. M: E R - quest.unload(false);! z$ ~9 [6 s* K
- }' Q0 Q: n0 ?6 q9 Y
- }; r6 E3 n7 \% K0 t! j1 o, K
- _quests.clear();* G6 J! C; F! p1 a
- // Выгрузка скриптов.% }& }" Y5 L4 d5 @/ k4 A$ H
- for (Quest script : _scripts.values())1 ?) _, c/ v8 J2 }0 F2 w7 }5 ?
- {& U4 ~, d1 f8 E; |1 l% @
- if (script != null)
/ |9 ]0 b1 Q- `/ v - {
9 q; _8 C- f4 ~3 a2 U8 r O - script.unload(false);
' F! U, l, j3 n4 t# `! C0 y7 M - }
" M: t! V6 \; U! y - }
: p5 p+ j' V/ m! z' h - _scripts.clear();+ e1 e' O7 w/ h+ x
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
9 _: Y2 B2 D; O 7 d$ m' ^( _ e! J+ P# l
Метод report()
+ S4 W+ a4 F p" F y
) a/ Q- w1 |+ b) E: p! j/ n- /**; _! w3 t) I9 \% h3 u
- * Логирует количество загруженных квестов и скриптов.
, L0 f3 V7 ^& \: e - */8 `0 P& A% J8 W* L' e- i, ]
- public void report()$ s$ T) ~, v: U
- {
' Y, s0 ~7 t& _" d4 b7 ]" s - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
/ _+ u5 C7 z" M9 d$ g - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
& V7 J7 f" f3 b" l" k( a, d | - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
7 Q+ ~ e* E* _9 {+ O 1 ?! K0 B: Z7 l5 Z
Метод getQuest(String name)
* s1 P% S4 D+ s5 ^
% q" ^, o1 ?9 m( q+ h- /**' Y: i) ?8 Z6 ^. x
- * Получает квест по имени.. ]6 c/ I/ V5 ^! T2 y& ^8 n: Z
- * @param name имя квеста
) W$ \* F. O A - * @return квест% K$ f4 q( k. b3 c4 v8 _
- */2 \' P9 w c$ H1 ]: s2 w
- public Quest getQuest(String name)6 \( Y( C v) U( F8 l7 `
- {
. ~2 `6 s; |7 J6 k% L - if (_quests.containsKey(name))* ?8 D7 C/ M/ J% q: A9 Q0 ~
- { X: j0 G8 H' N- \ |3 K
- return _quests.get(name);
9 F6 s- z$ p2 v& h - }' {5 y" ? s+ M7 m$ j) q4 `
- return _scripts.get(name);
! V+ [# a) C6 T/ |* t - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.$ \4 N$ O6 G; h$ e7 S. n6 |
\4 F; V" ^" G0 m8 KМетод getQuest(int questId)
( L( ?: t3 O# q7 @! V: B6 n$ b8 ?% @, a, j
- /**; Z `3 Y& G0 X0 W4 Z
- * Получает квест по ID.
9 E6 v1 o% C- M S' V' l - * @param questId ID квеста
1 T5 Y9 w9 j ~) n - * @return квест, если найден, {@code null} в противном случае
6 P' h/ J) a! j+ a - */# B& I$ ?6 ~- \" i! T, C
- public Quest getQuest(int questId)
+ N4 e4 V5 |& x# i9 u% E$ P - {
5 d5 r; G7 B' a2 {3 {- ]+ d, h7 l - for (Quest q : _quests.values())8 g" L' }" l. t& w4 e) s {- c: W8 {
- {9 h& \, h9 p* I( f* g- l3 P
- if (q.getId() == questId)
4 `! h' |- Y9 J- E7 @0 G - {
! j: f3 r' N0 w - return q;
$ P5 X+ d6 u. K" G - }
) Y$ C9 p) i6 @# t! t2 n9 J7 Z6 V3 g - }
5 O# |$ v& P9 V3 C. \7 d1 Y - return null;1 e% M2 x( U+ N6 Q
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.% y2 Q3 {' x" ]1 n6 P+ m' l
l% e+ L7 s! j8 U# ^* h" |
Метод addQuest(Quest quest)
- m6 U+ d) v) P- V( U
2 V- ^# ], P6 J, }- /**5 l8 U+ I9 }8 r, n
- * Добавляет новый квест./ P! _8 V1 s: L. v! p) t8 I* |
- * @param quest квест для добавления0 p- D8 N( k; q7 E7 R7 j4 w
- */
/ r/ R) _: m/ ? - public void addQuest(Quest quest)" D! @# I, y8 U2 Q) v. U
- {
3 o1 t+ q4 d# r - if (quest == null)8 T/ {5 X* A2 |" v3 I# X. H( P- }
- {
4 }' n" B. M; x& [; a u - throw new IllegalArgumentException("Аргумент квеста не может быть null");
7 d7 d' q( m) Y8 g# u5 c - }
; m0 I6 L/ r4 @+ f7 G3 A -
5 ^! S0 Z3 t0 S: A7 V; ` - final Quest old = _quests.put(quest.getName(), quest);, P" r! V- {' j2 r, w9 X/ ]! `
- if (old != null)
% {) x8 X' F: ?4 k5 D4 N - {* r1 n k* `1 K: v$ q$ f
- old.unload();( d S. h0 j, V* a: o
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
9 S( B v% K9 p/ F4 y - }
) p* ^5 `4 x: V, c. J- z1 K; } - 4 ^8 g! h8 k1 U6 T" o3 z1 Q, \
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
7 z+ v9 {) d# W. i" Q5 w0 ~. V2 g - {
( k1 W/ Q3 S8 B1 o - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
: Q% \- g F6 \' C7 M& f% o - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");. K P: C) r0 m2 \" V2 T
- }
: ]' [+ \- Q! i6 l! d' Y& E# I - }; k5 \1 u# ]7 n$ J* c
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.; B- G0 U# [% c. `' U
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
6 A- J$ w# D- i t9 V- S. x" A
4 h4 M( G, Y) f- q( v! n
! J( S9 M9 b' z* e2 k: l6 L3 s
, u5 W( V! n& x' _5 k |