Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius6 h6 Q0 u: o* E
6 {2 X0 I% d! A7 M& E) |* r5 bРазбор файла QuestManager.java
9 P, \9 l2 p: V' P2 o2 k8 X3 L, V4 k2 s1 g
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.5 d p2 L3 g2 n2 d- [
Основные элементы
+ t$ U; C# E1 {7 O& _- Лицензия' G" a, V1 _. ?& B6 b) Z
- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.3 U" i& K% z1 e2 X
- Импорты O( q( h7 U$ m3 w/ P
3 h, ~9 Z7 l0 [; ~3 d
QuestManager.java — управление квестами и скриптами.
% s; g- h: H6 B1 k. u$ uПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\6 v6 H! K% W$ b+ [2 e% y b
& g E5 G6 N, P
5 I# ~: v1 i8 L$ w% ]9 uДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
8 k* {2 e) B: w( n3 Z% H4 y1. Лицензионное соглашение, V6 B6 m1 C- K! J
- /*, U6 q2 q9 o/ H3 z! F% {7 x
- * Этот файл является частью проекта L2J Mobius.
7 g, D, n: `2 \% f4 R - * ) c2 T, l5 k+ ?2 x
- * Эта программа является свободным ПО: вы можете распространять её и/или изменять" ]) P$ S& P& B5 r
- * её в соответствии с условиями GNU General Public License, опубликованной
$ T8 k$ H' K2 D" D5 n( s$ h1 S, |' C - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
* `/ G) h& ?1 O7 ] - *
( U( R# p, x# \6 Y' o - * Эта программа распространяется в надежде, что она будет полезной,( Y. G5 _" A Z, N9 w8 Y
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии$ B/ t1 F: y: f% i" m5 G/ n
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
' I# S2 s1 I& Z4 O A - * См. GNU General Public License для получения более подробной информации.
: z. Z6 c9 ?9 z- X* ], i: m, g+ c1 h - * $ Y* m& F0 M& [! ^+ l8 D. Q
- * Вы должны были получить копию GNU General Public License# ` w/ n- _7 B3 N: c3 s
- * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>." x' t: G6 ?3 T% `; q5 g$ ?0 K
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
, V" {& \8 _+ }% ?# ^. g' ~; t1 B9 A3 [& C. [2 u3 r. i
; p1 x5 I7 N& I# z2. Импортируемые библиотеки
: C+ z* n0 U( f7 v5 I- A& m; T$ f' S4 [/ H- s! w
- package org.l2jmobius.gameserver.instancemanager;' d0 x; H, X& U) b+ V
$ ]' X! H, N* U$ g7 K0 O: ^- import java.util.Map;2 n6 i3 T: r; ]- D; N* p
- import java.util.concurrent.ConcurrentHashMap;
. Q' C: F h% s) F9 J- o - import java.util.logging.Level;( q9 j, T4 W9 |7 n* L6 a
- import java.util.logging.Logger;' Y {3 H @: y' k+ i' }& w
- 9 |6 L8 }3 V Z* C l9 o0 P3 y0 ?- W
- import org.l2jmobius.Config;
0 V5 s5 f/ `' d# V0 ~ - import org.l2jmobius.commons.util.CommonUtil;
, P8 X1 H- I: W* x8 _1 A7 I - import org.l2jmobius.gameserver.model.quest.Quest;3 w: A7 ?7 O1 x2 g) 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 — менеджер для работы с игровыми скриптами.8 @: z; Y: k2 o3 k7 P% k& J
8 E! V# p& t6 M3 {- t/ L
3. Описание класса QuestManager3 L$ g' N, M1 b& r
- /**
- `* y% v; U1 ], E7 [ - * Менеджер квестов и скриптов.
- z$ K. \0 \8 K4 m1 F - * Автор: Zoey76
/ u& L3 s$ ]4 \0 l" U$ n7 c - */ k! F1 l1 G. O6 z- `
- public class QuestManager
. }" w1 ^( b! y4 x8 Y - {- p- E2 x+ K3 m5 S2 F( G( _! c
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());5 U/ h( r8 q' J
- 0 ~) R- W) x# `$ X' B* E
- /** Карта, содержащая все квесты. */
8 G' v& [0 x' f' J* M+ I - private final Map<String, Quest> _quests = new ConcurrentHashMap<>(); t9 q' E. n3 Z5 S- D3 F) o
- /** Карта, содержащая все скрипты. *// j0 p9 M2 T0 a* r
- private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();% f$ u: P( k" s4 D
-
% `5 O9 V- P: Z, d5 d - protected QuestManager()
5 g" l8 X* h% V R9 s c0 Y: D - {
/ z6 y6 k# |: G' ^. C - }
# @% k3 n6 C+ L' ?0 P2 b* l& s) P - }
Скопировать код 4. Методы
( f/ ]. P% J! Z) K( cМетод reload(String questFolder)$ |- Z& x3 u5 T, k
- public boolean reload(String questFolder)# E, n, s" { X3 t1 Q# N
- {" [; _' x6 h7 `9 P8 D
- final Quest q = getQuest(questFolder);8 I; O' c& [5 j+ y Z
- if (q == null)
+ y- X. \; x$ g - {4 Y; c# [8 ]$ o" D. ?2 F* ^5 Y. n$ O
- return false; I/ F+ Z! I( t p
- }
$ z \; M. T2 D: k( D9 a" p - return q.reload();
$ e: O- H; p/ w0 { D' c - }
Скопировать код
8 \/ i4 M/ M9 }9 r( K! V2 N9 M1 m, n8 Y
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.( \: A6 A! C9 j1 M9 y
Метод reload(int questId)3 E; @- C4 g4 S9 e N. c
8 c0 N: p. s; c, M9 G. ~8 H
- /**
: ~5 ^' ~* T/ k* l9 q' S - * Перезагружает квест по ID.) X+ f) N. }0 u8 |5 C+ v
- * @param questId ID квеста для перезагрузки; x* U$ L" T# P
- * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
x, B, K( u! n! t6 j - */# C+ _* }- C1 w. ~3 {
- public boolean reload(int questId)5 E: A* g, h- {# ~
- {
3 `6 ~; q. [+ d+ z" E1 ]" x - final Quest q = getQuest(questId);
4 s7 _+ s/ X0 ~ - if (q == null)
+ c& D e9 ]8 m% d( J: N0 Z! ]" N. d - {
% B! h8 x4 a4 h& N$ y - return false;% O/ q& ?/ H; v
- }
. I# j, O m+ X& j& s- P# V2 f - return q.reload();
& M* G5 A' y$ k! y5 ?9 b- \1 D* V - }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
3 A; o. H# v, t' S$ d 0 J* }) U x9 j) m& ?- r/ k% I
Метод reloadAllScripts()
; N5 J% J. X: ^. [0 c/ m& X+ S
8 P8 m6 t6 K6 Y) x6 M/ y, l' Y, D- /**
_/ } R' s, t1 \% _9 T - * Выгружает все квесты и скрипты, а затем перезагружает их.7 x" R/ L: ] _, H3 s
- */, N' m H2 \& K1 ?( C
- public void reloadAllScripts()
& D9 j- f* p1 B- K) f - {
1 ^7 \( L0 {" ~( G. Q - unloadAllScripts();
! h4 k: J( h+ m/ B1 _' X# i -
) Y: b. i5 O" u! A6 I6 [' E - LOGGER.info("Перезагрузка всех серверных скриптов.");
+ Q7 j y2 e X4 S" l- E* R0 l - try$ y- O& T( Z; o4 _" s) s
- {- y/ U# f9 `' N! U L9 ?# w. w
- ScriptEngineManager.getInstance().executeScriptList();
+ w/ P- ~3 w; y - }
9 D: R U% F: w: G1 l. R - catch (Exception e)2 x" P# m, u$ f/ l) |
- {2 q U' q! p h. q( {
- LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
' b+ z" Q# T' X' R1 K - }: g5 i) z8 Y% R% y
- . W8 ]: t+ i. s3 T
- getInstance().report();+ w0 u; C, F& Y9 c- J' x
- }
Скопировать код Метод unloadAllScripts()* U: |% P5 H( m: ?4 j- m' F
# m" Y4 o; o: P0 n+ u$ d
- /**
- g* s1 a7 \$ ? - * Выгружает все квесты и скрипты.4 |& X. G7 l3 s1 f2 x
- */( p0 {4 u4 B6 s" t% T" h) G9 ]/ F
- public void unloadAllScripts()% f' X: _+ [" g- l9 A
- {% j* [5 F2 h( u- h
- LOGGER.info("Выгрузка всех серверных скриптов.");+ f1 v9 B% v a5 J
-
* l k4 Q+ [# V6 m2 V! Y7 b - // Выгрузка квестов.- }0 l. V& R7 N, J
- for (Quest quest : _quests.values())
1 Q4 f9 f1 k2 L/ g: s - {
0 D! r D1 h k* f* I2 L0 K4 X - if (quest != null)
1 E- O7 K, O: O: a" x2 x0 g - {2 x7 Q0 A/ m, X/ q2 m
- quest.unload(false);
% J. Q& A/ \ X+ }9 O! f1 f) u. t - }# a4 i* S. `. `. e# t
- }
/ J0 p! Q! W1 P( [$ _7 q - _quests.clear();/ Q6 Q* G8 @# w, Y
- // Выгрузка скриптов.1 T/ E# D$ p4 F; w
- for (Quest script : _scripts.values())
& l& W( B5 b9 ~6 X: g - {/ ]$ c G1 D% q) M8 {# }
- if (script != null)
1 E9 w+ p) X; p( H) v8 T/ c - {- A5 w! }7 S, i$ i
- script.unload(false); t M# M1 t, F# S" _
- }
( V/ I7 i+ T* x1 I, i - }" u6 }- o* r( ?+ t2 H# q$ x) z9 f) Y
- _scripts.clear();
) S. p* i4 I( `- h3 w, G2 _3 | - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
, N# W- T, \+ t" _4 E 5 }+ I7 R( k9 A1 B
Метод report()1 D, d! @) I9 h* [ O2 J0 W% V# B
$ t, s) l( n( m0 V( u0 ^- /**
' u5 x2 S/ B E9 O$ u o5 ^ - * Логирует количество загруженных квестов и скриптов.8 p% X+ w2 b5 {/ r; X. h F* x
- */
# O, h, k" M. J4 v% z - public void report()' x% R7 \; K0 f* A( `# X8 B
- {; o+ N! }: z0 l6 ~! m
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
8 w$ {# U6 W" g - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");8 D, ~9 D6 h0 x
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
! T! P3 j: a, T+ m3 d, u- | - N. d/ e5 S! a; c: p9 O. \. ~
Метод getQuest(String name)
. K. z7 L# ^3 Z' J4 Y8 \/ b" N# \3 n' |2 ~
- /**
& o# _5 q7 w+ L- W6 g3 l2 Q" H - * Получает квест по имени.% \0 N# L( h2 \9 ]
- * @param name имя квеста8 ]6 ^$ G7 @1 }
- * @return квест
1 v+ ?1 F& o7 L- S. S* |% b/ m - */8 I! D& ?* R& B1 ^
- public Quest getQuest(String name)( N- }. R. y' Y; n+ A4 ?
- {
$ {& g9 W2 x. e0 C' K' O# x - if (_quests.containsKey(name))3 g I6 {. Q9 }6 W6 {4 H
- {9 i: Y, G4 a% v% w* B% C
- return _quests.get(name);. J0 ]% U& [' U# Y5 m
- }3 I& p }: H% g" r
- return _scripts.get(name);
? [2 \, B- D, Z' F - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
5 L# z/ }$ ^) f5 ]" ~ ) @. D2 E# |2 z/ R$ M
Метод getQuest(int questId)
1 m( R1 \8 S8 q; @! f
0 a, W/ q: Y; I- /**1 u" b0 I" Q. f+ F: b1 w
- * Получает квест по ID.9 l3 D. g5 w3 `
- * @param questId ID квеста* c2 h6 i) F/ z- E, q
- * @return квест, если найден, {@code null} в противном случае0 e* Q# A9 D9 B# F
- */
+ @6 d6 q, F" W- \# Y - public Quest getQuest(int questId)
0 E: }7 V$ P8 x# u - {% G5 G% i$ w- X7 v% H! |5 [
- for (Quest q : _quests.values())4 L$ F1 e. z( i/ s" R, e. x
- {
2 v$ p% g! n+ a - if (q.getId() == questId)
0 Q* n' r: m; q8 L# J' @: Y - {
$ X+ q4 i$ V; v( s - return q;
& s2 I( g! m/ A- H* x: T1 U7 m - }' b N/ d, k; `+ G) p
- }8 s% E) }" E8 ~: ?
- return null;
- ~- S# E" i/ f' X5 {; | - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.. h O- ]. i3 k3 |, T! u" c; {
W6 _% d4 t2 @! J
Метод addQuest(Quest quest)
8 `4 \" e' F! W/ @4 C: E. r
9 n5 A6 Q; y! k, Y2 B s0 i- /**- ~" i2 y2 ^( A. Y% q
- * Добавляет новый квест.4 q; o- ]& }# z$ H
- * @param quest квест для добавления( b5 x$ o$ K' O: g9 Z8 Q& n
- */& A$ v! f% q1 v
- public void addQuest(Quest quest)
! D( E& H/ a* F% E* c D8 n - {6 ~2 f o7 x* B& p5 A( h5 N# `, j
- if (quest == null)2 z2 ^/ n+ t* J
- {
/ d1 P; V. z" U6 q8 k, L* Y - throw new IllegalArgumentException("Аргумент квеста не может быть null");
+ n1 U" ~: \* b0 N. z6 k2 O - }
2 `9 Q" E4 v: b& u& b* R/ r* e - 1 u8 h A0 x: N$ N: I9 m/ D
- final Quest old = _quests.put(quest.getName(), quest);0 X; }# Q2 W0 r( [' [
- if (old != null)( s( R( N3 |* O2 s# S# ^4 o
- {
6 L9 Q) H' r2 K7 d - old.unload();
3 `8 p4 R$ X! Z0 q: W- o+ ?$ l# p - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
) {" u" O Q; [* m - }
3 h' w/ u8 J$ A' E8 C2 [ -
7 r( m/ D2 {) H) j. ? - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
% K5 v3 i% F0 V% R$ C - {
$ E8 t$ B0 ]$ a+ {$ l$ A Z: N2 ^; F - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
+ d3 S$ q: |: d! O7 X6 h - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");5 X" C' j- K r$ M; D
- }
8 D) b6 A6 g; h: p& d- j6 u; B - }: n& N, E# H% Q9 b
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
! b) w* J5 Q4 r) v5 v6 x7 R+ dЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере." A8 S: j; p( Q( E, }! U
' f# Q$ c' Y; ?! k
, d" {% H+ B# v( O- t2 O3 K+ N! F$ M* b/ [; J- M& y
|