Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
0 S% F- K6 Y( i1 U6 `. Y
- `& P' D1 U% z- v' KРазбор файла QuestManager.java
0 q' {# @, y& [5 N: Q1 e
1 d2 O* t5 a" F2 m F& O7 hЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
3 O6 R( o2 w' ~1 O2 L8 |Основные элементы, b+ N/ Z. ^1 I- V, ~' c/ L
- Лицензия
r( _" H2 r0 c# t- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.8 w" i6 T* N! _) X* }
- Импорты! A9 B' R! ~% N
. M, J7 ^6 P$ J: G! \
QuestManager.java — управление квестами и скриптами.
A+ ]* o6 g8 Q3 Q6 j( qПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\, G7 O7 F) g- `: g
+ Y |$ f: Z: U4 z. q! A
$ k; n$ C& {8 wДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
* P4 j, h) N) ^3 J$ \+ t1. Лицензионное соглашение$ ~& u) X$ I0 @
- /*( v" P* V L e& i6 V
- * Этот файл является частью проекта L2J Mobius.3 G# j% q4 O* x$ D- |4 W% W
- *
h7 ]; t* d, W. ~+ d% }3 [ - * Эта программа является свободным ПО: вы можете распространять её и/или изменять
$ q" U% D) x1 ^( R- G - * её в соответствии с условиями GNU General Public License, опубликованной
- P0 L0 y! n3 Q$ ` - * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.0 E1 U( X) x0 n$ z# q: P, O
- *
5 d3 R# [+ O. y3 a& E - * Эта программа распространяется в надежде, что она будет полезной,3 F" w( }6 e+ h3 u% W# I
- * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
! F# `5 r0 c; R7 i+ f - * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.4 A% U: s( p3 N0 W5 T6 v; ?
- * См. GNU General Public License для получения более подробной информации.
4 ?) C2 X6 f0 g" v2 N. v2 n - * 2 M4 g* j6 I! s: ^
- * Вы должны были получить копию GNU General Public License
0 H9 ~* o; t1 M - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.3 ]9 N) `1 I# i+ a
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.& ~" n6 L2 c5 j$ E" X1 p
% m3 ]- h' Q, T# o
( R8 d' F, |8 @6 ^4 m% A3 r/ i2. Импортируемые библиотеки$ @9 p" O7 J* Q: x" ~% A
5 _6 a6 k$ X" r; s/ H& j- package org.l2jmobius.gameserver.instancemanager;3 q% L0 ?3 O3 e. L" k8 j T
- ; b* Q g0 T$ @" Q
- import java.util.Map;
8 N- }( p4 P' q" ~* h - import java.util.concurrent.ConcurrentHashMap;' ]% D c9 d; ]
- import java.util.logging.Level;7 X4 }" z( N+ m2 F% ^# n
- import java.util.logging.Logger;
, h# c/ B! g1 X/ M( Y
& B$ ~- t' F* w$ g" c( o* V$ J- import org.l2jmobius.Config;: u/ U) ~7 C2 J2 U7 c9 o
- import org.l2jmobius.commons.util.CommonUtil; }8 a& z) o; u5 g
- import org.l2jmobius.gameserver.model.quest.Quest;9 c5 }9 u7 \" I: x
- 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 — менеджер для работы с игровыми скриптами.
- M2 ~, A% d( l8 F9 K8 S4 s" F9 H& k
2 J5 X3 Y8 T3 A' X, _9 ]" ]9 u7 ~- R3. Описание класса QuestManager
) Y+ ~2 U- r1 M- /**9 o# Z+ k8 @' W: x& F! f# l
- * Менеджер квестов и скриптов.( n+ J) Q) r1 J' q @7 X
- * Автор: Zoey76
, U+ n1 k0 E+ T" C2 w q- e - */
$ q( j+ {, r, w& o) g1 { - public class QuestManager5 ~- @3 [4 R3 X
- {
4 ^- r; z7 [ I - private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());) y" g/ W& d4 w9 m, N4 a
-
8 D- u8 n9 W: t+ v3 W0 { - /** Карта, содержащая все квесты. */ L9 d# k1 \7 m- W) w& z+ M
- private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
# o H" ^$ o9 V# W4 T - /** Карта, содержащая все скрипты. */
9 }8 t) m$ V; j H. c. ^ - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();" c: G5 w- G9 m! }. m! [% O' ?
-
; L2 }( ?- V, L* F0 j+ [ - protected QuestManager()
3 K1 F( G: O1 O p5 w; d4 S6 Y - {0 z# l* l4 j( a" w3 I
- }7 p: t* _5 r" ^; |# R
- }
Скопировать код 4. Методы0 p. y( n# {' [% _* }7 H j3 K
Метод reload(String questFolder)
- W$ u W6 y1 V1 z$ D8 A7 g/ u# z- public boolean reload(String questFolder)
& G) k7 E. O$ _' ]! n/ w8 q" X - {- K5 @4 B. d3 p. ^
- final Quest q = getQuest(questFolder);
( R" @9 U5 t. z7 _- d, ?$ K3 G - if (q == null)% g% M2 w' v" ~
- {
( t% I' B) p7 i. ]+ \ w0 ?5 D$ Q - return false;
) ?6 \3 ~/ @6 O% z1 D( R7 d: Q, H - }
" o9 u; L' K5 N, | - return q.reload();
2 r# }" G, Q# G) X2 {; ` - }
Скопировать код
0 p2 u+ j4 N/ F% Z5 f$ L8 w, `: I3 | `& \, ?8 Z' m' e$ n$ c
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.4 F% |' G# l7 P! a+ g' _
Метод reload(int questId)( ^% y% L+ V% G4 [, x& Z: s
/ \4 `4 Q) ?* L# l* U- /**
- ]1 z( u. ?# F1 X8 S* V+ B - * Перезагружает квест по ID.& Q, n7 t! P- w8 q- S9 y% _
- * @param questId ID квеста для перезагрузки
8 o. s( M6 Z# R2 e7 Q - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае. q% j0 Y6 a% k. R, c" `( c
- */
& p5 ?) F1 Y, |* U! S - public boolean reload(int questId)
( q% E2 g# J0 \# h: x0 E9 f - {
1 Y% I/ h" u: l) O - final Quest q = getQuest(questId);
+ `4 R$ _6 }# T - if (q == null)
5 Q1 q7 h4 O5 w, I8 F - {) L& I) X# p- c2 F
- return false;- O1 x) Z9 [) i: ~! G6 ]6 T* k
- }7 k$ z- f" L1 R. j
- return q.reload();3 w- L5 ~& k+ F d+ X, |! Q
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.! G7 [6 Z1 `+ J# M3 f8 a
9 t) c! s+ P3 k1 Y* wМетод reloadAllScripts()" }/ X& j" z% G( S
" E- j8 D3 ]% E5 ^
- /**1 z1 E4 U9 i5 E {. _
- * Выгружает все квесты и скрипты, а затем перезагружает их.9 D: d6 \$ Y: [$ f, A
- */
4 ]6 w5 W2 ]' z( b - public void reloadAllScripts()7 F4 Q" |7 }, f0 Y' n0 Y4 X" \
- {
( t. V4 f% C+ n6 |/ S - unloadAllScripts();
$ R! v9 h! N# }9 [ - % J9 e7 O' ^2 d. X
- LOGGER.info("Перезагрузка всех серверных скриптов."); y/ Q* s8 J! S4 r+ V4 s
- try, w; k3 U( u' X- Q" ~: Z' X
- {3 j* x( p+ e1 u4 u5 ?2 d. ?
- ScriptEngineManager.getInstance().executeScriptList();
$ B* @6 w g" `& n" U: J ~4 H4 i - }
2 }5 d+ ]3 D, R' X. J7 I - catch (Exception e)& M. m, j" n5 y( M) @4 j
- {
2 k! f$ k4 ~. `# d! A4 Z8 [ - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);9 r+ {! n' A& J- K) y
- }
, v$ E* ^7 L0 H4 B6 k5 c - - P7 Y; g2 W! B0 u& I' m
- getInstance().report();+ A! J$ I6 w/ N* \
- }
Скопировать код Метод unloadAllScripts()# v, O% q6 C5 r& o$ Y- @* M
1 t8 H6 m9 x2 k( I% @* @
- /**
: i* o# h8 |$ i, Y- p. O7 F' b( c8 k - * Выгружает все квесты и скрипты.* j6 a6 R9 d! D7 p" y
- */- f5 i& L8 ]7 f( S$ r& L4 u
- public void unloadAllScripts()
; d7 x; u4 Z/ N$ H1 m( R - {
7 J! k# N" e9 J( `$ c, B" `+ F& O1 S - LOGGER.info("Выгрузка всех серверных скриптов.");
$ I# s( i8 Q* w- E8 U# c -
) _! h) N$ S- R# l; u$ F - // Выгрузка квестов.# X4 D3 H! u) c
- for (Quest quest : _quests.values())
4 g, `2 B% C" W6 Z - {3 } ^' l1 G% l3 R
- if (quest != null)* X3 X% y4 {2 A! _& F) y
- {8 n* A( p. G3 b% w
- quest.unload(false);
+ `# s, \8 x9 ~. ] - }
5 P3 \; h8 r, J6 f/ } - }4 h7 J8 Q1 m d. _' b% I k
- _quests.clear();
$ L* q' T9 k5 U2 K6 _& g! Y+ ] - // Выгрузка скриптов.
6 b6 |1 \* z6 x0 e - for (Quest script : _scripts.values())
1 D: ?4 }5 q, q7 t' z - {
5 Q3 a$ ?- p9 d: o7 E4 b2 ? - if (script != null)8 ?8 M: D2 N$ F
- {
# u$ ^ D$ g, Q$ t7 W" a' X9 } - script.unload(false);2 _9 u0 w2 w0 w; Z# W
- }
* q5 d& ?2 j3 Q0 m! |1 h - }
$ C8 e* m; _: T4 Z, b8 Q) I3 O) A - _scripts.clear();
1 J' W+ [4 V) _1 s9 W6 u3 e4 ]- y* n - }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
' A: a9 v; k& z$ z* M& K9 W" L! @ % G! p' y" \4 R9 b$ \
Метод report()- T1 B# r/ \) r+ P: r$ O! U
; v$ K$ B) U" i ?8 @+ B
- /**' h3 w! r/ h+ a$ x* ?& }
- * Логирует количество загруженных квестов и скриптов.+ m o5 ^) S) I- D2 G8 [% s& ]
- */* V# \: T9 x9 h, P# Z7 s
- public void report()$ \3 V# \0 p5 T6 |+ I5 n
- {
' j ~! A8 P* t - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
5 F3 R, H" s2 Y/ a9 ^% R% r% E3 x - LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");$ `- z- E/ K/ E K+ ^
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов., s6 K1 z, u$ N7 K
% a$ M8 t$ M5 L3 N( e0 |" c, I3 EМетод getQuest(String name)
6 {6 ^* }0 Q8 W, L3 N' K8 s" h. X5 p$ u L& D0 }2 U$ z
- /**
) L( Q8 c5 U! o% u - * Получает квест по имени.4 s9 g( F$ N$ L+ X, M2 s! U
- * @param name имя квеста( S1 p a- u. j( B; T, k- Q
- * @return квест% g+ X+ i4 g: T5 X) K
- */
( ~ }: R: }8 _+ ? - public Quest getQuest(String name)$ Y; j6 {" n- ~
- {5 ]* O9 v; e7 {3 k% x
- if (_quests.containsKey(name))5 a# e3 d3 b9 V. @
- {7 c( ~* Y1 ~, i/ R: {; m+ `/ \
- return _quests.get(name); t& I" g7 A: |. W z/ U, Z
- }
& @) n) \3 Q. ^) [ - return _scripts.get(name);
# y' A& |1 W8 e% E - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе." O- f$ Q3 c/ @9 U% u2 P. {
( Y* a j: u6 E, c& x/ W
Метод getQuest(int questId)% |6 j7 R# U8 z4 [0 L m
- w1 o6 i5 O! I
- /**1 o* [ b& [" @: E7 p q
- * Получает квест по ID.
8 d5 B A, z" c3 u s - * @param questId ID квеста
9 P+ V( i3 Z ]; h2 K$ c8 k - * @return квест, если найден, {@code null} в противном случае+ d: B$ @4 G( ]( v& D
- */
; C t: V+ ` D4 d - public Quest getQuest(int questId). J: ]- W3 W1 M
- {$ b; o9 B6 S" H7 |
- for (Quest q : _quests.values())& o* s. a% Z* {( w6 M& @& ?" w
- {( R' v! C- O4 _6 w
- if (q.getId() == questId)
/ U' Z+ `+ V& {9 T. K/ Z - {& O( [6 c5 E4 ~% z
- return q;- s/ I: D( g1 E8 M* u/ F. D( L" D% _
- }8 @! h/ Q H$ i8 V# _9 p
- }& E `& G6 P9 H2 e: ^* J
- return null;
+ l: Z- v R! F. F a - }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.! Q& \ Q9 q3 U4 C; Q
3 \0 R' f: q2 X4 x4 @' a0 a1 w1 V' j% K
Метод addQuest(Quest quest), M; v& a, r5 P
$ K* P0 Y! B7 \- V r7 D
- /**
; i5 b) @. T: [ K+ r- l1 E9 V, A0 `! x - * Добавляет новый квест.
% o8 \% C* z+ X* P$ x. |) a* l1 y - * @param quest квест для добавления
; n" g1 V( H2 v$ }/ b - */1 U W* i8 ^: M/ a j
- public void addQuest(Quest quest)
, `( K0 d+ {2 h/ t0 ?+ { - {
( _5 I2 s6 H$ ^0 X$ I& M0 Z# n - if (quest == null)# K4 e3 `4 q- ]
- {
0 u& y1 D$ e5 @9 k0 [- _. I - throw new IllegalArgumentException("Аргумент квеста не может быть null");
0 A7 S+ g* X+ j: M- J6 l - }, n( T& D+ W' y! b5 H
- ; V8 o7 m& h: Y3 J: n0 y) b( o
- final Quest old = _quests.put(quest.getName(), quest);
6 |. x8 i" |* s - if (old != null)
' N2 t! o) ?4 f# i' o4 C - {
. w' X5 h: D1 t8 X - old.unload();/ C1 U2 d; B; [2 _" u
- LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
( u& c# Q% r7 q2 t0 [: j$ p! D2 l - }$ }4 M" z# q2 N
-
% Z! a$ i6 O, u5 E$ c0 {. R% G& d - if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)* n( {4 I$ Q( d4 i
- {
2 r, I( m& m+ M( w - final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
! Y, |- h0 b9 \2 g/ ?' u - LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
2 I6 h* B- H7 ?2 F5 o0 }5 V1 q( d! Z - }; ^4 _3 U/ K7 D/ h
- }* k4 W+ ?4 y; G
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
9 S& a, Z2 S. \ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.# u# l) n1 p7 X% O4 H, v4 }$ q6 ^3 @
0 Y* g6 w% Z3 _' n( r+ u/ \9 N
1 [& T" I9 s7 ^7 t9 _3 k; r1 }6 Z1 m: ~ M- F. R. N: f
|