Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
3 H+ X! D x q9 ^. ~6 \; |, j# s8 z: n2 A6 ^' ?! o' _/ b
Разбор файла QuestManager.java. C% y: a& l7 i/ d& T
, S( r9 B5 A# k: h0 N, [
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
; n9 c E! V7 ~$ S) Z4 h0 o; GОсновные элементы
- S4 k4 k- G5 ?) B5 Y: K3 k) a- Лицензия! G- J8 x5 M; d$ U
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
7 x! J% L# N3 z: Y" M2 L" b8 H
- Импорты! e) b) X& K* Y( X1 }5 Q
/ r, J8 u C# `) D$ S; y* VQuestManager.java — управление квестами и скриптами.
[! M, h% r; E, x3 i, y6 q: CПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
) E* L" d, Y8 ?4 T$ V! K/ d; H0 h2 o; d7 w( t( ?3 i
0 m4 \8 L1 ~1 I7 M( N- H" FДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
0 O8 l. U/ z+ U: g& S1 R. D1. Лицензионное соглашение
& ?( m4 p/ @% z* V9 p# C8 L3 s6 C. @- /*( }3 B" |4 J+ Q9 m
- * Этот файл является частью проекта L2J Mobius.' p! ^. k- d5 X! e* {
- * $ {! D9 u5 {- q2 Y& O% R
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
9 s% k- t. ^# ]5 s8 s) D - * её в соответствии с условиями GNU General Public License, опубликованной6 w. j5 ]& b0 {' V; }" ]
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.7 f: P, Z/ O( s, V& K+ V
- *
: j9 E7 c& S/ p$ H0 ?" O3 N - * Эта программа распространяется в надежде, что она будет полезной,
4 O* H T' h- R/ x, S - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
, I: q" ~. j5 O8 L - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
) E# x, ^" M) n+ \7 ~2 h+ p - * См. GNU General Public License для получения более подробной информации.
3 |" b. D1 J( p; J - *
5 ]/ t6 J$ p& s7 ]' h' h - * Вы должны были получить копию GNU General Public License0 F) G( T5 z" O5 j
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.( g- N) i3 z! Z$ M3 }
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
$ f7 H* W0 N. {% F* w0 A
8 y, ?, i) _3 a. Y# x" P; I
w+ i; Y$ ~4 f: d# c2. Импортируемые библиотеки
: a: ?( L# W( U) _- h( c; M6 F1 j4 p) U9 q; L1 b/ a' B! F( k
- package org.l2jmobius.gameserver.instancemanager;
) `; l5 q+ d, H5 D( j - 1 ^ P+ b8 b1 `! [8 V" j, b
- import java.util.Map;+ S5 J8 d# l$ D3 k+ o* p. v5 k
- import java.util.concurrent.ConcurrentHashMap;
3 C' M1 Q: b% K - import java.util.logging.Level;
: t+ R! e$ R5 J: x% G - import java.util.logging.Logger;1 k: \/ r- ?4 L; y7 s/ F3 M
7 u+ @& y3 w7 A0 D8 s2 J( v- import org.l2jmobius.Config;
# `" D u/ p" Y' w - import org.l2jmobius.commons.util.CommonUtil;
, L5 K0 ~' M1 U5 {- t% ?5 w- \' n - import org.l2jmobius.gameserver.model.quest.Quest;% i; s# P! I- ~+ {, J w
- 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 — менеджер для работы с игровыми скриптами.
7 T. w+ Y& m" T* D# R- C; i: x
3. Описание класса QuestManager1 s6 i, {2 G5 }( j! G
- /**
! B- V; `' M1 ?) x. U2 j - * Менеджер квестов и скриптов.
- m. t2 S; z4 [+ t5 r1 W. ^2 p6 B - * Автор: Zoey76% R1 q, X T' Y
- */0 Q1 q9 U) ?: g: P4 P, K( A
- public class QuestManager
- [/ \" `( u5 D3 w" S, ~4 \1 t - {' O( ] d* u5 k, L* _- N
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());6 M; z* v. e j! G6 P
- 9 |6 G u" l% k5 k* @* L
- /** Карта, содержащая все квесты. */
5 R [9 w9 O& x5 J+ ~! A - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
9 S4 L3 U2 m. c* g/ M/ r& R3 I - /** Карта, содержащая все скрипты. */' z; s! q7 T; R
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
- X' I& P2 {7 a* D- z+ @ -
/ g: ?4 Q y3 }' ]7 ~4 f - protected QuestManager()
3 l- h4 i& _3 A! j9 u' B, ` - {2 c4 s0 p; a5 f: X
- }. s" q9 \/ a3 B: v n; N9 d
- }
Скопировать код 4. Методы
; T( @# z) Y# sМетод reload(String questFolder)! Y! W! I( }' L, b5 ~. f. T
- public boolean reload(String questFolder)0 a8 v0 g8 k; Z
- {4 ^% j' r7 v0 b. J: h# i
- final Quest q = getQuest(questFolder);
- G- m+ E5 ^$ c/ X1 R4 F2 z7 | - if (q == null)$ R4 Z; S/ \& j" Q! e
- {) F, o7 h2 o; t# ?7 }
- return false;
- S* J+ G$ C+ Q! Q, H8 N* o - }3 K: X) L0 `7 F8 z
- return q.reload();
2 Z) K0 ~2 g6 T# X6 q3 Y - }
Скопировать код # v- o) B7 g6 Y- [5 V7 Y
8 }+ V( \/ P& u7 o# a% CМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста. V$ x6 u# d" @. S/ S$ p# n
Метод reload(int questId)
8 r* c/ i& `, z4 y' D) t: n9 F# G) v' \9 U, F+ t8 A5 j! d& E; _
- /**
0 q, O. ]( V1 l0 n - * Перезагружает квест по ID.
% ?! j, H( K$ h6 ^5 M - * @param questId ID квеста для перезагрузки! ?) N P* w7 w* n( T% ?9 \% q
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
+ R; y" L! h' s$ Z4 F - */
! m. M6 B, r% ]8 r; u p- h4 Y - public boolean reload(int questId)
2 \* ^! ?* d$ o/ h - {
/ c; D" Z+ |' b! f# Z1 I8 H - final Quest q = getQuest(questId);
: o$ t2 F( T: ~; i+ R - if (q == null)
2 T/ g2 p$ f5 w( R- G - {" }) {. p }3 p
- return false;
% Y; }+ z$ P) b! Z' T4 u- n - }" p8 v% d; T) i
- return q.reload();/ C1 A0 a9 V6 [4 |
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
+ c8 @0 ^" I1 k" l) C* X8 o , Z2 w( h r+ v% n& r2 Y% T1 G
Метод reloadAllScripts()
N8 c3 R# A' q/ s5 p: @% z7 b0 |+ ^
6 E: U: m- f& W9 _- /**
0 ~( \" c9 L; S+ T; z - * Выгружает все квесты и скрипты, а затем перезагружает их.# H" p3 D; H1 B
- */9 P; T# {6 s7 ?; U
- public void reloadAllScripts()1 D; `# c- v8 Q4 b
- {
# ?7 e& R( B6 ^- d" x0 P5 } - unloadAllScripts(); S5 i% N3 t9 \. z' O4 @: e7 Z
- $ T! D0 ?9 z8 j; U
- LOGGER.info("Перезагрузка всех серверных скриптов.");* R& K% s( E1 C* h6 j6 E
- try& C4 f( k* C" g% M- V
- {
) h6 f$ w* H0 r( i5 K! q! A [ - ScriptEngineManager.getInstance().executeScriptList();
( Z2 ?$ o% H$ H# I4 X - }" e. `* ?9 r: D1 i
- catch (Exception e)$ a" s& e, h, u) |: A6 y
- {
& U* k1 ?& b+ z2 j! M1 n - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);3 \5 f2 {0 {1 Z4 l
- }
4 Q# P$ B/ o: ?! `" e$ E* [+ G -
@% u4 ~- \' _' q3 b A - getInstance().report();
+ B. n, N' K' } - }
Скопировать код Метод unloadAllScripts()
- a: v K: b' d8 z L# F) z, k; p' J
. c% n) }7 ^5 N- /**
' C- C6 O1 S3 O - * Выгружает все квесты и скрипты.
- q2 S; s% B ` - */' j- F% U0 l; N3 N( V
- public void unloadAllScripts()+ ^. E" k! n2 r# m" d+ K( f
- {: A. _8 Y$ a$ r( S# ]
- LOGGER.info("Выгрузка всех серверных скриптов.");& F1 E" r' z6 l3 }% t
-
" l9 D. s* x7 s- `/ g% m - // Выгрузка квестов.5 ^& i, w& Q/ d7 K* h5 p( Q
- for (Quest quest : _quests.values())
. V; ~& g8 W2 r9 c& s+ g+ V2 a4 } - {
# F: i& I" Y. d E; I - if (quest != null)
, K9 b- Z: V3 p) _+ K - {6 E' i% d l5 G _; V6 x
- quest.unload(false);
% S& ~+ j- P k3 Y4 g - }% l2 ^7 f* R' [+ Z& p9 h9 F
- }/ i5 @4 Q$ n) |, K
- _quests.clear();
5 X& E0 b! K; ~& w8 l* x - // Выгрузка скриптов.
5 s4 B- P! C5 Q2 ] z; } - for (Quest script : _scripts.values())
% S8 E- L& b# D0 H3 D5 h J - {
; r* v) o- i- @ u - if (script != null)
/ E/ Q; ^$ }' J% j3 {/ Y' ~ - {
, c* ]+ q2 _' e2 o - script.unload(false);6 ?3 M: n0 k- t$ d( \; B; F1 `
- }
- ~" X* L. h' P/ y - }- Z5 ~2 d! V( D5 D
- _scripts.clear();
1 h8 V% J# y4 u5 w/ q7 `) A - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
: O' n, y* y% Y1 y% @' u + `1 u% }. E9 t4 S) h& t! e
Метод report()5 W' ^7 w3 ], W3 J; k
$ r( G4 t& _! ~8 D5 D
- /**. C# o% K) C; A: X9 C& R3 ]
- * Логирует количество загруженных квестов и скриптов.6 T. O0 M- h) T# e, I/ ~
- */
" Q1 l# u# v- Z9 k - public void report()* c$ F, e* u; b
- {6 J4 `" G5 R% a4 D! B" L/ o
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");/ s" X) u" j. S6 L) |4 }
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
9 O9 `% }& L% {( H( S3 q: K' [ - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.1 S) L8 W4 h' J& G1 ?9 g$ v
: E. u% V" r: L; g: t
Метод getQuest(String name)3 J" P) y- x: y
Z2 W/ b4 b; l6 J- /**
3 ?/ F R! t3 n8 A! T4 ? - * Получает квест по имени.& s2 o; t! j5 E2 e2 C' O% C
- * @param name имя квеста7 v- E: y( h5 j z5 N e# ?
- * @return квест
" x2 L% v4 b' o) C1 z6 ` - */. ~( M6 [' \3 f# H j) k* x; l
- public Quest getQuest(String name)
0 c% l; m, y5 \( A1 K* L - {6 L# @- w0 y; G* y( {) \% Y7 D
- if (_quests.containsKey(name))) u1 Q) w0 M& p4 V2 Y |$ d+ C
- {
: s! N1 K/ a7 A3 ` - return _quests.get(name);
7 q8 g. R; D! M4 m7 y6 K. m - }9 ]- ?% c# g( T: V" t% X [8 _
- return _scripts.get(name);* X6 a! s2 u4 C- F0 s$ P
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
' T# L) f, e8 y( T+ F6 F 1 F* g/ {8 r8 k% r9 X
Метод getQuest(int questId)! [! ^% R* c ~* G0 ]
, D2 X- i8 r/ X5 Q' N* d
- /**
9 N# ]+ J$ K% ]: e; r - * Получает квест по ID.
. P3 d# j& \3 s4 D6 Z* r& o, l& `0 U - * @param questId ID квеста
; E; f6 {! n5 i) u - * @return квест, если найден, {@code null} в противном случае
7 R! w+ T) [# E% Q4 L; [ - */% L. `; e7 t" P% M. f( Y9 V- {
- public Quest getQuest(int questId)5 o$ D+ I$ l" o D" j
- {
$ V9 P. W. k$ v5 c - for (Quest q : _quests.values())
; M2 q( Q6 p8 [: h) d - {5 z! Z/ \! o& K! q& o& G) }" L9 L
- if (q.getId() == questId)4 g$ x+ _8 c; Q6 R) x* h
- {: w+ q- h5 f- M! P+ O! e( v
- return q;, ?1 h2 ~% k) q
- }
3 u' m' O$ f7 z$ O - }' ?. s# c/ ?3 Q- N
- return null;
2 L- H% e4 t7 l! q1 p) c; c - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.( e' [: N% E7 S
7 d0 J$ S* q8 [' E5 O' bМетод addQuest(Quest quest); R$ S" n! `+ t3 w
& B" W% q. a9 q$ {- /**
& K$ m- d/ r: [8 y - * Добавляет новый квест., v- F! I% @6 b( A M% x
- * @param quest квест для добавления X& l/ Z8 C6 d. g7 H0 g1 J/ F
- */1 Z# v0 `% o( H
- public void addQuest(Quest quest)
- B( |$ M+ J9 ~% q0 W- W$ Z* l - {
0 v: K4 ]( e5 \4 X# ]9 E/ w3 K. \% P - if (quest == null)
; m! t! E3 X' V9 e& N4 v - {3 r( c; ^' l3 i
- throw new IllegalArgumentException("Аргумент квеста не может быть null");! Y) r4 v/ H& W" x; U3 j
- }2 Q5 J$ u: i6 i! f
-
8 i) f8 q+ r1 M4 d7 Y7 \. x - final Quest old = _quests.put(quest.getName(), quest);( W7 K& i% l8 p5 k
- if (old != null)3 \" g. ~4 F, T$ y
- {
" t: ^6 v& o, Y: X: p - old.unload();
& g u( W( B0 \4 h$ u - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");: J/ I/ n4 _5 F* F! q
- }1 s9 Y* ]# A2 L f
-
! v; R+ e O; l/ } - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
% ~4 w7 R+ P& ^! M+ \ - {; w( v+ s* t2 {- Q8 e- C5 \- R
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
4 @. `% A" n. e% v( u - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
" C1 r3 i- K* _% Z. B/ q, f - }5 o. f' E' U9 i% M* k+ I
- }& W# q, e; H- c" h
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
% u% Y. w3 o5 C6 GЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.) w; T6 Y# a$ h( [+ K; y
% D( v( W1 X/ j: V; I, {& V( j
+ ~; i4 Q9 d k& H
) f \& A/ |- P: b5 l- `9 ~
|