Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius/ Q/ p% k% I8 Q, a% i. @) s, V
j2 w# L. J. r' nРазбор файла QuestManager.java+ W4 Y ?! _" I
; V9 B. U/ ?! \
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов., Z. `* s" X$ l; V. I
Основные элементы
* a* N! E6 Y, p! M! `; j2 z- Лицензия" b% Y* G6 u( g- A& p
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
3 B2 i; G' G* Q4 Y
- Импорты- {% |( X5 l& G
* l6 b4 j& n! Z7 d* @, E
QuestManager.java — управление квестами и скриптами.
( a9 Y4 n* D. X& ^9 a0 X; RПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
; P" r e2 {' D7 z+ m; k% K7 u/ N0 m1 Z5 G0 p) z# d9 j9 r/ h: D
' `( ~8 E' b2 w' ~+ C; O, W
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
- A. P2 N0 k9 Y; q+ m+ ~& `2 a1. Лицензионное соглашение: ~1 K! y D: F( ^
- /*
& x6 ?' N" G" Z0 Y: C# z9 C/ p - * Этот файл является частью проекта L2J Mobius.- z6 O& b. B$ m: T8 |7 O
- *
+ t" v H) ? z* ` - * Эта программа является свободным ПО: вы можете распространять её и/или изменять9 O4 `, l7 y+ x8 q; H
- * её в соответствии с условиями GNU General Public License, опубликованной1 |' @4 Q }6 ]4 p j8 X h% x
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.- c+ K9 }8 J3 M" y6 y9 m
- *
( Q2 X8 h$ T* X) R* ~8 Y1 i9 M - * Эта программа распространяется в надежде, что она будет полезной,: N9 x9 w C5 t
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии! H2 s$ A F* m2 G
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
3 v& ^* Q% o3 V; m2 X+ ~9 l - * См. GNU General Public License для получения более подробной информации.1 h8 F: H3 Z+ _+ ^6 e
- * % W p6 _: |7 |+ _; o3 z, f/ _
- * Вы должны были получить копию GNU General Public License
" A. N, D% O5 K9 S' R - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.$ V! _7 w/ Z6 b
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.# C g" @0 U# Y0 o! X
! m- ]0 o( T4 e" z; m/ m
2 h$ i! u. O( `' C" `
2. Импортируемые библиотеки# [$ x- u. e/ T$ S ~# ~
$ }! O6 u/ g& G- package org.l2jmobius.gameserver.instancemanager;4 V# m, l3 W. J8 q- M
- 1 g# n" d* i$ F( f) u1 A
- import java.util.Map;+ s' ^' N0 d. {; {( p+ N
- import java.util.concurrent.ConcurrentHashMap;
& T! ~( o% d0 b4 |, U - import java.util.logging.Level;& u! s3 `0 n' G7 l& \# i% h8 h% k' m
- import java.util.logging.Logger;
r9 c4 G7 ~- [, f6 K+ O* H% v
, Q0 M5 H8 F& S( s# A- import org.l2jmobius.Config;
6 d4 q- t* V" q - import org.l2jmobius.commons.util.CommonUtil; K8 Q4 ~7 B- [% \( r5 V4 x
- import org.l2jmobius.gameserver.model.quest.Quest;' j( P" B* _/ U# t# Z8 ?+ p 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 — менеджер для работы с игровыми скриптами.
4 ~1 O$ q7 F7 u3 ?% Q: b Q( r- T1 \5 Y1 @: b9 M; ?
3. Описание класса QuestManager
: C4 j! T9 G4 q% ]* S) }( t- /**
# u+ S# C6 B+ k5 E/ Q3 o j$ D - * Менеджер квестов и скриптов.
( t- X- _4 H8 d0 V3 K - * Автор: Zoey76
[: |/ \9 K: B - */
% Y) ^" h: g5 [* M$ k$ \$ @ - public class QuestManager
; b5 r/ Q/ o" g - {
: F( U2 `! J: h: A' _( D* R' d9 r. v - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());1 l, g, g2 w5 E! X+ g. D
-
* t& _( r6 l0 Z - /** Карта, содержащая все квесты. */' W; p- g/ o- a2 O; K! q, Z- }; i
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();: j+ Q9 ?3 \1 `/ |% R7 X* u
- /** Карта, содержащая все скрипты. */
) s, W2 z( z# o$ q( F( h, z - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
7 V- p5 `; ~! _2 J& [- V& H - 1 v1 L: I$ b+ {- W! T2 I
- protected QuestManager()% A; [: G. r$ C. C+ D+ C& Z2 X. d% o
- {, \+ L' D9 r: g7 G3 s
- }
; T$ T6 I" m5 i2 ]# B - }
Скопировать код 4. Методы8 o% o0 x+ I- l% C+ D
Метод reload(String questFolder)
- \( j* Y `0 ^" U, p }- public boolean reload(String questFolder)
5 D0 X' D: f+ a7 g2 h - {1 Z" \0 ?7 ?! p3 F
- final Quest q = getQuest(questFolder);+ L# o% X6 s$ N- G) U
- if (q == null)% B6 U3 p0 M; B% d" k* c; O$ b
- { o; F9 u5 A* V
- return false;7 w# a7 \# `3 C! E
- } s( ^* f+ A1 A" g* I; z& A
- return q.reload();
% r A/ N7 I y" Y8 d5 m; A - }
Скопировать код 8 t, C" x+ d# V8 r1 a, x
3 o T1 T& |- i) e. J& A' qМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста. [# M2 L) i! n
Метод reload(int questId)
- h/ z% L& s7 n6 I3 ~- n) R0 o
' y8 u+ e1 L8 X$ C B- /**
. b6 N; W5 J: E1 E - * Перезагружает квест по ID.3 B4 M' y/ |) ?0 Z7 {' C: S% Y
- * @param questId ID квеста для перезагрузки
! Q8 m( ~5 k" y1 A - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
" ^/ i: C4 ?' ~' A - */3 K* t- b8 f. _: Z
- public boolean reload(int questId)
* l& [5 s, K% `. e" D - {8 t- M3 B4 B$ ~% M" O% g6 v B
- final Quest q = getQuest(questId);4 u; f- ^! l% E( e6 \
- if (q == null)
% j$ j3 S& h+ n+ `4 t( A - {
' u! b, q% V" z% ] - return false;
' x1 @8 K; [/ G' m# y& f0 P - }1 Z ~; y4 Z" e1 ?& o" h1 F1 [/ B9 U5 |
- return q.reload();& l0 L& G: [$ E" R+ d
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.. p. A" l; J7 q+ W7 _; _( _- t! F, d
( Y* _4 w+ r6 K1 l# u& b
Метод reloadAllScripts()
; ~9 c& K% c3 v* L5 g) T
5 n/ a/ r7 k/ G( S, E. _- /**
8 E7 N% W* q C5 Y - * Выгружает все квесты и скрипты, а затем перезагружает их.9 X- h# X( t$ F1 I5 [" H0 F. \
- */
# A+ O! ^+ E3 u N3 f7 h - public void reloadAllScripts()
6 @% A) L' Q- R% w( a - {1 \9 W* g6 b$ }: B7 f& o- N
- unloadAllScripts();2 M4 R7 L, X( \( z. m5 W
- - N/ f! E3 |' g7 D3 H9 t! b2 b9 h
- LOGGER.info("Перезагрузка всех серверных скриптов.");
# i7 J& E; L( \4 Z* I K7 d - try
p& Z4 |3 ~9 L - {9 J$ o0 a4 j' y: Q' C
- ScriptEngineManager.getInstance().executeScriptList();# X! m" H: e# g
- }
, S' B1 \9 C6 a+ o - catch (Exception e)# l- R' X! O- {
- {
7 ?( I! I! t9 g, r& H - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
2 U8 J4 I1 [* q8 E6 R - }/ [8 j. A: Z7 L' X
-
; Y; N1 D2 z1 Z6 n; m4 t - getInstance().report();# l' B4 J+ W- {' @6 `1 f2 A
- }
Скопировать код Метод unloadAllScripts()% e$ b2 d, s( C# o6 e' e, z- G
0 h$ w' Z& W0 l. J. G- /**
0 f7 _" n7 q [! i# v( S - * Выгружает все квесты и скрипты.
6 h9 @6 w; J8 f! x: A2 _ - */; v$ g' |5 ?) U$ o$ X1 U" j) ~
- public void unloadAllScripts()/ `5 ]# C' F7 w: E
- {0 a( c6 B: j" I) I, F% L, w0 T' K
- LOGGER.info("Выгрузка всех серверных скриптов."); T; R* a O! e! R, G0 h$ J' j- B! M
-
0 J2 N C6 K7 q - // Выгрузка квестов.. H% }1 c6 D2 l) m0 E! a
- for (Quest quest : _quests.values())
; N4 p) k5 u- g" v$ l0 I8 _0 L - {
) G. Q( A- W6 k; K# n2 t& V' U - if (quest != null)
9 O) S' g& I5 R - {6 P6 a* e, s. z) J! B/ C+ _
- quest.unload(false);
' d( F+ F. S+ E' a7 ] - }# ~! T/ M2 }, h( k/ \
- }+ S' a- w y6 l4 M
- _quests.clear();
: C) U5 b- _: a - // Выгрузка скриптов.
* Y( V a- ~" k3 [ Y - for (Quest script : _scripts.values())% j( ^. m+ d4 s+ a. i) J! ~( d
- {
Z! G4 T+ H3 b d - if (script != null), n2 X% r3 I, U6 V% }) y5 R
- {! g. v' k+ T) P: h
- script.unload(false);1 s. h4 W7 o; u
- }0 L+ P* U- F: S4 A8 q% E7 a
- }
/ P4 A; ^+ f0 ^ S - _scripts.clear();3 b$ ]1 G- s% N+ g
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.$ j2 s$ [0 I7 w1 M& L, M+ r0 e, a
3 }3 n( n! P+ W1 w" K% i1 UМетод report()
$ e4 ? t. ^1 d$ _$ }
/ t9 V4 _0 n d" r. F) ^) e- /**
; W2 x9 Y) m/ l) E - * Логирует количество загруженных квестов и скриптов.
* `. W! }9 g' H U - */
q: N# X. L; ` E - public void report(), l" }) O, F5 |$ g2 M2 H
- {5 k, B& t& w4 v- ?
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
" ^8 O' v2 Z0 M0 A - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
# N, {- S9 r) i- w [ N3 X - }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
6 D; r; G) W4 Z- _2 h2 a( I ) c' s& }" a3 t M8 P, t' M* f
Метод getQuest(String name)
& i. d% ^+ u! ^5 }5 ]
1 i$ h* X2 m. k3 A- /**# `" x5 [+ L3 E! M
- * Получает квест по имени.8 e6 O: {8 p/ C! k
- * @param name имя квеста- G0 W: K8 Y+ F W' V
- * @return квест, }7 ^5 ^% J" @, e( e# c+ g
- */. i# R; t2 E, o B6 x3 \( M( O
- public Quest getQuest(String name)% \) @/ V# i t+ k6 ^: }8 _# r
- {
4 _% M4 @/ q, Z - if (_quests.containsKey(name))
! U X2 p. {# \% D - {
z% C5 Z1 r6 u+ W0 l; g - return _quests.get(name);" @; V) U* q! N
- }
" c7 V( ^$ I& s: D# @1 R" ? - return _scripts.get(name);
& a6 ]0 _' p+ X- W& ] - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
3 l: N- B. t. b5 I" K: J2 g l0 {; A : h% k# d! r# R9 Q8 l8 V% g
Метод getQuest(int questId)/ ?4 p( C- @8 s' o# F9 y' `
& ~1 L7 M( X( W; R3 K0 `' O+ |8 [- /**& {3 O; I/ K7 l+ D
- * Получает квест по ID.
( g! G C: q% n6 z/ o5 m - * @param questId ID квеста
" [" T; q# T6 \# C8 T' }- Y1 ` - * @return квест, если найден, {@code null} в противном случае) i5 o. i$ v8 N
- */
N; ?' L1 ~( y/ h - public Quest getQuest(int questId)
$ b$ Z# V( f( @/ G* K - {8 t0 ]) v2 M2 o. W
- for (Quest q : _quests.values())5 ?5 v. G5 E2 t) f! Q
- {, X B; u& g4 d+ H1 d; r
- if (q.getId() == questId)/ L: Y' j: d O6 K+ b
- {
* B' l9 N! e6 V1 [ - return q;! y" P& S$ j* ^! h
- }+ M1 k1 B0 L' b
- }* }" ~4 k7 @5 B2 s8 c& R4 R
- return null;
! F- h! q7 K! I - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
/ N2 q; ?: m/ |
- ~) `. x) y5 t/ zМетод addQuest(Quest quest)- n' n) P( y8 t
) D* e) K2 s* h$ b) B* P
- /**( u, U/ U& |0 i) `
- * Добавляет новый квест.
4 O( X, M4 M. x - * @param quest квест для добавления, y6 W$ @7 @* q0 X: e
- */ @4 U: t6 C- }, ]$ m7 |
- public void addQuest(Quest quest)
: p* R& g+ \0 V6 ?+ t - {, T% H% q4 E2 q: K \ i
- if (quest == null)
! A' S3 [. R+ @3 V* |$ D - {* T" e" i, r: W1 F( H
- throw new IllegalArgumentException("Аргумент квеста не может быть null");
" X A$ j O1 V" A8 Y - }
1 l+ f! e& t0 m5 v# y - + H9 ^+ Y' {* h/ R9 ~% l
- final Quest old = _quests.put(quest.getName(), quest);
* X2 j/ N; r' l - if (old != null) H/ ]* T: m4 v, z- o
- {# H% N+ ^9 {) L
- old.unload();, J8 d0 P j) I0 ~6 r
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
5 i7 k) v8 }$ T( T, ]6 D( S - }" L, V& P" Z9 `* s* |" u
-
7 \7 l: V6 K) ?7 R/ N - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
s: m) L! v9 Y5 C: v4 d6 l, X - {+ p1 q) i( A4 e O* \ D
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();2 K# g3 y0 h; U: y" {$ X7 |3 f
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
6 [1 T1 L& _; L3 @5 c3 W- X - }
" d, C3 o9 w) N2 H6 [9 W* T1 g - }% G( n, G) g5 ]
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
' A( e1 l+ u4 M" k6 \ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
4 Q; i- f/ O7 z
' q" u( j6 m3 p; P( X& {. Q9 T% F5 R0 g, e6 C# p- L
1 B/ X' O; Q' r) o
|