Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
- m6 K! R1 A4 p+ v- H: j$ C! s1 O! D' D! G2 q. }+ [5 N' I
Разбор файла QuestManager.java* a7 H/ i  C3 r4 T

+ s8 i: b: A! @$ C8 @Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
) I; Y0 H/ Z  @; s$ Y" pОсновные элементы1 o& x" t1 ]6 r: ]% O
  • Лицензия
    ! j- S% K- B4 u: a* r& a
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.0 e. {2 }8 U: `
  • Импорты
    & q9 z7 i7 w$ L( |& @7 D- [

: A$ b0 \7 s% _, G0 JQuestManager.java — управление квестами и скриптами.# N, ]7 U5 J" W) l4 l1 g
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\5 X! y0 t7 @) I8 I
" @1 u* b& j0 q  w

+ C3 D: {: R+ A( |- p8 @Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
# [2 M, z. L) Z0 P1. Лицензионное соглашение
4 F9 k  E  j& r4 ?& d  m/ ^
  1. /*
    ! \  J4 S9 Y1 L, H2 a8 O; i
  2. * Этот файл является частью проекта L2J Mobius.  k. P: {6 R3 \% R6 o
  3. * ; g/ h9 v) v, Z2 g  q; D
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    6 r0 @& J' Z4 X! }
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    % T% d& r" S& u, P$ o
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.' l! Q0 x" Z+ a1 n) O
  7. * + v- u" X6 F4 p$ m
  8. * Эта программа распространяется в надежде, что она будет полезной,
    6 T6 s, u8 s  L- r7 V
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии4 u0 L: J3 [7 ~2 O7 x3 I! _
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    ; c8 C( q7 I, k& c
  11. * См. GNU General Public License для получения более подробной информации.
    4 E8 I3 v& V& F6 x
  12. *
    , \$ b9 U8 @/ v9 S9 S4 {
  13. * Вы должны были получить копию GNU General Public License4 Q6 Y' ]+ f7 C6 U3 c8 _! v
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.) L. a& R1 F: O3 r" I' j, z
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.( L  n' i! h7 h" I3 B" s
* O. @# K$ \, z$ ~0 p$ U0 b
5 o4 E: B& o% b4 ?
2. Импортируемые библиотеки, r5 Y0 ]# q* w* w1 _# [

- A0 j# }7 Y* A! N9 U- L
  1. package org.l2jmobius.gameserver.instancemanager;; K8 A7 N" _' B/ E2 G% u

  2. & {' Y; M* x7 R( J+ l0 j( |
  3. import java.util.Map;
      Y! R2 b- N; Y7 M& }* f9 h
  4. import java.util.concurrent.ConcurrentHashMap;  M. I/ T% `9 o( z1 Q& I
  5. import java.util.logging.Level;: o# C; m6 i/ [
  6. import java.util.logging.Logger;% {1 i, b% F. o- M+ }+ T/ \& O( l

  7. " y  F% ?' y' L+ K: y% R9 s
  8. import org.l2jmobius.Config;
    4 L. R0 r0 k. s0 d, K: l
  9. import org.l2jmobius.commons.util.CommonUtil;
    % v7 K: [+ Q, }+ l- L$ l; a% b4 S
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    * M  c- }/ y6 N4 s& g
  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 — менеджер для работы с игровыми скриптами.4 P( i. ]& @9 r4 y+ z8 v

0 T% [# H+ z, G: S( B% v+ Z/ n" W( G2 `3. Описание класса QuestManager
; x4 Q9 f' R. F! V
  1. /**
    * N0 p: h1 D% B- ^$ L
  2. * Менеджер квестов и скриптов.7 X# v0 z* M% }8 x, X: D
  3. * Автор: Zoey763 [6 F6 [" x6 d# @3 H+ g
  4. */
      h4 b- J2 G1 b( E
  5. public class QuestManager
    & g, k7 y6 Z* ~# j. n
  6. {9 n% l. M/ w: D. D  B
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());0 H2 _( u( Q1 |4 p
  8.     $ U" _  u0 ]! k9 v
  9.     /** Карта, содержащая все квесты. */- S, ?' m/ Z7 Z8 U/ m
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    " @6 E( T  Q; e$ u
  11.     /** Карта, содержащая все скрипты. */! b+ J+ I% F( a; K; C0 g
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    6 \5 w9 Y# e+ ]9 Z7 C. x( b) |  L
  13.     2 ]6 _4 {% n& k; z
  14.     protected QuestManager()
    ) |3 O. N' ], t
  15.     {
    " _) d, L7 \$ q5 Y" ?
  16.     }& o% x: Y) ?( X
  17. }
Скопировать код
4. Методы
# _- G; E0 m* g. Z* i* X7 iМетод reload(String questFolder). `( j. m0 H" h2 i" T
  1. public boolean reload(String questFolder)/ M- H) y6 V+ a+ g- N
  2. {
    - `- L7 E* N1 ]& V5 c" E4 \1 l
  3.     final Quest q = getQuest(questFolder);
    & w% ~% L0 p1 [/ z
  4.     if (q == null), f) E3 x% L8 |* Z  m1 _* [) K3 X
  5.     {, ~# w1 r% D' n( o! M* q# p
  6.         return false;9 J4 h, d- |  x
  7.     }
    + s" L. I  s  \- p
  8.     return q.reload();4 M1 K: G! |4 v& f5 T6 P
  9. }
Скопировать код

4 \6 g8 s# t7 @) D/ x% R  ]
0 S6 A* @  s1 ^' O7 m2 SМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
* Z/ J: l3 d( Y8 }8 E) OМетод reload(int questId)9 R! T! c3 z5 g; ~: {
/ c, [& o2 p! J) E) x
  1. /**- d  Y4 [) Q4 c; k, v4 q
  2. * Перезагружает квест по ID.
    & @( i% p' x, f, T
  3. * @param questId ID квеста для перезагрузки
    $ b5 I2 a/ Y% f0 X$ `3 w9 u
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    ( E, Z6 [' q( g0 ^* S
  5. */
    . X+ w& z  @' T( e1 E
  6. public boolean reload(int questId)
    ! O' [6 C! }. ?' M+ Y
  7. {
    : X4 Q4 [; _4 q1 R% E3 j6 ^
  8.     final Quest q = getQuest(questId);
    . w' a6 x3 X6 y& u
  9.     if (q == null)5 ^7 I" V4 M9 K& K) m8 Z5 b4 B
  10.     {
    * Q0 r6 H2 T2 S! A" C
  11.         return false;
    $ l) U1 q9 m( _. F* o" a
  12.     }/ w' u- q# `% x) A% X
  13.     return q.reload();
    * Q: t& p: h+ w. h8 C
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    + ]1 D; m6 A, |; M6 F- x# B
' g/ S. y/ V3 K( P( P; \
Метод reloadAllScripts()
8 g5 n" t. o( _% I! l7 Q6 s& _6 B. z! f6 k- `& ~
  1. /**
    , v7 [/ N, p3 a0 w& H: M! d- X
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.3 u6 F. x8 Y/ r2 ?. B
  3. */' j9 U; z% f' `9 t# P$ N" H. m4 a# d2 ]  r
  4. public void reloadAllScripts()
    8 m/ I$ c3 l2 g8 Q7 t  i
  5. {
    5 K: {! Q2 U7 p* ?, {
  6.     unloadAllScripts();
    $ p* X; U0 g- G$ g
  7.     . J/ q- s6 u# f' V/ I
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    4 @8 ?) f" _/ }
  9.     try7 L% [" o( R/ W8 V. z; }. i
  10.     {6 y  v# W5 H" d5 [9 L5 H5 u0 A
  11.         ScriptEngineManager.getInstance().executeScriptList();2 h$ E. w9 T; ^9 U+ a6 k  j* p
  12.     }7 e# H- ^9 \# f
  13.     catch (Exception e)
    ' \, r' r4 l4 \
  14.     {+ A  _5 _) e+ V* N9 k& M8 v
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);! S( e: _  M' Q% L4 P
  16.     }
    + D% J0 R' R$ Q% o
  17.     8 w' P, k0 r9 _, b
  18.     getInstance().report();
    3 Z" F0 j1 S4 l# L8 c, ]& M
  19. }
Скопировать код
Метод unloadAllScripts()
1 N( {+ `" ^9 U- Q) m' c  U0 ~
$ ^& G" ~' |% m" d# n+ r
  1. /**% C  C1 j* b0 T7 r2 }0 U
  2. * Выгружает все квесты и скрипты.
    5 @1 a8 A2 {1 P+ m" z
  3. */
    & K0 u) u$ O( J+ `- m
  4. public void unloadAllScripts()
    3 H; l  [4 y9 _; F* y4 k; ]
  5. {0 y" I& {5 D  r: m2 N
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");9 q/ {2 n6 G; ?' Q+ z- {+ k( }
  7.    
    2 z* s7 c0 ]; }6 m) t/ @' u( C
  8.     // Выгрузка квестов.
    , d! d& u# G' t0 v9 o) |
  9.     for (Quest quest : _quests.values())3 I4 U: z" k! U/ _; o
  10.     {  r  L4 q5 m% i# v
  11.         if (quest != null)9 \; f0 L/ |$ m5 y
  12.         {3 W1 c0 E! W0 V' K- F# X  w
  13.             quest.unload(false);
    7 G) Z* ?: @8 X! d) Z- x. {
  14.         }- c' Y( B& z: ~. `$ w
  15.     }
    5 G7 @7 {! |( U( U6 Z- N, }$ z
  16.     _quests.clear();
    5 ]+ N9 Z" I: _, r5 |. e
  17.     // Выгрузка скриптов.
    ( r) \- ?% [  y0 t
  18.     for (Quest script : _scripts.values())( Q6 U; ^* R% s4 R- ^
  19.     {& `7 F* y$ r7 K" H6 {
  20.         if (script != null)
    # w3 r/ {0 l( \6 X) X! p
  21.         {) _- X1 @! J2 V0 |; K
  22.             script.unload(false);
    7 |8 X: P6 T% m
  23.         }
    9 H# b) i4 S9 ~( P) f0 p" N$ C
  24.     }
    4 g4 \) d( G9 u  t$ T
  25.     _scripts.clear();
    % J- y; b2 s! Q% W8 r6 @
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.* M6 ]) I# _5 Y" {# Q

( D2 z, V+ B8 Q1 q3 u# I9 C; OМетод report()) M- z5 K/ Q/ e2 t5 T

# ~& p  Y0 i1 p" Q# a
  1. /**
    - L. K6 x  Q! e3 }5 S" `& c9 g2 D
  2. * Логирует количество загруженных квестов и скриптов.
    " v- t2 M0 v2 l+ K7 X) W7 Q
  3. */) B+ y& q, z! X; i$ j
  4. public void report()
    8 P8 O3 r& c% M$ }1 F% l
  5. {& d# L# ?" n, u0 S, x
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");5 {# ^* ^' A" h* Y- X6 ?
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");# p# s  S- x2 R# s3 Z( c. u1 A6 I
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    9 R: c6 z" b' L1 {
% }0 ], r* e( P5 i' p' o' x
Метод getQuest(String name)) ?+ s# n1 O, l! S' P3 E

4 R  N+ O, ~4 P0 b3 c; P
  1. /**
    0 B0 U3 x$ T. a% R: _' Z, a
  2. * Получает квест по имени.. u2 s6 E$ Y5 l1 l
  3. * @param name имя квеста) |% L/ G, y0 y/ @5 [" ^
  4. * @return квест
    : `7 U& N, Z& O2 F. U5 ~
  5. */# A/ o& t% y2 ?: W6 a6 e  a
  6. public Quest getQuest(String name)( W1 g  p5 b+ I, A" g
  7. {
    6 E% H7 S6 y  Y8 ?# K
  8.     if (_quests.containsKey(name)). f/ j* ]& t* y2 F2 Y' c6 M
  9.     {
    5 e4 s- D+ j% Z& T
  10.         return _quests.get(name);
    2 V) F+ y! T; w3 c6 H: E
  11.     }
    & S7 |) y3 H0 Y2 Z9 r3 j
  12.     return _scripts.get(name);$ e" W+ I& d3 o; i; u' [& [
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.) u" v7 @1 e8 U9 T6 E

4 ]; k  w* D7 @8 Z9 p7 a/ aМетод getQuest(int questId)
4 z5 u( d. M) R* {( ], w+ f: t# Q8 l
  1. /**
    ) B9 w% m. y; S' `  ~4 t$ @1 g
  2. * Получает квест по ID.! S+ N1 N- R6 S& h4 o
  3. * @param questId ID квеста+ z5 ^# ?9 l% Q* @7 ^
  4. * @return квест, если найден, {@code null} в противном случае& w7 G, X# C, @
  5. */
    8 F7 E& W' s8 S$ m( b
  6. public Quest getQuest(int questId)- k- v' S( n; \4 W6 C" P
  7. {# [% E1 P) O# N8 b  M
  8.     for (Quest q : _quests.values())2 T1 k3 C, [1 @" `' v: t1 Z
  9.     {' y7 l) E: T: m9 k
  10.         if (q.getId() == questId)" y" Y  {) [3 F
  11.         {
    0 m$ ^; G3 e7 D% i. T6 E
  12.             return q;
    ! b9 a3 ]+ ?/ m( O8 i
  13.         }8 \  X" S& y" X' s
  14.     }
    % Z0 r/ ]# x) r/ D* L  k
  15.     return null;
    , b0 ~+ x- ?  h& S% E
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    1 j$ s0 J1 V) \

4 Q( L$ E! j2 }' x) ~Метод addQuest(Quest quest)0 l; f' x  @1 ?5 \9 }  p
' p3 w9 }8 V& _, l! z6 F
  1. /**
    0 ~9 v, z! X  \3 M
  2. * Добавляет новый квест.
    ; \8 [# {7 ^  Z2 q/ D5 Q
  3. * @param quest квест для добавления$ Q. v" S3 A0 ]
  4. */. p. A# ]( j) Q/ F( Z" U
  5. public void addQuest(Quest quest)
    $ ^' z" ~3 h; ~' [( O
  6. {: i7 v2 _  a4 l- U  {
  7.     if (quest == null)
    4 h1 w, f- [7 K/ |
  8.     {
    / d7 c7 D3 \1 @$ F5 J- `3 _
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    ' I& X( [5 A- Z6 @$ C1 z3 S& S
  10.     }  Q- [$ m, O! u& r- \- W
  11.     # J4 w% M+ o- ]9 g3 o
  12.     final Quest old = _quests.put(quest.getName(), quest);
    3 Q- i" H4 x( m! X% d) f
  13.     if (old != null)0 y1 ]( C2 S( e% y5 A% e. t
  14.     {6 i; J  h( D9 l( N0 V# h# _
  15.         old.unload();" ?1 e' S5 U; |; D, U5 X
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    1 F0 V4 \9 R# h( T
  17.     }
    7 Y" ?7 s$ K* t, \) C  Z
  18.    
    % ~0 v$ x; s0 c
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    , q7 C2 P2 p" n' b
  20.     {
    ' ]' h  L" `. J. L8 O8 H9 Y7 y- q
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    6 D5 `3 Y1 C, q
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    & y  b. e& P( ]+ x/ J
  23.     }
    9 V6 i: t/ j( L
  24. }
    3 e  X5 `! }+ |% g
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.' y3 S' F/ \1 U
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
- q; H, ~# Y+ r% @% K( ^3 d
! |+ `5 x. d4 v9 f1 @  a0 H4 z( |# @  u: \( j1 j
8 }  S; |: r! H% ~1 W, q
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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