Top.Mail.Ru

[Руководство по Java для L2J] Гайд по основным Java-файлам ядра сервер L2J_Mobius

[Скопировать ссылку]
admin Опубликовано 2024-9-21 10:39:29 | Показать все сообщения |Режим чтения Распечатать Назад Вперед

Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!

Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius  T/ P% P( I1 m/ J! ^

8 d2 p  ^- V/ cРазбор файла QuestManager.java# N+ @* h2 D* T# ~& q

* i- U+ t; D/ D% [0 i- EЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
4 P0 q+ a: u. u1 ~  sОсновные элементы
# j& c# {+ _* l/ V$ G% W
  • Лицензия
    4 j8 O8 o1 ^; d) s% `: j
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      + l: {8 [8 A! x6 [* C
  • Импорты; \. e( ]. M' T' H. c. Q$ r4 r
9 k+ p- i8 y' y2 B0 F, ]; c
QuestManager.java — управление квестами и скриптами.6 ?3 f0 x# ?8 ^: d& E
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\1 o8 E$ h( ~( C; [& v
0 w- J- I6 l+ x" X' A; P) _% ~
* \$ A" K* X" H$ I, n0 M7 [/ \
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
6 d+ x7 p5 o  h4 J" ~/ N1. Лицензионное соглашение3 Q8 b( f" Q' o) Y
  1. /*
    ' U! m1 i) g9 B$ a+ \) I
  2. * Этот файл является частью проекта L2J Mobius.' k. E4 w& _( r# b
  3. * * @1 B0 p. R+ I3 |; o6 Z( W: U
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять/ G( s/ d2 _* @% m
  5. * её в соответствии с условиями GNU General Public License, опубликованной4 s, n' R5 O$ @
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    6 F- g  [, g, N4 v
  7. *
    , d6 U. \  {$ H* k
  8. * Эта программа распространяется в надежде, что она будет полезной,
    - z. n' J, K4 x; O( t/ L5 _
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии' b0 X$ N+ A6 Y
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    4 |0 x1 i: g) `. Z2 M& }% P2 \
  11. * См. GNU General Public License для получения более подробной информации." u% R8 q4 g' D- O: {
  12. * 9 X; K$ r6 O2 j/ N9 S  r1 a
  13. * Вы должны были получить копию GNU General Public License% G2 ~9 m" k4 ^7 p$ N5 M
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.2 p, V+ w' ?/ Y7 W, I& `7 u/ ^- Z( M) }
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.$ i6 t; h2 _+ K  h

