Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
' ?$ ]4 y0 m0 F$ F5 v; W5 j9 I$ J. |% h# t5 `$ c5 R
Разбор файла QuestManager.java6 m6 J2 i' z6 t4 s* Z# J* N) J

2 _* _5 l8 a' G; W8 n5 T# _' P3 uЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.# ^. H; j0 p: `/ I% g, G
Основные элементы' t/ Y9 y# g9 x, b8 {
  • Лицензия
    : G+ K4 @) C9 k% e3 q% A
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      . n, Y; ?5 z& Q% Z
  • Импорты
    8 O% L! t1 a" h6 ]9 {1 x) q

1 T) O8 u) [% N- B. Y' k7 t' TQuestManager.java — управление квестами и скриптами.  [/ y% _& w8 \; E3 |. ?) Q
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\4 f& j: A  A# o  `1 Y
: K2 @" S! Z4 h& N+ I

9 M4 g) p9 W& I6 `. k8 fДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов." E$ i2 Q8 O% [/ ^2 a/ [. r
1. Лицензионное соглашение
% N( J+ e  U2 Z5 A5 m
  1. /*% n9 K0 V0 X! E" R3 A, ?' |
  2. * Этот файл является частью проекта L2J Mobius.' b/ j1 Q8 A0 O
  3. *
    2 |! n; j* [/ t3 B* {& P- D0 c
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять% ^+ T- J- g1 x6 q# y+ _1 M6 t
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    8 V$ ^4 h6 x# V) k, K. Z% Q+ ?
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.+ y" v( ~) _$ j8 W$ F/ ^4 i
  7. *
    ! }) C! u. E1 p; u- e
  8. * Эта программа распространяется в надежде, что она будет полезной,
    2 o' }/ H$ A& n  U1 I! ~! p
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    " w; \0 A5 w& D! B+ N3 g; x6 [; j* D
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    9 ^+ q, }) }" T9 d) H( s7 g0 X  X+ e
  11. * См. GNU General Public License для получения более подробной информации.
    9 I5 v+ E& ?3 N
  12. *
    6 s. E! d% @/ [+ a
  13. * Вы должны были получить копию GNU General Public License, \3 X$ e: N! ?" l# b2 U
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    3 z4 M6 G2 H! F
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.: K8 l8 |8 z8 n, X0 w( K
' q5 g8 ]& }$ j
4 c& ]/ K) T$ q8 I  B
2. Импортируемые библиотеки
' d% g* B! R# s
) m: |2 [" `2 |# k
  1. package org.l2jmobius.gameserver.instancemanager;
    - w5 Q3 o7 R6 Y' Z! W4 {2 z
  2.   d; g+ Y8 N5 p: C% U7 O
  3. import java.util.Map;7 _4 O2 s6 K: f! Q8 ?6 M4 ^3 e1 T
  4. import java.util.concurrent.ConcurrentHashMap;
    ; ^0 x' t# D: l# t9 e* R8 K3 A
  5. import java.util.logging.Level;3 T; K$ O1 p( Q9 T7 F1 Y. a
  6. import java.util.logging.Logger;
    3 C! o4 Y+ a1 Q  X3 z9 h
  7. 8 b4 i$ W8 K2 P3 W# y+ l
  8. import org.l2jmobius.Config;
    / i& \$ S1 ]. p9 o7 E# p$ T
  9. import org.l2jmobius.commons.util.CommonUtil;1 Q$ J9 y! x, E( [( r
  10. import org.l2jmobius.gameserver.model.quest.Quest;6 t: G# j! Q  d6 U4 Q
  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 t" f) z8 z/ D& X7 Z/ f
' U+ Q/ H2 [4 s
3. Описание класса QuestManager7 ^! m# ^6 _6 k4 E2 }; C
  1. /**
    5 e. Z8 v, F' R7 i) ?6 U( [
  2. * Менеджер квестов и скриптов.
    3 M6 R1 z% x- c# q* F5 `+ ]
  3. * Автор: Zoey76
    ) H# h7 I% `% W, v3 @
  4. */
    , o8 k9 U+ h5 L; O  m
  5. public class QuestManager
    & z; w  i' K! e$ W' }
  6. {
    % |. m# `1 }, F
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());4 t0 f8 _) M% g* F8 m6 y
  8.     , U9 \# J0 w/ s/ j/ m
  9.     /** Карта, содержащая все квесты. */* W- ~7 d: F. d+ u; g: L8 f& Q, C
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();  Q/ }$ b/ ]7 ?: G
  11.     /** Карта, содержащая все скрипты. */
    6 H9 O- G* w! Y8 [
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();9 J3 C. d2 |, J6 k+ S7 {
  13.    
    - P) Z+ B1 z6 H; \! x5 V* [
  14.     protected QuestManager()
    * N$ R7 K; X$ U6 s5 `
  15.     {
    , C1 p$ i0 F; C1 ?) K" b
  16.     }
    ' d) z+ L" A' ]
  17. }
Скопировать код
4. Методы
/ V- J  a& Z' u  kМетод reload(String questFolder)5 I7 r" w% a. g& K
  1. public boolean reload(String questFolder)" O1 i1 |+ m6 j  m/ U7 T2 C
  2. {
    : H6 O: a' s$ x6 n1 [. Y
  3.     final Quest q = getQuest(questFolder);2 r# ^; d. C3 l9 Y4 N, Z6 l1 S
  4.     if (q == null)
    ! A' Y' v/ {  U1 H. R% A" v+ b$ J
  5.     {
    9 v; K  t% B: }: T) o
  6.         return false;
    - F/ a2 k& q! C3 ^! H3 m. t$ I
  7.     }  d( D, u  X4 T  H1 n! f
  8.     return q.reload();3 w; {/ x1 m: ~# \5 u1 `
  9. }
Скопировать код

/ K. |3 U: e7 w& u! X1 K
: P5 W# I0 n  {7 m' a0 DМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.3 n$ T, T% E9 |
Метод reload(int questId)
# P, c; E; Y0 W) ]8 w! S9 ~. |" z! A3 J- }1 O2 t
  1. /**8 S/ c3 o  Y# p& C9 Z
  2. * Перезагружает квест по ID.6 i& o& @! Y! s1 A) L' L
  3. * @param questId ID квеста для перезагрузки; Z4 l: |$ @+ A+ x9 @
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае" k# o1 m' L$ }" Y0 O
  5. */
    2 p# a6 ~3 o9 _  E1 Y
  6. public boolean reload(int questId)
    - n/ y% g  p* S6 T  K. Y# H
  7. {
    " C2 }1 f& s  K- i  i6 u5 k
  8.     final Quest q = getQuest(questId);
    # H" ~7 y  M2 s
  9.     if (q == null)7 B: {: i+ T# u# b) b% ]9 w
  10.     {
    ' M/ y/ r! o8 a3 |' ?
  11.         return false;
    2 z. b! c5 o" I& Z; G0 `1 Q
  12.     }/ [2 O- l) ]9 M- J0 U9 P# K' d
  13.     return q.reload();1 ~+ }7 }2 p, b) l/ \+ ~1 M
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.- m) p% I( w; B  N# b( B

" Y: f% K8 t2 Y7 r% G: Z! c: XМетод reloadAllScripts(). r& m6 [, t7 Z, ^

1 H! a, e7 X/ g- B# f4 V
  1. /**
    ; J9 B& v5 t4 y" h0 q4 I
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.4 C: E; Y# D( T) ]
  3. */! m. Y: q. h! M! t+ ^
  4. public void reloadAllScripts()6 g! r8 P0 f- M* ~
  5. {
    ) T6 ^7 Z* t! l& k8 v; e
  6.     unloadAllScripts();3 x6 U3 p: k7 }
  7.    
    1 ^* x. r- T- v* e9 i* O
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    0 V1 P3 c9 i+ Y% N3 O, Y! @
  9.     try( A) L. ?! o& \6 P
  10.     {0 e% Z# S; Z# c! D. p+ c8 n, z" w
  11.         ScriptEngineManager.getInstance().executeScriptList();3 G/ `. _8 T, I5 {! {) Q
  12.     }
    - p' r6 X# p+ w- S# r9 E
  13.     catch (Exception e)
    1 P, x) J. }% \
  14.     {/ t' P" W8 P' Z2 _+ _1 @
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    ( @3 C# n, F" s1 m
  16.     }5 F. ^( L; F. c' q% `1 V
  17.    
    - z# Y  @% b- O" E; p
  18.     getInstance().report();; S$ {# V) M1 C9 Z# b& X2 V
  19. }
Скопировать код
Метод unloadAllScripts()4 M6 ?/ ]* `2 v' u& m" m+ u
) V0 N# b- y  z8 t0 E. K$ Q
  1. /**& q# ~# z' \; O! m' C; ~+ n/ ]
  2. * Выгружает все квесты и скрипты.; M" J( J" I5 T; f/ r- c) N6 q( ]
  3. */) W9 g/ ]8 q' Y: q; Z# k6 ~
  4. public void unloadAllScripts()& i  U. E8 _) N5 s# q3 v+ m% s3 ^  \
  5. {
    : X, c- l- T3 N% f. j( C5 J( ~; k
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");5 a8 ?1 }: f: J$ J5 N8 G
  7.    
    . f5 Y1 h! Q5 X" l
  8.     // Выгрузка квестов.
    # l" c% F' B: R. r. [
  9.     for (Quest quest : _quests.values())% f& a/ T; J1 {9 K8 |; _% d& J
  10.     {
    5 B$ r7 m0 F* U; M0 m
  11.         if (quest != null)
    " P* O; h0 z8 ~5 N
  12.         {1 ^2 o7 \: a, M! q: ^9 T6 c
  13.             quest.unload(false);
    6 u5 z7 [3 S( C6 F( B9 P
  14.         }
    9 f$ r8 o8 k$ K6 c
  15.     }
    & v% k8 O  c  m1 O
  16.     _quests.clear();
    5 o2 i7 J/ E# e3 L
  17.     // Выгрузка скриптов.* Q) s) K$ w% L9 Z" X
  18.     for (Quest script : _scripts.values())
    6 ]8 I, a0 Q# A! Z6 C, T
  19.     {
    & v: B$ [: E. ?' W5 o7 O6 [+ i
  20.         if (script != null)
    4 O2 D5 Q* W/ ^7 g# e5 ^) K/ y5 ^/ o" J
  21.         {( A+ i+ s1 P( X6 f# U
  22.             script.unload(false);+ N+ A1 O& V4 Q3 M' e1 N
  23.         }3 s3 e+ [& M) d: Z. `+ z5 j8 T
  24.     }
    0 F5 e8 l- f9 H2 v2 P3 u: a7 F
  25.     _scripts.clear();
    , B0 ^4 ]" x9 |
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    + X. M7 X2 r# B+ S; ~
- t0 S) d8 d' d- L
Метод report()5 Y; i/ U" Z  e8 R% e* R! q

