Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
. U* B) @7 Q4 J2 @9 Y6 e: }4 ^, a) `) e  f3 [4 I8 v/ I8 h$ t
Разбор файла QuestManager.java
7 ]4 n- z$ X* f* v* G- I
! z, s2 B5 @; [! f* Z- \$ @Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.5 \: F4 b2 X) Z1 y
Основные элементы: O3 S2 u# A4 M" R0 y
  • Лицензия
    * Z8 R9 d6 J' B  _7 e2 E7 W& o' ?
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      8 O# w2 u' \. @: |: I; L
  • Импорты* L& W! M/ O  G0 Q' ~5 d

- S1 d3 B: s& X, I0 }QuestManager.java — управление квестами и скриптами.
8 E, y& B1 a/ c, o$ RПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\+ I" ^& c+ d4 b+ W: c+ {7 H" C

$ \( B9 n3 i" O

9 ~  u' g1 a; B' ~  }! tДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.8 F7 R1 z+ e$ g( d7 s. l3 L
1. Лицензионное соглашение7 m! g' r" J6 l1 a
  1. /*
    0 _( E6 O, W$ x1 O# u) Q$ t, w
  2. * Этот файл является частью проекта L2J Mobius.
    " d3 c! P7 _- z% W4 q( C  S
  3. * / ?) ?  k  ^2 A; I$ ]3 c
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    " l: r# ~; Q; Q2 j5 B7 P& ]
  5. * её в соответствии с условиями GNU General Public License, опубликованной! }; y. K5 Y: ?1 h3 W& Q0 L
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.- Q2 j/ h" {7 V4 t5 ]
  7. * 7 t7 K: J8 T: v3 p% [1 ?
  8. * Эта программа распространяется в надежде, что она будет полезной,- r8 c0 w: W# Y  w, b& K
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    1 E+ a& ]" v8 o
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.6 E5 l; g" r: E
  11. * См. GNU General Public License для получения более подробной информации.
    ! O8 O7 Y2 S: L( P: L7 Y
  12. * - t4 n# }, o4 X! u4 O5 y4 N
  13. * Вы должны были получить копию GNU General Public License& h, u  ^8 B+ T: E6 {
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    6 V: s/ [" R" o# z
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.; U) Y; I* O9 _& u) I  `" `, P

. o+ X/ D" P6 W  k& @+ O) h: T. k; D/ i
2. Импортируемые библиотеки4 Q' J! \" j1 Q4 p' j