1 L# o6 ^: a+ L  x! Q; M) I4 \/ f8 ?3 Q; K8 h' G: R
2. Импортируемые библиотеки
- S/ ?! u. f2 v& L4 p
# O, ^, i! k. B
  1. package org.l2jmobius.gameserver.instancemanager;, R7 M/ z' `, d$ Y

  2. 2 w0 l6 f% T# K4 T1 A2 P: y
  3. import java.util.Map;. F) w+ j2 h+ k- ], q
  4. import java.util.concurrent.ConcurrentHashMap;
    8 s7 B. ^% h4 a4 ?
  5. import java.util.logging.Level;! ?$ z' M% O1 R8 C9 _
  6. import java.util.logging.Logger;
    % p3 \2 z: W7 p

  7. ' c! F0 o' ?: D" w6 T  K0 h
  8. import org.l2jmobius.Config;
    2 J4 U/ V) F5 X( @$ G+ t0 n
  9. import org.l2jmobius.commons.util.CommonUtil;
    6 \, m! j  _3 g( h8 \3 t. A
  10. import org.l2jmobius.gameserver.model.quest.Quest;" K7 y7 \7 w( W* {  R8 n
  11. 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 — менеджер для работы с игровыми скриптами.
2 _, \6 X5 V2 K
6 W' P! p% S* t1 Y% {  q4 D7 e3. Описание класса QuestManager& S+ [7 M( u* h3 N7 M4 m
  1. /**: B- ?: R; R) g1 C1 k; N: t
  2. * Менеджер квестов и скриптов.1 ^) Y1 E+ P2 ?
  3. * Автор: Zoey76" ~) ]' J6 b) d" Z
  4. */
    ) V' j# h3 Y0 ]; A) _/ R9 d6 _; K$ w
  5. public class QuestManager' p* h3 x: Z8 b& d
  6. {
    0 w, F2 G) J- d4 z# ?
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    4 p3 U. {1 X1 J. t
  8.     1 Y: a' ^, K! j
  9.     /** Карта, содержащая все квесты. */* Q& n" [3 A, {- v' B' d0 B
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();: ]8 K0 W! b4 ^2 K/ y( G
  11.     /** Карта, содержащая все скрипты. */
    0 A  N/ x. k6 ^! }) j
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    : e8 {; T; E/ k# G. v8 D
  13.     ) O1 z8 g/ i; V4 s% `. W
  14.     protected QuestManager()  q" ?0 r0 l1 q8 r3 T, z  d
  15.     {
      z, F; d- g+ I7 H
  16.     }7 P. t# Y  _3 k+ N
  17. }
Скопировать код
4. Методы
/ E( M7 m( p" R; _Метод reload(String questFolder)$ q( H2 g1 x- j% h" X4 X
  1. public boolean reload(String questFolder)
    # {$ {3 K# a5 h( D) I7 G' n  u7 d. `
  2. {
    ) u: B+ }1 N0 p: l( a3 O* O
  3.     final Quest q = getQuest(questFolder);
    5 I5 [4 M8 F8 U4 W) ^; [3 e9 A. ^
  4.     if (q == null)
    5 X/ G7 ^& O& H! S- F, w
  5.     {+ W4 e! A5 e) Z
  6.         return false;, e6 B) d1 a2 j+ m
  7.     }/ ?5 W" z) N. P' @5 p- U$ u5 [0 @
  8.     return q.reload();+ K, D6 t( J4 c* H* h% A* S: P
  9. }
