Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius; _1 k' g. Z! ?' y8 ]
. j' e; P4 X; h3 FРазбор файла QuestManager.java
% k9 B; U4 u5 s9 ]7 w7 i+ [" N3 ?# N
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
2 ~( l$ ]6 b* S& k9 _* KОсновные элементы# O- X' ~1 V( |* m
- Лицензия5 Z( ]3 O( P; ~+ J+ S, [
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
! i: T( N* i1 Q+ }: l) c
- Импорты
$ T4 X3 i2 i" s& d: J9 l0 M ! R, K g! W' p( W* P3 E
QuestManager.java — управление квестами и скриптами.
/ @ M9 p2 s, j) Q9 I2 _' o9 DПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\' s( U# p4 A& M3 [, R
0 k; ~7 k0 h6 ^" j a: ?8 K
5 s' c- R& F* m; L# MДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
$ J- `" P+ W5 b1. Лицензионное соглашение
: t2 V/ w6 Q; U Y5 s, Y- /*9 e1 C% o3 L! T: e) I
- * Этот файл является частью проекта L2J Mobius.
; B. x' W. z' L( g9 S8 ^' t' Q) k3 r - *
) L0 g, [9 v8 ^$ G( B% N- { - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
' f3 O" P4 s* {. n }3 o3 J - * её в соответствии с условиями GNU General Public License, опубликованной
$ H) b6 Q$ U) g1 s - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.+ C% S# p2 s# K
- * , @- s4 q; D$ Z; h" Q7 Q6 e
- * Эта программа распространяется в надежде, что она будет полезной,+ T* V; ]3 b. R, k! t8 H
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
* l% g. A# ~% u1 X# I, Z& H - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
0 c) w0 ^) k! M% _) _2 `: c - * См. GNU General Public License для получения более подробной информации.
; B4 K. |# V+ A* E5 S6 {6 g - *
& O E3 e, Z c0 V" ~5 _$ O5 M - * Вы должны были получить копию GNU General Public License( d4 w3 N9 J' v8 L. Q$ b1 D1 n+ x
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
, f7 s3 h( s# a5 r - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.) v. ?% d4 P+ T+ {$ y' C6 ^1 ]
) n! H/ I+ W5 f: ^2 a: x
+ t9 p- N: @/ _9 w2. Импортируемые библиотеки
* M# G1 R3 m0 j) Q* B0 y# V" d2 f2 P
2 S2 j4 L. i' u4 E* H N7 Y- package org.l2jmobius.gameserver.instancemanager;$ C' ]5 M7 s% ]) b; L) h
3 ?* q8 ?( \6 j r) Q$ }- import java.util.Map;, t" Q! L1 d3 t. s( t% f! ?
- import java.util.concurrent.ConcurrentHashMap;, ?8 @2 \4 a/ ~. V
- import java.util.logging.Level;
1 e/ \& M; f5 ^0 l" B3 y1 S - import java.util.logging.Logger;7 V0 \- i: r: O( d- `/ H
- , D( |) U, w: K2 |
- import org.l2jmobius.Config;
4 |! r: V G. U# |- o6 i9 W - import org.l2jmobius.commons.util.CommonUtil;
* _3 `: S* ?& O: K6 W+ b - import org.l2jmobius.gameserver.model.quest.Quest;$ | l3 T( f, L5 w; r* e
- 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 — менеджер для работы с игровыми скриптами.
% X0 I: x) R: H+ v5 l/ p9 h
: F1 O$ I1 B2 |( m& _' H# P* m3. Описание класса QuestManager
8 h- N3 I8 `* w7 t: c* S- /**
9 z6 G% E. o* ^& H# K - * Менеджер квестов и скриптов.
5 _9 W8 J3 a8 \4 Y0 h - * Автор: Zoey76
) U6 z9 Z" H8 v% N: n K - */
7 K0 E, e* z: } - public class QuestManager4 C- Q4 w' ~1 d R1 R5 z. K
- {; _1 q) `6 @" Y* K% C# l; M M
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());" s# H$ W5 R3 @' s; l
- " g& u6 O5 ?6 X' r8 v
- /** Карта, содержащая все квесты. */& H9 H* n: u+ z6 U. e2 S1 e4 ?1 C, d
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();8 f l6 s/ h# W0 V5 y+ X
- /** Карта, содержащая все скрипты. */5 v r3 I" b& E$ k
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();* U; e- Z# G7 K$ U5 N! J$ l
- # O: @* e0 V c$ W6 s* o# h/ ?7 x
- protected QuestManager() m+ B& _- q( M+ s3 o
- {
! P* }* P0 Q* e/ l - }
0 _" b: Z$ Z6 L - }
Скопировать код 4. Методы) Q1 F5 N& ]- ~1 o W
Метод reload(String questFolder)
' P; V9 }: J; w4 j- public boolean reload(String questFolder)6 ~" O6 r$ v( n8 D! e
- {
8 l5 Y& _' o: E, s - final Quest q = getQuest(questFolder);& h- M; r/ o. p/ k- [; | s
- if (q == null)
+ m2 J: S; v. |% { - {
& E5 p. H2 {. d$ z6 L - return false;
0 M- b) \* _# \3 k - }
) i9 b# @. Q! m/ w - return q.reload();; R: X9 m: ]3 E9 _ `: @1 r
- }
Скопировать код
/ B" ?7 c7 V. G! l* ~" `6 ~
# U9 F0 G d) N$ [Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
# N, \3 q i) e1 ^. YМетод reload(int questId)
! O# H' T$ t5 C8 K+ w
8 } }7 ]" T9 e7 ~, |- /**( y9 z. a- _) C4 H
- * Перезагружает квест по ID.3 @& X/ x4 S1 N! e
- * @param questId ID квеста для перезагрузки( B+ E. _" |7 G
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
( U% m1 e& U% e2 y+ U7 Z- e9 M, P0 | - */
! i" P2 c& g2 O; Z! M - public boolean reload(int questId)5 v1 U- P: P6 i6 |* F
- {4 ]+ a0 y. V, H
- final Quest q = getQuest(questId);
4 f$ b. V7 @" l1 D7 V - if (q == null)
# Y. `1 a) C. c- ` h+ n - {6 h% Y& i) R; B4 ?
- return false;2 h3 Z5 j% |3 o- ^+ c
- }% [: \5 f1 N1 t0 Y2 h! \; Q0 s
- return q.reload();6 O# x4 f/ T: R: N0 o
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.$ w P3 W+ R# w$ x: ?- D
/ G' h- {3 [ n* ]6 A* y
Метод reloadAllScripts()
3 c; o: q1 `( s4 a7 M4 a7 g. \( l/ w* c$ f
- /**2 a: r+ V! a# v) Z1 L5 d9 a2 I
- * Выгружает все квесты и скрипты, а затем перезагружает их.
6 _8 V+ n; N% ^) S+ V/ r. K; l; A% J - */8 ?7 B' P0 k% X% Y: n' J4 o9 V
- public void reloadAllScripts() \9 l5 x/ a7 H! `
- {
d1 a8 W, D" r( I* j/ w p% K" ] - unloadAllScripts();# ?+ h% D- s5 i, A
- 9 z) C3 E; J3 j4 v
- LOGGER.info("Перезагрузка всех серверных скриптов.");
+ W$ t& v3 w9 o0 D0 E1 a3 W - try; w6 v# e8 I! |
- {
! N7 b6 ~) a, }& T J2 B/ m# R - ScriptEngineManager.getInstance().executeScriptList();- G1 I0 j0 l" c1 [1 ~0 n
- }
( Y) `# h. ~- n q: h0 B: o. n d - catch (Exception e)
# x Q ~2 d* [0 e - {
# F i# H% }4 G v - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
/ \- m, q: n5 G. m* m8 E ` - }/ F+ W5 K$ D) c& m5 l
- ( T7 W# x+ s. X Y0 i0 g
- getInstance().report();0 q: k7 e5 i" m
- }
Скопировать код Метод unloadAllScripts()/ Z" P& R+ V( |7 z- C, t J
' E- g9 F3 @6 z8 H
- /**9 E/ j8 J% V6 Y! P( b( g) h6 Q
- * Выгружает все квесты и скрипты.
5 ]7 k# @: h5 g8 {, r% T - */, p" |+ I) j. @8 O4 g% y7 c4 P
- public void unloadAllScripts()( I4 ?5 x8 Q% ?2 @ _8 U
- {1 `# i/ L# ^8 p7 l
- LOGGER.info("Выгрузка всех серверных скриптов."); b% p# T/ l6 D/ g; j; q
-
9 k$ a9 T# \+ A% m0 X - // Выгрузка квестов.
; B! [' t; j& D6 e; c - for (Quest quest : _quests.values())7 P% \/ v$ z$ P' S+ p$ ~) H$ O, A
- {
# D. u9 c- e' d/ e - if (quest != null)
5 D S6 F) } h4 K( b- Y& X7 x, i' J - {
( U. e+ A7 a7 Z/ c# o6 l - quest.unload(false);
' u2 J, ?" ~* |- H; S - }+ r6 |' u! R0 a8 W6 f
- }, n" M, M% R' n" Q( r- o, x% d/ o
- _quests.clear();
9 W6 Z( Q$ X- \: ?. P0 {6 ^/ p4 { - // Выгрузка скриптов. }) F% K) N. ?" k) t% E& t2 H
- for (Quest script : _scripts.values())
& U9 Q" f2 w( `* ]$ J0 L2 p - {# V" I4 ~% c2 r5 \* \
- if (script != null)
: d* f: k/ J; E; Z5 F - {3 l+ q) ?0 s6 l$ l
- script.unload(false);
/ ?. d' ^. h* o. j* A6 S/ n& [ - }7 m% E& b. F/ N) s @9 w; _3 \/ p
- }
) x* f. \6 b1 W7 U& c - _scripts.clear();5 U3 r. q, `' }$ t5 A0 u
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
( n) G* A1 m6 i% i% [
9 D( j0 o1 h" s9 S) [: t# aМетод report()
- J7 X1 [" w. f' B, S" C* r# m! H# T% n7 {- s6 @) p5 I+ M* ^% F
- /**
% V- ^8 x3 y; p7 h - * Логирует количество загруженных квестов и скриптов.. P W' G. F! T) B
- */9 V8 H1 i2 X/ Q+ G5 D7 T
- public void report()6 M' @% `! K: {8 [0 i8 F
- {, M0 m: I+ b# `2 _5 K
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");+ g/ |' ^$ s9 T+ Z
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
, `7 ]( ]7 r3 r L: s9 I5 l" J - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
1 m- c4 N0 l6 a, }! B
* @& }: w- C9 D. p5 S) PМетод getQuest(String name)
/ R! } o/ k& P' B# n- o& H, ~+ M0 U9 h; w2 V4 p! X
- /**
4 J+ w# L5 K6 A4 i, @( y) r - * Получает квест по имени.4 c: S. H6 n0 M0 r
- * @param name имя квеста
, a$ j8 x& Y+ c6 R" U. E - * @return квест/ s) G6 l4 L, Z
- */
7 O. h( q, j k. _ U+ s0 c" ~8 S - public Quest getQuest(String name)
+ D- O# e/ E$ b# ~ - {7 a, n: J4 \+ q$ i j
- if (_quests.containsKey(name))
/ _1 O/ q" _: t [9 U - {& u, u& V d7 s. |) V0 b( q
- return _quests.get(name);( g" j M; f6 R( h; A% q; J
- }
# u5 q/ m/ Z/ C9 y$ o1 A - return _scripts.get(name);
# v& M; ^7 k0 `$ \ A. f - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.( r7 w) U! i# x$ `- A
2 s3 I8 g3 P$ vМетод getQuest(int questId)
0 d% F( G) n! Q9 o" i G4 U7 b7 d0 |8 _& m7 e' T: j
- /**
h/ @# c' n; a% Y; [2 p% | - * Получает квест по ID.7 _% d8 g3 Q. A3 p7 V* y( @, H
- * @param questId ID квеста
U+ Z- e2 k r, |! t - * @return квест, если найден, {@code null} в противном случае
2 Z" u( V3 o* n' L& [/ F - */6 W8 f! P* O& Z8 x7 J( F, t9 K
- public Quest getQuest(int questId)/ j [; T6 d& {1 j
- {7 Z1 G# O c8 d
- for (Quest q : _quests.values())- J6 M/ j, V& F; E6 ]" z# K7 X
- {
& O9 @ A5 \- c+ \% v( N0 o) ~ - if (q.getId() == questId)' ]" ? U K1 N+ A' y
- {% u6 |0 l: Y1 s+ \
- return q;
$ s; T x2 P- m5 y& v - }' L2 |1 j2 U5 R# ^5 W
- }" U/ W+ s* M( a4 ?
- return null;
; b/ K) e6 k# G; `% b5 P5 I/ J% v/ T - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
2 n, h0 ~- \0 Y* p; f7 w 3 t4 U, h5 d# p% C. c% \4 K$ S
Метод addQuest(Quest quest)( J) X& f5 w% Q8 D0 @ m: Z5 t* B! _
# C# F. ?2 w/ ^8 D
- /**
9 M/ T6 Q& W* P. i& C1 I8 @* @3 i* W - * Добавляет новый квест.
; X$ a8 j6 f- r2 s- P3 e% @ - * @param quest квест для добавления
5 X8 ~9 s' \8 E3 w @6 _. y - */1 ]/ U: s6 _! h7 V- \: `# j5 N5 K+ S, d
- public void addQuest(Quest quest)7 c8 q: g# h: F5 R+ V ?" r) D
- {
$ L* H# a4 a6 h( l1 o( o4 Y( ? - if (quest == null)1 w7 h: \3 n4 |4 L' \& _
- {7 U; Z: i x3 P0 C! ^" \
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
9 g- V* A' k5 B8 {, \! G) I4 l - }
$ U) n1 j; Y+ U1 J7 M9 v -
( F+ g$ B8 @* F" B! X - final Quest old = _quests.put(quest.getName(), quest);" C8 P: U5 ]0 j6 B: a* ^
- if (old != null)
/ L# Z* |+ ^, e* K2 e3 `: O/ }1 W - {
7 p; D! x# ^2 V* ^ - old.unload();
' `7 t: t( B/ ]8 H6 X8 T - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");4 c& ?5 m. w. L$ K- V- ]! ~
- }
( {8 _! N. C/ w- l% q+ O+ C! m - & p& P5 \7 @0 r g$ _9 E X3 C- C
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)( j2 a: A8 _3 j/ G) n
- {+ _9 g9 D6 }- H9 _
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
% q/ T1 O2 [9 p4 `+ q8 _ y0 V - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
; m" ^; F: u" |( Z1 k2 M - }
4 j7 e, y8 B9 R5 \+ M4 X5 A) l% ] - }
E: K) H5 H" \8 ?: \ - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.4 z7 }1 f- H9 ~5 [- h* c7 A
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
' t3 w& u8 `8 }, m
% @' g# P R' O e* C& X7 H9 A3 e6 A; [, D/ o4 E
" Z* J9 J$ @+ I |