Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius- P* ?' ^+ E6 ?5 {
' _8 [$ X9 [' b1 l$ p1 D
Разбор файла QuestManager.java) b. q8 \) P2 r
. ^5 s$ F Q- T7 G3 B; Q, BЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.1 b, H- U5 ]' ?
Основные элементы' ]1 e" r7 ^, l( r5 Z
- Лицензия2 ^' l. U' T& W& }# i \
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.: F$ Z% G0 z1 a& q) F7 Y5 [6 u' }
- Импорты' x8 H& j% r' w! c0 l8 K
3 _7 \& _7 a/ f0 y: o. h
QuestManager.java — управление квестами и скриптами.
2 I# C" @8 I/ i& ?! P- Q% m6 [Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
/ B" n) h8 Q7 v2 F7 ` f5 s3 Y5 h2 B l3 B& ]
, e8 q2 y4 Z2 T; g3 c) G& S7 AДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.! }: O; t0 l4 I1 v% i* @& u& ^
1. Лицензионное соглашение9 E; v }) t/ I" ?7 H5 P# w. Z
- /*
6 n! E2 C) J: f$ ]& a$ z* M- ~ - * Этот файл является частью проекта L2J Mobius.5 v/ r( h1 u$ l( @6 C* }8 C
- * ; @8 O& F6 i, w( j: ^
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять( k) f- A& a" K9 v/ Z. _- K
- * её в соответствии с условиями GNU General Public License, опубликованной8 Z2 s9 Z5 F$ r$ ~# y
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
' D E1 _, K2 O - * * i5 H9 y+ I5 t' w: y; m
- * Эта программа распространяется в надежде, что она будет полезной,
8 u! H" ?& D6 b. U' y - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
7 B; g9 L M8 D1 ~$ Z% q - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
, F$ i- T. l6 l. W - * См. GNU General Public License для получения более подробной информации.. K0 I" ]& q, K8 R
- *
1 l4 h# d' v8 d, @9 x2 h+ {) D - * Вы должны были получить копию GNU General Public License
/ s/ _* b2 e) J, a8 m Y! l - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
z( c' g; Y. e& i9 D* x - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3." C! Y' y! y! J2 P3 s& J0 S
7 y8 b6 B. [4 o* m# W
0 e2 W8 T( B* W/ [: j
2. Импортируемые библиотеки
$ \, v( W: r: z; r. D& d
4 T/ O M0 q9 w$ Y4 l/ f0 K- package org.l2jmobius.gameserver.instancemanager;
! f" T# C& z8 P7 p6 C
1 `/ w5 O `1 v" w. `- import java.util.Map;, S6 B: E" [' E- |
- import java.util.concurrent.ConcurrentHashMap;
9 p d. @: x6 W& K - import java.util.logging.Level; N! ]7 L7 F* N" {6 S
- import java.util.logging.Logger;
- r8 J% b( b" Y+ L0 `0 k" n" Z
" m) u4 v |% t- import org.l2jmobius.Config;
7 E. e* q5 I8 X C5 e - import org.l2jmobius.commons.util.CommonUtil;, a" l, r2 }# ? w) P8 w& ?/ B
- import org.l2jmobius.gameserver.model.quest.Quest;; I, O, {. t3 G( u8 ?
- 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 — менеджер для работы с игровыми скриптами.2 a# r4 A: N; u8 ~4 r- a2 Y2 o$ d
4 N5 o& a$ t" i1 _' _3. Описание класса QuestManager
1 j5 g% t7 V0 y2 _# T- /**3 ^& _* v" J6 ]& m1 t" H# Z
- * Менеджер квестов и скриптов.
# w$ _( Y f6 ?* y - * Автор: Zoey76
1 }2 h: J0 U6 l# o+ ?& f - */# `! n6 v3 |% G4 [( D9 V: Q! @
- public class QuestManager
' f G. N. a- [& | - {# S+ m% p1 A2 |* [
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
8 ]' r3 Y8 d+ g5 J" u! n -
" m+ \" m) G9 V8 d4 H - /** Карта, содержащая все квесты. */
. b! C- _" U, X/ w - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
$ d9 |) D& f/ v* c* m - /** Карта, содержащая все скрипты. */# T( v3 q- K: T
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
0 \4 C% ~; g# `8 D - % ]- W& {3 k0 n3 d, t" ^* u
- protected QuestManager()- j! h) [4 |* H4 N0 m5 l
- {5 a' t+ `4 a+ o3 O
- }
: v1 N* Y" R" t( V3 ?/ L' _) f - }
Скопировать код 4. Методы
# e, O6 r( W. d% LМетод reload(String questFolder)
. n7 M* W( _+ ?. `. J- public boolean reload(String questFolder)7 ?7 r' M3 }) m( X% I$ b+ U
- {' L9 d8 `- k/ ^4 R* ?! ^
- final Quest q = getQuest(questFolder);6 i: t( j2 [$ ]! G3 x( Q6 d5 s' Z, W
- if (q == null)9 @1 V: K6 m& ?1 L2 T
- {: o( Z1 p2 W# x3 q1 f+ @
- return false;7 G* J, }! l! F' r2 f
- }
, p3 r2 @. `2 L0 Q - return q.reload();5 r1 r! O$ y z: U
- }
Скопировать код
. k/ P* O0 ]/ E% F, W% a" S& m; v/ d* g* j# {
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
+ }, L5 S" u6 S% D5 ], C8 MМетод reload(int questId)9 e- K" ~8 {% \% _% S5 z
' g! g" l4 `& H! \0 g9 n! g- `: }3 p
- /**& U; X( h9 S- s3 q `
- * Перезагружает квест по ID.2 M' u+ q. X! ~0 Z% @ x/ J
- * @param questId ID квеста для перезагрузки
# S( F6 @, k) Z2 P- D& @ - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае8 ]7 J+ Z* R" ^6 l* e
- */
1 O; y3 g T) s% x - public boolean reload(int questId)
" a2 M& y! R* f( N- _3 f: j - {
m1 O! B( ^8 @& D' _, }% {% W. g - final Quest q = getQuest(questId);8 [( y9 z) z6 l5 l
- if (q == null)
/ l3 C# ` P O6 @7 I1 T - {
# J( d |! r4 z5 v+ q - return false;
; x6 f8 Z+ P# j* S8 z0 }) w! w - }
, n. B1 V% N @9 q - return q.reload();% C' r: e8 ]" q3 V+ K! m1 G+ r2 ]
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
# g$ ^; t& ~( q) I& m 2 E1 Q: ~6 l# m/ k0 D, M9 b
Метод reloadAllScripts()
) d# Z0 J) z" @# ~/ i
' S) ~* u( t5 R- /**
" P9 H1 ?, t: h/ N) P; V - * Выгружает все квесты и скрипты, а затем перезагружает их.
, a- H v! [8 O1 ? - */ K8 _( [' B& }$ v
- public void reloadAllScripts()* f) ^* v( Q+ I
- {8 C" U S& d7 I: d' w
- unloadAllScripts();" s3 ^5 r5 k! V, i: B. y
- 8 ?& u: R6 @9 ^% a, n
- LOGGER.info("Перезагрузка всех серверных скриптов.");9 Y/ _) X. o l. h, P
- try; C. O1 s4 @: E: a' m+ W% F& X7 t
- {
$ z% @) j& t, ?6 P9 w - ScriptEngineManager.getInstance().executeScriptList();1 ?0 @0 P2 L1 e* }5 c
- }
, O. \7 u u$ P |/ V* B - catch (Exception e)8 e' ]( |* L/ ]/ Q6 G, j: L( }* M. ^
- {
# f& @, l( S4 `0 b( T - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);& I% I8 l# M: Z/ z, E5 h
- }& Y9 c$ M: Q6 _9 s# ~: g
-
2 \8 Z- Y1 i/ i% k - getInstance().report();$ i, g2 Y+ b! X0 U1 Z, z1 H
- }
Скопировать код Метод unloadAllScripts()+ M* v( t* H' \" N: u' t. ^
2 T( D& J& v6 N- /**
9 Y, O: W* J4 u [+ |; E; p - * Выгружает все квесты и скрипты.9 [2 L3 D! L' H
- */4 c" b0 H# @! [, X
- public void unloadAllScripts()
' G% ~; O, \* b4 t1 ]: g Q# R. R - {
2 ~+ P: C, N: {2 p% S* n. ` - LOGGER.info("Выгрузка всех серверных скриптов.");6 q6 h$ R/ h9 O7 X
- ) a* W t' M7 [) \9 g" k# W% C
- // Выгрузка квестов.
# p5 n/ y2 s5 s - for (Quest quest : _quests.values())
; M k- w) j) n# A8 C& ~ s4 Q6 {- G - {3 K8 I% v) Z2 Y. }* |5 U
- if (quest != null)
) z0 \3 R* B% d, h* |, H& c& m - {
0 [9 D' e( O- c/ @ - quest.unload(false);
* v" K, K% X( X+ `5 U- B - }) Y; H: \/ {: B" v4 d
- }0 `: h, A! H1 u& g4 t- e
- _quests.clear();
/ O/ c/ l& m) |; ^( V5 M# q - // Выгрузка скриптов.
- J6 z0 k( K0 P3 C) V8 I - for (Quest script : _scripts.values())+ d$ t7 R+ x* X# y
- {6 C+ ~; c4 j$ p5 w8 I# T9 f0 [
- if (script != null)0 o; G( E' ?1 j
- {
( w1 T9 J1 P8 ?3 w - script.unload(false);
& c5 G& |1 Y9 ^& S; E# \/ C2 N; z, W - }8 M0 T! I2 ~! ?! r: t9 [. }
- }
% d& G( v% g* u$ G( g6 F* s( w8 W - _scripts.clear();
" `" C0 [4 Z' M1 A - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.: R7 i! ?8 T4 `
2 T# `: e# J# v# d9 J8 t
Метод report()9 G2 u& P H0 n; B
# Z3 t! U) t' e5 @
- /**
2 v, c! U8 X& }! Z4 E - * Логирует количество загруженных квестов и скриптов.
( r0 j: W( U- S* Z8 U+ C' O+ h- }9 ] - */. j) g) [" L4 K$ C3 @, ]
- public void report()
& Z) K9 M$ x1 ~3 r - {6 a) ?: v1 I( g7 T7 x
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
' [! C* g# \# L. i$ M3 _ - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");. a5 O& q' _$ t: L5 ?+ l
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов./ B# x7 L( G d: M$ a2 H u
( X6 P! f0 R; o9 c7 R( DМетод getQuest(String name)5 j7 I: u$ g. x/ Q) n7 e
5 f; T6 l5 H( D2 O, h
- /**7 A: k6 {! J- s9 Y9 r
- * Получает квест по имени.# Y+ g$ {* l3 V% Z/ }
- * @param name имя квеста! K7 A# K5 t1 R; R
- * @return квест
% c! }" |4 Z: ` - */8 }' v" K/ [( @8 c5 S/ F
- public Quest getQuest(String name)4 |$ o8 }2 N: Q o
- {( s2 a! |# \$ Q" ~. l1 x
- if (_quests.containsKey(name))- s9 T1 b& u4 T$ Z( A' d1 A: O
- {/ b: b4 y# |7 J; S. Y
- return _quests.get(name);' O9 N- H$ n" x8 G
- }
[5 G4 D3 J& _6 @; m) K5 R, O4 g - return _scripts.get(name);- ^' {' h& b( f( g7 ?
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
2 v7 X" U+ a- Y$ K; F0 p
% n+ M L' R: S0 S+ M2 I" gМетод getQuest(int questId)4 O- S1 k4 _* { a6 ?* Q
$ V. s9 z# y2 ^% y
- /**
: y! h* m; Y' U* ~ - * Получает квест по ID.
" x7 n5 W3 ?7 ?2 P/ u - * @param questId ID квеста
8 j) y$ V1 ~4 s6 q6 F2 w - * @return квест, если найден, {@code null} в противном случае
% u, M; q, |% H1 t+ N: ^$ _! W! y - */
4 X/ C1 R7 \7 h. X- T - public Quest getQuest(int questId)
' @9 b* c2 q I2 _+ r- F$ f. | - {
- r. F3 T& t6 X8 O6 Q - for (Quest q : _quests.values())
; w* i9 E0 P' f# C - {! o2 K+ n5 g/ `- E# B
- if (q.getId() == questId)
$ J( w1 ~4 U3 p4 f0 T9 H - {
) T6 m, r+ e4 _8 w- W6 s3 M - return q;9 h1 `6 S( V( ?' v$ l* v. P
- }. f6 Q, |" f' c# Z
- }5 j: {) \# ]+ \8 R6 J
- return null; M2 Q" I1 v" u! a! ]5 \7 s
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
' u* t5 t4 H$ ?: T& ^
- }6 e0 ]) @+ K3 ?% a9 y% c5 W: pМетод addQuest(Quest quest) d3 y; K9 ?0 p1 a9 D
$ k% x2 O' h3 f8 r
- /**
% b8 Z* t) J- e+ |9 J5 u- e - * Добавляет новый квест.$ l9 ^# p' M0 m" x3 y
- * @param quest квест для добавления, P% A/ u2 m- N- w$ P3 E9 m7 h
- */. v# u* b4 C" N1 u. P
- public void addQuest(Quest quest)
. w$ {' N ]$ z - {
7 R1 f5 C' H' f$ o - if (quest == null)% H* l4 T9 F! W+ m
- {+ y0 y3 p% {' E. c6 C! q% ?
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
c% g- D" B; w% B - } e2 h% z) a ]# M
-
/ ~5 [2 Q. M; g/ p* c' w; y - final Quest old = _quests.put(quest.getName(), quest);
* @" j7 p5 K7 o) w- f$ n$ s' Z - if (old != null)1 ~1 \" [8 @- h# P- m
- {
* X3 \2 t& Y) j4 _5 u* H1 n - old.unload();
4 j- }. |5 x+ ?5 o5 i - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");3 C: X9 U& u- ?# c
- }% H& q. {% ?( d; P" V: Y
-
. V* O, r$ d: j9 ^$ z" X - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
) M3 n w# R3 s; M+ h: l2 ^# J+ P - {
& _' f9 T" e; w6 B% R3 E - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
9 q7 U7 r/ z7 c: G2 @9 |1 r+ ]$ Y - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
1 l# c9 N/ ^8 ?: b - }
, E6 C: [# X, T5 ~+ }/ o- k2 ? - }
$ I) O0 G) N/ ?; d) ]5 z: a - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
2 @2 E1 |! M8 Q8 j- ^ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.0 e/ n6 n) Y/ t" K
. G8 o. d/ I1 k* j
: E9 I1 P& j# \$ l3 t/ w+ @+ O. ^$ ?, R
|