Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!
Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться
x
Гайд по основным Java-файлам ядра сервер L2J_Mobius; n- X; B( [& F3 s9 W; [% p
; D* B% h6 Y* A: Z3 M) YРазбор файла QuestManager.java4 K3 B( [9 B" G8 x
7 o& c, z/ }9 }* N6 sЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
# D, g' |" n0 a" b, m/ ]: f& RОсновные элементы
. f. K# ]; o* P% L$ z3 L- Лицензия
9 E+ P E: @3 \- G& m, J. `7 @- Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.$ K7 a3 \) L* ^& ?- N
- Импорты( ~5 a8 D" d/ U' D& \1 ]0 W
0 G& ?' [4 B* I4 uQuestManager.java — управление квестами и скриптами.. ?% w6 ~1 r `$ T0 |: S9 V- Y- @
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\; @7 A" @! |2 w n
7 I4 y( Y1 p" J; _
2 F! q9 X* v5 q+ TДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
% r0 |, Z) u( A( s$ `- {0 T% V1. Лицензионное соглашение a, }3 J. D5 H( A
- /*
3 g" D+ [/ g0 L' |$ P! |: @ - * Этот файл является частью проекта L2J Mobius.
2 x8 t4 r7 @5 J" X3 x# e* m# w - *
) @" n7 w/ M% W" l/ v7 P$ ^: f - * Эта программа является свободным ПО: вы можете распространять её и/или изменять' o$ X, f s" m4 Q& Z* n& j
- * её в соответствии с условиями GNU General Public License, опубликованной8 p l$ C, x, c1 L. _1 v4 T
- * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.2 q6 d, F3 D$ u2 V
- *
- m9 W1 |; Q, f - * Эта программа распространяется в надежде, что она будет полезной,
$ O1 F. p3 o/ N) @ - * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии1 [3 f: H8 h3 U: T
- * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.8 N E1 c9 V1 o" S) k9 M
- * См. GNU General Public License для получения более подробной информации.
9 x7 Z6 }3 m. v' T. G - *
/ p% _' x5 Y/ k9 F - * Вы должны были получить копию GNU General Public License
' D1 m; l7 |9 H) _; T0 ] - * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.+ a5 |; [ d- R. i) A
- */
Скопировать код Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
( l& `# z# t9 b, O: e! Y, R' C* [* O1 A: w9 N' n
) Z2 C) [+ D" }5 T, m' M2. Импортируемые библиотеки; \5 t: Z+ p, Y6 u) ^5 {: D
, H4 ? u0 R, {' c
- package org.l2jmobius.gameserver.instancemanager;
/ n: J9 v, k4 |6 s6 ~& N8 x
4 u0 w8 Y- B+ Y8 D2 K. {- import java.util.Map;
8 B( u$ z3 q6 K# Q3 P - import java.util.concurrent.ConcurrentHashMap;* ^! S# V' `$ {) u9 z: i
- import java.util.logging.Level;
. Z% M: w3 \- O - import java.util.logging.Logger;
h& x/ K! k* g
( J! l/ Z2 a4 g! S- import org.l2jmobius.Config;! n4 x. g/ ?& [' j( Y
- import org.l2jmobius.commons.util.CommonUtil;" J/ F- R4 p' K& {8 t/ N7 I8 Q
- import org.l2jmobius.gameserver.model.quest.Quest;
7 F/ ~0 `4 F* 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 — менеджер для работы с игровыми скриптами.
4 Y# G4 g; D% p( u, z( ^5 x1 {# E1 M+ H) B
3. Описание класса QuestManager4 T& W$ O; Z* {8 w
- /**3 A c7 G' d/ x, M* N# I; a
- * Менеджер квестов и скриптов.
' b( R7 ^' Z. `& B - * Автор: Zoey761 A9 \1 D) p d
- */
$ A1 H! {& b% Q' v8 o: F* W - public class QuestManager, }2 f7 q+ I5 W" {) q
- {8 S s, F0 |7 j5 ?/ V e
- private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
2 m- I/ _% i4 c s8 \- j( k -
& q- X# y- N$ f1 X/ | - /** Карта, содержащая все квесты. */
) w H, {6 s* r1 ^ - private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
3 G% e+ N4 z/ M- m ? - /** Карта, содержащая все скрипты. */
6 X( ~! u3 e+ ~ J: R - private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();+ d3 r' u" S7 ^" L" n, F
-
1 l8 `1 B r8 }( e; G) G; w4 H# k) [ - protected QuestManager()
. R8 r6 s5 n3 P1 r/ r - {
3 I% ]5 a/ @; |- R$ a! Z - }
9 m$ A4 w; l4 [: |* k - }
Скопировать код 4. Методы
- q) }- F! N$ ~( X9 W8 g) N/ |# oМетод reload(String questFolder)6 i" ?+ N- b, E' g& G
- public boolean reload(String questFolder)
3 w; g1 {& i w, ]& N1 l6 S' i0 W - {# e/ I) h l- m; _6 }1 Z
- final Quest q = getQuest(questFolder);! B4 W2 l4 U) r7 [
- if (q == null), \7 Y" t' I* f% O1 B" l
- {# Y2 |$ ?. S- Y5 Z! C' {
- return false;
* p4 @4 c; r6 g3 c9 V - }+ Z" a6 j: z* w/ I3 L, e" C% v
- return q.reload();
8 |6 E4 e9 s+ r - }
Скопировать код
/ ]; P* V, v7 A# z) {3 j
# W9 O" u/ B; p. @0 L3 bМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.' n7 b4 L3 }/ n+ L9 r* }+ X; v
Метод reload(int questId)& \6 _+ V7 m8 F! x, J6 d
% D! r# U) l* ]& w0 P- /**
0 t/ R: u* ?* Y1 Z2 m1 L$ S v - * Перезагружает квест по ID.
8 B& j( s, R n - * @param questId ID квеста для перезагрузки
9 k5 n/ d7 v2 u" j' X - * @return {@code true} если перезагрузка успешна, {@code false} в противном случае+ {0 ?9 F0 S, f; Y6 d5 J
- */
S3 d, v. F4 w - public boolean reload(int questId)
) l6 _) Z0 V/ e! u8 Z; } - {
" F4 X% }# U0 W# r - final Quest q = getQuest(questId);
. r' K* g+ a2 p# J1 N - if (q == null)5 |- k6 F( m; u1 j
- {
3 S9 A6 R5 @. \% D$ J# q" O5 m1 Y - return false;) U& M z) l9 e8 [$ {
- }( z, b N) ^ B
- return q.reload();( ^2 N+ k& Y1 f2 e) A2 D/ G% J
- }
Скопировать код- Аналогично предыдущему методу, но перезагружает квест по его ID.
D; L, O7 b% Q3 T3 ?
* e6 n- l; H3 [; r' lМетод reloadAllScripts()
) n+ t; |: v9 Y# F5 C. e3 g
8 M$ i7 s6 ]' V: |/ {4 V- /**/ x% ~2 w( `. Z5 p8 Z
- * Выгружает все квесты и скрипты, а затем перезагружает их.% s& I! X7 X: G6 W; h
- */
1 R$ Q. v& H; Q& y - public void reloadAllScripts()
' X/ h/ Q* o8 F6 y$ B - {! G& l. I& |- t; K
- unloadAllScripts();
/ V: C: ~; f: f- Y4 a6 K8 g - Q) j8 ]) z* `6 \% a6 Y; t& [( E
- LOGGER.info("Перезагрузка всех серверных скриптов.");: x8 k3 F# B7 J% p5 c% v9 P8 ~
- try
8 p5 r" Z3 U& f' t" e4 ^ - {
+ y4 ?% C' [* c9 C9 V* X4 @ - ScriptEngineManager.getInstance().executeScriptList();
& F+ S( r: v7 t/ |" V }5 j - }: r4 U4 F: ]/ K1 |( B( ~! O+ i
- catch (Exception e)" O. D$ N* Y% F# _2 X7 M
- {
2 o0 p2 U' ` t/ t- v - LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);9 ^+ y' p" R1 Y
- }4 L2 G' `9 y2 a: {+ E3 l
- * I |, y, [6 b* Y1 l
- getInstance().report();; U$ r k/ X/ y, X+ [2 j) y* R; P
- }
Скопировать код Метод unloadAllScripts()
5 E! {$ }! M& M; H6 p3 m- @0 o# k6 a, |9 {; v
- /**
4 f0 w; f7 U# D+ r - * Выгружает все квесты и скрипты.
2 b$ N% Y& A* j4 v3 ?# D/ S5 C - */
# ?9 ] F% O0 U1 L1 E9 _ - public void unloadAllScripts()
. f% Q) B5 I' W+ f# h) n - {9 G- ^8 _1 a- d9 W5 N
- LOGGER.info("Выгрузка всех серверных скриптов."); _: Z7 ~# p7 O, f. z
-
7 y3 v5 j ]. ~2 I6 s - // Выгрузка квестов.
1 |4 h( s! Q2 q - for (Quest quest : _quests.values())7 ?! s, K) F9 a) m0 d. A
- {
* b7 e6 W5 C' ^8 _* M+ V% M - if (quest != null) Y" Q* F* `. E0 w$ ~( u# |
- {& p6 W' O" e/ n: E6 ~ D
- quest.unload(false);
9 D2 `8 d2 C! h6 e- g9 }' d5 s - }; n$ c( X) V. X" t
- }
5 g5 N$ Q2 R, J8 J: [3 C - _quests.clear();
7 ]2 k2 I4 f8 j, m D - // Выгрузка скриптов.% I+ }/ G" Z9 u# A1 ~0 L. s6 O8 ]
- for (Quest script : _scripts.values())& Z1 {1 Y) S6 @* N$ l% z9 g9 T
- {
- y! A% v% _- G' ]4 M: s - if (script != null): A8 @$ D2 ?+ R2 |' N
- {
6 s& Z$ l0 T, w9 e6 a1 ~3 z9 R% e - script.unload(false);
`9 w( t7 J/ { Y& G - }
: F B% U9 t* t) I0 F1 Q; ~& E6 y - }
* |& ^$ G' G; E S$ `1 ?( R - _scripts.clear();* J' |. W+ y) p* \
- }
Скопировать код- Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.# |1 S# a' [3 E. y. }5 l8 j
7 |% r7 y* f7 x% d$ s+ iМетод report(): k# O$ u( Q" I8 f1 s
$ G. d/ K5 Y; U0 [; w4 }- /**
8 q2 d6 c, k# v8 z2 _ - * Логирует количество загруженных квестов и скриптов. ^, U8 y/ m. U7 g0 M, |; D
- */1 _3 r. s4 d" b& m
- public void report()
$ n3 p8 h9 q9 @* O/ \* Q% J - {3 `4 m' F8 G( f% R, t, |
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");# k! m0 o4 ]1 G+ e
- LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");" U# K8 {% J4 ?- V$ O
- }
Скопировать код- Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.7 p, p v# Z9 F ~
. u" m W1 I. N' K: s: fМетод getQuest(String name)9 C8 H% S, p- i* B: n
% y( y' E$ a& |# E- Q: k
- /**
+ B8 D6 Z0 o2 S - * Получает квест по имени.# {8 E" H( }. M1 T' M- r4 V
- * @param name имя квеста
( l1 e% t) ~+ G - * @return квест
5 V# R) O- ~: Q7 ~ - */
1 g* S3 ?9 g- h8 Y# |* Z - public Quest getQuest(String name)3 _( t/ r; |0 m" W1 V/ i
- {
" ~1 c9 L$ Z, I8 e( F. C - if (_quests.containsKey(name))7 u: s1 p: o# K2 Z
- {
' k8 Z& x8 E7 T+ n9 h - return _quests.get(name);
( M# }5 s# u4 ?" Q+ j - }
1 q* D2 S8 _! r2 ^8 m8 M - return _scripts.get(name);
0 [" ]& S2 b: |. ]. B% U - }
Скопировать код- Этот метод возвращает квест по его имени, если он зарегистрирован в системе.' y# K1 G( p. { ?& \3 r+ Q/ a5 p9 `
1 z [9 H2 n, o |" Y/ k
Метод getQuest(int questId)/ \, X- p0 o( m
# k( p# D" j7 J9 i/ \- /**/ t& Y2 }" I: o6 L
- * Получает квест по ID.
* V3 g" b+ }4 W. b; Q1 \ - * @param questId ID квеста6 h# h& L/ |1 l9 E2 d$ W7 H3 Z
- * @return квест, если найден, {@code null} в противном случае
9 d# R/ L/ ^$ e4 ?* Z - */
) l( d5 Z1 N+ |6 F# { - public Quest getQuest(int questId)* Z; P) p+ k$ Q
- {/ r) ?2 i- r& h4 [. F
- for (Quest q : _quests.values())7 H+ X2 j5 y9 h0 l
- {
% v/ r9 j' ~, Y) P - if (q.getId() == questId)
8 U4 Y( }/ n/ Q- C! d b - {1 j7 P9 R9 v: h* u
- return q;! m( D- \- m& U8 b# I
- }
' e _& {0 u7 B; X/ ?" d: y - }0 K) d5 @/ R# Z- f8 N* b
- return null;7 N2 m& [$ ^* z* j( g
- }
Скопировать код- Этот метод ищет квест по его уникальному идентификатору.
: {) f5 Z) F; A7 j3 I( Q0 D : O# \0 c. L" t$ Y
Метод addQuest(Quest quest)' X9 w& a9 M6 p8 R/ y' m7 i2 Q
9 E0 T3 Z/ B1 P$ l5 r) q9 Z
- /**
; V `. E4 r6 ]' ?" Y+ P8 q- m1 R - * Добавляет новый квест." b& Y% J/ g0 m& |; H) k5 l
- * @param quest квест для добавления" a) N3 }2 O% N9 Y
- */* H, n0 l$ ^1 H, p) p8 T5 Y$ A
- public void addQuest(Quest quest)7 C. P# Q8 M9 Y. O# _
- {
: P, j l$ K! W. x- u/ Y - if (quest == null)
1 v- ^. R8 G3 x* R" z - {
6 K7 O, Y1 I" U: V% h5 k: G - throw new IllegalArgumentException("Аргумент квеста не может быть null");
$ n7 c- R# r% j6 t - }
8 a0 E9 \2 H& W - 5 k% }( _4 W- Z2 R+ l
- final Quest old = _quests.put(quest.getName(), quest);2 R+ H/ w9 G& L; b5 v
- if (old != null)& B6 F( y$ g1 |: j& t, e
- {& j( l8 c4 F- W& a+ K
- old.unload();
0 {7 U& x3 t. f% }" J - LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");: W ^% Z- b! T# @- I O
- }+ p+ ~) n, A8 T, u D' [! ]
- ! ~# `7 R. W( T% I& Y B' `# Y3 m- c
- if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
8 A+ k+ c# C- G9 F: Q - {) X5 L. w5 X# Q& {* S: ]& n' W
- final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();; l0 `4 I- n0 V5 a
- LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");& J* h+ Z% G, H; h$ N7 T0 n0 J
- }% g) r1 D* b4 N9 T( u- H' v) Y3 K
- }$ w0 o+ y6 q- r- f4 K1 s, }. y0 x4 T
- ``
Скопировать код Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
: o+ r# _# K* O3 H6 ~. ?. NЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
/ \$ v* b' O" B# J1 S( r
9 [* {- h8 \) Q3 s2 G! K' G9 ]
2 N4 V/ @* `) h* i5 G" E
; a9 t- ]* a ]( x! V |