Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius: r( ^2 n* }5 L6 W% w( v
3 ~( U. a: s9 E1 g" M
Разбор файла QuestManager.java) o6 W9 H& _9 R0 m- C" p

' v, x  e- ^9 }4 yЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.( S! t6 l& S* Q/ u# y. e5 T1 p+ v
Основные элементы# z6 T9 {6 ^! ^# l1 ~  U- H
  • Лицензия
    : u2 P5 S: h7 B9 [
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.% q- w6 R) b0 s3 Z9 Y0 l2 K/ L
  • Импорты* Q3 y3 J4 E$ @; n* F3 Z2 J

. o+ H9 Q( n+ G& z9 \9 h6 N# u8 GQuestManager.java — управление квестами и скриптами./ x1 p3 u7 k( p# `) r( ?, \) Z
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
8 l$ h  ^& ~) X5 d8 k- r
5 ~: `/ g! N7 Y5 z
) q* @' T. k$ I/ |$ ^* }
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.! ~; g! E/ \. Z! g4 [: k
1. Лицензионное соглашение
" p+ Y( L/ U/ i# j, M
  1. /*& B8 k0 V" p. a  V+ ~" i. |
  2. * Этот файл является частью проекта L2J Mobius.9 Q8 T4 N& l# v. J6 W. x
  3. *
    . _( o2 E1 M2 k
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять" Z: G& [2 \1 v! a- F7 [
  5. * её в соответствии с условиями GNU General Public License, опубликованной; _2 a" _9 J& K2 _% F
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    : K2 P' h6 z3 O" F+ Z& J
  7. *
    " F( o: n% v7 z; C
  8. * Эта программа распространяется в надежде, что она будет полезной,$ A8 ~! n$ P# U2 C$ N0 E% O) ?- e
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии" h% h; A$ o, a* V$ M: [. u
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
      v/ n6 ~$ p, }; e
  11. * См. GNU General Public License для получения более подробной информации.& g6 F5 b2 `+ W& V" g; u/ z7 @
  12. *
      _6 K' H3 |+ l2 q1 H
  13. * Вы должны были получить копию GNU General Public License
    % n- ^# n1 k# ^' C0 @# b+ S
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>., `" S  b; P7 p: y
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.7 [) s4 ]! [" W( L6 f  L  _

+ }6 K6 s- u5 {: a
/ L" N5 s( j- f2 s2. Импортируемые библиотеки
5 g; i0 F9 {. _& d. z: p4 P& n. k
  1. package org.l2jmobius.gameserver.instancemanager;' Z7 w) D% r* V% K, K
  2. $ W9 _, {  C  y1 i6 }
  3. import java.util.Map;
    1 g, f# d$ W7 _* M& l, a2 h* ~  r
  4. import java.util.concurrent.ConcurrentHashMap;/ \# @  s& }' C0 M9 D! l
  5. import java.util.logging.Level;; w& S9 B$ p4 y5 |% Y( b
  6. import java.util.logging.Logger;) M% m# w0 ^4 }: m1 q( f7 [

  7. 1 v8 `- K% q% x" J1 e
  8. import org.l2jmobius.Config;
    " H8 s" i' V; F( E9 K" k
  9. import org.l2jmobius.commons.util.CommonUtil;% ~2 E6 F" `/ J6 \8 p
  10. import org.l2jmobius.gameserver.model.quest.Quest;% Z" M' d2 J0 q% Y
  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 — менеджер для работы с игровыми скриптами.
- ^$ q. C) M; C* E) t( [& V( ~2 _6 ]9 z$ U  B: n
3. Описание класса QuestManager
4 [' C2 M' H- O- S- B
  1. /**
    : e$ e* ^# E" y* c0 y; g  \
  2. * Менеджер квестов и скриптов.% U5 p- x. g! M
  3. * Автор: Zoey76
    8 {# O8 m- y! m- {6 V7 K1 _
  4. */
    , M5 T$ C, W4 {% M6 O
  5. public class QuestManager) k  E6 I# g) g3 y7 f" I) b6 t4 e) g9 {
  6. {
    # n3 H4 B" h: Q# [. E( ^) e  |
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    ; q. L3 n* Z2 Z8 _! A. [
  8.    
    6 `: a& E& c2 u6 z6 v
  9.     /** Карта, содержащая все квесты. */
    ) k' W0 K8 t8 n( l+ ?
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    & h; @3 ?7 y2 t" p6 a# N+ u- G
  11.     /** Карта, содержащая все скрипты. */
    2 g8 v6 d2 n( x) e/ J  N( h
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();& g3 o* D/ m* t1 e
  13.     * ]( N  H) W* \. G, S
  14.     protected QuestManager()
    6 E' N  ]4 G% ]: Y$ g
  15.     {
    4 l) ~% n( A. v. R3 ~9 C
  16.     }
    % o5 {' d% R- n* Z) U) L0 v
  17. }
Скопировать код
4. Методы9 v+ c& H9 b6 y: c6 i
Метод reload(String questFolder); s* L& C+ n2 G) \+ {; v
  1. public boolean reload(String questFolder)
    + n) d4 D% S- O- R% j  T
  2. {
    & L, a; G9 @" c: `! T
  3.     final Quest q = getQuest(questFolder);
    * w3 N& o; C7 l
  4.     if (q == null)
    7 O1 d% z6 E1 ]% A5 O
  5.     {# E: a  I$ L; l3 v
  6.         return false;( X% I! m6 W/ `8 ]/ w* P9 E# g
  7.     }: ~) @$ E+ B/ t3 @  i
  8.     return q.reload();+ u6 w  y1 q: ]5 Y2 I9 `& M% J
  9. }
Скопировать код

2 w* z( {2 {- I/ b/ Z  Z, Z2 j: j7 u
9 |5 D7 N5 d5 Z: aМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.9 A" T/ _7 x: U
Метод reload(int questId)
3 j; J3 h  x% @8 S+ K* U2 V( Y. Q8 @: H/ x
  1. /**
    ' e+ j! W$ c- E6 O
  2. * Перезагружает квест по ID.4 o7 R. o& u# Z( r5 n
  3. * @param questId ID квеста для перезагрузки" C: i2 }- y! P1 D) f2 Q6 \) G5 ^
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    , L+ P0 p) S4 j# X9 O; o9 N
  5. */
    ! A( b$ @' o3 y% F2 \: {7 i' v/ e
  6. public boolean reload(int questId)
    1 w1 {9 m- T" T; r7 J& H
  7. {
    & T: J0 i4 J: m* a( G
  8.     final Quest q = getQuest(questId);
    $ u/ m8 T" u! S  J# X  _5 l
  9.     if (q == null)* {+ ~* L0 f' C# Y5 T, ]
  10.     {7 q  _0 K6 [1 t9 w9 P8 R% t
  11.         return false;8 K. E# w2 g' N+ f6 ]& ?3 l; q# b
  12.     }
    " i5 K) e. I' f4 r! C1 ?
  13.     return q.reload();- N4 `0 u) y6 i; c" {0 ]2 W
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.6 x$ D! B, w4 b
2 [! _# E$ B! b! f8 Z/ m9 F
Метод reloadAllScripts()# k" ]3 \$ q# O1 y

/ M' @3 E+ Z+ s2 z
  1. /**6 M' ^. Q1 `2 u+ \2 G% }/ ^  j
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    6 O; c: o- y( D& j* ?
  3. */
    0 k& I* W& Z) o8 s# g
  4. public void reloadAllScripts()/ ^6 S  s, L4 v8 a; u5 D
  5. {; g/ G" Y1 |0 h3 n& N1 }- f' z7 ]
  6.     unloadAllScripts();
    # S! H) f  U1 j* j% J
  7.     7 x1 m! N* G5 m2 v7 r
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");  x* M7 d/ b: O$ Z: P
  9.     try
    6 V: p7 K  W' H# \1 R$ W
  10.     {
    8 x0 v  P2 s- [- `( R
  11.         ScriptEngineManager.getInstance().executeScriptList();% v7 n* e; j& T/ \5 ?' c! W
  12.     }* R/ g, d7 p: ^' W8 L& X6 W+ e
  13.     catch (Exception e)1 L# z6 b/ i& N3 Z$ P
  14.     {
    . f6 n# b7 ~" q: A& d" S1 A  P6 }
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    . W! i- v/ m* K9 n5 }
  16.     }: d: A) z1 G0 i: X8 Y3 }) k
  17.    
    ; E% p3 n" D, v  B& T# c
  18.     getInstance().report();& o" o9 J8 b4 G
  19. }
Скопировать код
Метод unloadAllScripts(). I) Q- ^6 \! {( ], n# v: _

5 I' b8 c/ T9 Y- J, d. t' \
  1. /**% \0 y8 d- x0 D* |% F
  2. * Выгружает все квесты и скрипты.
    9 k2 e* ], J( {# b/ R8 V0 \
  3. */
    8 c8 x% a0 }$ S5 V
  4. public void unloadAllScripts()2 P4 Z/ Y* B& Z* G. _' r( l* m- S
  5. {5 H( F# }/ J6 ^, |
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");' W: F4 h' X4 ~+ l
  7.    
    ) C. s6 s4 Z4 A9 ?% b
  8.     // Выгрузка квестов.  i, Q1 c# x6 X: [& ?+ A4 _# z# e
  9.     for (Quest quest : _quests.values())! n! S% O4 l+ O- I7 U
  10.     {* _- H- N2 p$ c9 i
  11.         if (quest != null)
    4 D5 F' H# B9 ~4 W" m6 ?- h' t
  12.         {
    4 w: o7 J2 t% y# q" V! @, G0 X0 X' Z
  13.             quest.unload(false);
    - r3 m3 n$ a. W3 \* n. S; [
  14.         }
    6 J* D' z& `2 e% q7 H
  15.     }" ]( z5 y# W( b1 q/ V: N
  16.     _quests.clear();7 n" d+ x* e0 k0 W$ r3 P- ]
  17.     // Выгрузка скриптов." ^4 j; z# y$ H# g
  18.     for (Quest script : _scripts.values())
    8 N7 l" e* s  C
  19.     {
    7 B; L, _0 I0 h9 k5 o# P
  20.         if (script != null)0 a2 }% ~6 Q8 D6 b; k5 x
  21.         {
    3 d  Y. C& K* N% C
  22.             script.unload(false);
    6 w6 p/ j7 N: Y3 i
  23.         }
    ! v& x7 V; S  z. |  R& K3 g
  24.     }
    - u, L  a. S$ k5 U0 a
  25.     _scripts.clear();
    % w1 Q) }) \! k' o0 ?; f
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts., G9 M5 _1 I8 v- X- o+ a

' C3 q+ `; {: J0 C) `3 G$ nМетод report()
  s" I+ n" i1 N2 P7 I* h' {7 x
- T7 ]# ?+ ^/ }9 l( S0 i& D% g
  1. /**
    / z2 }( ^& L  n6 E1 V! b
  2. * Логирует количество загруженных квестов и скриптов.
    5 q% J$ g8 |* R6 |% v
  3. */
    3 a4 x5 L$ P( }- C9 m
  4. public void report()
    6 d& t6 l% a0 N
  5. {
    $ j# n0 h$ Z! @+ k# n$ |# V
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    . X* J2 i5 q1 t
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    6 X) o$ x1 {, n7 H$ n& D9 a% t
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    : l$ L; {' t7 {+ |  f

" ^# @) ^0 {: V, `" ZМетод getQuest(String name)
& {6 Q3 u8 o; h( F6 t. Y! P& {5 B5 R% A- m5 M9 |: t- M, w( Q# \
  1. /**2 _3 ]3 A: G. i: u$ B" y7 e2 w
  2. * Получает квест по имени.% v# {  [+ v/ w4 O) E& ?
  3. * @param name имя квеста. W6 R% }6 T- `5 s5 Y, A7 y# k0 }- U
  4. * @return квест
    & x( x9 f' b. U" {
  5. */
    , ~7 a$ z3 t' p  \3 C1 F
  6. public Quest getQuest(String name)- h& r/ D' {3 q2 o
  7. {8 N- L* S; {' t8 k" l, v' h) ]) H
  8.     if (_quests.containsKey(name))
    8 H) Y* O4 x5 }+ ~' M" g
  9.     {% B+ l! y4 e9 S) |5 A- {, M
  10.         return _quests.get(name);! k7 x- n" d- c8 e3 B
  11.     }! _% r7 x6 B+ a
  12.     return _scripts.get(name);0 J4 D& n  t; m$ ]7 s7 m( n
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    1 q% G. N  s/ \+ ~
5 V/ P% h/ D  w( f6 q, y, L3 h
Метод getQuest(int questId), W3 X8 j: m! E. H

+ Q. m% U! O( W' u& Q% G. I
  1. /**1 R7 t, L: c) W: w7 T
  2. * Получает квест по ID.5 J( u- ?6 L# O9 ?5 U3 U; @3 `
  3. * @param questId ID квеста2 W2 h8 w+ n4 V; L$ O6 c) L/ N% l
  4. * @return квест, если найден, {@code null} в противном случае5 z: i* `4 N3 C& Y  S; d
  5. */
    9 O; z. ^1 H, n. Z
  6. public Quest getQuest(int questId)
    8 s% Q$ y* v2 a. g
  7. {. P9 Y3 @' O/ c3 n. I( U5 R
  8.     for (Quest q : _quests.values())
    . }' i9 o4 p& C; P
  9.     {
    / l3 ~! P. L  R  _1 ], A
  10.         if (q.getId() == questId)
      k3 X" X: b' X+ {, p* l( b& f+ p
  11.         {
    6 F3 t- T6 h9 \2 i$ b+ Q
  12.             return q;
    + D& ~- p' q' n4 q8 a: G0 A
  13.         }
    - v. f" Z) `( U9 v2 y
  14.     }
    ( f% v$ U6 [9 P3 X7 `) S4 L( x  `
  15.     return null;( N0 p4 j& q! w9 ?3 r& ]5 z' ]
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    ' R. A" E* ^" k! _+ h) u( p8 t

# r' x4 t) ^  ^  d( {  bМетод addQuest(Quest quest)
- n2 a9 C' Y( l
  o, P* Y; M5 W# e$ a( Y! w
  1. /**0 r. {9 l+ t6 {. T
  2. * Добавляет новый квест.
    ' _3 S9 o+ X/ ?! v( k( D4 z- n& @
  3. * @param quest квест для добавления/ Y& J7 z8 V* Y. y: D; G4 R
  4. */
    : G, v* ]* c: p8 R
  5. public void addQuest(Quest quest)3 g8 q0 C/ ~) Y( a8 ?: @8 M
  6. {; `0 V& o. F$ E/ ^5 ]6 I
  7.     if (quest == null)7 j* T; K$ J+ F1 F3 d+ }
  8.     {8 q9 w$ A& z9 j0 C
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    0 }' l. _  f- K- G
  10.     }. ^9 r" Y  @& C) ^
  11.     7 C) ~+ V& Q/ ~0 a& b
  12.     final Quest old = _quests.put(quest.getName(), quest);
    4 c( M* P' [. |3 j4 w
  13.     if (old != null)& ]# j( I% Y7 }& K  P$ n) o0 B
  14.     {
    / {& V2 q. ?# T4 j" P
  15.         old.unload();
    * O& O; D9 k" X% P. m& J8 e2 S+ q
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    / }' P6 \( m4 \9 K7 H2 W% y
  17.     }$ Y3 ?7 ?% Q7 Z: R; a: N
  18.     % ~# |  i( U5 V3 p+ ?1 V9 e. M
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    5 m0 H- V2 r. g  T" n
  20.     {5 D/ J* V; R; g& }2 n$ ]  s
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();. h  r: I0 q6 W' m$ W; b: I
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");, x3 n/ a3 D5 q7 a5 @% S) F8 s# F
  23.     }
    8 y8 r4 R; K- X* j0 N, T
  24. }7 s4 g- W1 j! r% d( y) I
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.) r! o% |9 K- |; @1 w' ~3 m# @
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
& f1 @% d: P0 W- G8 ^# K9 O- J

& r, l2 U: G5 }0 U$ @" L0 _( c1 g9 `: r/ g; C6 o
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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