Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius# K2 u, }9 d( R% i  t
5 v; b+ l, }& U3 e
Разбор файла QuestManager.java
8 j1 v8 H: W. }- v/ q/ w4 J: I
# m1 T# G9 C% e0 I9 qЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.0 O; o3 ^# i! U& [  X
Основные элементы$ F% r: j: G$ d/ V! c
  • Лицензия  J8 h3 d( A% |- f! @* O
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      $ R9 ?5 @: X) s
  • Импорты4 q- F' X9 @9 P; n
$ a( [! Y+ T4 t! z: I$ m
QuestManager.java — управление квестами и скриптами.6 W8 S0 n; ~, [8 t
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
7 k$ l2 l( ~/ i$ a# w% Z: Q9 m5 ?; ~* w2 a( p$ V9 D
) f8 z  H& O1 y) x" O" e4 w# I
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
1 w( F- p; E* V. o: n. P1. Лицензионное соглашение- _+ d" P- {0 Z. `/ l
  1. /*1 P9 O" X/ k" x9 @* [% s
  2. * Этот файл является частью проекта L2J Mobius.
    . @# q* [- A! b) v( R+ B* ~
  3. *
    & c, H; G9 u+ j1 o
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    7 T# f7 x% r. G0 s: s
  5. * её в соответствии с условиями GNU General Public License, опубликованной2 {2 N1 m3 ?: W" ?1 q
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии." s( c2 h- O0 \3 q3 L) C7 ]& \
  7. *
    , {0 q$ X5 m  p
  8. * Эта программа распространяется в надежде, что она будет полезной,7 Y; T; }7 _. V( t9 q5 d; }3 P/ h
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии( }5 V3 S& X' j- O* B
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.- o  u+ g3 r; S' G# z
  11. * См. GNU General Public License для получения более подробной информации.
      U" ]7 I; `2 V8 ^* d% v. Z
  12. * 9 f3 F) B! o$ d3 V4 R
  13. * Вы должны были получить копию GNU General Public License
    9 C) w, `2 B8 `7 Z& p8 Z6 d
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.9 Q. M' |! s/ I3 k4 S, W
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
* S3 Y6 Z4 b  M5 C& ^  V  k- w* k, d1 t- K! k

) \$ i" h% j' J8 ]- X2. Импортируемые библиотеки
6 y+ W& Z: \+ A! Z+ G5 n$ |& z, q9 s8 a6 C3 o
  1. package org.l2jmobius.gameserver.instancemanager;6 ?' X/ _$ t# Q- ^; [9 \
  2. ' J2 N  F& \+ p/ g! W4 y* C& J1 O8 V
  3. import java.util.Map;: Z  s+ R# G5 n. \6 A7 W7 F; H
  4. import java.util.concurrent.ConcurrentHashMap;# ~! S/ p3 \2 v- a
  5. import java.util.logging.Level;2 ^; D5 r  `- @- [1 u
  6. import java.util.logging.Logger;
    4 i# y$ k* {5 M2 _! t: X4 w

  7. ( U$ q$ O2 m# s0 h7 O# b5 R
  8. import org.l2jmobius.Config;3 b& D7 Z5 `. B! R0 s
  9. import org.l2jmobius.commons.util.CommonUtil;
    . ]% g! |, u  e3 S
  10. import org.l2jmobius.gameserver.model.quest.Quest;( o$ a+ J, O" I3 f" q  O  z
  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 — менеджер для работы с игровыми скриптами.0 _# Y2 j" B5 A* \$ K

9 G# k9 U$ o5 B' v& Z. i3. Описание класса QuestManager( i. W: \: ^* N/ V9 s
  1. /**
    ( D0 Z. {6 h, w
  2. * Менеджер квестов и скриптов.7 |3 ?! f+ z) \$ B
  3. * Автор: Zoey76
    % d; u3 j* `% i  _/ b9 ^$ ~3 f
  4. */0 c$ I' ^8 N' |1 X/ S  |5 i7 J
  5. public class QuestManager
    $ K8 E  j2 Q- Q+ d8 w/ m! [- l4 Q
  6. {! Z6 f9 ^& q: ~' b' m, F
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());/ ^. G& l. G0 E4 ^' s6 z
  8.     9 a: V/ b" t; r3 Y, e, w1 _
  9.     /** Карта, содержащая все квесты. */
    * }" N& O* z: B: J! E
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();9 }) R7 |0 r0 C6 {9 q! T
  11.     /** Карта, содержащая все скрипты. */( ~! O# S8 Y3 w+ Z
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();% c4 v% o5 `/ O' Z
  13.     2 G! K% x% H6 @( N! }; S
  14.     protected QuestManager()
    ' f. v' P9 Q& T! X# p
  15.     {
    4 A- c& q$ Q7 K4 Z
  16.     }
    9 I7 L) |8 S' Z1 Z3 X. `
  17. }
Скопировать код
4. Методы" p- c( W0 v7 a4 O8 ~
Метод reload(String questFolder)1 B6 E  f) Z# w  b, ]% N
  1. public boolean reload(String questFolder)4 o) {  H7 u( m' p& f  {
  2. {% _7 [8 f  N( \7 l
  3.     final Quest q = getQuest(questFolder);
    & U/ X4 I9 M) l  r: Z# y7 B
  4.     if (q == null): N" ~, F6 y. b) Q6 J
  5.     {
    ; Q( J7 w4 |1 Y. L7 K7 I, C, x
  6.         return false;# Y" g8 ^8 p: q* [
  7.     }
    ! t& k) D4 s! Q7 h3 h% C
  8.     return q.reload();6 o" v, g8 E4 K3 `( K
  9. }
Скопировать код

) @4 g9 R9 O: M5 T, a- {
6 n7 M! c0 y0 }& e- O6 WМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.7 t: p+ e5 s" J
Метод reload(int questId)
, x; e5 T# ]. O$ ?0 ~7 K0 r
" h" V! W4 x1 m# ~8 K
  1. /**0 a8 L2 t$ {4 {/ C3 I$ f# z$ h( j
  2. * Перезагружает квест по ID.
    $ n5 J3 k( Q1 ^( Q8 S
  3. * @param questId ID квеста для перезагрузки1 M: e2 M7 O" g/ j! M  X
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае8 _6 g* }; q, u* i/ M
  5. *// s4 M& X) F/ p" n5 X5 _
  6. public boolean reload(int questId)
    , G9 l1 ^/ S) ]+ i) u
  7. {
    8 [7 T/ q# h6 w$ I
  8.     final Quest q = getQuest(questId);
    ( ]! H9 _. Y: B8 v4 t; G1 U0 h4 g/ _
  9.     if (q == null)4 H7 ]) y0 }) m  V! E; |3 @
  10.     {* p$ s; G# L9 j) g. G5 e
  11.         return false;
    / _6 i2 |2 n. v) k6 k
  12.     }
    $ q) g( R9 u5 @+ `
  13.     return q.reload();
    ; P7 t) P. `6 h# o. \3 j; W
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    * P% z6 M! y  U& s

$ j7 k. v# s* m2 ]Метод reloadAllScripts()# B4 M( A! U1 m% z1 I
. u. ^3 Z: L( M
  1. /**! V& ^& g" q8 t6 R
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.. Z9 K9 V# N2 o! G! A
  3. */% k/ r2 x- c; n5 H7 g8 {- H
  4. public void reloadAllScripts()
    / A/ i1 H' p1 j  |( V3 q3 \* k
  5. {
    8 s0 G! b' ?2 h1 {4 D' i
  6.     unloadAllScripts();
    6 L) Q- W. o) u8 I8 t
  7.     , @7 g  h4 z  ]# j( E
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    2 j: ~. d5 v* \( B8 T
  9.     try0 d3 Q- V- x& K7 p& \
  10.     {
    % I2 d* y" T+ c
  11.         ScriptEngineManager.getInstance().executeScriptList();
    8 V! M- f3 e9 ?* Z! t# h( I  ^
  12.     }
    : h' K2 T; U5 Z
  13.     catch (Exception e)0 C& D$ M: e( m2 }* V/ z3 M
  14.     {3 r$ O  P8 F5 D; ?, n8 K5 w- E
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    - X$ i$ C3 a3 i) T0 V
  16.     }
    : T9 R2 f6 @# M6 i% Z- ~6 }
  17.     , v& n# ~; e4 F% q9 h, g
  18.     getInstance().report();
    1 Y' C" Q+ X+ c
  19. }