Скопировать код

) y! {& R1 P% m( h/ J% J) P
$ H% P- l6 F8 j( EМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
2 }- d  f$ n0 `& W! c5 xМетод reload(int questId)! |$ k7 {7 \0 X- n  D
7 o, x% n  O& ]7 Q6 I
  1. /**/ K1 G# P, L% `2 d' \
  2. * Перезагружает квест по ID.; J. I$ P, k. N, V: d4 ?6 C
  3. * @param questId ID квеста для перезагрузки2 ?4 k5 a) V! T; N& I0 c  h
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    : G7 X- l% k$ ~6 Q
  5. */) H- A7 x6 Y' h4 x& a' g
  6. public boolean reload(int questId)! V) N8 h7 i% m2 j- P" i( o
  7. {$ M: }1 h. W! m
  8.     final Quest q = getQuest(questId);
    5 Z4 N  T" K$ l* U% \
  9.     if (q == null)
    4 A% l/ J! l  s( L6 R
  10.     {
    + M6 J( t: M, T5 a" j& a2 N1 l9 N
  11.         return false;3 N  A" I) R! @6 L/ p1 l2 q% I
  12.     }% o! A: o2 D! s0 f8 v
  13.     return q.reload();
    0 q7 C7 Y! R. O5 |$ Q0 C
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.- V) N2 y& {# N  Z
: c& D! R# V9 k2 _
Метод reloadAllScripts()
" Q& t/ P2 H. p6 B( `- O, c; ^2 v( v! N. U
  1. /**
    " \  E( @: a% E& O: ?; a
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.& Q: V2 D# a! S( k  h
  3. */
    4 @8 ~! C' [0 g7 D. \
  4. public void reloadAllScripts()" ?" j0 P4 X; o) b7 U. m
  5. {: m) s" }7 w0 y& T
  6.     unloadAllScripts();
    ( b% w# i, x/ O9 _8 X( ~
  7.     4 e( C' Y! ]1 @8 Q5 r1 A) Y
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");* {5 W3 D6 p1 O3 U1 y( E) \
  9.     try
    9 V$ |7 o# k) f
  10.     {4 h3 t) R! j$ _; x
  11.         ScriptEngineManager.getInstance().executeScriptList();
    0 u  F5 l- V" ]/ K$ D0 x5 ~7 `
  12.     }5 [2 Y5 k# k4 h0 H8 C* N6 x' o
  13.     catch (Exception e): n, ~% B' e2 K
  14.     {
    - B, C: Q/ Q8 E. u
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);4 a" ]$ }( I; \' @* y5 o
  16.     }. U0 J5 G; r1 X2 C
  17.     # A- I1 J  t) a6 V* J& m9 d( w& n
  18.     getInstance().report();$ z0 A$ H* \) j% [! q
  19. }
Скопировать код
Метод unloadAllScripts()
3 }9 s% ]$ e8 y# G9 ]. q- d$ ^8 X: \: F1 |9 Q
  1. /**7 d2 h" g  S# e( k
  2. * Выгружает все квесты и скрипты.5 C3 H# K- x1 ]0 B' K
  3. */, i' \# a& y: e7 e6 D, L
  4. public void unloadAllScripts()# z2 ~8 a5 x, y5 E) V9 ^, G) a
  5. {
    " i+ ?$ R: X8 I7 q7 e
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");5 p1 l' f& q7 Z# ?
  7.    
    7 h+ [! ^  f& W4 [6 O4 y6 ]) B/ @2 ?( D
  8.     // Выгрузка квестов.
    2 a" K& X$ L4 D
  9.     for (Quest quest : _quests.values())
    * }, U5 w- U" B
  10.     {
    1 V0 w5 \# {# X& \- {- p" |( K- x' o
  11.         if (quest != null)
    & X$ R0 `# C: W- B1 |
  12.         {
    ' h2 @6 ^# q( c' Q" W. V
  13.             quest.unload(false);
    $ T: [! I9 b$ h3 x5 j
  14.         }/ \: s5 d9 j+ C3 E1 N* Z7 ]6 c; w
  15.     }4 `3 K6 c/ b: c" F5 H  }
  16.     _quests.clear();! s9 M* m3 P+ \' L
  17.     // Выгрузка скриптов.
      a: c8 a3 D( N1 Y* u
  18.     for (Quest script : _scripts.values())7 [% `, p8 K& X! r
  19.     {) n2 |9 C) `( b
  20.         if (script != null)* P) M' E  l3 M, I4 `) a. ?
  21.         {* C- f$ u. a5 U0 k% m' P: q% L
  22.             script.unload(false);
    3 J4 P' P4 r. F" x8 B
  23.         }
    5 u& u# n, W1 ~3 S/ i0 ^2 r% }
  24.     }, r$ ?( R  J, E. w* F. L9 O; Y  P
  25.     _scripts.clear();: g, u& N. K5 R6 ~
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    # W' ]% M" ~( N. E: A

/ G& ^% A. ^& N0 g! i9 u' i4 S  x; nМетод report()9 c4 l- m* e6 B) m9 o8 v
/ B% q; M4 E8 o1 C4 h/ K
  1. /**5 M" K) l( }9 v$ C8 i% z9 W
  2. * Логирует количество загруженных квестов и скриптов.! f# `$ z6 L2 b. t; K4 Z
  3. */' Y3 ?) }$ u& _* V( A
  4. public void report()
    . C' r0 C. I0 j6 B- c* r, r
  5. {/ s3 v  N% m! Y/ f' ]
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    . ?# N3 K$ a, X" g
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    9 u7 E/ ?& f9 B4 t% a  l
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    8 }# H5 u" J6 P* e& _. c' I
  _3 N& x" z: T# b' E0 m% p. L3 {
Метод getQuest(String name)
- D( v/ I, N( F7 b1 ^2 [; K* f  A0 X4 K7 O& E
  1. /**
    / ]$ z2 K/ b' q, m6 H
  2. * Получает квест по имени.
    : z) [' [; @' W9 r6 p
  3. * @param name имя квеста
    , H2 P0 c" r4 q  K, R( v) R  Z
  4. * @return квест
    2 T0 d& ]: C* u0 s, E2 ^  I: }
  5. */
      O! h; g! E$ Q8 @7 I
  6. public Quest getQuest(String name)) A# w5 q6 B5 F: [" N
  7. {, r" ]7 s- V3 p7 w
  8.     if (_quests.containsKey(name))/ E8 p$ _, |# B* [* I
  9.     {
    ( ]  D% o8 i  q/ \% c6 y
  10.         return _quests.get(name);
    ' N; f5 W  v) k; R) j# i; A
  11.     }, k0 K5 L+ I1 E; i
  12.     return _scripts.get(name);
    7 `( W( y- Z+ k- G# [8 l
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    5 \& }. c# x/ O; A1 n+ L  a

0 y) M% R. P8 O1 r. d9 H8 a" M1 {Метод getQuest(int questId)/ g0 g! B# p: M9 d

9 x* o. m* F2 }& o* H
  1. /**/ ?5 x5 V) p% f0 U' ~! O$ Z
  2. * Получает квест по ID.
    % o+ P3 O8 z" t6 }7 Q1 v& @0 B
  3. * @param questId ID квеста
    7 u, ~# [* q; L2 t; t2 g
  4. * @return квест, если найден, {@code null} в противном случае
    . ?5 K' t; z# q# x5 ~5 Y
  5. */
    , D3 g" A; V: d! x
  6. public Quest getQuest(int questId)
    $ w. N$ {: n2 L' Y
  7. {) w( ]4 `2 @1 S
  8.     for (Quest q : _quests.values())
    . ?, [' z; H% @/ p. [1 M5 |* O
  9.     {
    ' I/ }  T% P3 c7 \
  10.         if (q.getId() == questId)
    : P' X' x; L! Q9 I+ v
  11.         {
    ; b3 e' M0 R/ c2 w5 ?' B4 J
  12.             return q;0 U9 E6 e6 }4 ?3 [% W/ {
  13.         }
    9 |7 v+ x. ]; S& [' B
  14.     }
    ' H* W: W3 l3 k  z8 h
  15.     return null;  c5 P9 T, a7 l% j3 q. [
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    8 `$ ^4 ~+ h/ E2 i, P. n

, B$ u, C# R+ Y" L( D% e2 NМетод addQuest(Quest quest)
* R9 `0 B. o5 B  z. X2 Q0 l- @# U, r" [/ a
  1. /**
    5 N3 s8 _( z$ h. X7 I
  2. * Добавляет новый квест.
    7 O. c. k' k% o" ]/ V4 }& U( n7 @
  3. * @param quest квест для добавления
    2 C7 q+ S# w: w1 c; h- o+ m1 Q, h
  4. */
    ! @& h/ n5 Y% f' k3 ~1 z. g
  5. public void addQuest(Quest quest)
    8 u- Y7 W3 F) F& k
  6. {
    - A/ a4 B$ V( n; ]3 z% c' \# [1 p
  7.     if (quest == null): I& f2 m/ Z; n% r9 D8 ^0 v
  8.     {4 `/ N: Q9 m" E
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");: L$ w2 j. D  Z; Q% ^0 ^( \; U5 O
  10.     }" O/ F# u5 c9 \
  11.    
    5 I( O4 r+ o" b; \
  12.     final Quest old = _quests.put(quest.getName(), quest);
    & w: [# y( I2 r( l' e, \
  13.     if (old != null)1 ~# E" t9 @& y; M% i" ?1 f
  14.     {( y8 S3 E4 H2 k" m$ u  V
  15.         old.unload();, W* ?" O- {5 Y) ^- D/ j* {
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");7 [( n  ?3 [4 f4 M3 w
  17.     }5 q% k2 P9 m! @/ f' T) E$ Z+ ~4 D. H
  18.    
    ; ^1 a# `3 q) e) q; d  v
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS). S. \1 A7 X" {! G- y+ m9 R0 a
  20.     {
    - ^2 }: e% [4 X
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();% R' m! W; q5 T" R
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");  ^5 y! ~9 A/ O7 y' U
  23.     }0 T1 q5 V' q- u, ]) e3 P
  24. }$ B2 v& i9 z* z5 ~# V( s7 C6 Y
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
4 ]! k) d! M% iЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.0 z3 i& c2 R  k2 A
7 P$ E7 {0 ^" r$ \2 D

/ _0 I9 c9 e1 W4 p
% [6 L" S# A; F. E
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

Правил начисления баллов

Опубликовать
Сектор творческих людей
Горячая линия

638638758

С понедельника по воскресенье с 9:00 до 23:00

Обратной связь

admin@artace.ru Онлайн

QR-код

Powered by Discuz! X3.5© 2001-2021 Comsenz Inc.