Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
1 g4 y4 W9 S0 S4 N6 G! b8 {% A
Разбор файла QuestManager.java
$ Z0 o- ~. X- f6 O
! j" d* E2 d  p) d) ]! X( dЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.1 X8 C5 J1 h, r! J% }* v
Основные элементы
( D9 ~! ~+ f2 K3 o' c8 I9 i
  • Лицензия  s1 ]9 n% J/ C: j! {+ l
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.2 U, Z0 Y4 h3 `. b; I5 L! A: z( }
  • Импорты  u* A- K! J/ Q; b/ ^, p; I5 [

% l7 r% Q4 x% l7 MQuestManager.java — управление квестами и скриптами.
+ p6 B1 g$ b' H( _$ Q2 n3 i, T2 kПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
! S" S- R9 F+ F, G3 v
) r/ s$ M. _2 }; {
! O- L5 p3 r: I0 L; `, x
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
/ _. n, o; K' S9 M3 h$ S. ?" e( E1. Лицензионное соглашение
; s7 C9 K. R) q- S6 M; \. C6 F
  1. /*
    : T' J6 y0 E' H5 x
  2. * Этот файл является частью проекта L2J Mobius.6 [5 K* ~0 H  k* I, T! k
  3. *
    7 ?% F) L# g! N6 t" N% c; ^/ K' W
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    , G% _. l# E* I) V
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    . d7 X; V2 S! ~/ I2 W2 E, H' l
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    4 q3 L5 d3 B2 Y' L, V& m7 Q; ?9 D* I
  7. * 4 d/ m. E" o; d. Y9 Y. G8 O4 H
  8. * Эта программа распространяется в надежде, что она будет полезной,! n# J) I4 R! Y
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    + j: O1 m" d$ Q' d0 U
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.. O9 u( l8 r+ _1 V8 |3 ?6 f
  11. * См. GNU General Public License для получения более подробной информации.
    # @( D' H$ T. ^! ^
  12. * , j) |$ K) }' }/ o  K. A
  13. * Вы должны были получить копию GNU General Public License
    9 K2 N- x7 h% C2 R& \% S' u8 s
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.1 b4 R  x( q8 o6 O; p2 Y
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.* F3 ?2 X! e7 @4 d
: S6 @3 C. S) c2 M

: C0 l6 j+ v' d3 E! }2. Импортируемые библиотеки
  ^6 X/ Q7 T( O3 i, S7 n# w5 Z6 _
: E- w  |( ^) ^% l  C* |
  1. package org.l2jmobius.gameserver.instancemanager;
    7 N7 \3 R3 M6 l% g0 l2 k& K

  2. & w# S5 N+ R; E# F6 f* n0 X8 i
  3. import java.util.Map;+ _! C2 O3 ^5 a! \& P4 |
  4. import java.util.concurrent.ConcurrentHashMap;
    5 Z+ y7 l* l$ L+ N- F" z
  5. import java.util.logging.Level;
    - U9 m5 F; s& E
  6. import java.util.logging.Logger;3 X: a5 M3 W( j, n: e9 F& a& @
  7. ) t/ s9 U: C9 w% e
  8. import org.l2jmobius.Config;, }+ W/ H! Z0 G5 E" a3 y
  9. import org.l2jmobius.commons.util.CommonUtil;0 k" p( U3 _# W5 H+ |; `
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    ! V6 x4 R  t7 B2 E0 C9 _
  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 K: @# o( k" b- q# I: N

( \4 ?6 s! s! L" N; r! f, J* `3. Описание класса QuestManager3 F" t) |6 D6 T0 Y. b# {2 V
  1. /**
    9 z8 F' t) o) L3 V$ N8 _% Q2 k
  2. * Менеджер квестов и скриптов.
    % n2 w2 v' r7 A
  3. * Автор: Zoey76
    ) Z, u5 E, A6 ~2 G0 b
  4. */
    + ]$ W( ^: S0 C1 X! H
  5. public class QuestManager& z: V- e2 F# _
  6. {$ A0 K3 \. a3 u/ F
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    2 d$ V6 B# l  j! @
  8.    
    5 t5 |$ W- a8 }) y
  9.     /** Карта, содержащая все квесты. */- a, U) a+ }- y; c7 p, a
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    # N& S1 O0 Z8 q( u9 d& ~1 I" V
  11.     /** Карта, содержащая все скрипты. */5 \3 }; G: W  ~
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
      B' m/ q1 Q, ^, J
  13.     . s( G$ |. Z' W4 M0 Z
  14.     protected QuestManager()
    , g2 L. |5 x6 x
  15.     {
    / W$ ~" E, R( T/ z' p7 X  P
  16.     }0 Z, U4 F' Z! y
  17. }