! o& F" y; j! f7 `
  1. package org.l2jmobius.gameserver.instancemanager;
    % X( q; D# e6 |* Q

  2. 3 w* c+ R* L# ?7 b! N
  3. import java.util.Map;
    $ |; j& a8 H& m9 U1 d- p. E( N
  4. import java.util.concurrent.ConcurrentHashMap;
    # c0 u% H5 @" b6 t& U7 W; [" d( ~
  5. import java.util.logging.Level;
    6 D) D/ C' i3 p2 N: h9 X2 s, n5 N
  6. import java.util.logging.Logger;. N& d) Z! g1 G) p# `7 U! ]# G

  7. + z; L0 o" c) O4 s
  8. import org.l2jmobius.Config;
    . {- I+ [" b' X$ H; Z' d6 R# a
  9. import org.l2jmobius.commons.util.CommonUtil;
      `; M, k8 b  n* y
  10. import org.l2jmobius.gameserver.model.quest.Quest;( w2 a* S' X4 `
  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 — менеджер для работы с игровыми скриптами.* X9 q% M& [) x% \. x, c' ^3 p

) }7 E! I4 U9 d- d9 Y2 Q' V6 V3. Описание класса QuestManager- J- v; p. Q; Z8 N" z/ v, @
  1. /**; U+ |; I) H8 p) s' j* ~
  2. * Менеджер квестов и скриптов.
    2 ?- c3 v/ B) f! a/ @- e, c
  3. * Автор: Zoey76: R, {7 l' ]( s- W& w+ r, Y
  4. */
    5 J- v( f9 |- k* v  l
  5. public class QuestManager) ?- g# y* B, l/ e
  6. {
    & y: ]) m1 x: g* m4 \
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    3 X2 K+ g" s7 m9 p- L" l
  8.     2 L4 D' N% k' d' e2 F6 c& S
  9.     /** Карта, содержащая все квесты. */
      M3 M' `% P4 a/ Z3 s& O* |
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    . U+ E) J7 f* x+ B- x; g* |0 s
  11.     /** Карта, содержащая все скрипты. */
    + |, B4 z) ^. S6 I" h
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    : ~0 i6 n( F. I  x
  13.     : p/ [. G& r& e/ i1 d: k( q  ]  \
  14.     protected QuestManager()& y% t' A, J1 E* \3 E3 {
  15.     {
    . \8 u5 `0 _. I: W7 A2 A- M
  16.     }$ ?6 ^: i1 n: q* f' s8 ]  }
  17. }
Скопировать код
4. Методы
/ F; l: W+ \2 D. d$ P5 f2 m8 J+ aМетод reload(String questFolder)/ M5 p) D8 P- x: N0 z1 q5 x: s
  1. public boolean reload(String questFolder)
    ! k# ?% o( n# C5 [
  2. {
    $ G6 `+ H; Z, h! w7 J
  3.     final Quest q = getQuest(questFolder);, p* E* a( b* ?2 y
  4.     if (q == null)
    8 u; x9 D( j, T* W" B0 h
  5.     {' l/ T& n0 }3 o9 J; S5 z# d% B, Q
  6.         return false;
    7 n# }6 h2 w* V) Y( O* A' H- I9 V* I
  7.     }
    2 ?6 N9 c: i( l4 e1 S
  8.     return q.reload();
    % C$ l7 H7 w  K2 m
  9. }
Скопировать код
  D  V" z7 f* q" l5 y
. X3 v% ^) i( v, ~# ~! X
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.- ^" V+ g5 O1 r! R. k" J5 U; ]
Метод reload(int questId)
3 ?- n. x" _+ w6 Y8 [+ X! |! {2 V# w0 L* s( @2 e# b' q
  1. /**
    7 j# T) h6 h  j# R
  2. * Перезагружает квест по ID.
    & ^9 h, @5 f3 h4 @' ]! K
  3. * @param questId ID квеста для перезагрузки
    3 l1 f$ f6 o2 {( @" u* q
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    ' |5 K3 D% g2 C# @
  5. *// l8 a3 f- c# J( A) E1 e
  6. public boolean reload(int questId)
    7 A6 t- F* o! R  R" H( W
  7. {
    - [# g$ `; W. d  i
  8.     final Quest q = getQuest(questId);
    $ Y4 K: Q  E# K) _
  9.     if (q == null)! U$ F9 T& a8 l0 N, b
  10.     {- R# U0 U1 D( p: O
  11.         return false;
    0 m* `# n, b  p- f
  12.     }
    4 ?4 ]2 Z" z* ?+ F2 L$ P: l7 k' |, K
  13.     return q.reload();
    & F: y4 B, s. P+ Y! b
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    " |4 f% b0 ~- W. m+ K' c

; S3 M( z; }/ w  ]( CМетод reloadAllScripts()
! L- y( l$ l) ^+ h8 E7 Y1 V. k1 B8 N7 n( t* H$ l/ m9 e
  1. /**
    5 E$ \  G/ b) s2 }2 B
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    & y3 ^" V3 _" T( ?: d! P
  3. */
    0 g0 g! I" S- m' z' y
  4. public void reloadAllScripts()
    & A+ f8 w+ }7 G+ s4 w$ x; r
  5. {
    " Z8 L# v% Y4 K! h4 r( c5 [  z
  6.     unloadAllScripts();: m& L, |' P+ q+ E0 s' [6 }1 B
  7.     # b7 S9 ~1 W1 d0 G( B& G
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");; O/ q2 l& {* ^/ @( W% ]1 {
  9.     try
    0 d+ o/ h" o7 f4 `: Y9 Z: B
  10.     {
    ) j, H  ^- l' [: \# O; u& H! I/ U
  11.         ScriptEngineManager.getInstance().executeScriptList();
    7 F4 d1 H2 x+ D3 U, O( y8 t* x
  12.     }4 n6 x: Z6 N# P% a7 H, f8 q* C
  13.     catch (Exception e)
    ' F5 [4 i) l/ D
  14.     {
    ; y2 W- W! p  b5 [, g: V
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);; |! `6 C# `1 b5 S/ A! Q
  16.     }+ k& I9 |9 C- R! o' |' D
  17.    
    6 y: V3 B6 q" k: o1 j
  18.     getInstance().report();) _0 q, ^. P7 C2 n1 z( K; F' \
  19. }
Скопировать код
Метод unloadAllScripts()
9 B- i+ @& y# N0 v# n2 C
2 c+ @) ]' w1 ?1 `$ k
  1. /**9 I3 g" I% N# V( b
  2. * Выгружает все квесты и скрипты.# G6 h& M7 t8 W. k& }. n' z
  3. */
    0 D( i4 z9 ^3 _7 y
  4. public void unloadAllScripts()
    ' v. E% ]. y: y- F1 S. t
  5. {1 U! u4 s6 R6 v. d
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    * c  ]: z  D1 |+ K+ D3 o4 [% ?6 d9 o1 M' [
  7.     # a+ `$ S; a( [
  8.     // Выгрузка квестов.
    5 |0 N1 S7 S8 {, ~
  9.     for (Quest quest : _quests.values())
    ; V. ^% K( V9 w% Y
  10.     {& u8 r7 J! B1 [" z. u+ G7 ]4 ]
  11.         if (quest != null). O* @. [) Q/ a9 [2 x
  12.         {7 x/ n8 d( X7 ]. f
  13.             quest.unload(false);
    1 X7 q; m5 [0 c
  14.         }0 |2 R- K  U8 F, ~# b, U3 `
  15.     }6 K5 C) W: q2 D# p8 E
  16.     _quests.clear();
    0 D# M4 d  a/ P. O1 h' y6 Y
  17.     // Выгрузка скриптов.
    6 x% G: `; f; f( n5 B+ \# d
  18.     for (Quest script : _scripts.values())) V1 Z; C+ i" J& k
  19.     {7 C1 J: E- `8 Q$ [3 T* _: K
  20.         if (script != null)- f' ^$ \5 M' F
  21.         {" @0 ?9 \. [. y* P( z8 n
  22.             script.unload(false);* H! ~/ j8 s; a  g$ z) o9 m. s
  23.         }
    , ~5 ^: a* A0 z' V
  24.     }
    6 r) z7 W# q- E/ R7 N- `
  25.     _scripts.clear();. g8 s: P  Q: q9 }9 y
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.& s' D' a' h; \6 }) Q8 T4 P

4 ?# t* w/ [* M9 @& P$ Z# EМетод report()! S8 V. w3 w# t- @

/ F1 D7 I0 g  G/ B$ o
  1. /*** J: D. e* F3 _) |) @& f" ?. O
  2. * Логирует количество загруженных квестов и скриптов.7 z/ C+ {! D" p! f4 ~( n- q
  3. */
    # M7 o, w3 L$ S8 i$ |
  4. public void report()
    - S: B$ U/ P8 d
  5. {
    3 B. ?+ o4 \0 O5 C6 x* V0 F
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
      N. E! E4 h9 y6 T$ I' E+ z
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");( l3 O: X8 }/ A7 X4 n
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов./ R9 e/ ]" R1 X6 ?$ T

! \( s+ Y# u$ r6 m; h, n8 R! xМетод getQuest(String name)
7 G0 o. ^) v" f
: u( Q7 e- C  ]- d& z( J7 u' [
  1. /**" Y( y8 ~3 d- L' |
  2. * Получает квест по имени.
    8 Z6 x) C  n7 K8 d! C
  3. * @param name имя квеста
    . e' M) ~# ^7 k
  4. * @return квест: \1 v; Z! p: {1 t
  5. */7 m' x( D1 t6 y6 B
  6. public Quest getQuest(String name)
    . v: W+ H) q4 S8 u, W. C! s
  7. {
    4 p- e; d1 E  Q- E- R
  8.     if (_quests.containsKey(name))3 p' L" Q0 }; x1 @+ K' Z  K$ L
  9.     {
      C  ~# `- K& c' X3 K+ G5 T
  10.         return _quests.get(name);* Z2 c; C( _0 G- U/ ~7 I
  11.     }
    + e) J% E, O9 b, Y
  12.     return _scripts.get(name);
    1 z" b0 Q9 c; p9 e6 s1 v
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    0 i1 }1 D. A, _9 O, }1 ?9 g& u/ r

7 \4 I0 R8 M7 Q) I# iМетод getQuest(int questId)8 [+ ]) G6 I9 e2 g* R+ I9 P

1 W$ E5 f" [3 Y! w: [& o: q4 X" \
  1. /**5 A+ I1 \  N" J* }! f2 f5 s7 |
  2. * Получает квест по ID.  C) r) ]" n/ W: ~7 B
  3. * @param questId ID квеста
    # u& h4 F4 K& ]7 N: [) r' F
  4. * @return квест, если найден, {@code null} в противном случае
    2 P' p/ s% z) a7 u1 D  Z( B
  5. */
    $ a" j3 s% G  H' f$ z) H* V
  6. public Quest getQuest(int questId), w4 w' b) s0 ~/ s  n" _1 r
  7. {
    & a. ]. _. E' ?( ?
  8.     for (Quest q : _quests.values())
    ' k& N  B3 R: Z, F+ x
  9.     {  W' Q5 A( y$ ~4 p+ I
  10.         if (q.getId() == questId)
    : A& }4 [7 s! w% h
  11.         {. w% H1 G2 Y8 w/ F6 Z
  12.             return q;
    3 K9 W7 c7 v0 z2 M! ^6 y
  13.         }
    . R2 l. E, i3 g2 V0 [2 u0 O, F
  14.     }
    6 \: V+ T* f5 B
  15.     return null;: s+ N) d; k: @# y' F' n" l
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.4 u/ J% y% v- {' c  g3 y1 d3 C

# O% K5 z! A  yМетод addQuest(Quest quest)
' k4 C5 O4 [9 A4 I* X" g) t! M, T) v& n7 \1 T( r' W& X2 V
  1. /**
    1 H  ]/ u8 L; S/ U% _4 Y% y% r5 @
  2. * Добавляет новый квест.
    , O. N' I5 J# \
  3. * @param quest квест для добавления
    6 C0 m' R) B# F& S
  4. */
    & U4 G7 C% M5 Z: z* ^1 e& h% Q$ ~3 \
  5. public void addQuest(Quest quest)
    - ^" Z/ I# Q8 w
  6. {
    % a8 a8 j* Z- B2 c! ]; _
  7.     if (quest == null)
    & U! \; n1 U- w: [
  8.     {
    + f& O6 z  O% H5 G
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    6 k: p7 m$ A) ?# C6 b* b
  10.     }0 I: t8 o+ m1 c% s2 V
  11.     : P  m/ z- L' e9 G/ q6 z, J9 Y& H" I( g
  12.     final Quest old = _quests.put(quest.getName(), quest);$ x3 I7 O! z3 p: ?
  13.     if (old != null)
    - h7 y9 C, T+ M& e6 J( S
  14.     {
    $ b; }/ }; l1 s6 ~6 S' K  Z' G# m
  15.         old.unload();+ l; n. M2 n2 _% W
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    1 Z5 z/ }2 u. [! A
  17.     }& ]* \) F7 D7 {( j: D. V3 Q' `
  18.    
    0 c$ T# S; z2 g4 Q5 l7 o: V9 T7 ~# N
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)3 E/ F3 v; T" @" ~  G' ~
  20.     {0 E7 @/ z8 W- p
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    7 X. B, G  m8 c. [
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");' t: C" M* A9 H
  23.     }
    0 p* p, ?6 b4 J6 X. T. D: N* u
  24. }6 S& b  ]6 V% \
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.' a. D# r; N1 W. Z' S1 T' J
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.  w! m# S: t3 G9 V( N9 [/ A
& a4 L. F. A. W
7 h: m3 L5 h, Z* T* m% P8 \" {  B
- K: B) [) q& b0 q
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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