Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius3 h: P- u! S G' F
& R- h) o! k7 [, }: V
Разбор файла QuestManager.java& J2 t$ p+ K: A. A
% e9 O% L: k0 t# F" ?) ?- ?( U
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.% U0 g+ T/ D4 Y- {
Основные элементы; {$ c$ A# N1 g
- Лицензия
1 v9 \/ p+ B3 `; q# f+ i/ U- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.( G" ]0 L3 s+ Q. U2 M
- Импорты
, N5 i8 V0 {$ A: k Q, ~; ? 1 c" Z6 O& W' c7 m/ S; Z
QuestManager.java — управление квестами и скриптами.: Z* ^' P; J' M. @
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\& `8 f, X0 ]8 i, _6 Y- h
m c' b" B2 ~7 o7 [
" |! {2 _" ~# GДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.6 p' b+ S7 b. r
1. Лицензионное соглашение8 R4 m) \. z/ A+ h2 L
- /*
$ g) z/ \( t# ^4 T6 b& ~ - * Этот файл является частью проекта L2J Mobius.
r6 D6 p1 j r$ y- [8 B( v: H - *
, F. d# M, L( a( k - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
- D M! x% E( @- a - * её в соответствии с условиями GNU General Public License, опубликованной
% L' Q) c: ?% H4 {2 E9 X# h0 O - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.1 r! ` i! l! ` D
- *
2 y, X9 _) Y6 ?: G% J0 _ - * Эта программа распространяется в надежде, что она будет полезной,
3 @6 J. S/ U# Y - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
' {+ ^$ B( m# C& M1 \ - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
4 ?9 K& r1 i: z7 L& U( a* J - * См. GNU General Public License для получения более подробной информации.- j0 w; [. M! o6 s
- * : K7 Q& R3 ]( G/ J* G; Z
- * Вы должны были получить копию GNU General Public License0 O' K( \ x8 Z( o! {9 D
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>./ n; S: @3 B" P" u- N% J
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
6 W R: g/ X v$ j/ @# t2 j7 r; h6 }# l; [8 E( o
* B) U; S2 ?. q; l6 ]9 ^0 F* l* O
2. Импортируемые библиотеки+ [/ e' C. Q$ u5 X
' Y( f9 Y! w0 ~- package org.l2jmobius.gameserver.instancemanager;$ p: |+ w* p9 n! ] l: U* m/ H
$ T, e6 N9 ^# T3 L9 S @- import java.util.Map;& ?- r2 Z; ?& _% ^: L0 S
- import java.util.concurrent.ConcurrentHashMap;
( }: n. k# G9 }1 y) m, ` - import java.util.logging.Level;
* h& _) [" I1 R. v - import java.util.logging.Logger;
# O0 c) J _; x
1 b( L0 O; m% p/ ?& K5 W* w- import org.l2jmobius.Config;6 G/ K4 C9 M: d; e* h( z
- import org.l2jmobius.commons.util.CommonUtil;
8 z- [" j2 A/ F5 J6 _" Y8 v+ _6 ] - import org.l2jmobius.gameserver.model.quest.Quest;, E5 G# ?; d% W) U
- 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 ~5 d6 t1 `9 U' i
# i- G% a5 C& d3. Описание класса QuestManager1 H, a6 E: [% E( c1 p7 G8 \
- /**! s# L/ u0 k4 e
- * Менеджер квестов и скриптов.
: e* i; b4 }! v - * Автор: Zoey765 Y/ m' g5 ~1 V/ e# e' a8 G
- */$ ?" @8 }" R2 i) a" c, _0 ?6 E
- public class QuestManager+ {7 P2 M$ t: c$ a3 \% v) k, D
- {
& q" P! y5 T: ]: R: o) v' F - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());9 Z0 B" V n% [0 {3 T* q' k
-
. F4 [' Y2 _0 N) u( g; u! e+ y - /** Карта, содержащая все квесты. */
& |( ]% b9 V5 i; b - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
2 U3 }! z# \# |) k+ i9 Q - /** Карта, содержащая все скрипты. */- T9 A5 l% F9 [
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();' {$ F' ^& | l+ r5 ]
-
% t7 A% ~* e P. ]" \% Z- b# ` - protected QuestManager()
) ]! G- o! L9 r3 s. b - {
+ Z. E1 q0 d" T8 p% G; M& U' O9 e - }$ ]# U7 w E4 I; B) P; X
- }
Скопировать код 4. Методы
' |- ~) n$ D$ uМетод reload(String questFolder)
7 ~! v2 [; j8 P% z( N. g4 F- public boolean reload(String questFolder)/ }6 F5 |3 c3 a& R
- {
2 {$ a( H$ `. K. f' G9 v - final Quest q = getQuest(questFolder);& r) `( |% P, s: w
- if (q == null)
0 H) l8 B; q2 [0 N - {
7 ~6 f4 n, M$ ~$ ?6 y# o' g - return false;8 P: O( B. ?, ]! Q" i$ \
- }
4 m8 q6 p0 T6 N' Z9 H5 l# M - return q.reload();/ w9 O. U3 y, m" Q$ w" G% j8 e
- }
Скопировать код
0 i/ U9 b. y1 H% V
( I* k0 y! W8 [! v; n: c- G6 P2 XМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
! D6 ]4 s1 F/ e- CМетод reload(int questId)
0 l6 W: f2 \9 e) m R7 H! W1 p+ P e0 O) e+ L
- /**- R3 L1 Y; o6 E0 a) \: c6 h9 }
- * Перезагружает квест по ID.2 o6 c+ s8 L" Q- B! J
- * @param questId ID квеста для перезагрузки9 y: i! r/ ]3 w0 |
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
' U8 @( O2 M' W - */
% t5 l" R1 F: c" l! J# q2 G - public boolean reload(int questId)# ~5 C$ {0 E; B+ G; l2 M" ^
- {+ N- [- K! D, N
- final Quest q = getQuest(questId);
" d1 W& @) S) }* Y* Z4 P - if (q == null)
% N0 `/ A, U5 U/ q - {
& B# a$ y R" M) D! o - return false;
* @5 {0 ^: @- }8 o - }& J0 V; O$ Q2 a2 M+ L1 F
- return q.reload();
5 _5 M, ]" g5 P/ T/ ^/ Q8 Z - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID./ i4 _1 T- j$ L" f8 D
5 S7 P' f( X& v' B) c$ ZМетод reloadAllScripts()+ Y; o, d3 l+ X$ s' M& g% w
9 l: G# K1 i. L1 O# \% O( B- /**
9 Y" o8 V% x* S( K4 j: }* u- d - * Выгружает все квесты и скрипты, а затем перезагружает их. ?0 N6 _ ^! y
- */
J- K3 M+ w1 M2 U* P. S+ K$ [ - public void reloadAllScripts()
+ b& N7 {/ c2 ~1 D( |3 b' `$ w - {
w) N/ B/ j: f5 U. Q4 B- N - unloadAllScripts();
. o; P/ a' o% d$ h& c -
/ f+ J/ ^/ K. r3 l- W( L - LOGGER.info("Перезагрузка всех серверных скриптов.");# p! J9 X0 o3 D+ H7 U) b
- try( k! u3 G' a+ v9 _
- {- ]* u) J5 o S( q0 M( _
- ScriptEngineManager.getInstance().executeScriptList();; `7 x" m, G1 x( ^
- }6 H# o$ z) C; h7 S$ b
- catch (Exception e)2 ~7 F Q" ]! j' B0 U
- {
& e" q: ], Z, a+ b% B - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);9 Y# s+ N- D8 T0 r5 `6 k3 I7 Q
- }8 z: V$ x+ |- [% w( Y# g9 K
-
! @* M- ~0 l, i - getInstance().report();- e( d7 P4 Q0 l
- }
Скопировать код Метод unloadAllScripts()" p7 G3 R: E _, m
6 J; W6 l, i: Z, b; E o7 S- /**
9 v& ]! ?" ? w( `$ J6 l2 j - * Выгружает все квесты и скрипты.
: \3 K1 a* ^( k+ h - */5 T6 @2 h4 m% U* f
- public void unloadAllScripts()! Q9 {/ C) F8 n: ]* x3 B8 c
- {4 }$ `% ^9 k0 a2 b3 I
- LOGGER.info("Выгрузка всех серверных скриптов.");$ X+ u, B1 M; }
-
) ^2 }6 W) v. f: ?5 @+ Q - // Выгрузка квестов.
: n4 B# o3 f6 Q7 L8 M7 Y - for (Quest quest : _quests.values())" m0 o2 f: n7 c# f( ^ N
- {
3 W, @" p, i* G l: V - if (quest != null)
& M8 R- V) [, m& [; M - {
$ d5 D8 q; E$ F2 T; T( | - quest.unload(false);* C* J! o- J* u
- }, a" B0 v% \$ D4 \! e8 w: f
- }
5 w6 n& \" A0 p - _quests.clear();! q; y' i6 {9 r, d
- // Выгрузка скриптов.) K' A, O$ x; `4 l2 Q
- for (Quest script : _scripts.values())* z) X* M$ L( p2 f3 b
- {9 d2 f y) K" R* e, v. z n
- if (script != null)' [6 |4 C7 {% X
- {
- M5 g" w, f( {8 q - script.unload(false);
2 Z6 c. F' N" p' Q5 F( F - }
3 V1 Q2 @7 ^ L! ?: f S - }
% D* j3 M" h+ b5 m4 T! a - _scripts.clear();
& O" j0 H8 N; R- y; U6 S - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
: ^% E/ q, D Z
" m* t& ?7 Z+ p' Q' ^' ^) [1 g+ y2 ^Метод report()
3 n. ?& ?2 M, s* T+ O3 {; r8 z7 j- o& x
- /**$ E8 \+ Q4 F2 ]1 w; ]# A
- * Логирует количество загруженных квестов и скриптов.4 u% ^2 N! z& f
- */
* e3 N9 e; J, {. r m - public void report(): l, Z' p& K% u8 D6 p' l2 C* j1 i
- {# u6 ~% s/ ], V% l2 g& `/ `6 `
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
6 a2 {- V7 L7 @5 l - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");* L/ w4 n) V9 N" z$ l; |
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
0 X; f/ S$ N" ]7 t* @0 U
1 n/ q! w4 W( p" Q% ZМетод getQuest(String name)" g4 T" ?; q1 b, x; Q) S/ G
8 G8 t9 ]& q( T$ L& g$ V+ D7 U0 h
- /**
$ q( I( q; E+ f( k - * Получает квест по имени.! z$ `* }7 J+ \! a% i; @0 Y4 ?
- * @param name имя квеста
% r4 }5 |, m' w0 _6 p& A2 u - * @return квест1 P5 `: @5 P7 x0 M- d% r( T
- */
, {- d: U, N5 |1 [9 E - public Quest getQuest(String name)
, Q5 p. h6 ?, N5 _0 H8 L - {
6 O. ]4 I8 \( L4 K - if (_quests.containsKey(name))9 r6 T6 s2 e$ }# b
- {
! o) o& G# j8 x3 P0 `0 f - return _quests.get(name);4 D5 E* `0 n' M0 _: g
- }- B7 h, s* K3 b* R$ Q
- return _scripts.get(name);
+ T& |4 c [4 `: L+ J - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.( F1 c5 g/ Z, p( I& L9 O
8 j8 |4 z3 Q3 X9 {: _
Метод getQuest(int questId)
; M6 |1 f' q0 R9 _ V+ ` ^5 S
/ b- f& K# m% i8 _- F* `$ ]- /**/ ?* i( q2 y4 L3 n
- * Получает квест по ID.1 e6 [! G6 N" l
- * @param questId ID квеста X0 b; m6 _$ A# ^, _
- * @return квест, если найден, {@code null} в противном случае3 Q0 `7 n# X; [( A- H- a
- */( Q* c9 w" h' B8 V. [- S
- public Quest getQuest(int questId)
# a4 D- Y" f& P5 i$ o4 k - {
: Y; u/ k8 o* d5 L - for (Quest q : _quests.values())
# H) v+ p' L8 B, ^7 ]& n - {' ?) R0 @) n9 _# e; T
- if (q.getId() == questId)
5 M$ _* e% R1 D) L - {
, K& N( u$ m' p/ p; P/ C - return q;
; G9 R- ~. n; o" ]& s) _( ~! n0 z - }) N. d2 @' D& k `( D- N
- }4 `% U. W+ d3 ?; h+ p& f3 a1 n
- return null;
' d+ J$ i( `2 U' V3 q - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.8 m y$ w% D ^' u" Z+ W
/ H- A2 N" m& P4 fМетод addQuest(Quest quest)
) F" n! N9 s; p" t: s) H/ q. C: |4 Z! |: v+ w$ [2 C
- /**
7 Y: V+ l. b M- T - * Добавляет новый квест.+ h, S* U8 w$ C j) H4 c. f/ C1 H) K8 L
- * @param quest квест для добавления: c- Y2 j# A# M$ ?' C8 r& Q
- */! m$ s$ Z- ]+ |. {; I
- public void addQuest(Quest quest)
+ Y+ V: v) C$ W0 ^ - {" G! A( v1 y% ]* K& ]
- if (quest == null), y; e" [, I A) A' _# q
- {
! w+ I- O+ s9 r# s3 A# P - throw new IllegalArgumentException("Аргумент квеста не может быть null");
* Z: T( @% @6 }) Z# c% L - }' ?/ D0 @, ~! s& w8 ?9 ^$ C
- 2 M# |! _$ i; U) x2 T
- final Quest old = _quests.put(quest.getName(), quest);
( p4 M. A. g' b9 l/ l - if (old != null)1 ^5 ]+ R' Q& Z8 U
- {7 s& {$ M( G) f% y" S" d
- old.unload();$ W# n' C) N9 j8 l* T$ _
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");9 U0 r+ k+ I K) ~# J# Z! j
- }4 D8 Z0 i6 e/ @
- ' d: \1 b `) T! u3 U
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
1 g* v8 G, S" q& v - {
, i* E- R1 c/ X6 U! E - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();3 t; R `* c% {
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");, ~8 }7 k% F' X# d* y
- }
( Q% V- l( u2 s) _/ b7 _ - }
* R; ]7 g( Q1 P* p8 N - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера., N: w, Q+ t6 K" \# r9 B" {; e4 p
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
& c; V8 L9 X) H5 G6 [8 d6 }* {2 v( m8 `8 |/ _, p A9 o4 z
. D1 N$ d0 [& t- e
+ r7 T4 h% c, b3 {
|