Скопировать код
4. Методы2 G8 C+ e3 \( @& @1 D' l: k4 G4 F
Метод reload(String questFolder)
( F6 \4 p9 S0 z' z
  1. public boolean reload(String questFolder)
    * _2 ?: V+ z  e" ~" I
  2. {" I8 r0 H6 O7 }* `8 n- k
  3.     final Quest q = getQuest(questFolder);
    8 j9 r* i: X: m) `/ D, r& g
  4.     if (q == null)
    7 h/ \' M" G$ _7 u# o* A" i: G0 ]
  5.     {
    & m2 x4 p  K4 b8 @9 T! p9 |2 P
  6.         return false;
    " K, k8 M& Z# G
  7.     }7 k6 g2 T8 s  Y) G  t: n
  8.     return q.reload();
    # H! X: J. |; V& f1 _
  9. }
Скопировать код

5 M* O6 k' c  u7 M8 @: r, B# t8 U
2 r3 [! v  _1 U5 j2 B1 EМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.. L. U5 ~- J: U6 Z
Метод reload(int questId), s6 q3 y; ?8 o+ |0 v! o# D$ d- v
8 ~1 J. c, |; E3 o! ^
  1. /**" }8 o( Z9 G6 Y6 d3 Z
  2. * Перезагружает квест по ID.
    4 A0 C( B% p) b6 f
  3. * @param questId ID квеста для перезагрузки
    7 N" c2 f! t& u! |4 _7 ~
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае# ~7 @; M1 A5 _1 V
  5. */7 o& x4 r0 @' `5 O9 |2 B3 B9 K
  6. public boolean reload(int questId)7 B6 ?8 F0 V+ \+ s9 _: \2 e: I
  7. {4 n; B2 A5 r  y# A1 a5 X
  8.     final Quest q = getQuest(questId);: s2 d6 P0 \" e; F, P! m' e
  9.     if (q == null)
    # ~# a2 T6 Z; G2 Q3 d3 k* t9 G; S
  10.     {
    ; z$ w& Q7 e3 Y- d9 v
  11.         return false;
    4 V4 }0 S9 J! C" d7 H
  12.     }! C# n* ~- Y- ?( ~7 J% K, P! U
  13.     return q.reload();
    / n( }5 ~, a( \5 \8 E
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.: S0 r& L$ p' A7 J
7 S7 F- M  v3 x$ x
Метод reloadAllScripts()0 [2 j: D7 u" D' l
$ x$ R" K2 }& j. j5 K
  1. /**: P' {1 b1 g: E8 O+ S
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.% }5 I2 S9 I. |8 g8 Z7 R* v
  3. */8 Y' b0 M7 L) P# }+ \* A
  4. public void reloadAllScripts(). [7 w  ], J  J  n9 _8 p0 [; _
  5. {
    $ j& `+ i2 z0 U# N$ w) F6 S, V4 L' v
  6.     unloadAllScripts();
    . m8 e0 }- Z% K" e7 o
  7.    
    2 ?) @" |% B2 R
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");: o/ y& c3 @$ g1 N- M) T& H
  9.     try+ ?) A: U, T) C, k
  10.     {/ {' A, ^4 o0 V# _
  11.         ScriptEngineManager.getInstance().executeScriptList();) }* _4 q3 T* o
  12.     }
    * R, ]7 }: ]* ^* M# ?: Z# I* `6 b& u6 r
  13.     catch (Exception e)
    ; o9 i' R1 z5 y
  14.     {
    5 A$ ^. w9 ^8 G7 J  e2 W; X
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    ! ?# l8 ^7 b8 O5 w/ |
  16.     }7 G7 m% E) r) O! C4 f
  17.     ' z- _# A# J3 l9 k
  18.     getInstance().report();
    ' O1 a& D% h2 d& l- R& @- q2 O; T
  19. }
Скопировать код
Метод unloadAllScripts()
+ ?5 H% ?/ Z( m# U& Q( ?9 F3 B; ^0 f; c- v8 O3 N
  1. /**) |- ?2 ]) \4 f! J  d
  2. * Выгружает все квесты и скрипты.
    - S+ t& A( ]; O' P! Z
  3. */
    : ^5 p) h) y* E/ C4 |$ H8 b
  4. public void unloadAllScripts(), |1 h, L9 g; X1 s( K( n, x; \: c
  5. {5 h. q7 g  T. `/ ~$ p, n
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");6 f9 Z' G/ N' Q  e( t. I
  7.    
    + E( Q7 U; G* n, X( p; K
  8.     // Выгрузка квестов.
    0 G3 A" @8 Z! G5 H9 L: J
  9.     for (Quest quest : _quests.values())' z8 u9 {# B; x2 j1 u/ D5 X
  10.     {  c' c. ]  m" j' w' s' N) A
  11.         if (quest != null)
    % q* }0 s5 W9 J- z
  12.         {
    , A! p% z) U5 U5 i1 D
  13.             quest.unload(false);7 ~9 k5 F1 [1 L& v
  14.         }- N0 x. R$ P6 q
  15.     }
    $ Z# y( Z* D. V6 c
  16.     _quests.clear();
    6 b0 S5 V9 {! Z  N% C/ N8 D" X" z
  17.     // Выгрузка скриптов.# A* `9 i4 t2 F5 y
  18.     for (Quest script : _scripts.values())4 v  [/ H( J' w. K: [
  19.     {4 `3 a5 i4 u0 L
  20.         if (script != null)
    9 M, _; j9 v9 J! U( A  W+ Z
  21.         {, F* M9 y3 F$ y) g* Q# H
  22.             script.unload(false);
    : u, g! o. k4 }* n  {8 [3 P( @
  23.         }
    & J* X& K: M  Q! ^
  24.     }/ c( f4 u5 l; {( _9 Q+ t8 d
  25.     _scripts.clear();: H3 I" m9 [% `
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.' S7 P' i& G- f: O! x
% U8 D& z4 V! ?3 c- W' U
Метод report()7 f$ i( Y2 `' y% [

0 X' a/ O$ ^* c  G# z
  1. /**4 v4 K2 Q& g& t- U5 U1 @
  2. * Логирует количество загруженных квестов и скриптов.$ o% [8 T6 @: ]) q5 h
  3. */- B$ c( y5 |0 _8 L& C# T0 @% W# {& @
  4. public void report()
    ; n2 P* q9 n4 D* O! V9 N5 w; N5 p
  5. {4 w4 ]- W) Q1 `! C  d
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");- o2 {; h" p1 d" J' m
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");3 C8 F% r* v) R- k; P4 K
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.( K5 F3 A7 ^# @& k6 N* H* `
( S0 k% D, q7 g+ ^9 F- V- G8 r9 _: P
Метод getQuest(String name)  Y) y! ?# g" [* D/ b& X0 @- W; ]& ^4 K

; T2 X( D& N9 c# ~
  1. /**  n+ c! t$ d; v- f6 ?
  2. * Получает квест по имени.# J. j9 U  n5 a  G! [* t- |0 }
  3. * @param name имя квеста9 M  x( Z% B' N7 k
  4. * @return квест
    2 }& ?% O- n! c' Q9 x1 I
  5. */9 r6 h5 q! j* z3 a
  6. public Quest getQuest(String name); E; M% @. V9 M. b9 I
  7. {
    % V4 |* h7 v0 v9 D! d& u4 C0 z4 f+ Q9 X
  8.     if (_quests.containsKey(name))" t! L- r( b) \" c% O  S
  9.     {
    ; S: U7 |: X' ^6 q5 K6 |& S4 b
  10.         return _quests.get(name);+ |9 l. W  }+ n4 C( a
  11.     }" [/ a/ W: U/ _/ T. X
  12.     return _scripts.get(name);7 a! G  |, _! ^' }- q
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    2 h( p4 G3 e3 T3 R6 W# L
$ u; m6 `: @& c# _! T; J
Метод getQuest(int questId)( f' l" t7 I- O& {
. m$ c- ^, `2 ~" N
  1. /**
    , w" }# ?& @, I" C
  2. * Получает квест по ID.) O; }* h6 [: T) M& X) y% \
  3. * @param questId ID квеста1 S! A, l# t6 L+ K
  4. * @return квест, если найден, {@code null} в противном случае
    + h' L8 c1 s) ~! G9 O2 ?( c9 e
  5. */
    ) ]9 d; \" }+ m: O5 s) J
  6. public Quest getQuest(int questId)
    % P" u+ A/ q( R* r
  7. {# ~# m/ ?& Z# N% o- c$ r: [2 {
  8.     for (Quest q : _quests.values())
    4 t. [; L; W8 O6 W
  9.     {7 Q4 H: K! @! E" J1 k
  10.         if (q.getId() == questId)
    # r5 m" n2 R5 g6 Y
  11.         {5 s9 Q0 h8 g* G# B# ]# _4 P
  12.             return q;
      I* ^& Q4 b2 @: w
  13.         }
    ; @1 V1 X' F) C) k" w. S, A1 G
  14.     }
    1 Q. B$ l* y5 Y3 Y2 x% I6 n* L" ^
  15.     return null;; a1 ^4 @! D" Z5 ~
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    3 t" Q* t) {, a8 u' R# _, [* p
& m! ?. K. o. ~" V9 B8 |
Метод addQuest(Quest quest)6 m1 t# l) u2 C# v2 G3 ]
# M6 y: W; p$ n- X$ T5 s' O7 H2 {2 T
  1. /**, M" A. t- I/ F2 |0 B& q
  2. * Добавляет новый квест.
    / P, L( \: ]) ]! S" p
  3. * @param quest квест для добавления
    ! E1 U5 f/ S" l: B$ f
  4. */
    9 U. b+ T5 [6 y6 P2 q# e
  5. public void addQuest(Quest quest)
    - e: k0 ^/ v7 A# _
  6. {; b/ u4 D. |! ]5 k
  7.     if (quest == null)
    : p/ j0 V+ D4 P6 ^: N4 F
  8.     {
    9 v; P  L4 d; Q2 ?
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    , x) E2 ]1 p$ z9 M8 Y5 H
  10.     }: U8 Q/ I4 a% ^8 M% y
  11.    
    0 q+ Q4 U; q& v9 Q) E9 d' M0 j
  12.     final Quest old = _quests.put(quest.getName(), quest);: U: g+ @3 U' k9 d+ H; P
  13.     if (old != null)7 w/ p% K7 F; T9 }
  14.     {
    9 M; K5 U% ^2 r: T! M7 `
  15.         old.unload();
    # b4 j% q& I9 t% q) G
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    8 s" y7 x8 T) u; j& I
  17.     }1 @4 o3 ^& f/ ^: F2 f
  18.     % [# E7 D" v9 j) z+ l$ C5 g6 W1 J
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    4 h6 V# Q! o: ?8 g$ n
  20.     {
    ! h! l. l" ~2 {! z/ g0 B/ e5 d8 j
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    2 P! x& ~" L) i/ u
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    9 E6 M3 y  v) L
  23.     }- V/ Q! |" x" T* T4 t! _: a
  24. }
    ' t- z: J9 E' ^; H7 ]
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
" f: l; L' U0 w; c* a  O6 MЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.1 y+ j" V  i( L" I: k( O
$ n7 C& n4 `8 \+ P3 }

$ p" i7 y9 h" ]9 L! x' E1 u- m- C5 H4 A( T0 @# R/ e
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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