Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
( N( O# A! S$ Q8 V5 x
1 R/ T; V8 c4 I5 d. A9 _Разбор файла QuestManager.java
& k. k. d) [0 D8 f% W: b2 N
( `5 L5 O9 B0 p( v8 [' y& w+ W& MЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
6 f; ]( ~8 z( j/ V3 e$ x3 b# g8 j0 i+ r8 DОсновные элементы4 h/ q8 v) M* S1 p& c6 j' h. Z ]
- Лицензия
8 q3 I( p- y2 T) N- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии., ~0 D+ v2 g# S/ r
- Импорты
1 n) S4 m' W2 V2 F5 j 6 o- g6 z1 B7 i+ w0 O$ l2 M+ D
QuestManager.java — управление квестами и скриптами.
( A/ J, s2 A" v4 c3 {4 Y7 TПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\+ O. x$ h0 N) a+ P0 ], C1 r0 }
& k6 `3 Z: {% m3 y1 D% V
" s8 Y/ V u5 d# n& {Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
/ B. ?+ |, a+ @7 r% y$ k1. Лицензионное соглашение2 m; K; D$ T9 X. H: `
- /*
8 G6 N+ M, l, E; O9 J0 J - * Этот файл является частью проекта L2J Mobius.! u: O5 V- Z# u1 M& f! Q
- * $ S" A9 |% h/ z
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
. l( Y* N F( N% H/ ^- S2 N3 Z8 C8 ` - * её в соответствии с условиями GNU General Public License, опубликованной
( H" H. Q: s; ~' D: G - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
7 q1 O5 b+ W7 ~6 N - * 6 [8 D0 Y5 @1 n8 Z! o
- * Эта программа распространяется в надежде, что она будет полезной,
8 |( ^5 x- m( f; b8 G S - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии a l; }2 E; F2 S: Y9 T$ z
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
: j: y( D9 O* W: x - * См. GNU General Public License для получения более подробной информации.
; Y |* X6 t. b7 F# F) ?" W - * # j0 K2 X7 {7 |2 l6 B2 m
- * Вы должны были получить копию GNU General Public License
, K! T0 z3 q p& m* c+ R, T5 h' S - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
0 k) Y$ a: [; ?( x2 V: W& q - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.' d6 y# W5 Q9 o t, u
2 w$ m0 w, Y3 r, y
7 v$ n- S5 a a0 A0 G$ l2. Импортируемые библиотеки
: `. u: H' O/ z- }. X8 s2 N# M4 ^/ T) l. q& }% I _
- package org.l2jmobius.gameserver.instancemanager;( s, O9 {' j5 j' I$ x$ {+ j
0 R. R3 S: n6 f! ?* R- import java.util.Map;
3 ~( L6 w, r: \4 r2 k - import java.util.concurrent.ConcurrentHashMap;) V: r, {- `) I8 `1 y# p
- import java.util.logging.Level;
4 }, ^1 Q' d, y/ ~' x2 c* x# a8 w - import java.util.logging.Logger;
3 U/ ?* q ]7 ?8 l - $ I K) n+ [; T% C
- import org.l2jmobius.Config;" [0 }- k! ]+ Q4 ^. @; q
- import org.l2jmobius.commons.util.CommonUtil;% R. p5 T5 x o( `$ M
- import org.l2jmobius.gameserver.model.quest.Quest;. u8 i# b. K: v
- 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 — менеджер для работы с игровыми скриптами.# z; [ b0 V, U' W7 Z" H) M
7 T9 ]9 S% { _, }3. Описание класса QuestManager2 [' c X7 z( `) c' q- G5 ~) c
- /**
/ H. j1 E( P2 T# [ - * Менеджер квестов и скриптов.
2 V/ v' c1 h* f: j/ \ - * Автор: Zoey763 X- c2 z; w: l$ _9 Z, I. R8 K
- */( ^. @+ U1 Q2 k$ Q
- public class QuestManager" P5 r4 B" D" ^ H: h
- {
9 ]! H7 a _ q3 ^: |/ T - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());1 G4 S" _' C) k8 B2 b
-
1 O$ m9 k" Q3 B% A8 j' s0 q# C - /** Карта, содержащая все квесты. */
2 z# w S0 _' o- g6 s% _8 q - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();$ X* z6 G% M) I# y
- /** Карта, содержащая все скрипты. */
- b0 a" Z% x0 m- c - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();' r8 k1 f9 N8 R* A
- 7 m* h6 X7 j& M
- protected QuestManager()
" J8 I0 v4 [; \! ]6 s, Q6 x/ D - {6 c/ [( q6 z7 y k4 Z0 }3 c- g; r7 J
- }* W' b% G5 _2 U% V4 q, e, C
- }
Скопировать код 4. Методы
4 h9 f* a2 J; `/ C% KМетод reload(String questFolder)
. h2 B$ n! D4 y- public boolean reload(String questFolder)
9 N. J/ y; {+ M( k4 P! p9 P - {
$ T2 h8 \! f2 D0 ^& \$ I - final Quest q = getQuest(questFolder);
C4 D" ?' ]: \" M g - if (q == null)
8 A! F/ G8 n, J% c' h4 w - {
' r; t/ |" T }: }3 n - return false;
" P) f5 i& N3 `$ W) J% u; ^ - }
- _1 p* R, r) [ a6 h8 E - return q.reload();; Y' U% i. d7 ?
- }
Скопировать код
9 q k0 S! A( z; N( H0 ~! w2 L: }% ~0 [' B
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
; U; r% s( J, w& p7 I4 dМетод reload(int questId)
4 l. S- \0 w% x6 s2 g) K
5 {0 H9 P3 m1 ~: N% x1 X' c- /**) L! w F9 T9 P4 [
- * Перезагружает квест по ID.
6 v1 A5 k; X- Z8 F - * @param questId ID квеста для перезагрузки% [7 ?/ a* @& T. n
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае7 c" r l( G L) e, A# [+ B! G$ [
- */* ~) e, u" |( p1 Y# N4 j! \
- public boolean reload(int questId)
3 J2 G; g$ h$ P; V - {3 c) e& ^% {9 `5 w7 D9 W( ~8 `
- final Quest q = getQuest(questId);+ C4 ?! X4 C* T7 j; R* k
- if (q == null)
8 q5 K; L: S2 @" [0 T. W - {) I4 ^+ ^& a9 G' j' F( _
- return false;
) l a u2 T+ a# r - }6 F; c; r6 h9 m8 Y' O9 ^5 P
- return q.reload(); W1 D8 z2 h2 k! t" |: c: G+ [
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
5 x7 M" _/ `) n; K- ?# N
9 a9 e; G M9 gМетод reloadAllScripts()9 e- K X& e2 O
" ]9 t8 l& ]' Z5 B; b1 e" \' L
- /**, _7 m( k; y, H9 N
- * Выгружает все квесты и скрипты, а затем перезагружает их.$ `/ V# s8 V* N! N% F% j* ?* z" x
- */& N6 [& S; K: c. _0 u. H0 c
- public void reloadAllScripts()6 `( ]( V( g' {: n
- {. [8 @* R; z3 A% J0 |
- unloadAllScripts();; {. c3 Z" a# R" E- U+ \& \! p
-
0 v9 g& ^ ?5 D; Y9 h' t, g - LOGGER.info("Перезагрузка всех серверных скриптов.");( k5 n4 p; C4 o9 l
- try1 \' E' ?8 R5 E( u+ p0 r$ v
- {) f& r$ h+ a9 d7 P' v
- ScriptEngineManager.getInstance().executeScriptList(); H, L; Z8 i9 Q; R; S- e9 e
- }- S+ S. u0 i& X* T5 u% P
- catch (Exception e) D5 R9 M. B# t Q
- {& \. {! Y. Q, q
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);3 ?! k3 U7 \4 ` g- `
- }, C+ \) |+ P5 D, L
-
6 O) L! {# ^6 U$ K" r - getInstance().report();
* ]2 C) y+ Z$ N0 W5 U - }
Скопировать код Метод unloadAllScripts()
+ B9 H2 ]" v# H9 n; O$ B' c9 e: \$ S e. \5 j
- /**
( m: V) W5 k! u+ L* w2 @% P - * Выгружает все квесты и скрипты.
6 g) a0 T0 J; ^% E: s, Y2 q - */! L. E8 _! d n3 s O- F* S
- public void unloadAllScripts()
( `% S+ c6 C* v7 [& w( i; C - {$ |" j5 h% y8 S
- LOGGER.info("Выгрузка всех серверных скриптов.");) s8 T' ~! h- J0 {2 B8 m9 A
- 3 ]" k) N. o4 L. w
- // Выгрузка квестов.8 J6 r( |. N5 T# _' \
- for (Quest quest : _quests.values())
4 a5 I: W+ d% B. E9 d3 Q. I - {2 L5 w6 ?4 y# C9 Q/ W* `- S4 b
- if (quest != null)* K( U! q- H+ I$ g
- {
' W& m1 B9 I( O: {4 z - quest.unload(false);, r, X( t) D8 S2 g
- }/ b$ A" ` ^5 X% J
- }6 ?, C2 D. x5 K6 }! I
- _quests.clear();) l( F7 B. d) v. |; y& T
- // Выгрузка скриптов.
\5 q: ?' y0 _5 s% Y - for (Quest script : _scripts.values())
, c. N% k- k' ]* j - {( M" b( r& |/ n5 f( I# V* i
- if (script != null). Z! P, u/ W+ T& w) ]. p" B4 y
- {
4 W6 e5 J5 @: B) G - script.unload(false);' e0 F* V+ F0 C4 I x$ [" K
- }
$ p: n: p' c3 U0 D+ B - }6 v$ P+ L5 j- r+ Y
- _scripts.clear();9 K( @9 f; p# u1 F: D1 z
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
" Z% ?9 D: Q/ H5 W* V s5 V! U9 n
4 w/ }* P* l) p2 e4 I P; }7 o2 fМетод report()* \) u) B1 ]$ `6 Y4 d5 s; b2 C
% m9 P- I9 O+ F# ]% M$ |- /**, Y% ? ^ S- ^7 x5 Z, z5 E' }
- * Логирует количество загруженных квестов и скриптов.0 t e" p" B2 W9 A& e
- */
; {! W* x$ v4 y: m - public void report()& d& b1 g0 y1 b8 Y3 C U- t
- {
- Y# |; `2 L% c. [2 }5 ~ - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");8 j2 s* Q6 k+ i2 i' c
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
4 f# ^5 t% }& C' a8 T - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.5 V4 w& N' T" _$ V( D# ~3 |
: ^% O( E$ ~, b9 nМетод getQuest(String name)
?3 T7 S' v. [( h! q- W+ d4 u' B6 X/ f
- /**7 o0 [! j- ] m/ e: l
- * Получает квест по имени.% v7 Z: X! U3 C- J& S* I
- * @param name имя квеста
% x, E( t, k, E1 y" ]% B* ]9 O4 v - * @return квест) p9 e& Y3 F7 e
- */7 m8 ]/ f/ ]5 z5 A5 g
- public Quest getQuest(String name)$ O$ Z* \, b7 t" z# d; f
- {/ l% F, ]: l2 Y* L8 k. y9 z
- if (_quests.containsKey(name))" O7 N3 [6 ~" p* \" s
- {7 P/ D2 ^4 [/ l) j
- return _quests.get(name);
+ l7 F6 ]& p) n6 Q1 K% x - }2 ?/ F* V4 E- p2 A. R& J
- return _scripts.get(name);; H' Q2 O# d4 u3 R4 H* r* H
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.5 W M/ r/ ~* W9 h h$ f
- y# a# m, ?( [: Q1 ]7 X8 VМетод getQuest(int questId)- ], a* X. g g( g1 z
. p3 E) ?( n: n! T3 b
- /**7 w1 `2 V P7 w( V0 B, z
- * Получает квест по ID.
4 u1 v$ c; E9 h2 ^ - * @param questId ID квеста; n' b( `; ~! Z3 }$ ]& {
- * @return квест, если найден, {@code null} в противном случае
$ ~+ P: X5 `- a* E( B" B( V- X g! O - */0 L/ f$ F3 ^; A0 c2 U4 [) ^
- public Quest getQuest(int questId)
/ D7 t3 V! _7 r+ W0 g - {' z' ?6 [0 X3 _, e- Y w7 E9 y
- for (Quest q : _quests.values())2 N$ D9 }! Y& d4 o# B8 ]
- {* O! d% Z! i+ G1 `" M+ ] Y4 g
- if (q.getId() == questId), }. s, F/ T5 a9 B
- {. k5 h& t( p( y' V- A2 p1 n& l
- return q;# P' Z, x1 c; b+ w. v+ M3 m
- }' g0 X p5 i1 o2 e' U
- }) Y! ~- u3 y. S0 F& Y4 j6 s x
- return null;; K& a( C5 ]! D" }1 N
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.9 Z/ H7 f l9 S9 a* M$ {
# N! e: v0 k- t4 Y
Метод addQuest(Quest quest)* f% Z. u3 X W& `) W
) z5 ?" j8 S, f: B; a& w, v- /**
! h0 C- n7 f) M: J6 Q - * Добавляет новый квест.% N P, }/ G, I3 C3 B
- * @param quest квест для добавления
# N- t; H H) |9 w9 { - */6 P+ r$ I% ^+ Z) j2 [0 r7 h4 E) C
- public void addQuest(Quest quest)
1 H- Y4 @8 Q( L( I - {% o) u2 ]; C9 [4 x. K4 f; ^
- if (quest == null)
% ^* r( Y. K( Y7 F/ d6 h - {2 a" f* i8 I# c
- throw new IllegalArgumentException("Аргумент квеста не может быть null");& j; Q c& i/ |8 N' m+ Y
- }' b! ]: u2 l0 }" W4 P0 ]
- " K" D4 r% Y; D8 i: @" R
- final Quest old = _quests.put(quest.getName(), quest);8 A8 s- X) X% c5 P! q. P
- if (old != null)
4 F$ x4 C8 Y8 G; `7 H - {
+ S0 a/ ^ [, v/ P+ z$ A3 } - old.unload();
5 I9 @ {+ `3 K0 }' f ?3 b - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");9 T2 ^1 n2 z. p2 {1 Z# Z
- }- x# y2 {! y& T5 _
- ' H; L! x" M" Z& n2 H- M- U
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
) L( a3 U2 ?8 \! t - {
8 N: [2 H3 h8 R1 ?" N8 u - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
" y9 h. Z9 q! j& I - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");! B, P) l, o6 K" F9 D8 W
- }! a! s# {1 [' e& M2 k# @
- }
& F4 u D; T8 |" J3 `4 P& l - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.: D, E6 V U9 W( D
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.+ o" o: q3 i I2 @/ ? P G0 g
+ z( V6 j# Z+ z- o" r3 a' k: I @. r5 o4 [
" n. T# K6 r2 D: {7 g |