Скопировать код
Метод unloadAllScripts()" U) A! e4 e8 x* X4 o4 I
% b. N4 F0 j4 k! E! T8 H; h6 h
  1. /**6 z* C$ N2 s! Y- N+ O/ f
  2. * Выгружает все квесты и скрипты.
    , }) X. z9 ?. Q
  3. */  v: ^6 ~. [+ E+ S
  4. public void unloadAllScripts()& N6 ^/ C* `3 I0 j6 e7 S
  5. {
    4 F5 e9 [; x$ \" ?7 O% @* @' ]
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    ( e$ D/ h  p2 l
  7.     * g' @( y, N' c
  8.     // Выгрузка квестов.  X7 {$ A1 S( |, N1 I: [  e
  9.     for (Quest quest : _quests.values())  d8 P( y( A+ p% q; ^
  10.     {
      q7 O' R5 z/ f9 f
  11.         if (quest != null). T: _8 s8 ~# S9 H! I& w
  12.         {
    & M, D9 U' u* e! C% e
  13.             quest.unload(false);
    ! B7 B6 m/ `: B* d. i6 s
  14.         }
    4 W' M% e4 Y0 ?3 w
  15.     }
    - i( l" O. Y6 H! i) @$ t1 Q7 A1 e+ y
  16.     _quests.clear();3 i" `, @: k/ H: f3 f1 k9 l
  17.     // Выгрузка скриптов.) K* E" `4 i8 h9 v! j
  18.     for (Quest script : _scripts.values())7 _* z1 H  ~8 E
  19.     {, P# c0 S# Q) {; J% o. D. `
  20.         if (script != null)3 N) S+ U+ [0 J2 f" |7 U5 e
  21.         {3 |- i0 D0 [+ p( y% {8 x! {" q; v, X
  22.             script.unload(false);
    4 e( I+ ^0 O. r/ H, b
  23.         }
    # K1 p" \/ \: ^8 H% R! U; Q6 c
  24.     }7 P; d  V$ f, `1 ?
  25.     _scripts.clear();
    & O. l% y* c5 T1 f5 i' ]
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    % ?# G& K3 ]& m1 v( W# G: h
5 R1 y" G+ [) D% y  y. y- W# G' Q
Метод report()+ `! L& K/ s% d5 Y
' a  C; h2 O9 c& M6 ]. m
  1. /**
    . D3 _4 f% }9 X$ ]! |
  2. * Логирует количество загруженных квестов и скриптов.. i+ p$ n9 ^2 W" ?0 z
  3. */3 X  C9 m/ K2 F
  4. public void report()
    & F7 B; ?' I$ o" |8 T
  5. {9 v8 n4 I5 K9 H. t( d4 X& a& {$ _
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");; ^& B7 I8 c% g# a
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    / P7 A* E; l! F* Q6 M' i2 ^; f
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    ! \& N2 M; T, e( X, S, P$ h
6 E; V; W! }$ {9 F7 V
Метод getQuest(String name)
0 T5 W2 d0 c2 P0 Y( j
# \- }" W. j- v
  1. /**) t$ ~3 h* f  d/ s+ t
  2. * Получает квест по имени.
    & l9 _  }8 J% ]5 E4 [! C1 y: h! n! o
  3. * @param name имя квеста& p. I$ o* Z1 B4 e- a" O
  4. * @return квест
    ! M) D! M) v% G. X9 x
  5. */, M. E& S& c1 k2 ]" Y* F* W
  6. public Quest getQuest(String name)
    $ s# d2 M6 c# z
  7. {
    . U3 j/ l- @6 B- v. D# v1 n2 E
  8.     if (_quests.containsKey(name))
    + K, ?# L$ X* l! Q, |
  9.     {
    , u' J4 Z/ R: ?: Q
  10.         return _quests.get(name);
    $ T5 W( I* ]' W( W
  11.     }
    2 V+ i* [( x* W: X; p
  12.     return _scripts.get(name);! m/ P+ K5 @$ n) H* Y6 V
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.. P3 c: [" d5 j$ O( |2 a4 D& m
$ ]1 t9 ~! b) h& F1 F- }
Метод getQuest(int questId)* M. o+ _: w+ v4 V

5 h7 Q% ~( b& ]  [9 d9 u# o6 ^/ ^$ _
  1. /**
    + P2 _9 S" u/ ?! Z! n1 D& I
  2. * Получает квест по ID.
    5 ?$ x. ^! ~  a# i! t
  3. * @param questId ID квеста
    ) l* A7 ^* g0 n$ i0 G* {
  4. * @return квест, если найден, {@code null} в противном случае
    3 P3 `, k) D) O: @. I
  5. */9 l3 i  r" s% V+ n5 F4 X; _
  6. public Quest getQuest(int questId)
    ; Z* i2 x: q9 o; @) |& x4 V
  7. {
      h0 z7 {5 R$ E; R
  8.     for (Quest q : _quests.values())# d" |* o+ n9 Q
  9.     {
    2 i# F6 w* N3 u' g* E+ n
  10.         if (q.getId() == questId)
    " D) m3 N# h0 H3 I
  11.         {
    # J* s/ Z8 a6 t; L1 @1 H5 E
  12.             return q;9 }* l- p$ K1 z9 E# _
  13.         }' K: H) l5 I, ^% d0 @% ^& i
  14.     }
    , S4 t2 r3 p& g7 N
  15.     return null;
    8 ^" z: n" y0 |
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    0 {: D6 `* r5 H$ d

9 W+ q' b# \5 c4 {$ uМетод addQuest(Quest quest)
! j' X/ e' x5 u% |& x* N
: |2 R, v% r' K
  1. /**
    . [  W- T5 ]3 Y9 _6 }
  2. * Добавляет новый квест.* Q5 F& x+ j: ?: x, m5 C/ c
  3. * @param quest квест для добавления
    * _9 W* I+ k4 p' T( Y# m8 ~% V
  4. */
    + B/ l: o+ G5 x; a  I
  5. public void addQuest(Quest quest)% |2 h* l5 j$ S' q/ ^
  6. {
    * T* m0 p* O2 w) d% S# T
  7.     if (quest == null)/ R  `6 u: Q/ ?* i& L
  8.     {3 t  b! ]& w" t% X0 }
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    % C: p; `; C6 ~9 L. w4 R$ l
  10.     }
    ! N" I" p/ M0 H3 }* }& _
  11.    
    / e( G3 @! E( ?" C. L6 s) j
  12.     final Quest old = _quests.put(quest.getName(), quest);
    ( A' D0 U; c7 U' v
  13.     if (old != null)
    ( s6 g/ I. T7 _: V' d
  14.     {
    , B) a$ d+ I1 n3 M! g- h5 z, R
  15.         old.unload();
    & h% y* V- a6 Y/ U/ |  n5 e
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    8 e' x& v, w: A2 A, S0 [9 @
  17.     }
    / E( R" H6 Y4 @3 h5 m* l
  18.     4 z; Q; c# I* O/ P) C6 c8 A
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS): [2 L- x: P: Y* j0 k
  20.     {
    0 B$ \2 r( K' @, W/ ~* I+ ^8 D
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    7 J* y4 i8 B8 ~5 V
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");4 G2 w+ _( p# Z- r9 D3 U
  23.     }$ M. b1 z' ?  [
  24. }/ o+ n- `) Y" H) F& Q
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.( k, p% ?5 ^- w1 Y$ X* J- V
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
, B- x0 R  y4 J. U
8 @# t$ O! v0 P+ s2 [# K/ Y0 b" B. P+ w( ~
2 f$ I) z$ q9 C0 c1 b4 O; l
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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