Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius9 ]; g/ ?, |" @8 H& W
' P# e5 `  h6 }" \+ N
Разбор файла QuestManager.java0 \8 y" m( {5 e1 f0 ~! h$ F
% W" `2 Y, Y/ I/ H
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.# a1 ~# _" s0 c% ~9 F: p. x
Основные элементы
" I4 a5 Z$ Z" h6 g  i) e
  • Лицензия
    " {& ]4 ?+ B5 `7 ^& i8 Z
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.6 ?. K; {, }# I% d; ?; W) O8 Q, [
  • Импорты
    , i, h  J1 N/ U* w. l4 L+ a

; }7 P; {  X  Z) _# h8 k4 rQuestManager.java — управление квестами и скриптами.
% i/ y* ~4 H- j! w* C" \1 Q2 L  oПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\5 \% n) B0 c% }- J& @& ]" ?/ s

( J$ i% f3 |8 U, }

! Q( e/ a1 S' B. E( ZДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.! v. G6 s' G5 n- u6 T$ N
1. Лицензионное соглашение
- L6 N& s( e& H' A* S
  1. /*
    / R9 u! z% k& A2 Q
  2. * Этот файл является частью проекта L2J Mobius.
    : Y5 C" Y) ?/ a' x
  3. *
    9 j) G) H% z! M: c8 F$ k
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять/ G/ f! B0 I- O+ Z
  5. * её в соответствии с условиями GNU General Public License, опубликованной  R3 C- e# K6 \9 Y
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии." w" U( C) u$ H% O% j! B
  7. *
    ( ^% T) ~! y- C# y. Z! N
  8. * Эта программа распространяется в надежде, что она будет полезной,
    , N# m: [! A4 f  f, J
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии5 _, {* d: ~; |8 Y; L/ P
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    - _/ N, L0 O! ]* {: b& T, Y$ Y0 o. n
  11. * См. GNU General Public License для получения более подробной информации./ Y" T1 A. D& ~, C! h: m
  12. *
    ( T: M) e2 f( x2 q2 L6 G/ v
  13. * Вы должны были получить копию GNU General Public License7 J8 M! ]/ X1 B3 f2 E& v( Y
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.$ ?( Z; S& P: G2 U) S0 I3 R5 p. N  t
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.# m& _( ?9 x! ?: @$ P, y( [8 i

. X& z  |  [6 y3 }( \5 B$ O& T5 W: v. Y
2. Импортируемые библиотеки& B- C& i4 L; G/ ~7 _

4 Z! a* v8 b( a* j6 t
  1. package org.l2jmobius.gameserver.instancemanager;
    * K% o. w* l4 @1 M
  2. ; Q: M/ V( ~- V2 E; L% H& k3 i
  3. import java.util.Map;2 p/ n9 {2 h/ B: B$ A- k
  4. import java.util.concurrent.ConcurrentHashMap;" l2 Y& [& O8 `
  5. import java.util.logging.Level;
    ) t' P8 [+ T) b% |
  6. import java.util.logging.Logger;
    % X9 q9 @: T9 K/ o7 P# m, ?
  7. ' m- w/ X3 u9 S+ y. U/ R4 C; s
  8. import org.l2jmobius.Config;' t# d% R- i  j6 c, q- i
  9. import org.l2jmobius.commons.util.CommonUtil;
    . G6 I" |) U( w/ b
  10. import org.l2jmobius.gameserver.model.quest.Quest;0 z5 D: Y, v3 @+ O# \3 ~
  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 — менеджер для работы с игровыми скриптами.
( B# X: f' s$ o1 D
- q3 x% y! G! Z* I" K7 E8 ~3. Описание класса QuestManager
9 _2 w% T* p; Y' |8 A
  1. /**( D( a+ T- Y6 R" ^, J+ h3 d% r
  2. * Менеджер квестов и скриптов.' \% f9 k. s) C) o$ ^( E& O% u: Q5 l
  3. * Автор: Zoey76
    8 O, E& a/ e) {
  4. */- W* i* V) }1 w: v& o& u
  5. public class QuestManager: m  b8 x: \# e9 F+ @+ w
  6. {
    4 v8 G$ l: P/ m% T/ F9 V- j
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());% }4 Q3 b: @0 ^+ E$ X7 R, g: }
  8.     * Z+ H* ~8 d: r) Q8 o' J
  9.     /** Карта, содержащая все квесты. */
    4 K# T) k! ^0 r5 u) O. J
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    . A& Y! h; i& J4 ]( z
  11.     /** Карта, содержащая все скрипты. */
    5 ~  j) r7 k3 ]  I# E$ Y
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();7 o4 J) L0 q7 [9 `8 \) g
  13.     ' _# ^. G' l4 p
  14.     protected QuestManager()4 \: k+ T7 C+ d3 x2 Q4 E
  15.     {
    9 h2 g5 p$ M2 ]5 ?
  16.     }5 P' H, ?3 S6 `4 w7 f5 w* x2 w
  17. }
