Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius! D7 y7 T, Y* @ {1 ]( j0 y
4 @8 m$ q' C- c
Разбор файла QuestManager.java0 t. T1 t; _( y% e' h
4 ]1 q s; G0 [7 AЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
$ S! g" w9 O$ T' v1 H2 u5 ZОсновные элементы
0 B* {, x$ T$ X- [( z- Лицензия
8 b$ U: V! _( c2 N% l- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
& S) P" j, e) ?7 L9 R2 j
- Импорты
$ y* h+ q1 W# N( U5 ] * u) d, @7 h" u* n9 g( x0 Q
QuestManager.java — управление квестами и скриптами.- \( I6 d" E6 K
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
8 n P# u$ o' w5 S8 v C
- Z7 S" N3 |6 K+ r
; U3 R/ B! P& p/ N9 }' T5 }Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов., s: q6 |& F! w5 y) M. |" o7 Y
1. Лицензионное соглашение9 S$ M+ B; t# u6 I
- /*: l' f5 H/ D) P" S5 _7 [
- * Этот файл является частью проекта L2J Mobius.1 [) B- M- [: R( E
- *
( u- p8 y5 h: T - * Эта программа является свободным ПО: вы можете распространять её и/или изменять" v# X# }" [# \3 i+ d7 t
- * её в соответствии с условиями GNU General Public License, опубликованной: g; _8 `+ ^3 D1 ~! |
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.: R0 P8 \8 q' ^* O j. R. t
- * 9 W3 |" z' g! B, Y! d6 o
- * Эта программа распространяется в надежде, что она будет полезной,
, Z9 W* k: Y- s; P6 i7 [8 L - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии' U7 ?4 p# c' }7 C0 X, u
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
& I. O$ P, r6 T) ~2 s - * См. GNU General Public License для получения более подробной информации.' C. ~9 b. P, X* x, J. p
- * + T9 e/ C. d& B6 x
- * Вы должны были получить копию GNU General Public License- c5 n$ M0 S- `% H/ A
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
3 ~1 t9 S3 l5 B: k `( ~9 H - */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.8 g3 R7 [7 H! A
1 K, x8 y/ K5 P8 ]! `5 \* z a% l, D5 E7 V9 o/ v9 g1 S7 z& V
2. Импортируемые библиотеки
7 u! M, S/ e6 J0 A# G% t* d6 j; r
; W8 y( ]1 x) ~$ z- package org.l2jmobius.gameserver.instancemanager;
9 ~1 j: N$ u+ \- j0 t
1 y6 w* }* E6 y* V- import java.util.Map;
1 h9 i/ G2 N$ S5 r$ t5 [' U - import java.util.concurrent.ConcurrentHashMap;
" h9 ]0 q! ?2 G N8 w0 }& s - import java.util.logging.Level;
# G# C. b& m! M# l: X - import java.util.logging.Logger;' H) m" Z% E7 H( d p
3 j/ I u Z: w) S7 ^- import org.l2jmobius.Config;
: A a9 l$ j2 x" O% W - import org.l2jmobius.commons.util.CommonUtil;7 u# j% ?% [( m9 G( |" Z/ c+ Y
- import org.l2jmobius.gameserver.model.quest.Quest;
+ {% V1 k! h7 W0 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 — менеджер для работы с игровыми скриптами.
0 ~5 V7 O" U& D4 U f. }. z7 b9 X$ I
3. Описание класса QuestManager
8 @9 `) j& r( n$ m/ _$ o- /**) l) [- V* W9 C
- * Менеджер квестов и скриптов.
# F0 I. C$ l! J3 V - * Автор: Zoey76
5 b) c# A x Q7 j2 ?0 j - */% V& o% g6 q+ t1 x) w2 W
- public class QuestManager
: Z" k- R# R1 C - {
2 Y2 E* }% M- Y. }) \( W$ m - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());% J4 ~. M1 s( Y2 }
-
# S# a/ c0 W! z* h+ k - /** Карта, содержащая все квесты. */ J4 d& a9 N4 W
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();4 V4 \' z- K q- j6 n
- /** Карта, содержащая все скрипты. */( f6 Q0 C' [/ X! G+ w g6 L9 \
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();5 ~1 y% q1 W/ t0 M, a0 h- M
- 9 _ x6 {7 C$ O$ p! @
- protected QuestManager()0 I) W+ }4 m) G
- {' @" ~/ r6 K2 j
- }# R! m* Z) S1 R3 S" C* s
- }
Скопировать код 4. Методы
" Q( r3 \3 }: a+ Y& q/ ]! rМетод reload(String questFolder)) T; m0 x- X5 q: E! z0 y& {# K
- public boolean reload(String questFolder)+ e' ?$ r# ^5 F* A
- {
' X1 \! c0 q% f; j i - final Quest q = getQuest(questFolder);; X: `1 m; w# r
- if (q == null)3 ?* F# X( H0 y* g' K4 I9 [
- {
; }3 B4 i- k6 c1 p8 {! A N5 J: v - return false;
' m$ M; v3 S, l2 o8 A( K: a - }5 T* C8 `' \# d+ P0 Z- D
- return q.reload();
! W+ S$ Q& g' ~ - }
Скопировать код
4 i6 o: \0 S5 v/ n+ Q
* ^% d* S$ k, d7 M4 ZМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
+ a9 [: A% I5 a( t5 \1 y2 VМетод reload(int questId)7 e5 T9 N4 G! ]) r+ \2 j
0 p6 k. s' t, @9 H
- /**
# H- n- Y# N- O4 Z+ u: k. J5 ^& J - * Перезагружает квест по ID.
' z7 c/ K. s* ~5 j( U5 K! u1 E9 d8 P6 ? - * @param questId ID квеста для перезагрузки
1 T# H! C1 K G/ G% K - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае2 c1 y) J0 U: n, x1 w( s" K8 Q
- */- X7 |. H/ h. n$ W# h- z' p" k
- public boolean reload(int questId)% J ]2 T8 M: H
- {" S( z M, ~3 q P) C: l @
- final Quest q = getQuest(questId);: d; a% a4 }2 L4 J* M
- if (q == null)! O2 m4 m" _- Z2 L" U5 A
- {
A. l8 ^9 Y$ q( v3 S - return false;
- G3 z/ T2 x# o& D9 Z$ j# @ - }* V J- |9 X/ ~& ~! S) L% J3 f4 W0 m
- return q.reload();
: {1 ?& x# b& Y& E5 g - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
8 O3 ]5 ^ Z/ J, r7 T / v% c! N2 f/ U( g0 u
Метод reloadAllScripts()
+ w' d9 _ Q& s) W0 Z
1 Y8 Z5 a) Q1 O! ~# z- /**
1 b' s& l3 h; u9 k - * Выгружает все квесты и скрипты, а затем перезагружает их.
' \" {+ E: X/ M4 y( b* q1 K - */: h; L6 y7 T& `
- public void reloadAllScripts()' M9 T: J( R' t) L( w9 y V
- {* |; @7 m- h+ o$ n2 @
- unloadAllScripts();
- {; x% V+ C+ R' \5 X$ o - % D; Y6 y/ A8 G1 ?2 e" X' j
- LOGGER.info("Перезагрузка всех серверных скриптов.");
2 l6 r7 I& V! t1 ~ - try
8 W0 F5 Y0 M$ F/ O, V/ l# w - {
/ \! R! G7 I4 A5 G( s' P$ r+ J - ScriptEngineManager.getInstance().executeScriptList();0 g/ d2 {, {6 o8 D. o
- }
3 Y5 H6 H0 c7 j+ G( n) ? - catch (Exception e). D) ~3 r' ^: V8 }( g
- {: s% {$ p) }& o6 P/ Y
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
, I4 x5 r8 W- P - }
& I3 M* z) ^ v D7 N. j -
6 ?% t3 H# W1 L/ Q6 K1 h" h - getInstance().report();
: D0 h6 ?; z* Q$ {% {0 q# H9 l - }
Скопировать код Метод unloadAllScripts()+ d# Z. g9 G; ^, z& ^" m! @$ ]
% [3 j1 e* x) Q0 Q/ k
- /**, h) J3 ?4 ~- P$ E6 b6 q
- * Выгружает все квесты и скрипты.
% }, l) e& ~; \+ d) Z - */6 r& V- r' [8 r8 r y1 W! W
- public void unloadAllScripts()
9 p0 a; U: S+ { - {
! M+ U$ A/ F/ [2 r7 {0 p - LOGGER.info("Выгрузка всех серверных скриптов.");5 j3 j8 c) y( P# h
-
' _1 I5 C; `4 x6 L1 g' L1 _ - // Выгрузка квестов., A6 ]4 E5 t ?- _
- for (Quest quest : _quests.values())2 X' B3 f, c! U1 ^$ H0 E' ]
- {# ?9 [) [$ S. h" `) ~$ ]
- if (quest != null)4 p% h+ K) l! |% Q' }5 A# P1 x
- {( |2 V5 y' G8 f& }* J
- quest.unload(false);
: X5 ^4 [6 e: [# l - }
9 a, Z8 ?9 Z! y - }
- b. D2 j J) k- B3 ] - _quests.clear();; `1 y6 v- p ~! C5 @
- // Выгрузка скриптов.0 W* h% k* W) T0 H
- for (Quest script : _scripts.values())
' L/ y$ _8 F( U3 ^9 X& f" y - {* l9 E2 Q- w6 v: f) }
- if (script != null)8 Z/ X$ J$ j$ I, t& c1 f
- {
& Q$ g- j9 G: g. j; j - script.unload(false);8 o- c0 d. v# O
- }8 T0 y- o$ Y" p5 l2 ]
- }
' O; b! w" _5 ^+ {# s, G8 _ - _scripts.clear();
' C; B( a3 O- @ t; d+ G. ~: s - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.. s4 m9 v; r1 @
* `$ m0 I' H6 @5 hМетод report()
+ D1 a7 L$ Y. n# Y7 Z
" ]: v; A7 M+ i+ v/ L) o1 ~5 H, @- /**
+ M. z. f8 Z0 ~( v$ Y9 K7 j: r - * Логирует количество загруженных квестов и скриптов.8 @+ ?) E( r \3 @1 C: Q" S% x
- */# [* t% F2 a6 W' J0 V, g/ p
- public void report()$ Q' r+ r7 [( }8 |
- {
5 B j0 {& W5 x* @4 W% c - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
" ~5 x0 N# S5 Y; t8 L4 O, {. E* \ - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
( W6 j3 {( X7 c" \& | - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.$ q1 G' w: F: K! h3 D
9 w) p0 H1 [8 ~! _6 M1 u! T! QМетод getQuest(String name)
7 O. f- S( r. T- H% h2 d u" U: N: k, `3 h; ]' j8 B, R+ U
- /**. d) z! n. o% m7 u# |
- * Получает квест по имени.
" e: [* D' j8 O1 S, ^ - * @param name имя квеста
4 p. a, ^$ K5 S7 U( j2 ]# t" g# V0 g - * @return квест
" Y0 ~. ]1 ~+ t' o) ~9 S - */+ i3 A: I9 k0 R" l. N
- public Quest getQuest(String name)
: F s. X# k4 T2 B! b# ?4 k - {# Q/ O# ^, P6 `- ?
- if (_quests.containsKey(name))4 S3 F5 I# E! n1 L& \
- {
( j5 y3 c9 c0 D) B. I% K% a g - return _quests.get(name);, F; h/ @, g' G0 E3 _
- }# `7 D: L; a% V! P, \
- return _scripts.get(name);( x' K9 ^+ U. u' C
- }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.! g p9 w6 h% \& S$ q4 I
% w; U$ t! C7 R; v! d
Метод getQuest(int questId)0 t! E$ E/ j6 O. D# j
; }- B, L- }0 o; W- /**. l7 y( Z4 H- @) Y
- * Получает квест по ID.' u1 L7 p# Z! ~
- * @param questId ID квеста. b% V2 t8 i8 ?' ^ L! G
- * @return квест, если найден, {@code null} в противном случае. |. \' k9 f4 b l
- */7 s3 g( [+ p' V( x3 b4 z9 f5 A
- public Quest getQuest(int questId)- I1 L7 h8 k6 S# q: k
- {
& q$ n6 i8 t3 @! | - for (Quest q : _quests.values())
8 g1 _+ Z5 U" e2 w7 q - {, {1 e4 C2 e9 r% r" M. P8 h
- if (q.getId() == questId)
' i: s0 y. P {8 k - {+ M2 r# T2 P3 N# N( w
- return q;6 Y9 f3 V- P8 \- E
- }
( J9 y5 E0 m5 A( R) A - }$ {. c/ a$ \: n8 a( Y
- return null;* _9 \8 u' t! |1 d' { I* z
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.0 t: ~- i+ j+ a, D7 g# a4 g: I
: m- @8 m4 d, E6 |2 ^" c0 b* z: `8 d/ z
Метод addQuest(Quest quest)$ v$ N/ s p8 T: W3 F
0 U+ a& I/ G# ~) S- /**
( T& U- D* _ S! ?; s - * Добавляет новый квест.* f, R8 W8 Y1 b% K4 ~* [! t
- * @param quest квест для добавления
0 v& C/ a0 j }+ L7 A' t - */
8 F6 z3 t1 g) y5 `+ C - public void addQuest(Quest quest)
?6 g+ M ^2 O) J6 v8 k6 [3 P - {
3 a: I& B; v) @8 H- d1 G. u4 _! @ u - if (quest == null)4 T2 s- F3 r, c. g3 ~0 Z! u
- {/ ]7 h6 B) C' I. w
- throw new IllegalArgumentException("Аргумент квеста не может быть null"); J% _3 G: n/ q8 C# k' r
- }# e* y$ Y h8 g8 _! u" x9 ?* n
-
+ @: P8 Q; f( n' G e6 e4 | - final Quest old = _quests.put(quest.getName(), quest);% ]* w' P* C9 r6 C; o/ Q! B0 C: ]
- if (old != null)
* c4 |% a" X: v8 c - {
8 g! _& [6 Z% i) G# O - old.unload();9 x: w, _9 N; S/ S& V
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");$ l. r9 r3 k# }1 z7 r+ c3 s/ m5 K
- }8 \2 ]- J8 q' t1 U. F) _7 |3 ^3 h! X% v
- 8 P& C' M( k, q# f/ C
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)4 v) I- R$ ^5 [7 A) ?
- {
5 ]' w- w7 @. ~$ e5 j - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();& D5 |/ r8 p' n
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
. W% ~5 ?/ ?- K4 ^$ i4 z2 ^ - }
' G& |2 a Y! M) n w - }/ N4 [0 f8 l d- j. {
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
* u8 t& f- H& S2 {ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
4 b. ]. K0 o9 _' T5 e2 A0 w! F9 L( a2 w. n
1 b' o/ u9 f/ _- j% a" r
& O1 v( n% [& t- }5 j' e+ Q" E |