3 q2 ]- E' G4 z+ k& L& o; i
  1. /**6 h! s  s+ {/ z4 [. l
  2. * Логирует количество загруженных квестов и скриптов.
    9 ^8 D' q5 g1 H9 g& d3 b$ E3 t3 ]
  3. */
    1 i8 Y/ p2 M% N, T7 R8 v1 |" d
  4. public void report()
    / J8 w/ I$ V7 Y5 W! W$ u
  5. {
    5 F* I  j. [; V
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    ; A( Q0 G+ X) C3 [; F
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    2 ~0 l/ Q: }  a9 i; n* W) @
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    ; i  {" l0 ?2 K3 l, c1 t# \
1 M  R5 e$ n& P( E* y
Метод getQuest(String name)
, w; `. R! V. G4 P" P$ E$ z: ?% f
7 @% [  {4 ^' n* u
  1. /**
    9 A& Y( T( a9 b5 b4 ^7 l) x- L' W
  2. * Получает квест по имени.
    ' t$ s; T" H/ S; Y" l
  3. * @param name имя квеста% Q9 m% i8 j4 k# k9 q' |
  4. * @return квест
    4 I/ m  ^! K" Y' V
  5. */
    ' H8 P! A4 ^4 m: C- z
  6. public Quest getQuest(String name)
    ! M6 B2 D6 x* J6 Q
  7. {
    % t* E0 F8 x3 l- Y2 d1 j, W) H% X
  8.     if (_quests.containsKey(name))) A  Y5 Y  S9 R; G' G( f7 T
  9.     {4 E. x" S" M, P; L7 t
  10.         return _quests.get(name);( t! `. y' z' N- F1 \' U- z5 z7 V
  11.     }
    % Y: i' h; n/ p" `, o- T4 v
  12.     return _scripts.get(name);
    ) h- ^6 W, N5 E& B' I6 |
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    7 Q$ n3 P& {) Y' b6 K