Скопировать код
4. Методы
7 @& Q. i7 A, P" s% I6 |0 XМетод reload(String questFolder)
; s" \1 k9 K/ K6 p
  1. public boolean reload(String questFolder)2 x1 {9 v) A7 j  G
  2. {* T: v0 n  P  b$ ~" D+ E% \! x
  3.     final Quest q = getQuest(questFolder);" ^/ ~$ N8 G4 ^- g( Q4 U
  4.     if (q == null): ]+ f, E' a1 }* K
  5.     {/ h2 O- e) m: C9 }8 L- I5 y
  6.         return false;
    / P( _4 [/ ]; I) |
  7.     }
    ' ]$ J1 O3 ^4 O
  8.     return q.reload();
    ! C2 f! B9 `) W
  9. }
Скопировать код

1 N3 w) c3 i# i. D' {+ z" ?& X' c- l
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
) ?, \9 x& R( F( X2 _+ XМетод reload(int questId)9 v+ r( V  V& g* F! O4 P
4 O6 h+ M* ~( {! W
  1. /**
    4 m% h' I* t4 ^3 N, J1 C
  2. * Перезагружает квест по ID.
    & M& j) s+ i0 b
  3. * @param questId ID квеста для перезагрузки/ e  |9 @% z6 \
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае" g) v4 H% z6 J0 h/ O" y
  5. */
    0 k8 {" G$ `; H: \
  6. public boolean reload(int questId)
    - t/ }8 Z% {6 h8 k- B
  7. {
    5 z9 f2 Z4 p. {, u7 Q; W
  8.     final Quest q = getQuest(questId);
    " w$ v. V# Y& I% ~. B+ }0 X
  9.     if (q == null)
    0 C# |3 M- j& H; U- f; M1 V
  10.     {% e, \3 v+ V$ y' l* _9 Q0 X" w
  11.         return false;
    2 |- A, V/ o# b9 M; t
  12.     }
    * V" y: `* ]6 x7 }  D
  13.     return q.reload();
    4 t  ~5 Z! ^( {2 _2 v$ i3 b
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    : U  S7 ?3 R. Y6 f9 ^0 k( H

, T& H. O2 r  i6 ^0 C( x% xМетод reloadAllScripts()& o/ v& f+ M/ m+ I  {% X

" w' }$ K- b8 U! \
  1. /**
    # ^5 s3 U/ S% D
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.3 W+ p; h' O- w  Q
  3. */3 p* `/ c, s9 }
  4. public void reloadAllScripts()
    3 C5 s. e) Z5 m
  5. {
    5 @8 F% c5 d$ O7 k% `/ B
  6.     unloadAllScripts();
    8 D9 x: _! T) f4 l5 y7 D1 N7 o
  7.     1 A4 k2 b3 q* ]6 K% ~2 y/ ^/ }. N
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    ; H( H% ~7 E- p) }
  9.     try
    3 n0 T9 W" o" C
  10.     {6 N2 }: S) e. B8 p- t1 J/ a8 J
  11.         ScriptEngineManager.getInstance().executeScriptList();) w9 m$ \8 j5 |  k$ K9 N" z
  12.     }$ B# C7 E3 N; G4 f: i: c
  13.     catch (Exception e)% D& u" c$ {+ J8 r
  14.     {
    ; j+ }0 Q9 S' a1 g  g4 F! o
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);  f$ ^( p  x% ]5 o7 @
  16.     }1 C1 |& Y9 T  k7 F
  17.    
    * U# l& P9 R. H% M, D4 P1 X
  18.     getInstance().report();) |3 ~: b/ |  i6 M5 w. f- a' ^, s
  19. }
