Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius. A+ R. M7 |' q9 |: T" q- I
, A0 Q! Y/ L* g% {$ Z* E
Разбор файла QuestManager.java
8 |! {5 Y/ n4 o$ s: v" ?: {) A" F9 W' |3 J$ ~
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.% H2 I9 S; U. _1 Z% u1 t
Основные элементы0 P/ \6 Z7 Y; N
- Лицензия
. j' T- w0 r) S) B2 |* p! g- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.7 s+ c3 C& r0 d' {, Y& m
- Импорты1 o" i8 H. J" O/ K1 f7 S4 M
: Z! S8 j, ^5 B i: N: k' n" EQuestManager.java — управление квестами и скриптами.
( V( a# g1 w( m) H; v* ^; b$ PПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\* h: `6 H+ q# Q B
5 Z+ j& f8 d+ Q( S* m1 T5 a9 A+ F- u: L2 ^6 R
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
; h$ y" z6 _. \( F+ i) Y: F1. Лицензионное соглашение
2 {" b( V/ M7 J- [5 N- /*
7 I1 ?6 M7 J7 D }! p3 R" [ - * Этот файл является частью проекта L2J Mobius.; _6 V5 U, X: Q
- * . M3 n0 y! H- v# H
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять
; t9 ^1 v: N6 Z) Y3 }# ? Z# ] - * её в соответствии с условиями GNU General Public License, опубликованной
8 z2 A; K" x3 e* d+ D$ A' Q - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
1 V2 N: {! T# | q+ r# I - *
8 W+ V( Y* O J! |& \7 L; C) { - * Эта программа распространяется в надежде, что она будет полезной,4 a" X% B( O. [4 n
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии/ b/ q, j/ z/ b W
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
7 w2 r( R J0 t4 [1 V - * См. GNU General Public License для получения более подробной информации.
3 d* O, u7 q$ ]. d - * + {: h0 C! V1 A6 {
- * Вы должны были получить копию GNU General Public License
( H9 W D% y# N9 m( E8 V. s - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.0 Q: R* P4 W: v
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.* N g4 F( p5 p- g5 a+ ^
# A; B, U# o$ k5 g
/ j" k# l g9 ~: [2. Импортируемые библиотеки
3 F* W6 C+ c" H& x; R2 y
- `. A/ \( X5 `; ?; a- package org.l2jmobius.gameserver.instancemanager;1 ^4 J+ Z- ]! ?( k4 Z9 W' P' h
- 4 Y3 j$ @" t+ ^4 Z
- import java.util.Map;
' z( c! j. {8 Z) Q) X# `7 u5 g @9 ^2 i" { - import java.util.concurrent.ConcurrentHashMap;/ b) } K( I: C+ `6 @5 K6 U0 _
- import java.util.logging.Level;
2 r4 u9 p: n' Q3 r2 w# P& o$ l - import java.util.logging.Logger;( C/ s [( P$ ^
- ! W5 I3 V; h9 G+ i; O3 h! `
- import org.l2jmobius.Config;- B$ |: Y! G& P) ?$ |5 F! q8 {: R& y
- import org.l2jmobius.commons.util.CommonUtil;
, O; Z, B7 U! ~( B8 n+ p - import org.l2jmobius.gameserver.model.quest.Quest;1 y/ m7 L" z4 Z$ X' 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 — менеджер для работы с игровыми скриптами.3 W ~ ]) _/ q; [3 B# ]" O
8 K( o6 k6 b; g
3. Описание класса QuestManager
8 U8 q% E9 n# D) H- /**
! p' i9 T; D/ }. A. H! Z' S - * Менеджер квестов и скриптов.9 J7 e5 p; L- }# |1 v0 [2 o
- * Автор: Zoey76
" n' E: y! n/ a# G8 U7 H - */
$ J g9 f) Y/ Z$ ^! N% ^! u - public class QuestManager
# m. Q2 N2 n8 F" d - {+ J: `' W) q8 R6 r7 d
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
8 ~2 `6 k" o' `# L) H2 u -
$ m. ?- G! S( T6 f - /** Карта, содержащая все квесты. */
2 \! `- }. s; ^, p _7 _/ ` - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();7 |1 o+ N3 D2 ^; N8 [
- /** Карта, содержащая все скрипты. */
' B: |# Q! }# G& N& ~ - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();$ {. u4 v9 \9 k6 a
- - f' ~4 l" J! E4 S# ^
- protected QuestManager(): O3 [+ p$ i/ S& i1 S. p L, i' @
- {
% }, w4 m: h4 `9 z# f, V9 L6 T - }" @1 Y( D; l* c4 P! K: m# h; h
- }
Скопировать код 4. Методы9 I" w0 [2 h4 H1 w& K4 ~! q# m) m
Метод reload(String questFolder), b9 R9 V6 d. O
- public boolean reload(String questFolder) {% C! y2 |4 T3 m0 _
- {
! t( _# c4 j$ S! u' {" T - final Quest q = getQuest(questFolder);
2 P8 C- F* a, P2 [0 T L. E - if (q == null)
& J5 x: I% i5 W - {
4 N1 ~. O7 e- r: A - return false; h0 @- k) C" M& {% P* j' }- u/ S
- }
9 f, ?' k* `# _ - return q.reload(); k' P- V$ Q2 G9 w, K
- }
Скопировать код 1 d8 Q2 k% [( g' P3 d: i
$ q' N9 Y9 O4 a- _/ x. BМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.# C% h9 C8 o$ n1 z& C4 F
Метод reload(int questId)' M# N) x$ A' Z+ @; `- _+ u4 O
, u: \4 n) x: O, H4 O- j- /**
6 ^/ E1 i0 }( x: F - * Перезагружает квест по ID.
& y8 ~( }) }$ e, g/ {, r - * @param questId ID квеста для перезагрузки9 V* Z# i) f8 _8 p( K* |/ }3 ^8 l
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
/ C- e2 \; l4 a5 R - */
* n8 j5 l3 i8 x7 Y0 S3 l! i - public boolean reload(int questId)
8 L- s7 j- p \) z' F, f4 F) j - {
6 ?7 g8 @4 m: v - final Quest q = getQuest(questId);* h$ h+ K$ i5 H( C. u+ U/ {3 G1 Y* p
- if (q == null)6 m8 @" W" _8 C' a
- {
3 L0 B- X2 g l0 P - return false;, n/ d" c6 D' ^# V
- }
3 m: h7 y7 g# B# F1 u2 r4 k# {, f - return q.reload();
6 \* S+ H2 ?1 x0 s5 u' K- V - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.7 f* h0 o. f& @8 ]/ J8 l
* p1 ]4 _7 _7 w: s
Метод reloadAllScripts()8 e4 S6 K0 y% ^- V7 A- A4 w9 ?
* L0 `8 E$ f+ N6 s* I" O% x- /**
1 M2 W, A y) ~: o$ ~9 y - * Выгружает все квесты и скрипты, а затем перезагружает их.
& X& t! L/ _" i& j" G - */
' ~2 F, n# w" L8 m( I$ X - public void reloadAllScripts()' O" x2 e' r3 L9 _
- {
0 Y5 i0 R5 x! Y; ]" l6 Z6 g - unloadAllScripts();
8 ]9 b6 M3 Q% g" @ - / V. T! g( c2 H9 _( o- }2 c3 }
- LOGGER.info("Перезагрузка всех серверных скриптов.");
; C% g" Q) V% l8 D# ] - try4 y9 i+ r' {( I7 {& `# N; r
- {2 G5 x6 }3 A$ ]8 G% j0 n6 T
- ScriptEngineManager.getInstance().executeScriptList();
6 {( i( j; H8 ^9 @ - }
9 C! G, y7 G/ w, W6 q3 ^( E - catch (Exception e)
( K! F4 I2 `( R: q9 [, v - {
) G* ?$ s$ {8 \7 \1 W - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);6 a% R3 d+ F; X6 m% Z9 d
- }
% o& w8 h5 e- F5 i -
" A/ ]& \" m8 E - getInstance().report();3 f* O8 k6 S0 S! D/ m z
- }
Скопировать код Метод unloadAllScripts()1 s: n: I0 M/ p) e7 C6 A
2 q6 p3 |& G- n. C T4 V: A7 q. n- /**
4 |' t9 L/ e9 h0 Z* W. n, T - * Выгружает все квесты и скрипты.
" J- T* Z: Q( i: i - */" R- G @* w( [* F. X+ a6 C' D( c
- public void unloadAllScripts()% e* n! b) H/ Y$ \
- {4 E! }; E% R/ \. h
- LOGGER.info("Выгрузка всех серверных скриптов.");' X4 r' H1 _: Y8 a. b$ q& d7 F
- 7 V6 S x* O$ z" g2 q
- // Выгрузка квестов.
! @' b1 U% Q+ q - for (Quest quest : _quests.values()), s6 y8 Z: K+ H: C( s8 e
- {
5 p' Y* v+ f3 W6 q: d+ H2 L; e( D - if (quest != null)( k, C k- M5 c: r+ M0 l% x1 c
- {
( t: S+ X2 z2 y' [ - quest.unload(false);$ c' Y( u2 j7 N) j) J
- }5 l1 N& @9 {$ p% ^/ L% V
- }
! K. ^' J7 T$ I0 Z. z - _quests.clear();
( k4 Y, u- _% |; I! N: }/ V& x - // Выгрузка скриптов.
9 U4 m) R. b! d& e - for (Quest script : _scripts.values())
$ C0 q4 ]% \" j m: N4 U( N, e - {1 S; X* H, I8 j- m- o4 o
- if (script != null)
0 E! d) }) w% q9 }3 r# [% E7 ^- [ - {
9 t' a6 ~1 S/ R5 W7 ]6 @3 N - script.unload(false);
7 F: K6 n- t! h, W, X - }/ E+ X& ]$ _) P9 I3 g) H" s9 H
- }' H; i8 R3 F0 o; z
- _scripts.clear();
. }! s4 j( Y: E9 ]3 E - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
' e i5 A; e: r, G8 G( g- b
* X' L' W/ ^5 G, d+ J6 JМетод report()- m; y$ ~ w1 C1 w1 ^
4 L+ Z$ x1 m+ J& O; n( O: _1 Y
- /**
8 g4 M7 I7 ~: F- P. Z3 y - * Логирует количество загруженных квестов и скриптов.
9 N3 e* v4 O# R* A8 b - */! D" u# A; W9 L( m
- public void report()3 \( P- ]# n. T' R/ j# I& j- ?
- {
5 k: L: Q. ^1 H( e( k - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");! _6 p, ]2 C# ^8 P
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");; E0 s9 G1 g1 J' @4 x/ a0 T: O; D# t
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
0 |* r: E8 n& L P. _8 l & W& Q+ |1 p0 D7 z; U3 N, X
Метод getQuest(String name)
0 ]! |* C6 W- G2 K! y! `
, H' i- d; z) d7 ~- /**# A- W+ g! R" w; S, w3 V
- * Получает квест по имени.6 k" t" \% Q' q; D- ]
- * @param name имя квеста3 u4 |& k. A M. A
- * @return квест
9 `6 d8 J4 k5 R - */( n7 K# G; X ?: I
- public Quest getQuest(String name)9 s6 D) U: d9 o ^
- {
" J- P, a3 G D( p* ^& E, r7 q2 x& g - if (_quests.containsKey(name))
9 A/ A! K2 G3 ^, _* i - {
+ i+ J4 {6 m& m9 B* p. I - return _quests.get(name);# ]% I2 B. W. Q; R" N! U# S# m* T
- }+ D0 L+ a, Z4 Y1 j" q. l+ U2 G
- return _scripts.get(name);+ e& H: h9 q9 r+ C, h7 N5 s
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
/ w; X: n. h" n, H9 o. M& y- o / [3 J, ?; P$ f& w6 N
Метод getQuest(int questId)
5 E' B# i( U* [/ w4 v! }
* l, H: Y) j ]& g; _- /**" [3 C# u) T9 `6 y# \( [. e
- * Получает квест по ID.
( G0 F$ B4 b3 C; w - * @param questId ID квеста% E% I% w" s' Q8 F2 J0 \
- * @return квест, если найден, {@code null} в противном случае
! u/ B+ g* r* Y" G# R0 n5 |* e - */
2 i* O" P& `/ k; A3 W: S - public Quest getQuest(int questId)
0 ?% G& X5 b/ s/ i# h2 _: x$ j - {% e |3 z" F% u& e' E" U- T
- for (Quest q : _quests.values()); d- i5 @, b& F) u$ t8 w8 Z$ i
- {& O" |, T0 X" H, K. r$ r
- if (q.getId() == questId)0 A& X( k0 w+ X/ u' d9 A
- {& s- }! y _# b& ], \0 z5 q: ~7 M; H
- return q;
' O, x1 o. h: E9 s3 k# v5 E1 _/ X - }
+ _# _$ F/ V' X6 c! c: J$ O* S - }
1 _+ m3 T( J+ M6 o3 [* ~ - return null;- {7 e5 w1 S" ]5 N; G% k6 _ I0 P2 z
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
# k `* G# R* c0 i, f/ _ 4 }6 n/ t- G) O/ Z
Метод addQuest(Quest quest), T3 \* z0 X* q3 \
4 B" |% k7 o2 @. p: e8 z/ q- o* O- /**
; O, K" v4 U0 w5 `$ B, | - * Добавляет новый квест.. s6 K) [! L9 y: v+ M, b- A; M
- * @param quest квест для добавления
- R5 u+ @; u: U - */
, h+ r6 C6 d: z. w - public void addQuest(Quest quest)5 T: \ T' q7 h( N9 [: z" h
- {+ r) z$ R9 b0 Q( T" I. p4 z2 W
- if (quest == null)
/ @. s% z3 y- W0 `0 T/ X! r+ I - {
# I* {' Q+ g9 h - throw new IllegalArgumentException("Аргумент квеста не может быть null");
( ^4 c/ O' a& a. r( n" p - }2 N/ N2 h0 Q$ I" g" T
-
0 O2 d' y1 E# V M" w, \ ~! W - final Quest old = _quests.put(quest.getName(), quest);2 p9 V1 ~ {1 o8 w: O& \9 q& W
- if (old != null)/ @ k9 c4 }# `, y. x* E
- {
4 }$ E6 B5 y: m2 _% C2 C/ @ - old.unload();
L9 e5 C6 X5 ]5 ^/ K8 G - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!"); i: q: L3 u# V3 c
- }
+ k; C8 }% j! l) N! m - 8 x. z5 k( _ i! f3 M" m
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)7 l/ O6 E/ v5 o/ ]1 W
- {9 u# P0 o5 n' V3 u; a
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();* j) i/ }) ^, g7 t; J; I5 \( z
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");& k5 I. b$ c5 M5 H. s
- }
) y2 z* W' }: ^$ W - }
- b7 _+ J4 X+ C) q' ] - ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
6 y$ d g% D" W/ Q Y" n: ]ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.. K" f3 i, |, a5 N6 f: r! R! F5 X
" R+ W) f" s; a' T+ o/ E; M
0 Z* y" S' o5 e# n+ O G6 b& I6 z; ?+ D" {8 H: e7 G
|