6 v# G, X; ~- `5 ~0 T! E& wМетод getQuest(int questId), r" |2 r) b8 d% Y- c( X
; O9 S. ~8 r& z8 `! p* C: m2 x
  1. /**  W+ m2 b8 a9 X8 @7 ~0 G
  2. * Получает квест по ID.6 C& \1 ?# f) v  `' C/ z6 J  z' {
  3. * @param questId ID квеста
    1 X" O4 _3 H7 M: w* O
  4. * @return квест, если найден, {@code null} в противном случае
    / _# f8 L# m0 f( [3 Z5 @
  5. *// }! Z6 c7 ~0 g- G+ m5 A4 V
  6. public Quest getQuest(int questId), Z0 v" r4 b7 \
  7. {. G7 A" l  r3 {
  8.     for (Quest q : _quests.values())1 l! q8 Q& p2 V
  9.     {  x' z' u4 ~2 [3 X& O7 I4 \: \7 @
  10.         if (q.getId() == questId)
    . ~$ r% y2 N7 K% Y, T# L. j) O$ ?/ S
  11.         {5 c2 ^2 D- ~. l* m8 g3 x) B+ k
  12.             return q;4 D# E( q7 j+ c/ o
  13.         }* A- k' b4 G4 `# ^
  14.     }
    $ G1 h1 o3 V6 d! ?) ~& \
  15.     return null;
    ) I6 _* q7 |% U
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    3 q5 s( ?3 A; ~+ l. }3 x, A
5 y8 ]; }: S9 z9 O: A7 x
Метод addQuest(Quest quest)
! P7 z  M1 J- ^& x% a, L* R* \0 X# ], o! H2 \6 ]" [& |1 l  t' E
  1. /**
    , |( R0 @# i4 S- I; C' q0 {- C
  2. * Добавляет новый квест.
    8 J- r, K5 V) o, T
  3. * @param quest квест для добавления2 a1 b/ M6 ^4 C: J0 B( e, Q
  4. */6 z+ w: \4 r2 A3 F& {% g
  5. public void addQuest(Quest quest)
    - S; r" x4 B: y: B7 S
  6. {
    ) x7 s+ W( [$ L! G' k/ `! `
  7.     if (quest == null)
    9 m* R, ~% `8 D" ^
  8.     {
    7 h: F) ?* w/ I$ ~6 ]# y
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");1 ?8 k1 b8 S3 X5 `/ ~1 s# l
  10.     }
    5 o; Q+ F, {8 a+ |( u- A/ k
  11.     ; x4 L! v& R* e  s5 R
  12.     final Quest old = _quests.put(quest.getName(), quest);/ r, f) w: B1 _* T, x4 `
  13.     if (old != null)% O0 W4 i% r: C! G: k
  14.     {
    ' P6 D% K8 N3 d4 G8 K- Y' p8 g
  15.         old.unload();, _0 g/ d- `/ R( J" h
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");. T3 s+ g( Q# {
  17.     }
    & A) @+ V, G2 }* f6 W. I
  18.    
    ( r2 m7 N) ~/ R) N% I! W
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    4 D- n* H: p" j9 `
  20.     {
    ) @( N8 n& G4 R) S
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    ) R" o/ _( T/ C+ N' D5 B. u) @% J
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");9 I8 E6 X  z. @
  23.     }* m3 j% J: j3 c/ ^  z/ }
  24. }
    # v( X$ H3 m9 j0 c9 c5 \: J. h
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
+ {% Y% b- T% [+ M- s1 ~2 J: @ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
5 [3 j! G6 B) B$ |% H6 x6 }, Y
. {( y! N! X2 Q  \4 A
* |( B, U( w' \  i0 _# D5 @
: C6 n: Q. r/ {( K0 w) E
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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