Скопировать код
Метод unloadAllScripts()
) }9 n/ T% m8 E% q& |8 o7 c2 \* X
  1. /**
    7 c$ N# M# ?" U& I: N# o; [
  2. * Выгружает все квесты и скрипты.
    : o( q: {, D# M: m
  3. */
    9 j/ F. X% [/ [8 g7 H
  4. public void unloadAllScripts()
    ! @, V# n8 R, ]8 ]: q7 M
  5. {
    : d& O4 _0 w9 Y' {
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    " q/ x# M0 L$ W. J5 J
  7.     : N8 d# Q  p* r* s5 e  }
  8.     // Выгрузка квестов.$ r# K2 P1 q% t
  9.     for (Quest quest : _quests.values())
    ( q. x/ L0 o+ c5 U7 y) E
  10.     {
    3 k0 [: S+ m- w" V
  11.         if (quest != null)
    8 }! i0 n; n5 L% U
  12.         {. h& @0 s" k8 }: o' K* Y
  13.             quest.unload(false);
    / `1 W; d# B- A
  14.         }3 L! ^& Z* t5 E. G+ ?0 ?
  15.     }
    0 W, h% a) s# g
  16.     _quests.clear();' A" B3 \" B* y
  17.     // Выгрузка скриптов.* f: x* R" d7 u
  18.     for (Quest script : _scripts.values())5 r1 j8 k5 e" P- J" B4 u
  19.     {
    , c1 L" w2 g4 s
  20.         if (script != null)% B, `% i9 m0 u. w1 a& V# J5 z
  21.         {
    . t. W% k+ I9 E9 }6 E, M( H
  22.             script.unload(false);9 s! D/ ^7 I. E7 M% y% ?* _' @  O
  23.         }
    4 c" q" B  D* Q& x: g& I
  24.     }
      ^9 K7 B$ O9 E7 `1 k
  25.     _scripts.clear();% i6 s" @+ b8 k  F* T% A' v+ y
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.( q0 H2 A5 B" o
3 U& t2 d6 G3 S/ s, k" Z% Q4 }1 y
Метод report()
& ]6 W! H# G1 T+ s: N: T
, a$ I( w. C4 y9 w/ h
  1. /**! K: W' q, E8 _2 b! |
  2. * Логирует количество загруженных квестов и скриптов.6 z" W% _) o4 G
  3. */) ~- k. T8 j+ M/ D/ n' c# L
  4. public void report()
    , {' Y6 S8 B# G& ~5 R/ v& a
  5. {. X0 h$ o3 }0 g6 R; t5 `
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");7 v% n* o/ p# b( O5 w
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    , I7 m0 P6 K( O) X% [
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.) \$ s2 ?$ A7 l1 L, \9 ~- E

6 @/ R9 B0 j% s5 Q! mМетод getQuest(String name)
1 J. L. E; j$ ]; W! s+ ~* S4 Z$ L6 h. @1 m' E. C6 E7 e5 |6 s6 u! T
  1. /**% w8 a1 a4 S& n; c2 P
  2. * Получает квест по имени.
    , ^6 ?6 \$ O6 ?& Y, d. g
  3. * @param name имя квеста- z  _5 ~+ G$ @# e& @
  4. * @return квест
    4 T2 j( |( _9 u' O6 G% O1 ^
  5. */. r- _' b$ C  c
  6. public Quest getQuest(String name)+ C( ?& G* n7 G( P) V- O
  7. {
    5 T$ b4 X: _! z* r' D% r" G8 K
  8.     if (_quests.containsKey(name))
      r1 c6 v+ Y6 }$ ~+ m8 q; h/ y
  9.     {8 K9 E7 |7 |7 ~1 C% `' ~
  10.         return _quests.get(name);4 [, h) D% h6 j* Q1 R
  11.     }- e8 ]3 g+ L. h# e* k4 [/ }
  12.     return _scripts.get(name);1 J7 ~2 t2 B9 F# H* H0 v" q* a. z- f
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    ! [) D' x0 n' U3 Y3 E

3 }2 c+ [* I1 u, [' Q' `Метод getQuest(int questId)- X1 }+ v+ f9 S% _6 f

3 G4 `7 H9 j3 p( `1 r
  1. /**+ v( \5 E) R9 ~3 C
  2. * Получает квест по ID.
    9 w1 G: f" b- Y7 M
  3. * @param questId ID квеста
    " t( P; N. W% s; [( g
  4. * @return квест, если найден, {@code null} в противном случае
    / m( k2 R$ K: b; n& a( Q. X
  5. */' s/ E- N3 ?0 m
  6. public Quest getQuest(int questId)) v/ w4 F. x/ e- |4 i
  7. {
    + w9 w& n: g4 G: `
  8.     for (Quest q : _quests.values())- q$ R7 p' }" ?- g+ p0 v4 g8 _
  9.     {) o! N3 g, n9 \8 G3 z
  10.         if (q.getId() == questId)* U. c# B2 W! `8 C+ l0 E# y4 |
  11.         {
    ! n0 M  F6 Q. b. ?' e
  12.             return q;
    ( L1 d. s9 R# c% U+ |9 m4 V. Q( \
  13.         }! x! d/ R8 s0 K
  14.     }7 R$ |' H" @  q& Y6 h% |
  15.     return null;
    8 h. H, B* I9 L/ T) r1 o0 \" l
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.2 K. Y) @5 y4 m7 f' L
2 m' {+ b7 t$ a5 m
Метод addQuest(Quest quest)
% X7 J* n7 n* b: F2 i/ E0 l& Q( J( w0 i, ]+ [
  1. /**
    ) B0 |! p) o+ V! F
  2. * Добавляет новый квест.
    $ u1 ~/ T: h: u" {. }5 b* E
  3. * @param quest квест для добавления& j/ _! X0 B6 c7 a
  4. */
    $ w3 n5 F5 L$ y0 V4 ?+ b1 e1 r
  5. public void addQuest(Quest quest)
      d- ~9 X: R+ v4 P) N! ]; ?
  6. {% z" s8 Y0 i- j  K
  7.     if (quest == null)* Y/ [+ g) o* U8 u7 T
  8.     {
    $ ]) y. h$ [; L& G
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");  D7 }: b& g+ q" Q( r& M8 W
  10.     }- f  X# I1 {& {! n
  11.     0 {3 r* l2 ]9 t8 {! n
  12.     final Quest old = _quests.put(quest.getName(), quest);2 }7 m+ k, u& B* S
  13.     if (old != null), c' h  X9 j) O3 o/ K
  14.     {" `" \  {/ D# ?  h$ h
  15.         old.unload();( {& d7 ?* I+ N4 l* r0 T% g% H7 x
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    ( A% D9 J$ ^4 @2 @
  17.     }
    : ]+ ~. {7 m5 |" Z" Z+ e
  18.     % E7 U! \; m4 Z, w" B
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)# r& c  k' K0 S' n1 l$ r$ ^
  20.     {
    # O6 Z: ~) j8 g4 f6 c+ Y: f# z/ N5 ]
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();* D: t; z: n' _
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    % n4 {' Q: n1 `2 [9 e6 l
  23.     }  g& E7 z3 i( M* D, V& H
  24. }
    1 Y3 @8 E" i1 m) u
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.- p/ g" i' u! c9 K: l7 p
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
" A, E3 a7 ~' p# i( }
$ s9 u2 N, t  x% g7 v9 v9 s) p, p6 d
) g1 D4 H  D. |0 C4 E2 O+ f1 h' ~
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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