Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius7 _/ Z+ t9 i7 D- J: D6 F1 |/ M
# X1 g" y- O6 y" tРазбор файла QuestManager.java# l$ ~1 E5 \8 C V
0 [# G8 S% ~9 ^
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
# g" g, B3 Z9 ^, dОсновные элементы
P1 s! q4 f( `& g3 V" T; @( u$ S* u1 s- Лицензия
# Z2 K, r4 k2 D! I- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
' m; Z7 }& k) {. I
- Импорты: Y1 Z: o- _6 ~3 N4 F" b
3 W6 F8 m9 g% {+ h/ K
QuestManager.java — управление квестами и скриптами.
* ?- x( g* M4 R6 UПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
1 D7 _ C- y* l: y
! @' \# n8 K m" U7 A% U- P/ _% O* I7 B l
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.6 y6 k8 ^7 q- N @" l
1. Лицензионное соглашение
/ v& }# \7 `) I* a* U- /*3 [' B# M7 c1 a4 a$ l8 N
- * Этот файл является частью проекта L2J Mobius.
+ a( t: y. h" M6 u _( n1 R - * " i- E9 E5 K5 O+ F- z
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять) Z- R: b2 n! }4 z5 N" `
- * её в соответствии с условиями GNU General Public License, опубликованной
- T0 {% g# d! p8 m! T7 e" U - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.) O9 y# y9 L3 S' w: N, Y3 M
- * 0 e6 O7 G; X# u ?7 _
- * Эта программа распространяется в надежде, что она будет полезной,2 b& o" d9 T9 P* A- N3 D1 u! h
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии" N5 B# g& C6 G2 d% x7 P( |
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.4 k1 w+ Z0 A7 m. Z
- * См. GNU General Public License для получения более подробной информации.9 ^7 Z" a O" p) E$ a Z; `
- * 4 I/ f) e/ w7 u
- * Вы должны были получить копию GNU General Public License" ?; Q+ ?* |3 U4 c# ~% g+ \/ W- B
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.( e5 B+ ?% b- H7 G6 G
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
( R$ J Q$ R; r0 k' Q; J
. m8 _ g) X" `4 W! n$ V& `
* r- s, l+ y" p4 _; g2. Импортируемые библиотеки
5 T6 s- k) d& X. a: [0 d* \( ]0 H7 \% Y% B# }3 W
- package org.l2jmobius.gameserver.instancemanager;$ [! `( ` D6 U, S% l& S
; t& A8 ]+ u. d* E- import java.util.Map;
1 S1 M8 c* ^6 z' [& e" I - import java.util.concurrent.ConcurrentHashMap;
N6 @+ b& v& ]. j. y$ S - import java.util.logging.Level;/ l( Q9 W( w8 G o/ ^9 g6 U1 D
- import java.util.logging.Logger;
2 C! T$ N# |# M) u: f - & j% K4 C& u" A: ~5 y
- import org.l2jmobius.Config;8 r. B8 H1 _" K( ^( [$ O* _
- import org.l2jmobius.commons.util.CommonUtil;
) k. C1 I0 e/ f: M9 S. _0 u$ `2 G - import org.l2jmobius.gameserver.model.quest.Quest;; I6 d' |' a# [- H$ _1 \/ ^
- 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 — менеджер для работы с игровыми скриптами.
8 V. A' _/ G0 [
3 }) {, |, |7 U. U3. Описание класса QuestManager& Z6 a# |% t( V$ d( x
- /**
* y6 L4 F" D" j - * Менеджер квестов и скриптов.
+ g+ [) C% |6 X - * Автор: Zoey76$ f; O. a, L- O
- */
' l3 B2 m; @ m( `8 d - public class QuestManager/ v1 C" x" K1 E T B6 C
- {
8 h6 w: K5 U- }1 K - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
4 }* _4 Q7 F5 w% P) C - 1 A; f f0 P# X6 q- r4 E
- /** Карта, содержащая все квесты. */
6 i1 K9 n2 Z' s. R" y - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
: m0 C/ ?7 \- ]8 ]& T+ D# @ - /** Карта, содержащая все скрипты. */
1 Z% ^( _; a, h% R - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
+ D ]& W' c" G - * T/ T @3 d4 k* C) q: q- @
- protected QuestManager()6 Z. p; C. Y+ I7 ]
- {
: h N- d" z9 {" `1 a7 z& b - }$ k2 G( j8 @0 W% O
- }
Скопировать код 4. Методы
V, r/ _+ @1 wМетод reload(String questFolder)
# c/ n( A" d8 w. X& q- public boolean reload(String questFolder)
3 h4 M: S" [) `0 `5 C- U3 f% G - {
. J X' p& x% Y - final Quest q = getQuest(questFolder);
. Y B7 D0 l5 n/ K - if (q == null)7 c2 L! j- G( i" l$ d2 j
- {" v. Q$ D0 E' S- ], F, j) x1 ]
- return false;! I0 v, b: A! Q- I6 p/ U% ~: }
- }- y2 s* ^6 J2 Z3 U% Q0 B
- return q.reload();
( }; G4 L4 y [ P! p1 q# A: V - }
Скопировать код
& [8 v8 \" H! C$ J! Q! N- O- B* d/ I8 E6 O' p/ g6 G
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.8 Y0 l) s1 d0 {1 ]
Метод reload(int questId)
8 y7 p+ Q) n5 a6 W" a2 c c( l+ M- I7 t2 t- H
- /**
$ t8 f% Q" N% t* I0 ^* k- o# ^ - * Перезагружает квест по ID.2 `6 V% }) x0 I$ d
- * @param questId ID квеста для перезагрузки
% [% k; Z1 W7 S - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае( d8 Y3 g1 x2 v. T
- */* ~- D$ X% M3 ?
- public boolean reload(int questId)
( g1 O# X- T$ c# i7 ? - {7 a, [: ?! I! t J2 r. R# D" i* V
- final Quest q = getQuest(questId);# S0 [6 X+ Z* }; B
- if (q == null)
' X: T. N+ [$ L% \' G* }; t5 O - {6 |8 a6 ]: _: D) b3 A5 x- ]
- return false;
* ?' o* N: i# X6 i - }
+ E$ @9 w; J- s8 H - return q.reload();
8 L" e4 f$ g5 V* x - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
! m1 O3 B6 ]- V5 ?$ n # w: [0 g& t0 V ]' r! k
Метод reloadAllScripts()
3 Q: W; G+ r# _: N! N. C, U- h. f# U% u% r) I, U
- /**; e. t$ h s6 h1 K8 z% h
- * Выгружает все квесты и скрипты, а затем перезагружает их.4 G ^! H+ M2 x. e6 r0 T6 p
- */
7 D# k1 W6 X0 m) S+ c - public void reloadAllScripts()6 _" S3 a5 q" P. K# K* l9 B" U
- {/ b" F& x; @9 Q' @! |6 j5 q8 Q/ [7 q2 ?6 R9 R
- unloadAllScripts();
8 k0 O, A0 ~ v1 W5 D -
+ n$ }1 f4 r6 y+ v( f - LOGGER.info("Перезагрузка всех серверных скриптов.");5 \6 @; f+ q+ v ]& K
- try
: J" O* @" E" X% w% [ - {! n. a" [' ^9 L5 f& c$ r8 Y! @
- ScriptEngineManager.getInstance().executeScriptList();) o5 ~; d# g+ f0 `2 o
- }
) K% a, K+ D' t' j% l; p - catch (Exception e)0 A; m# D: l7 {& M/ C
- { V. ]/ L& V3 m8 V9 J+ m
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
( I2 p: v6 E& Z p! q' t - }
! |# w- H* P& ^) v) Z -
$ q2 x0 X O1 M - getInstance().report();* g" `6 O: j& ]. h, q" W& r* o
- }
Скопировать код Метод unloadAllScripts(). c7 e5 i& k/ b& e
% e$ K/ N, R6 n+ Z* l- /**
+ h3 [/ d9 ^2 f3 e9 t6 y - * Выгружает все квесты и скрипты.
8 R* w) Z0 B2 B6 p; j2 A0 p - */
" X4 O" K" Z6 S# a8 B - public void unloadAllScripts()2 l! S) I- V0 B" z$ u4 q
- {$ j* u7 B/ w( [# ~: d6 [
- LOGGER.info("Выгрузка всех серверных скриптов."); S# N2 w3 b+ a2 `
- " q0 x! v# i( I4 A6 n
- // Выгрузка квестов.
5 c. I7 X% f" I" q( G: H0 K: Y6 F& L - for (Quest quest : _quests.values())3 c7 ?" E2 r$ K9 W" J3 R
- {, p# p8 u9 {; b: W
- if (quest != null)
+ A& l( |1 l3 Q o* c5 M2 {; ?6 n5 @ - {
5 m p; R( L) B/ w& I5 i& { - quest.unload(false);
- v. J$ Z" S) G" Z - }
8 x7 u/ U$ @9 I# H f. N( O: F - }
6 p! v" d7 Z/ M! }. O7 V0 k! S - _quests.clear();+ _) r$ V6 J- ?2 G- q
- // Выгрузка скриптов.) \; O: u2 \, y- q, ]
- for (Quest script : _scripts.values())1 t( k3 c' @' d9 w4 a, D" U& ^, t
- {' Z+ |" v) x& V: Y; H
- if (script != null), B3 i) J1 ^0 Z
- {
2 e B' j3 f2 X1 Z( y. b - script.unload(false);4 G" {) g7 X, Q/ I9 o: g
- }& {. k$ T7 n* _4 l7 a5 I, U/ } L
- }6 r5 ~4 t$ M* e& ^' {
- _scripts.clear();- b0 l" y4 ~$ _
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
( X' W+ g3 M/ r3 A ( Y0 E; m* W4 f* j2 l* [0 o2 n
Метод report()" D2 s' R, ?4 k* `. x. P
% R v7 P1 Y. Y) B1 r7 T2 X+ v
- /**
' `7 |- T ?5 m/ ~" o4 c7 O6 Y1 E3 ] - * Логирует количество загруженных квестов и скриптов.9 b+ S7 @2 V. T3 M q' D' e
- */9 {" ?, e0 J4 j( q, h
- public void report()
5 V0 C. Q; d; D: c0 e7 n2 }: ]# E - {/ n$ {* O) T: H4 \, K
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");. L; m1 r- B4 I k: O1 Z
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
) C- @! Q% d- @- r4 H6 G - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.6 x) ^: C0 |- |* J9 ^# S
% k* y0 M& b! o* K& l% u7 x9 w
Метод getQuest(String name)
, o0 N- L: E/ g, e: q" ~. r* ~% m$ G; i; j" U6 ~ U+ |6 y6 [
- /*** G* o+ I3 ]/ V2 l1 T0 _: _& E+ `6 l
- * Получает квест по имени.0 s( T1 [8 Z2 N+ ^5 U0 X/ v1 k3 ^
- * @param name имя квеста9 p# a+ c' D, T! x
- * @return квест7 E5 L4 S ^( E$ Q, J
- */) t; C3 Z$ ~% X6 y7 z# Z
- public Quest getQuest(String name), ?) w7 s6 |+ q: T3 A5 t
- {
) T* s9 T9 D, b# W/ b. O - if (_quests.containsKey(name))
! E/ k+ ?0 l$ Z" k: q( b8 ^ - {- O# a, u9 A. R7 l
- return _quests.get(name);
: ]. ]+ N* V4 H" E - }+ E4 ]% u2 H2 K9 |$ W
- return _scripts.get(name);( H( e: p+ H' ~( x; J' n3 |
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
! A# h4 { |' `% J" P2 a
8 a( a/ v. t6 G7 f5 ^Метод getQuest(int questId)
' i( H6 A3 z, I# N: d2 G0 @6 |0 a8 A/ |4 k( d$ s
- /**: X: m9 u) x* a- n. U! b
- * Получает квест по ID.
9 `6 F& a7 x O, C* B: r( i - * @param questId ID квеста! U% @1 A* v n1 T' W- m
- * @return квест, если найден, {@code null} в противном случае
1 E4 Q( A# t; S3 G5 `' w+ w - */6 c0 `/ X: Y b7 H a n! T
- public Quest getQuest(int questId)8 N% z* ?3 P8 a' s' A
- {8 C5 U$ R) Y, m x- t. ~" ~
- for (Quest q : _quests.values())
& w# _+ D! @5 F H1 x - {
; e V6 b, O+ U - if (q.getId() == questId)4 g( }: B* C% ~4 r
- {
1 c$ [+ |( T6 d$ ^& V& Y! [" P - return q;1 h7 c1 \! b8 U5 n* @% {: S
- }1 h* i6 y* t: X% m- b B/ m- F
- }: a6 H3 w- S0 }
- return null;
/ c/ p0 q) L7 b - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору./ d& u2 m4 F$ E& J' w
6 C- h8 ~4 t8 yМетод addQuest(Quest quest)! _% ]+ b0 k+ M: ]$ V/ \
% M2 e k- F T! Q i- /**4 z3 A3 f- d& D
- * Добавляет новый квест.
" t9 Y) H _7 c1 U - * @param quest квест для добавления
/ Y2 j0 [. U1 P, ^9 W - */
) V' e/ t! o. J/ c' \5 X( Y - public void addQuest(Quest quest). U( L/ b. ~7 L& w3 |6 y
- {# W" e+ M/ k7 r1 v$ L; x
- if (quest == null)" ]0 K" G, g" Y6 R' }$ {1 O+ |/ _" e
- {! K* W8 p [% e. j9 n- a6 `
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
6 ], s% x4 x9 @# Q) J: U - }
8 k- d0 a0 }. W, e* U& s: Q -
8 I7 y) B+ N) G# o6 M* v, b, H- j - final Quest old = _quests.put(quest.getName(), quest);3 I* \) V( v0 f: x1 ^6 b- O
- if (old != null)
6 h/ V7 \( T h' m - {0 K7 C0 L% S2 V1 y7 x! J" I Q
- old.unload();. V( R. u" Z: q( k
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");) v) {, f2 p2 S) L6 o
- }3 c/ ~+ U; J$ a7 S6 V
- " K9 X* c9 Y7 Y2 r9 b. q# r
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
. l! p+ S x; h" [' b3 U0 E - {
: n' ^$ s1 Z/ R5 `* f5 A9 V/ c& t7 } - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
! V5 W, o; p6 l' d7 J5 D - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");4 h2 b I; V' Z8 _
- }7 V2 r. P6 X/ m: I d1 ~
- }* M% \8 }; H5 p" J
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
4 @8 I2 T0 E) E' gЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.+ D' Z# g, W T% d2 J
; M# Q" f/ y/ h6 k6 T
) p9 J, g4 h6 |7 S/ z/ H: v$ j7 D6 u: I: @
|