Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
$ ?6 h( [9 \- E8 I* X5 j3 h0 k9 w7 `
' X6 T" W  p2 d4 `Разбор файла QuestManager.java
6 |- {& [; M1 y& `9 t
: o7 ?0 X5 i7 I6 v! k! J8 nЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.: r5 n" S) J0 u( q
Основные элементы+ v. f' N6 j3 ]8 K+ `" O9 j
  • Лицензия! d# Y+ p! B! [. f' x1 G
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      * @, \: P% N, Q  z: E) W' z* ~
  • Импорты$ g5 R, I8 \. I

" K6 |" u/ g$ YQuestManager.java — управление квестами и скриптами.
8 @5 R8 K* P- o; v3 d  xПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
4 i2 B# D, u& X$ W) h* ?+ {  j5 Z5 f& {
' T* q& S( O, q; U( r& L' S
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.3 I4 j, j4 G# W6 F6 z: }
1. Лицензионное соглашение9 D% g7 |8 a6 s  W7 w& z
  1. /*
    6 @  W- v* N8 Z8 b- ]5 B
  2. * Этот файл является частью проекта L2J Mobius.6 {2 ~- k  J2 F. d0 U, j7 B! q
  3. * 1 A3 h5 f* l! \1 ]4 Q3 P4 k
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять7 d6 _) a. e6 W* p9 i
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    0 o) w4 k  x- d6 k5 _4 e& w
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    / i( R# [+ ~+ E5 f
  7. *
    * |* ^- H1 I; b9 C8 h8 ^( S' J
  8. * Эта программа распространяется в надежде, что она будет полезной,  J3 D5 q  `& w
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии" h: P% Q) I! ~' X/ K: I* l
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    4 w, Y6 V! D% p( O9 K
  11. * См. GNU General Public License для получения более подробной информации.+ j8 t; w% |7 @# G
  12. * * m& t5 J7 \8 G- ]1 L* E
  13. * Вы должны были получить копию GNU General Public License
    * L; e& d2 r# I) I+ w- Z: f
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    ! D- M5 c1 |* z
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.4 a# z" x$ Q4 q' T5 D3 ~! E6 [- d

/ j! K* w6 P2 J; t/ l" M, B6 F1 a: S4 z" J( E) P. U
2. Импортируемые библиотеки
  O! _! Q3 L, s. v* Q# [$ h
- `$ I5 I/ ], g$ R
  1. package org.l2jmobius.gameserver.instancemanager;! K6 p& g6 f5 ?7 F% d/ ]  y9 |
  2. / }* f0 T' ]' F' g, Z$ f. T7 x. @
  3. import java.util.Map;5 F; S1 l+ f. M4 d/ l8 i' ^
  4. import java.util.concurrent.ConcurrentHashMap;: A# i) B4 e2 M' K& {
  5. import java.util.logging.Level;- Z) D* }( |! P* d
  6. import java.util.logging.Logger;* L* s: |6 R  ]$ o2 O- O) C: D7 m  X7 Q

  7. 7 ^2 Y, v! M6 g  b# `
  8. import org.l2jmobius.Config;
    ) m; k5 E6 U# g5 H- _
  9. import org.l2jmobius.commons.util.CommonUtil;4 V% e$ d8 N1 O1 M$ M4 }8 O
  10. import org.l2jmobius.gameserver.model.quest.Quest;# N& j- U; ?6 ]% u$ 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 — менеджер для работы с игровыми скриптами.
1 f8 s# _; ]: [9 o2 p. q
* Y  ]7 W, X  N7 d+ ]3. Описание класса QuestManager
! _2 S9 j+ r: J& S2 T4 Y7 N
  1. /**) ^" _! X+ x8 ]! b7 O# l
  2. * Менеджер квестов и скриптов.  M0 a- T4 ]9 g2 ^+ v6 @
  3. * Автор: Zoey76) ^' H6 s, q) o$ {
  4. */) {1 [- \! @- a+ N1 I
  5. public class QuestManager
    * C: w- ^0 v. _5 l3 ~
  6. {3 t/ F  ?* M; D7 a
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
      m9 f0 S. e# C9 Q& Z: |
  8.    
    " F) V+ d4 ?' c) q
  9.     /** Карта, содержащая все квесты. */
    : I' ?3 O. z; n3 t, ]* \  h
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    4 M9 p% C3 q* m/ }4 h
  11.     /** Карта, содержащая все скрипты. */
    4 I" y2 w2 {5 K4 V  t
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    : `' Y& g+ ?$ x
  13.     % ~( L5 n% I# r
  14.     protected QuestManager()
    9 q: ~- u& }+ b; k; K
  15.     {
    " J4 x2 s6 O' X! C' F4 v2 |' K0 `
  16.     }
    9 `- v% e" ]* h- Y  z/ T6 [& d0 L
  17. }
Скопировать код
4. Методы4 V" `' Z+ N) F4 y
Метод reload(String questFolder)
, ?* V7 m1 M# I2 i% _3 f
  1. public boolean reload(String questFolder)
    ( V# ~$ M: g: Y* P
  2. {
    ; D: w& l) u( \* N& P
  3.     final Quest q = getQuest(questFolder);/ c- v" r) ^& Y$ C
  4.     if (q == null), z1 e) Z/ l. G8 o8 g. Q
  5.     {
    ) \% j, R. @9 u
  6.         return false;
    8 C7 m; {5 a: [6 s! g4 j
  7.     }2 F3 p: q: C1 {! t7 v/ E
  8.     return q.reload();; [  d2 L: V* k" h
  9. }
Скопировать код

. x0 P  P2 M9 \) ^+ G9 k7 Q! n) z/ f" {
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.. u4 N# a$ Y3 `$ F: v: L# ?! k
Метод reload(int questId)* h8 `3 F5 J% [1 L

7 j& u, q' ~3 t. f
  1. /**
    ; H  O" U$ g/ I  d! S3 l2 i
  2. * Перезагружает квест по ID.# k& D% n( ?* ~
  3. * @param questId ID квеста для перезагрузки
    . n/ ]# c0 P4 x8 C+ s% ?" ^4 t/ c
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае( s) w) @1 J. {/ v( s* D* N% f  A) R
  5. */% c, j/ g3 A3 ]( H
  6. public boolean reload(int questId)8 r7 a; H7 _9 ^! O- d8 `! Z
  7. {* l; K; ~8 p" j" ?
  8.     final Quest q = getQuest(questId);
    . _6 Z, X7 n0 S& p# k. x0 I4 I( J
  9.     if (q == null)
    % c& R- `+ f: Z# q, P- p# f
  10.     {/ S+ j; d1 }. b9 s# W# E+ s
  11.         return false;
    ' x% v1 q* V( `4 @9 A0 T6 t$ G* U
  12.     }! x9 B9 l' K! W0 p. M( H1 ~
  13.     return q.reload();
    3 Y! g  t, _) H" C5 _
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    0 C# Y* l( b1 w

2 t3 }) {  o- F: V% MМетод reloadAllScripts()6 F( k$ ?0 j# n9 S9 A3 @
: S, C% T2 Q& K1 t2 Y( S
  1. /**4 [, O/ K; ~2 {- H
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.: l2 @/ e  H* J' R) i, p* T" C2 w
  3. */
    & e) B4 m& F/ R
  4. public void reloadAllScripts()8 v4 s6 F) Y; f# d
  5. {2 X% a# p7 c; h7 ?2 Q* `. l/ U
  6.     unloadAllScripts();
    + ~6 X* d' v2 E. r' H
  7.    
    : u# X' L0 j" K7 U! Y  d
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    3 Q* t" ?: m! Y/ G1 Z) {! x. Q
  9.     try% {, s! K5 U! J, q# l1 @8 f5 G# {# x
  10.     {% x1 R. v' L. F& o/ S6 e
  11.         ScriptEngineManager.getInstance().executeScriptList();. E- g- w, }6 g  V) q
  12.     }
    : s$ |, Y, l( S; u# R
  13.     catch (Exception e)/ k3 E7 Z7 i4 o: U  b  _
  14.     {
    8 W2 l3 o5 q: \: X/ N
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    " n( y" E" t1 {  s4 Y
  16.     }
    % R" C. V8 t2 }# t9 P. d
  17.    
    4 l1 \) B% c* ?8 R
  18.     getInstance().report();
    ( ?7 d  d3 \* A+ ~, A
  19. }
Скопировать код
Метод unloadAllScripts()
7 K3 ?; a- e+ U' E% e
; \' e  }2 _4 d1 ?. E8 y
  1. /**
    . ^* O% v8 a! X2 V9 a- t! D, }! K
  2. * Выгружает все квесты и скрипты.! K5 r( X# q3 a* f
  3. */
      e: P6 O* c/ z, Y7 O
  4. public void unloadAllScripts()
    / F7 Y$ @5 o. ?5 \% m
  5. {" t: y* S7 e1 x0 L- u* L4 A
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");& X  f, V* W$ g) t
  7.    
    1 ]9 @7 }  @8 D- ?4 f/ p9 Q# ~8 k
  8.     // Выгрузка квестов.
    0 B% j% a% m( n& W. G3 G
  9.     for (Quest quest : _quests.values())% b9 o: Z' Q6 k, C9 Y
  10.     {
    # _8 ~2 p9 `- V9 y  W
  11.         if (quest != null)
    0 a( ~, ^$ ~% j' E$ T  s0 t2 N) M
  12.         {( u& t1 W- F( t  m& y
  13.             quest.unload(false);1 W4 I& B: y! r) t+ |5 ?* T1 N
  14.         }
    9 ]  y: i; u, F# }  f
  15.     }
    % p' C0 W* N- x: j& B/ d
  16.     _quests.clear();, ~' O, z4 u$ F$ u7 U
  17.     // Выгрузка скриптов.
    5 M2 o3 {6 Z! M' g% S+ Y$ r# b
  18.     for (Quest script : _scripts.values())
    ) F/ ^! g  Q8 V1 N$ F
  19.     {
    " W! R0 ~% T1 S
  20.         if (script != null)
    0 I. s4 x/ Q( r0 M
  21.         {; M) m( d4 X5 s  z) E
  22.             script.unload(false);
    $ v* e! {  J( B* B4 u: j! ]0 G
  23.         }
    & Z) x' Q5 W2 E9 f/ j8 l. @
  24.     }
    1 t- o/ ?0 ~1 t* d4 R% R
  25.     _scripts.clear();0 q' Y& J/ D9 }, l3 R
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.5 @3 l1 S# @) l

" ~; K* N4 ]) R8 d: ~! O% A$ @Метод report()) J9 y/ t) d& {$ q& u* i* o
, }5 J' _) Y, {- d6 Y3 x1 \
  1. /**" w: l* _" o* X5 P. k
  2. * Логирует количество загруженных квестов и скриптов.
    ( F5 y1 j  e5 X) s& X( G* i! o
  3. */. a$ }- Q  M4 R, j8 J; F- h' {
  4. public void report()
    6 p- @+ e' A# j& a/ K
  5. {& P) d1 O! X4 O% w) {% J5 Q
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    & Z! {" v3 |  I+ w+ i
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    ) I1 r2 H5 I% X! e9 r
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов." G3 a9 x* E# ]% R, j5 J

/ K& d8 m; |' MМетод getQuest(String name)
" {$ j- T6 h5 T* `; _) W4 A- c1 u% T* `, t: i" O
  1. /*** ], g% x; L. C0 v" X
  2. * Получает квест по имени.' u3 ^" B$ K% O7 y' e4 J
  3. * @param name имя квеста
    " S. T$ w  h2 J8 ^, i7 p
  4. * @return квест
    0 k/ \5 s: \% e& d/ t9 p& ?( C
  5. */
    - U) g/ q/ f' L, v5 _8 H  o# W
  6. public Quest getQuest(String name): S0 u" }  P- ^
  7. {$ D5 g' h* S- ?' x2 u2 N$ s& m
  8.     if (_quests.containsKey(name))0 }( A9 I1 j& I2 ?! j; i; [
  9.     {
    ( U  R5 r" l- N5 Q6 j
  10.         return _quests.get(name);; ^3 l) h+ a& ], [9 _* X* n
  11.     }. {2 G7 X  e8 P% q
  12.     return _scripts.get(name);4 `( y+ y2 [6 t* p6 h0 n" b7 o
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.. i8 w& c  V0 F' ?" J+ M
: Q" O7 @: H7 x) }: F. I
Метод getQuest(int questId)  q% S0 n- X" F7 `$ a4 l
- `* v: y* C5 R# V$ k3 J4 Y, ~
  1. /**; P' ~) G: I9 s8 H2 q0 @7 w
  2. * Получает квест по ID.
    , o1 j* \3 G2 e' A9 H
  3. * @param questId ID квеста8 ?3 |" M8 s1 R4 C  ~
  4. * @return квест, если найден, {@code null} в противном случае) O8 j( e  H# n) l$ s
  5. */+ u! ]1 y" n) i9 z& i
  6. public Quest getQuest(int questId)
    6 n' a" Z) _8 m5 C% z( h
  7. {! Q& b' L0 [- d. u) x0 e2 ?/ y
  8.     for (Quest q : _quests.values())
    ) s" C! y& ^2 s: l
  9.     {
    4 }, s. \7 M% V" L% j* c
  10.         if (q.getId() == questId)
    ; L, v$ s3 U# p1 N* \
  11.         {1 J* N4 s* K1 ?' Z) r+ ?
  12.             return q;
    + }$ y( r& ^: {
  13.         }. v6 ~1 B' r' C7 G
  14.     }
    6 [+ O' Z, b0 H" E* K, W3 ]* R% N1 n
  15.     return null;
    & Z; l4 l& ?8 M% d
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    ! S4 l. R" b8 P2 v2 o9 D. K
6 B( _, y$ E! k2 A
Метод addQuest(Quest quest)
, t$ E- l" j8 c# j( X( q/ P# ~( i" K/ C. g$ B0 k
  1. /**
    3 T" |6 l% M( @
  2. * Добавляет новый квест.
    7 d* Q; C* V4 e. z' u
  3. * @param quest квест для добавления
    / N9 H9 I; d" X; y* |! }: ?
  4. */
    4 p+ q" U5 c, G6 F! ]
  5. public void addQuest(Quest quest)8 J" X9 g( v7 |+ K8 {! _
  6. {
    : j  I- ?4 K. ^( Y) K, ]7 a
  7.     if (quest == null)" Q, `  X* G1 ?- F1 B' P/ w
  8.     {0 {" e# @1 y0 E4 @  p+ j1 @
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    % g0 @- N6 s% E1 L
  10.     }6 l$ B  ^6 n/ V* x+ }9 S
  11.     3 F+ o7 V( s5 {. c' c+ m* \
  12.     final Quest old = _quests.put(quest.getName(), quest);
      w( f( \/ U4 |0 J( y3 t+ v) _& p4 R
  13.     if (old != null)# i3 C( h- D+ \& Q: ]4 v# x; N
  14.     {
    8 T# j- a; c# B! g
  15.         old.unload();! k4 ~/ C6 V% n( Z9 I& I. J& a9 x
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    8 r9 |* }' J) [' v4 j# @: _3 B* o
  17.     }
    3 n) |* ^" C1 ~5 M5 w
  18.    
    . Q; P# H, d, P9 C
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    ; [# y% |0 O, f9 q) U: v) l
  20.     {
    : p) p/ j" S3 \, Q1 H+ O9 }$ l/ N
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();( i, Z+ t5 X# N" `/ n
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");$ C4 f& A) R) L
  23.     }
      `$ o; I: k! ?
  24. }* U4 S" F2 u. |2 Z  N2 ?( }
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
: x+ O  F+ |+ ], g8 ]" wЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.' b4 @% e. H7 W) _8 _
! Z+ `- Z$ w! y9 D5 [" O

) h9 B5 b& @% [4 i1 v/ l4 n) \; t$ D) P% J) P7 i* \2 u" r& g
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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