Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius+ _% B6 l6 y4 M5 x3 A8 ~& P
1 b5 r- r0 e, L& I7 j( sРазбор файла QuestManager.java
F1 }! L- [7 ?4 n+ F, ]
+ `* f# K6 f5 Z+ }. {# SЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.- y- U7 X5 T, P; ^! X2 ^
Основные элементы! R6 S* Q* z: I$ S$ G% L
- Лицензия
: K- I0 B! o/ J$ t- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.6 n3 M' S& v; b9 M7 a
- Импорты4 H' o% I3 R+ a! T
% [1 W# {& v; @4 q& iQuestManager.java — управление квестами и скриптами.* ]0 w1 |) \! k
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
' B+ j( j; E& Z$ X- E; |
4 z9 k% `. V1 h8 e- ~* [, Z! C" N
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов./ a: M1 B# e. Z5 Y& u& D- h7 F
1. Лицензионное соглашение' c. f0 M( m" e, H
- /*! o! M" B/ h* K" W: O) \ j" O
- * Этот файл является частью проекта L2J Mobius.# U6 t$ w1 F0 L4 G
- *
6 s' m' y* y5 M3 G- x, U- w9 _8 j - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
( Z: t m7 r# K - * её в соответствии с условиями GNU General Public License, опубликованной0 v/ s/ o9 C6 Z: V# [
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
: d; k# e/ c$ @, z - *
& O1 _4 }3 H u/ }1 T - * Эта программа распространяется в надежде, что она будет полезной, ]$ C* T' M- |& y$ H2 c b6 t
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
- w Z- t. a# j - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
9 m) _$ T9 ?" |+ V7 a+ V! N+ { - * См. GNU General Public License для получения более подробной информации.' _7 Y" k+ q6 Y- d; j9 `
- *
. K2 p! W! q) `+ i; a - * Вы должны были получить копию GNU General Public License
1 \% e4 @3 C$ }* B& |4 S: g* t - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
! ?* S* p$ k& ~) d- } - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
# G* u Z5 h/ V& R) I
+ P* X) L Z- z( Q/ \ @* S" q5 ~. U
2. Импортируемые библиотеки
/ V1 b* z% e P7 {' \: e# H
5 J1 n/ r' V; H: r, H, C5 v. [- package org.l2jmobius.gameserver.instancemanager;$ K$ }* `1 F% \; o0 r7 i5 j& q
- * I, f: }" p3 p- t" U4 l1 H0 {
- import java.util.Map;
* ?, s' o. u. `* N6 C6 r5 Y0 e - import java.util.concurrent.ConcurrentHashMap;1 n) z9 s& |( g# [
- import java.util.logging.Level;
( m, T8 K ]2 D; a - import java.util.logging.Logger;
# E* }$ f/ I% @, A/ I; K - 2 {- d# |- V) v- p
- import org.l2jmobius.Config;
9 S$ N/ x6 G2 b3 v4 ~ - import org.l2jmobius.commons.util.CommonUtil;
2 b) ]3 _3 ^6 x - import org.l2jmobius.gameserver.model.quest.Quest;8 Q- s6 X" c$ e4 L7 _7 Q! x
- 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! Y% ?" C" C0 g- `- V
5 m& \! D) C0 |* W3. Описание класса QuestManager
# {9 h T% N) {* i' e7 D7 q- /**
8 ~; S6 l. }% W% Z' y& I - * Менеджер квестов и скриптов.
" P' K$ @5 u9 \ - * Автор: Zoey76% d% O3 J: Y5 r$ T
- */
( R) e( x" u/ c- `7 X( `8 \0 } - public class QuestManager
' X0 R) j% T6 u; x& X% P" C7 R$ b' B - {
0 t: \. j8 ]/ G6 V% `; |& C x5 z& R - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
$ c" \, d% {! ~; z( } - 8 R' g, e: Z2 z8 ?2 k5 g
- /** Карта, содержащая все квесты. */
1 T s6 g) a4 Y- W' p7 P& H7 n, [ - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
+ c2 I2 c' p# b7 w0 Y - /** Карта, содержащая все скрипты. */
6 V4 e4 i ]' V+ p: H3 ]: x) o; k - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();. W4 I ]2 W+ F; e
-
/ A- e9 [# w1 f - protected QuestManager()
( Y' l# r0 K; \' i, _ - {
! R$ ?! K, @( O/ N$ P: }4 @( N - }0 g) M4 y1 o4 K e6 Y/ `7 `6 q/ C, ]
- }
Скопировать код 4. Методы
0 x( `1 ~% r6 h* ]! g. v/ i+ {6 P* iМетод reload(String questFolder)1 Q$ f, I# O& C) P1 p0 B6 J5 g
- public boolean reload(String questFolder)6 [% v& s7 e7 Q7 ?# `' y
- {
% d8 @0 l4 F8 X3 P9 H - final Quest q = getQuest(questFolder);
m) b7 t" n% o0 I8 A# Z - if (q == null)
. Q4 O* O9 L! z) ] - {# G. ~* v# A3 t! f& y
- return false;. {. k0 v: k7 t, G
- }! _ B0 p o5 Q& c3 B
- return q.reload();
& X* |! C) T# m. J4 m - }
Скопировать код : F+ w3 m: o$ V5 t' s) T
3 m/ S t% t4 O' H; E5 i4 KМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.. S9 M8 V- a: t% A7 N# g# A
Метод reload(int questId). L5 y, F; D0 @. h4 ]; g
, x3 ~. x, T" h8 S
- /**
C1 ^# o. t. \ - * Перезагружает квест по ID.
) s+ F9 y% s% B - * @param questId ID квеста для перезагрузки
4 r& e) c3 @/ b+ M1 L; g - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае; D' ?0 a$ J! q
- */9 v4 Q5 S( ^9 ?$ X( q
- public boolean reload(int questId)
% A; X! a) t2 n9 J0 l9 C - {
q- c$ D: C9 _6 x - final Quest q = getQuest(questId);1 J; H: [' }3 U# y
- if (q == null)
' @ f7 c/ h) F( c: Q- ^ - {
: C O+ r3 S' L( ~7 a - return false;( ^) O( j9 X) @7 ^8 b" ^9 w
- }
" N: H0 | I* `7 Q9 T1 q - return q.reload();
! F1 L" ^1 C5 }% e" F8 ? - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
& @% e$ _- Y; x% {0 s0 q$ G$ }( Y* r
+ C, q2 X( ]+ a# P# BМетод reloadAllScripts()
0 d* J0 k. w! E: j
1 T" C T3 {' {- P! I- /**! J+ M8 M2 B5 F( i& S3 x5 i. n
- * Выгружает все квесты и скрипты, а затем перезагружает их.
9 m. f% k( E+ Y3 }& P5 L - */' f- F$ p( T' s% W9 I7 t; V C
- public void reloadAllScripts(), X% i3 t* e5 d
- {
' m% T" n: P$ T' r& ?9 V' z2 R - unloadAllScripts();
1 W4 \7 R# z% R% ?8 B+ A -
$ t2 D9 p+ x; d - LOGGER.info("Перезагрузка всех серверных скриптов.");
4 f' M. X) n0 B. t2 D; @+ u" C3 L - try9 ^6 M/ ?' s% u4 j
- {7 D) s* i% }' f' K) c3 K
- ScriptEngineManager.getInstance().executeScriptList();
" J5 z/ J5 S# ?2 e - }
2 }' @2 o; \! |7 | - catch (Exception e)
) R* ]9 p2 U2 R% }! ~ - {' B7 O/ v0 Z# v. R% ^& H% p( G$ W
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
9 q% R3 Z. Q% z0 q2 F- q' D2 {) k - }, p! a. ]0 c: v# h
- ; q3 I- M+ M a( h8 |2 P4 }
- getInstance().report();7 n) [2 A9 g/ H! e
- }
Скопировать код Метод unloadAllScripts()& G" M* ~4 E' S( ?' b9 J
8 z6 R' ?1 H/ G
- /**- |% g8 F M/ c$ v& s
- * Выгружает все квесты и скрипты.
( L; ~% J8 \9 o - */+ g8 }( C& n, {; e' {; ^& @$ H
- public void unloadAllScripts()
) B5 D, R9 W* c. t. A+ [ - {
* l8 o1 T. \- F: B7 {" |7 H - LOGGER.info("Выгрузка всех серверных скриптов.");
( [" N! o/ W6 N' P' J - " P$ _" ~5 E6 u
- // Выгрузка квестов.
3 \7 h9 {% M- P0 N* B) K, c9 T - for (Quest quest : _quests.values())& U4 R* G" N( i t4 H; v
- {
" D" |- i: s. {/ v5 q3 s9 a+ c& _( K4 U - if (quest != null)( f8 B% [' A9 y S: r% i
- {
# P, ^* z& Q p/ u) p - quest.unload(false);
& |6 L0 {* k% E7 k' g - }3 M) F/ l8 r x8 A
- }. H) }: U: {" [
- _quests.clear();
, ^' O: C. i# @6 u9 F4 V6 I( e( M - // Выгрузка скриптов.
5 N1 M4 Y: n! {- w9 C6 k' D - for (Quest script : _scripts.values())
# t. ^ }. \4 i) `) W1 o( j - {
9 T+ i5 a( {: e8 Y6 m5 u - if (script != null)
: C5 f- Y4 Z+ A c( \" a4 G - {
) }) p2 \7 o2 l) u, |! `# k K - script.unload(false);; C4 ?, B3 e4 k6 e$ I4 W) ^5 y
- }
) A. K3 x r) t1 O - }' M! s3 m# u, Y0 L
- _scripts.clear();" L) S5 y/ o# h1 v; Q, ]+ i
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
6 Z. S6 f( E0 I2 o; B! q
! J6 T( ?. ^. D4 P7 g$ GМетод report()
# ]- U5 ~. U& G# M
% t' ~) r& j) }0 s9 S1 i' |8 ?- /**) t; W4 s) _: i/ b8 |
- * Логирует количество загруженных квестов и скриптов.
" u2 ^1 e+ c. h - */* ?% G, G0 {" g' l( P
- public void report()+ ^0 E$ ?" X! W/ N. L5 b
- {: \% p8 D& n* }! Q; U) ^, _3 y
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");+ f+ A8 e0 [9 @" c1 n T! G
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
v9 R2 S i) u8 w* p7 F; w: v" [0 ` - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.# g) u) X" c$ _7 b
, W6 Z9 ?. L1 p3 ]! K6 ?/ c. a9 {& M7 J
Метод getQuest(String name)' W6 t& C% X+ |+ d. p. Z
1 E2 m" c2 g( _. Z# M7 B- /**- }; f) z$ X* {) A& \, X( a
- * Получает квест по имени.
, p( d4 ~# i- e8 k" i - * @param name имя квеста/ [% C1 g. q; U7 ]8 x7 [
- * @return квест
! D3 w( r+ H1 r/ z l6 C* ] - */
% `8 g8 S+ o" ^, l - public Quest getQuest(String name)$ y9 V# W: a- x1 y- G1 Z) S
- {0 P. f2 e4 z7 [& Z: U2 F
- if (_quests.containsKey(name))# y' @3 K) I4 F7 ?
- {
. d: j' B# A5 y5 F - return _quests.get(name);
, e5 h* s( f, d - }+ x& I/ U$ \) b4 W$ J4 P0 ]- h5 ^
- return _scripts.get(name);1 D ^3 l5 k* [6 f v
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.8 y, V- _. t# j: y6 H
0 A# E; D" D" u2 Q
Метод getQuest(int questId)
& w( Z9 `7 f b0 _5 n
# N( [) @" G# ~" u- /**( K3 t" A7 C9 |: q" z j
- * Получает квест по ID.
) S8 T. {6 M7 y2 y W% C/ Q2 c - * @param questId ID квеста
/ b B L Z4 Y$ F. [& k9 z - * @return квест, если найден, {@code null} в противном случае
! h3 ^& n1 R5 l' o( Y2 Y$ h - */
6 `' Z( [1 y: Q9 M - public Quest getQuest(int questId): z1 n/ J7 O& T: f. ~4 X: K7 O
- {
% N5 g- a* H; g! ^5 x5 V7 d; S - for (Quest q : _quests.values())$ w( \% B, t& @; j& c+ S( S
- {
$ a, Q* c+ L8 l/ a% Q. o - if (q.getId() == questId)
6 c$ V9 r! c& y6 _. D+ h/ {' \" L2 w - { e8 o0 {8 D" U% ? s- K2 s
- return q;8 b; X2 R1 z, E y, U
- }' s' k8 j4 G2 a- o: K. L
- }
& N* d+ w1 s, y - return null;
% @. T5 u# ]/ o& t8 k) H# Z - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.7 V% q) o) ?$ q6 v, }- z9 f1 N
5 k2 T8 y5 s* Q7 B5 EМетод addQuest(Quest quest)
) y0 ~% S6 V* y! W1 |3 f! b% Q) z0 u% w3 O5 a
- /**
# M: W+ k& l, i+ N- m: J - * Добавляет новый квест.) J$ U8 V+ o9 P8 _! \
- * @param quest квест для добавления" l0 n D2 c- q4 [+ Z
- */. s' t9 q5 e* @, w4 D4 T$ L. ?7 {
- public void addQuest(Quest quest)
2 [; Z6 F3 B0 l5 u - {) B5 l1 S- x1 N" v6 Z
- if (quest == null)% S# s) ^: F. Y2 T. b
- {- r2 ~0 S' @- \( F. J( }
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
3 D6 N/ w8 r& r' @ U: q) V - }
* _6 v1 C3 P! Y' a+ N& t- p( k -
1 V V# |# v5 g' R" }( z; Y4 A& _# V - final Quest old = _quests.put(quest.getName(), quest);
+ C' e5 C5 @2 F! F3 j - if (old != null)) k% j8 T0 S) Y: C' S8 x& J) A
- {
6 D' N% x2 \5 x# C1 ?# F - old.unload();9 h6 A2 i! W3 b( i) m+ r8 X3 v: Y
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");9 A1 b: p- T; k B* ~$ ^
- }2 |9 y: n1 r; z5 E; b, ^" J
-
m! {4 \* i1 t; P0 |& d# F - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
) S! O- s: [6 x8 n - {! O% @9 H5 d3 x ]3 a J( D
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();/ L! H4 r ~& b& j3 I2 x6 Y
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");* S. w$ L1 } C. k" T0 W7 f, ]
- }
- D" b6 @* i t0 a( v6 o - }4 ^2 _* z1 v/ Y4 w) ?- T
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.3 o) Y* W8 N' o$ `
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.3 T- M; \/ E% R z
* a' j0 Q3 _" `+ V% w/ W) `! a4 S: F; g4 g- M$ n
+ @& R4 J' _7 S# z7 Z# e |