Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
$ z, |/ a$ K) O4 w6 E& `7 |1 D1 @" l) g( l$ V
Разбор файла QuestManager.java0 N$ u2 k' Z+ g3 A1 D* F6 j$ t
8 T" i9 I3 b! N LЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.& O, p D4 ~; I+ r/ y8 {' G
Основные элементы) v: h8 S3 x' d1 B8 }5 |
- Лицензия( [7 S9 B1 ]5 i9 A4 V1 ?# ?: U3 t
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
! h( u4 _6 @0 I$ M' \
- Импорты
. c$ k' F4 Q' g, x+ y
w$ B _. ]2 g/ t: k! pQuestManager.java — управление квестами и скриптами. B4 l! e! R8 q/ s0 {- e. `
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
0 U5 X& A& D0 Q0 |
2 a5 \' b$ j) ]# l, l1 w3 {1 E: I R$ U
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.2 a8 ?. P( b# G" D* s1 Q" J
1. Лицензионное соглашение
3 b# ]. B8 u) c9 v$ ]- /** l4 F# V$ B( b
- * Этот файл является частью проекта L2J Mobius.6 l4 N) o: ]; s1 J
- * ( E/ H* B+ G+ W+ A
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
% w" y+ Y' t) O! {4 p+ V6 r - * её в соответствии с условиями GNU General Public License, опубликованной( ?% }4 u0 }, \4 {0 A
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
; \" { }9 }8 i. i+ q6 K p% i - *
4 P) Y+ {" M$ ~! F: T, X - * Эта программа распространяется в надежде, что она будет полезной,
. F b( a- ?* k: w9 T' v - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
) P2 w: l3 {+ L - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ." M" y/ u8 g% N" U' l
- * См. GNU General Public License для получения более подробной информации.6 z; u: K& Z7 r# T& K
- *
2 ]6 \, [, D4 O @ - * Вы должны были получить копию GNU General Public License
* G7 }4 C% g8 R% @- z) h; \ - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.' V! a* X& f( F& Y; v+ |
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.; G' Y9 e, F& E$ {0 H. u
( c, m) e. e4 _5 h2 y g7 B! k
. M) n k& q: N7 w3 i2. Импортируемые библиотеки
; |. i) E/ ]8 R: \8 Y% W9 f3 V6 l. W0 l. W, S' O$ G
- package org.l2jmobius.gameserver.instancemanager;( s* J8 W" R5 S
- / }! R' l! C. j! ~( o e" d
- import java.util.Map;5 I8 ?+ A& g9 z
- import java.util.concurrent.ConcurrentHashMap;. L, c$ |4 C, Q( J
- import java.util.logging.Level;- I2 `3 k0 _+ A5 U5 T
- import java.util.logging.Logger;
1 v) G# L/ R. R0 { K - + ]4 V+ z3 @% z) O4 ^' e
- import org.l2jmobius.Config;
- n" V& s( |6 L5 R( p - import org.l2jmobius.commons.util.CommonUtil;+ C: I9 {) h2 Q `& l- V
- import org.l2jmobius.gameserver.model.quest.Quest;
: T# P$ ]$ g$ k3 G0 F: H - 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 — менеджер для работы с игровыми скриптами.
& F3 Z* d8 ]2 F* N$ o( S1 C
& f- A/ I$ v& E/ I; ]' Y0 i9 p3. Описание класса QuestManager
+ ~6 J6 y; u' l- D- /**
8 t6 X. N R: M$ \: Q6 l/ } - * Менеджер квестов и скриптов.
6 F! l R; j8 g; l6 ^) W/ F - * Автор: Zoey762 J2 Q$ F4 J! O1 y% B# Z9 c$ `
- */9 g' y6 n: _9 O; o
- public class QuestManager+ T6 l( X/ y3 }
- {3 L3 G" Q* h, P! o: D' A3 ]
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
+ [; b* ]: J- r9 t0 c - ! F. ~3 B) _0 o! X9 {) v: \
- /** Карта, содержащая все квесты. */" C. ~" r, ?9 P1 ~9 y0 W& [8 g
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();, k0 I( N, d: U' e$ v; q
- /** Карта, содержащая все скрипты. */ t; V& V$ i+ f3 {. c; H0 N: b m
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
( w7 M% J n4 { -
& n) h! O6 Y+ m& N, c - protected QuestManager()+ A+ D' K/ i) j1 g7 w7 @
- {3 a! X$ P; u; U: R: a
- }
3 G; Y' m" d( ~0 K/ u: Y, }6 V* n - }
Скопировать код 4. Методы
& t0 r3 a+ `/ v3 V% GМетод reload(String questFolder)1 B$ W" p. E$ \( E0 d+ L: W: S
- public boolean reload(String questFolder)
/ k* L- M7 H. v$ l9 g - {& N1 t& P5 Z* h# M
- final Quest q = getQuest(questFolder);
! e' t7 v# m1 i9 ^6 _* J - if (q == null)
% i! h' ]8 C* k; ^/ u& _ - {2 N1 l0 m. s. f/ N' k( B/ M
- return false;: H5 Y# ?& x- [6 X! q7 e3 b( s+ `
- }& p- x2 {- ^' [9 d* g3 F( n
- return q.reload();
# C# K$ y4 p# ?. x. a! \* w - }
Скопировать код
1 p3 y) b2 }& A$ H, a" X* M$ I; [ _/ m4 ]
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.- P' w+ T9 s# ^
Метод reload(int questId)
! a9 s8 e) V$ r* f( R' i, O6 T5 b3 H" g! a6 I3 \
- /**( B/ w. g, w5 W0 C
- * Перезагружает квест по ID.8 d0 U6 V+ A8 {8 \$ g! f
- * @param questId ID квеста для перезагрузки
4 [: |6 c# L4 S; }: k - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае3 S9 I/ |' U( C2 I
- */
" c0 i% |/ D- [3 I8 r& O - public boolean reload(int questId); v& L0 O3 P8 A8 e5 z+ u
- {
) }: L2 z, H( V& d" r5 b - final Quest q = getQuest(questId);/ H8 P8 Z2 X A4 s0 \. p D6 }, T
- if (q == null)+ ?( b, E9 N( ]. ^
- {
P* ]0 _3 O3 K/ n* }8 h - return false;% y5 W' A: h3 {+ J
- }8 c/ U8 X& ^* g/ d; H
- return q.reload();
. | F- }5 n Q9 W - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.; n% z7 D+ S+ D1 G
1 {7 d/ R% g2 D8 }. {
Метод reloadAllScripts()
/ l4 ^, Z' H+ \- O9 N1 \+ E3 o8 n4 R7 j% X# O
- /**/ g4 ^& q0 a* H6 T" f }
- * Выгружает все квесты и скрипты, а затем перезагружает их.4 \ D% W' I; B. E/ L2 y( H3 F) u$ n+ B
- */: V* I- f; u6 s9 p0 l9 k
- public void reloadAllScripts()2 y2 _3 q( j# b
- {% c7 n. U; A5 W0 z2 I7 @) {+ M
- unloadAllScripts();
( y: B% k7 {( _1 W' v9 k8 |9 q -
+ I% j3 v2 C e - LOGGER.info("Перезагрузка всех серверных скриптов.");
* e! c. N: Q7 j. H0 o - try/ K& a( u' u% A D
- {
' o" P( l+ d6 t/ j$ p, |7 ]+ k - ScriptEngineManager.getInstance().executeScriptList();# M/ S8 @ N7 m
- }! v( c8 J2 a' N+ K3 N: `# t
- catch (Exception e)
. ]* r$ o, c3 K: C9 U( Z$ D - {
% o% A0 C1 J2 K; S- K- q8 C - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);, [$ j4 ~- E7 q' Y/ L$ B+ n7 d5 h/ U
- }0 W( u+ g) _- s+ M2 K+ K; s+ @
-
3 L; `6 ?/ a& y6 [ - getInstance().report();
9 g: D/ |5 B4 H' X - }
Скопировать код Метод unloadAllScripts()2 U, H6 G5 @; z, o4 x
7 _' M5 x! h0 X* }- Q" `8 R% Y' w4 Q' ~
- /**3 G# w u6 U8 B: K0 t- I
- * Выгружает все квесты и скрипты.
" l2 x/ {6 E3 s4 O, P( c4 x* ~ - */7 d2 w4 n' P: X, c6 h
- public void unloadAllScripts()1 q- f9 e' H8 p6 E# Z
- {
0 E& C8 B4 y! M9 o - LOGGER.info("Выгрузка всех серверных скриптов.");8 L, h! m, d$ I& y% h7 Y) c
- 0 q- D" ]# S2 F
- // Выгрузка квестов.- f$ ?/ f7 l; K: C
- for (Quest quest : _quests.values())
1 r- ~* Q, j6 y1 e* g) O5 H - {
# {6 q& d0 _ y5 X9 s2 C+ ?, g- Q - if (quest != null)
9 N$ x- J2 M' ~) o - {7 _9 d% M# F' Z$ Y+ _: \' @
- quest.unload(false);
& }! D0 w) L0 c* a" q, e0 I8 Z: o- n - }+ u2 V5 K6 R4 ]/ {4 ^# I
- }% }: `9 R" d8 P$ `
- _quests.clear();4 z7 ]* i& p% F/ p) m+ T9 w7 _8 h
- // Выгрузка скриптов., z2 k) W5 |0 T& v* }
- for (Quest script : _scripts.values())
) m, U/ N1 M: w# X4 O+ H - {' K: M8 L8 B% E# r. S9 Z" z
- if (script != null)" M( K# M; ~ L+ g
- {
a$ e% v- X- g# ?0 ?" @0 B - script.unload(false);7 N# Y$ n7 H9 q7 k4 n6 r6 x
- }
) ~# h7 z& D5 O/ X* l! Y0 j, k - }
5 F% E& i5 T. e - _scripts.clear();. S$ T! [) p9 f! Q
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
9 }5 s4 w7 X6 A9 p1 `6 X
4 J2 ?$ d: Y* X+ A2 oМетод report()' x+ l. ? P8 O8 _ m4 C
7 w( b, A2 t' ]! U
- /**
" \/ F4 t1 [1 X' O1 S8 C4 s- k4 Q - * Логирует количество загруженных квестов и скриптов.
# ~+ \6 ^, l# d3 ]' k% ~: U. @$ a - */
6 U$ E1 ~. V) m- X - public void report()
* h3 y8 Q+ c# F7 n1 ~# J - {) A2 U' @* l9 d' k/ U+ z
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");/ e$ j% G" ?2 j& O( F, I6 B8 x. w
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");% t. |: H9 _0 |6 L/ q5 S4 `
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
1 L* w% S3 S) K+ s2 v, V 1 i/ e4 @5 Z$ i- p! B4 b; @
Метод getQuest(String name)
+ q7 d2 `* t# U F" i+ b; {
6 Q: \$ w6 ? R: q' z- /** D/ v; u5 H) \# j! A: j1 ^
- * Получает квест по имени.
- _0 w+ \+ v3 {; }+ G - * @param name имя квеста
7 {# Q& N( T: L& d - * @return квест9 _% u4 g: x6 ^% q- s3 g$ _5 |0 B
- */
2 D9 m! ?" x) d h! s - public Quest getQuest(String name)
: n+ I/ Y9 s t% b0 T' D - {" U1 I9 e! o/ A8 T
- if (_quests.containsKey(name))
" e& b& a8 I9 W1 `' k - {
6 y8 u; ?) W+ t7 l9 J' m& G" q7 N - return _quests.get(name);3 c/ R- G+ t& H- ?
- }7 a" s7 |' I* K j- s
- return _scripts.get(name);
' M. ~8 S A3 O7 X& C' C% p( t - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.( a9 T$ t0 p7 h+ h C, g
9 l: u! c+ _: `% ~" I
Метод getQuest(int questId)
5 T' m, h4 ]+ a$ D% [( m( d! K; g) ~, u/ O4 u
- /**! E# T3 @2 g6 M0 V
- * Получает квест по ID.2 `. d6 l: ^" r9 x( W
- * @param questId ID квеста: \" `) a8 r6 h% y% }
- * @return квест, если найден, {@code null} в противном случае, E, Q& h% d6 l# J; g' N
- */
0 P* Q. L C; N% b% q: M+ G' S - public Quest getQuest(int questId)- l- _1 D [: B
- {
. ?/ h* A8 M8 Q: d' T. t' T, L5 t! H - for (Quest q : _quests.values())
( K$ d5 }' n/ g$ v: c' H - {& j( D3 S4 k& n
- if (q.getId() == questId)8 T3 J8 }1 N2 `" y$ a
- {
( Y% H$ z0 _6 u. ], \ - return q;
9 i% i; a8 K+ n' H6 N - }
( R4 U2 \6 C7 ?8 e! K - }5 N$ A) g. J& A% r2 P4 U
- return null;1 X: i, P/ F6 K
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
% @0 Z% U% Z; G' x1 ]; A7 J5 F ! c+ Z) O3 l7 B6 ~- v
Метод addQuest(Quest quest)
1 a8 D5 r) c1 a" {* L
; n" i; O0 J3 o- /**
) V9 v5 q8 M( I' u2 K$ A' T - * Добавляет новый квест.6 g& F% s' d0 p" W( p9 Z X! `
- * @param quest квест для добавления
2 X" k7 ~7 L5 n( c - */* q0 e2 o. T0 U* G& k/ U
- public void addQuest(Quest quest)
! a# W( R4 U _" O/ N - {
/ w7 X3 f/ {+ X/ y$ F9 v3 \ - if (quest == null)
* I ~6 U* f; x5 t- u* ?% z3 \ - {
$ u$ @6 |$ W9 F - throw new IllegalArgumentException("Аргумент квеста не может быть null");2 Z& p' u5 [/ h0 {
- }; M, U/ E3 ]' g* l
-
" J9 j, }8 _$ e% a6 m - final Quest old = _quests.put(quest.getName(), quest);1 M: q" u. q* S8 e9 ]( c
- if (old != null): ?$ ]4 Z2 Y! I6 x3 I& W& ~
- {" ^) J- h, @/ e# n( f& Z
- old.unload();: s0 e' R5 G' z$ _* }0 \; ~9 r
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
9 h6 |6 Y. _! c! O - }; q# Z/ s" b1 F! O! C
-
2 n2 ~9 T ]" y% \/ N - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
- e/ L! q9 b7 q - {
7 r0 U- `4 o: f* s4 ~0 ? - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();2 z) v1 b l5 I/ Z* s9 h. A
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
1 I, }% n( g6 F7 o' R: e7 K - }
( }7 C1 i5 D! }* l - }
. Q( l9 G: C7 c - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.# N5 A+ e% E- P$ A/ W. {9 |/ P/ l
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
( o. d) i+ v6 s( k- b' P5 l g0 |* [. t* u" ^, h( w
" i$ p/ W L( U* i/ Q' y9 @5 @& e1 o3 r: D
|