Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius, M5 }, v/ i7 C f" E. g/ ]
0 S% L% O. ] b9 c3 c" UРазбор файла QuestManager.java; ^& p- m; t. K" A
1 l% b i3 _" s9 {5 K: rЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.3 D% s3 B- P* Q D4 J
Основные элементы
6 h$ e3 o( h$ n" Y) X. A/ v/ i( ^6 T+ i- Лицензия
@% b# x, y0 `- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.( ^2 e9 D' @7 m: d b7 w) P8 n
- Импорты0 x7 F) d5 Q& j+ J
/ g p+ b& [+ i) DQuestManager.java — управление квестами и скриптами.
! ~$ T& x8 G4 W; z/ n" MПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\' \ \ P- g) H; J' [; x
# w# s6 W1 c v6 J& x, C4 `/ b1 {* b# V; F" C
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
+ _8 k% m$ w" o5 V* I7 f b1. Лицензионное соглашение' Q- L8 Q6 _1 M9 t/ O }
- /*7 _3 S4 i: G* ?( q* x$ |4 O
- * Этот файл является частью проекта L2J Mobius.: R- |1 q5 m# z" Y; P6 m- |
- *
3 R) b3 H8 @+ c& F% _3 [ - * Эта программа является свободным ПО: вы можете распространять её и/или изменять" `6 Y- d: K/ D M) i- b
- * её в соответствии с условиями GNU General Public License, опубликованной& v8 @. J. o9 V" c
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.* s8 t2 P* z, O5 Q
- *
9 v4 H. `6 t; H3 h0 J7 X - * Эта программа распространяется в надежде, что она будет полезной,
3 v1 E9 i7 x/ l5 o- q. @- D8 R - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии) p5 G) i6 R6 q- H) M4 m+ t2 L
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
0 ^$ ~$ B8 a2 F' X, t7 C3 x - * См. GNU General Public License для получения более подробной информации.
( Q, b# N! l5 S& |- O6 a - * 6 n: X$ p' V/ m& x' V! u
- * Вы должны были получить копию GNU General Public License; D' ?; P, s% F5 O1 F
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.& C1 X# |+ u9 w' O; Y7 d
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
2 t0 ~" I4 u2 U3 a6 C3 u2 V x. a" J/ N
* f2 d+ W8 ]8 `7 J
; H* e( y- i; S _2. Импортируемые библиотеки& O" R& D/ X0 ]5 q+ X6 D
$ o! b( x; q" A7 Q- package org.l2jmobius.gameserver.instancemanager;
: b' J0 A5 c( l. d% p1 s. O
7 {6 c- w% E$ ~) `7 E- import java.util.Map;$ ^5 ~- z! O' t6 n
- import java.util.concurrent.ConcurrentHashMap;6 v5 b$ B) m; F( ~0 A3 t6 Y0 g( q' b8 R
- import java.util.logging.Level;
3 Q. Z% D& \; C! O1 g v! [ - import java.util.logging.Logger;) o* L) o" l+ a+ {+ H/ j
& @" ?" R& m/ @0 C" k# |- import org.l2jmobius.Config;" P- c3 b4 K G; a# k: Q* G! b1 r
- import org.l2jmobius.commons.util.CommonUtil;8 U5 W' w0 Y- Y7 D
- import org.l2jmobius.gameserver.model.quest.Quest;9 J5 u" v6 L% U- A9 b3 V
- 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 — менеджер для работы с игровыми скриптами.
" [& a& M+ z& ?7 L0 z1 c+ C
- [; x& a# A. [3. Описание класса QuestManager
6 x* o( @/ j/ Y5 F0 J- t7 _7 r# n- /**
# J7 |9 q# z r; S - * Менеджер квестов и скриптов.
+ b4 {% \9 ]; W. W! Z9 ~ - * Автор: Zoey76
' z1 l! H9 y7 X% b+ e - */& X/ N3 }, _1 f; r- V" `
- public class QuestManager; P- ]" L/ s) O8 G( _- }! G- x
- {
1 X5 S8 ~% }7 K9 e. C8 {( \# ^ - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
6 t: i) t& J8 E2 g -
* r' D6 ?8 b* r: G* H - /** Карта, содержащая все квесты. */0 u5 S2 M7 v$ M' B+ L" j
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
h- U( g# ~: s - /** Карта, содержащая все скрипты. */. q# S& R; h5 r/ F) P
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
x: o6 [9 h% P% F -
9 Q% N: D# g7 ^5 \0 C, h - protected QuestManager()
* A! _5 p5 w* z; V4 E - {- x6 j5 M |" I1 Q3 q" c* e
- }
' l5 t& o f7 e6 \# _& |& H - }
Скопировать код 4. Методы
! ^9 Y @# A6 uМетод reload(String questFolder)
7 o' G* z5 P u& `5 N8 y6 S: b- public boolean reload(String questFolder)
: i+ p/ p- ]$ m - {% O% ? U# d' T* p; ]
- final Quest q = getQuest(questFolder);+ I3 x6 E6 z- l4 t5 q
- if (q == null)& j4 e8 l) Z& |: J
- {
. q4 T9 a- A0 S0 L" w+ y- U$ L) P - return false;
: Q0 P' {4 ?) U# \3 y( n - }: |8 Y* Y* K- ~( A5 b/ q' ]0 t
- return q.reload();
% x9 ]7 X( Q1 ~: g. k% L' p# O: g% F) L - }
Скопировать код
5 z; ~) }% X8 q3 r- J7 P/ C! E/ t9 M/ T D5 O" o$ \
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
0 \' f' _7 R# h: K7 ?7 ^8 L9 IМетод reload(int questId)! a* u. [2 y7 r- h. s
1 A, W0 H/ L& H' X
- /**3 m/ U# |. f! V# E% K1 o$ Z! N
- * Перезагружает квест по ID.
# ?# Z# [6 I3 c6 W# c" u: C - * @param questId ID квеста для перезагрузки1 u0 p1 @' k& q
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
- F m. O! r6 {6 \$ v - */
9 B! k" A8 x: N/ ~+ G4 ] - public boolean reload(int questId)- E! |& G$ e# n4 K
- {
9 |. ~" ?) N1 v& S7 O - final Quest q = getQuest(questId);
; H+ c0 k% \+ S* j, S - if (q == null)
@3 R# I. v7 z* \6 l, L - {# x) M5 R0 X( }1 k) G3 O2 Y
- return false;# |$ i0 {+ l6 u; ] w
- }
4 S2 f3 \) S* U* m) c3 u - return q.reload();
, M. j% t! _/ h# A0 Y - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.& i$ P5 R. t4 W N, A
% p8 w' F# ?4 Y1 L/ ^
Метод reloadAllScripts()
! T2 g8 R: l$ A* B& y' T, _8 a+ C L% \. r
- /**
7 d9 E# v0 L4 a7 U4 M - * Выгружает все квесты и скрипты, а затем перезагружает их.
r! v9 o: h( I5 p; m, p - */
4 P7 o4 q& c% ?) ?: f - public void reloadAllScripts()
8 J& u' f/ }; T0 p2 g - {5 V2 n* z# ]1 B! ]2 q; w2 C! e
- unloadAllScripts();
; c2 Y2 {# R6 H6 ^& Y q -
* g* S3 X, O- [4 X' A9 M - LOGGER.info("Перезагрузка всех серверных скриптов.");2 I8 c6 w! W2 Q+ h5 X7 Y
- try
b2 n( Q# H+ u/ R' r% S - {
6 L' c+ G; p/ C8 j# v0 M1 E3 } - ScriptEngineManager.getInstance().executeScriptList();
! R" ?- m: s4 B5 O, j2 e( a - }1 t# T" ^# [* G) p
- catch (Exception e)
0 W: e- \2 ?8 F; c+ R+ G& a4 ^ - {; U& J; `: o! o2 f2 F7 H
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);2 z: `3 ~7 r$ M& {. W0 o
- }
$ q5 U: }. C! j4 J4 k -
: G* k9 E8 N; j - getInstance().report();) ]7 D' {9 O9 h/ j. p" L* e& I
- }
Скопировать код Метод unloadAllScripts(). S# u1 L/ o4 c6 q6 O8 @" @" B
! O; J0 g# a; {6 f3 }) ~6 k1 h* e- /**
2 L, ^/ k+ r4 a& U9 m5 T% ]! i* f - * Выгружает все квесты и скрипты.2 I; v1 ?+ \! }
- */
5 u2 R3 O/ O1 M - public void unloadAllScripts()' E7 m k7 O4 T# _
- {+ r7 P* ] ?$ }; v) \) p
- LOGGER.info("Выгрузка всех серверных скриптов.");
& w5 x i* [ I9 \# k# t - 7 R4 e0 }3 g$ h) [; }% r6 N, I
- // Выгрузка квестов.
; \! ~6 P; ~9 [' U( ~ - for (Quest quest : _quests.values()): H/ O$ h# p# ]6 K7 Q' n
- {
# W# {2 Y; E5 E3 v4 V2 V4 K4 v1 y9 j - if (quest != null)
1 Z0 T4 R/ c8 b4 p5 A/ f0 e& b - {; E! m7 J/ u! W$ I# C$ v$ _' J- W& G
- quest.unload(false);9 [" z/ j" y' T/ X) I
- }
: ?! R8 V. o" `' v, n. S - }
. z* e, x/ d) L; \, o% U - _quests.clear();
1 z, |% Z% J( _ - // Выгрузка скриптов.2 ]! Y" v5 p+ C9 C( T$ i' U
- for (Quest script : _scripts.values())
7 X) n! ]: }% s r, S( o - {. y9 o: R1 D- K0 {) Y
- if (script != null) c+ E2 C+ S/ ]* z/ L
- {
) l# [3 s: g- W0 q6 S - script.unload(false);
$ Q3 u1 F, O v7 _- n5 |3 G z - }# R' r n. _# E
- }- S: i9 v2 |3 B$ u2 b
- _scripts.clear();8 V) t1 S7 y5 g" R) L
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
2 ]% ]1 t8 O" ?/ F - L8 P- V/ H0 R' \( B4 ]" U# v/ D
Метод report()0 x5 E& [, P9 J) n. p& b7 S( X0 h
6 H; L- @, ^, { I
- /*** X1 P) j6 @# w; B1 p
- * Логирует количество загруженных квестов и скриптов.
" e" V0 d) a! A, Y/ J7 Q - */% N( E6 H$ G# x' V6 s
- public void report()
) `6 i4 L+ I7 V5 A7 u - {) x8 G; Q, w) s4 d
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
& O0 o: ]( B1 i9 m% l - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
( P/ q1 `8 `; M8 Z - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.* I7 B+ U" l# X' F& Y3 m
/ c* N+ K: [% ^9 _
Метод getQuest(String name)" B8 q3 ~1 J( |& |3 J
% ?0 T, t# O9 b/ k- T/ M4 a- /**
; B# F, k3 r4 _! C. b Z8 h1 d& w - * Получает квест по имени.6 Q3 p$ G0 S- q1 Z- P( v. b4 o! o: p5 p
- * @param name имя квеста
! D8 q' y" a, d" B; ?: Y; l, C0 C' ~ - * @return квест
' J8 M1 {5 N$ J7 F/ D: \ - */
8 `5 _$ V" F4 T9 j0 d" U& O - public Quest getQuest(String name)2 e+ x2 \) ]1 h* m! P# C
- {1 D8 l3 B; Y2 s, V1 ~
- if (_quests.containsKey(name))
n, g5 j9 g( n9 [) |* h+ ^: R1 ? - {- L- ^, W/ P7 L! \# {5 M6 F. D5 N' s
- return _quests.get(name);
3 T. l9 y/ {! | - }1 \6 f w8 h* t
- return _scripts.get(name);( y) d' G- G/ @; H7 o% K ^
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.* X# ~/ T+ g! _4 m4 ]# P$ I7 A
" ]0 l: ^2 @" Y y: @" ?7 o. ]Метод getQuest(int questId)" V G( s# ]( x# _& X1 c1 I8 ~
; e" j* @' x9 i4 n- /**3 A0 `4 M$ f* p( A
- * Получает квест по ID./ r% X' K$ @' G$ v' u
- * @param questId ID квеста/ l1 k+ L: B% b- m- W5 g) }3 s
- * @return квест, если найден, {@code null} в противном случае; R: |. f% ^. l7 h& Y" R6 j/ `( i4 A
- */6 ?0 P" K3 L$ `- x/ i
- public Quest getQuest(int questId)
- z+ w; n7 k1 E; v8 c x - {
" h" |" t3 ?7 x a T - for (Quest q : _quests.values()): M& a1 z* I. r; f) e, ]1 D
- {
( e J6 T# g1 } - if (q.getId() == questId)2 | D o9 v- l9 n# p! E
- {
8 d1 ~! ~) @) D4 l3 \5 L - return q;
* d5 L, s/ u3 ]3 Z R - }
3 d/ @$ \4 w- Q6 N9 }; w9 T: E! `4 ` - }
2 ]5 u. I' E; h( \! |6 d" W& P - return null;
5 Q# e. L' d7 W! q- G- V! @ - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
4 m6 u5 H9 F) D# }" k& t
. R) b. t0 u+ A/ D1 e9 J uМетод addQuest(Quest quest); r$ `6 u$ ?. O/ N ~2 |* i
0 K+ J8 z" c; X1 i B, R- U" D2 E1 G
- /**
# M( _; X& j" f+ M% x: q, V+ H - * Добавляет новый квест.' t3 {3 e- C, X! `
- * @param quest квест для добавления( F% P! T# U, D0 [
- */) V [0 g# n4 e* s6 D1 p$ a
- public void addQuest(Quest quest)% [ Q; x9 d- E7 L. W) P
- {
5 e5 F3 l: ?# l6 X - if (quest == null)
0 Q7 P3 g1 E5 B- Z0 S0 N& w$ b - {
1 d6 R$ D: i2 C - throw new IllegalArgumentException("Аргумент квеста не может быть null");
% F: `( {. N J$ p3 x - }8 W) ]. H4 F3 }9 _
-
6 \% R7 T5 C( d - final Quest old = _quests.put(quest.getName(), quest);# Z) U2 ?* C9 {4 B# v$ Y# r: g
- if (old != null)
5 [& k: ~2 a+ {; R - {% B, x2 M; t2 a$ V9 ?/ c% l
- old.unload();
. s- _) D( l1 d+ g& V7 [) L - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");0 t! o& A/ x, a% }$ B$ s
- }
$ \! U6 Y- {' h+ M5 s -
8 |+ |/ [2 u" M9 C - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS) C O+ D2 _5 M' Z' Z) q
- {' G' P1 |: ~4 J$ x' [1 n
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();2 N; j+ O8 U. H7 y
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");' k5 g7 c3 P, D/ ^3 [" Y+ C
- }% j A- m9 }1 X$ q2 `) F, T, [
- }
! a! u5 z7 ]- Z! [: _ - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.: K4 E3 m \& d" l0 H* y* j# m w
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
# W. X- o5 l# L8 z% U
6 X, ^0 @+ }1 u& V4 k; u
2 l3 q2 P v* C0 S9 H( [& l- R. |- T7 D, \; U
|