Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius" }4 s& P. A$ s0 G7 y& T1 ~% A: `
* m5 j% ~3 U* X7 h+ k2 }7 o
Разбор файла QuestManager.java
9 S* U+ G) R0 T2 ]! m8 j' M4 i# _
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
; Z% z3 ]/ c( |2 m/ }- kОсновные элементы6 v/ B6 B4 w1 {
  • Лицензия0 N" g; h: P" W7 i$ N: Q
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.9 E% I7 z+ C  W/ x+ Z. f  F
  • Импорты7 m* e" ~; w3 t, T/ e' x2 q6 n7 @5 b

" t# M$ ^2 p5 d8 J" tQuestManager.java — управление квестами и скриптами.
* U; L& c, W+ I4 _) }5 O; K0 xПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
3 w2 }  s8 |9 A2 a( ~+ e- V5 M1 t' {# a! C( Z

- |" Z5 T! }6 Z! Z  z6 p& kДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
0 i3 j" y2 {2 c9 n  C; P1. Лицензионное соглашение, `/ B$ u) |' V9 ?
  1. /*
    5 x3 }9 N/ y8 D9 R) e
  2. * Этот файл является частью проекта L2J Mobius.3 I# x9 l  X+ V, {6 q
  3. *
    . Z% t' O+ c" C! P0 H2 u" }# q
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять; M8 ]7 O7 w1 Z. b
  5. * её в соответствии с условиями GNU General Public License, опубликованной1 |! O6 }1 F2 `5 Z& v4 U
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    - c7 p% Y: D$ v6 a
  7. * 4 e4 b' E9 E3 h
  8. * Эта программа распространяется в надежде, что она будет полезной,% Y3 E& l# f, h! x5 `5 k, `  W- G
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    5 H7 a( q4 a$ M$ n5 ~& D( J
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.9 k5 z2 D8 x: X3 ^5 m2 R
  11. * См. GNU General Public License для получения более подробной информации.
    # a- I+ c! P2 P- @0 A: o- ~! K
  12. *
    # J2 K6 ^6 \" y: `
  13. * Вы должны были получить копию GNU General Public License
    ' S% R! E! ]6 K8 ]5 A
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>., O2 M1 [# [2 e- c1 ^+ M- o
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.0 O4 H: }) _4 j# i  B% F. p

3 Q0 q/ h* n9 Y' B( ]  _- ?, h) ?* ?
2. Импортируемые библиотеки% B: M! p2 m7 E/ O8 f9 O; s# y

% x! _- d- M2 P2 b" w2 Q
  1. package org.l2jmobius.gameserver.instancemanager;
    3 E$ p, a$ p4 Y8 \! V4 i. ^
  2. " ~: w' b) B% i0 R# _
  3. import java.util.Map;3 ~# o1 E$ B: ]* N5 j& z& d
  4. import java.util.concurrent.ConcurrentHashMap;- V! j: g! J2 [* z# Y! V. ~/ O) x
  5. import java.util.logging.Level;) I9 ?" j; v" N, D( B+ _
  6. import java.util.logging.Logger;1 U6 |" n) q1 d, `. D( `6 h  T
  7. ) q+ Z. Y' a# m+ t* C+ j
  8. import org.l2jmobius.Config;  j; J  Y. Y& T
  9. import org.l2jmobius.commons.util.CommonUtil;- F. {5 P' U3 y( Z, u) ~9 z* ?
  10. import org.l2jmobius.gameserver.model.quest.Quest;' C! m1 O1 ?5 M" c
  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 — менеджер для работы с игровыми скриптами.3 ~& n, r: t9 H+ N
% d# |1 n, E7 D
3. Описание класса QuestManager
! ]  a. Z  {# t9 f+ R, Z# W: y0 n
  1. /**0 u4 Z( |, _  [3 y' G9 m0 @
  2. * Менеджер квестов и скриптов.
      o$ f2 Y9 d5 d" F  p
  3. * Автор: Zoey76
    4 S, l+ l% A+ ]7 f6 \
  4. */6 E0 m! w3 |" A  r+ r
  5. public class QuestManager+ S& S, D9 q! @( i6 }2 e
  6. {
    - N$ x- I4 c4 G% }5 i/ E+ V
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());0 y3 p! r1 W1 t5 M
  8.    
    0 z1 W$ `: E9 m$ R" R0 J- E6 F
  9.     /** Карта, содержащая все квесты. */
    7 J5 Q# |9 c: {, |3 J
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();: ^( E3 d  I2 h9 x* Y
  11.     /** Карта, содержащая все скрипты. */
    3 s7 |- \% _$ h- a" g
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();  W* y6 B, M. Q9 Z
  13.     # E* b  }5 m, ~
  14.     protected QuestManager()6 s; v8 w9 p$ N7 s: a
  15.     {& c5 z) f- J  Q. B1 m$ E" O
  16.     }
    + n2 R6 s& w* R' V9 b2 Y6 ^( _
  17. }
Скопировать код
4. Методы) T3 B1 k0 A! x" ~# v: I
Метод reload(String questFolder)
; X/ \! g' K: z- e' p( R
  1. public boolean reload(String questFolder)7 Y: U9 f1 s0 ~. ~" {
  2. {
    4 ~; z2 h: `; g3 V9 ]
  3.     final Quest q = getQuest(questFolder);! q$ ~5 I% W( z. b+ u  b1 U
  4.     if (q == null)
    8 u) j* Y8 u- V# [; z
  5.     {
    ! j3 @7 o! R- ], _
  6.         return false;
    ( Y$ c  ^" R  b9 f1 J/ u
  7.     }
    9 k* ]0 F; ~" o# G0 s7 W6 a8 A
  8.     return q.reload();- u* T  R7 D* e( C& E
  9. }
Скопировать код
9 Y, Z% f, h# b
, Z. U- f6 c  B: e+ u
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
. W1 b$ q6 f/ A1 nМетод reload(int questId)
4 K$ e$ \2 t$ L* i) U3 [' n1 l7 X* T# z
  1. /**
    1 G* f6 k! B) j2 N
  2. * Перезагружает квест по ID.7 \- P6 D# b3 V- @3 a
  3. * @param questId ID квеста для перезагрузки, r& n! {: l; ~# ?
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
      m& o3 r% D" ~4 @
  5. */+ e& k3 r) Q% f5 w" U
  6. public boolean reload(int questId)- P: W* U9 O9 s) j
  7. {
      {8 i+ \% \  S1 a8 Q9 L9 m- q- E
  8.     final Quest q = getQuest(questId);
    2 O/ H( A; P& q4 y" C7 F
  9.     if (q == null)
    9 O3 H* M0 Z  @# t) e2 U  u' H
  10.     {; N5 C1 R$ k- E  _1 C; W; U# N# r
  11.         return false;  K0 _+ V& J3 v( X5 s8 p
  12.     }
    : j, Z/ e# Q5 D' Y$ y, A" T
  13.     return q.reload();  C! B6 A3 {0 n( {, j' W& F
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.+ K' _8 X7 Q) n5 n6 p5 J% ^/ z) R

9 c4 C+ o( O" D8 ]Метод reloadAllScripts()0 M( }  ]/ c8 ~" O( }) c6 K7 ]6 q

7 z+ A" E% y1 N* Q% X! I
  1. /**
    - ^/ p2 b- S/ @1 v; [9 s0 Y
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.! e. _: n4 {& h2 N3 Z+ @
  3. */
    ( N9 ]7 C1 Y- r$ U6 e" ^3 ~
  4. public void reloadAllScripts()
    . @' t, R  P4 c, H* n: x. q
  5. {
    & D' o1 w# a3 V& D! }& Y+ V
  6.     unloadAllScripts();
    ) O, Y4 \4 k) B4 z1 h4 E
  7.     ) u/ m4 {7 l2 k7 o7 v! u* Z
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");: G& q; ]% H$ l. _$ `
  9.     try  c) K, L; \. J9 Q+ z# ?
  10.     {% p# T0 t8 A3 u+ O2 |" r- i
  11.         ScriptEngineManager.getInstance().executeScriptList();
    . b0 E6 O  }8 U2 W+ d& d* M
  12.     }
    3 z& V9 D) Z  M" w- S
  13.     catch (Exception e)$ W" u' M  U* [& @0 l: `* E
  14.     {
    & O$ ~( i' Q  {
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    7 u, B9 q/ d+ A9 q
  16.     }# H8 d  h8 ~0 G; J: o8 D
  17.    
    " f' y' M- {; {  H" Z
  18.     getInstance().report();
    3 d! _" J: O3 q. U
  19. }
Скопировать код
Метод unloadAllScripts()
" C: J6 A0 B/ h9 t4 @: e/ s! O
+ e# R- P: n# V% g5 M0 r0 s7 t  N
  1. /**" N# h; M1 S/ F: k! A+ C2 d6 E/ O) y
  2. * Выгружает все квесты и скрипты.
    3 v& a" ~( M" w
  3. */
    $ u7 b9 @# W' `7 h
  4. public void unloadAllScripts()
    4 l6 z' u. u( j6 N- n& f
  5. {+ d! t7 X/ J3 ?5 H8 S6 b& Y& H
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");- R: h7 T) l) e& U* Q3 f+ d# E$ q
  7.     ! l# e: J3 r# @% w2 o5 i
  8.     // Выгрузка квестов.+ z" V7 t- U4 V% n% h( q
  9.     for (Quest quest : _quests.values())
    ' E) F% m; u8 D  a# t: u
  10.     {
    - V- u* b6 L! |+ Y8 \# f" s) M( n; H
  11.         if (quest != null)3 M' {, D* i- J
  12.         {# m- Q& x8 {! J. p. x7 I! G- I
  13.             quest.unload(false);3 d6 H& F( r5 m, I1 \0 M7 A
  14.         }$ D& H: _8 ^% B5 A
  15.     }( F( }1 D- s" e
  16.     _quests.clear();
    ( V! Y% i& g3 v: ?
  17.     // Выгрузка скриптов.7 k+ j4 p$ j2 M
  18.     for (Quest script : _scripts.values())6 H4 t5 _9 v5 t9 K! s7 \. \
  19.     {: x- o, }+ }5 N$ v3 F
  20.         if (script != null)
    5 F0 {2 l% O1 ^5 z5 K6 V' b
  21.         {: n& a8 v8 [6 V) R$ ~' B* z
  22.             script.unload(false);7 |5 U+ o- ?$ Z) I, S
  23.         }
    : B9 d/ H+ s6 m. |( ?4 I
  24.     }& Z1 ]; `8 n' M' X) [
  25.     _scripts.clear();
    6 `% q3 T" L3 t6 w# _/ J' D6 ?
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    / U/ ^  Y8 C1 m2 D. S% d
& Z. j- x: d2 c  M4 U
Метод report()5 @  H8 g9 p" i
# j8 j) b) q; K; l6 u* ~
  1. /**2 e9 s; k3 S& c; z/ I
  2. * Логирует количество загруженных квестов и скриптов.# Z% f  b2 V3 h6 M0 q: `* \/ Z
  3. *// o* }1 N# n. N; H& s: A
  4. public void report()
    7 H5 ]1 W6 k3 N& e$ Q4 p
  5. {
    2 b. |, P  l, {! N% c1 b6 e
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    ! q8 J' U( G! u" \( a& Y  a
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    7 x# Q1 H: @8 I  e! ~
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.8 H" N  _- a; s! F( M4 E% Z5 _

" ^$ ~8 d& m" |0 L6 FМетод getQuest(String name)
7 S: y) c  x6 ?% }; n  _, y7 T1 o
4 e1 Z# q) I$ i' B- S8 K  w9 i
  1. /**6 {5 U% P6 A7 b2 d
  2. * Получает квест по имени.
    7 x9 W1 F* ?% @
  3. * @param name имя квеста
    & y; \9 H$ Y! S, A
  4. * @return квест
    , W' \; g3 [; s
  5. */
    9 q- U/ g5 D9 @
  6. public Quest getQuest(String name), O7 {- I. `/ C* y# N' m
  7. {  R$ D2 \5 ?- Z/ i) U; `: O  w
  8.     if (_quests.containsKey(name))
    & J2 U! S: ]! }" G
  9.     {
    ( l0 t7 ~% Y$ _6 s5 C- N' T
  10.         return _quests.get(name);
    0 W0 h: Y' a+ f5 K
  11.     }
    ; O4 n% j, h  ~* J. ?: [3 Z
  12.     return _scripts.get(name);- v% i+ M$ S. t4 _+ f1 W
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    " _& l& s. S" c! g' X
' G& b1 i0 h! t; S6 j
Метод getQuest(int questId)/ \1 n5 p$ Q2 ]/ @9 S9 y  t

% w/ d& {0 |3 m) e
  1. /**
    ; v3 ~! `( ^/ u; l4 o
  2. * Получает квест по ID.4 b3 s( |9 S" {7 s( Q
  3. * @param questId ID квеста
    " k& d+ b; }% Y5 u
  4. * @return квест, если найден, {@code null} в противном случае6 l" m/ q% w% ?: Y
  5. */
    ( \' u  H- B; X
  6. public Quest getQuest(int questId)' _6 X" ~: p/ }9 u, m
  7. {
    1 S7 {: O3 X' |  ^  w0 p) V
  8.     for (Quest q : _quests.values())
    8 H" M7 b7 C) Q- M8 p
  9.     {
    2 I9 G& k* f' o$ H+ n
  10.         if (q.getId() == questId)  v4 A9 {  S5 W
  11.         {
      [$ t: l; ^3 P3 ^! m
  12.             return q;! X! K3 j9 X1 e6 H$ t8 |6 k: E
  13.         }3 h8 g0 d9 m. a" U, w
  14.     }
    0 `+ y$ A6 W( N, d
  15.     return null;
    3 q: q3 l4 O3 @( F
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    # T3 B- f4 I4 U# }  }' ]
) e5 s6 _3 x& ?& b( X" F- A8 v' c
Метод addQuest(Quest quest)* Y+ R, {3 V4 z9 V+ K- C

8 b( a, V: L1 o$ A% R3 S* X
  1. /**4 T, m6 C6 n# B. J1 {4 h
  2. * Добавляет новый квест.2 f+ n5 D4 F& u9 M* i6 {2 \
  3. * @param quest квест для добавления6 |7 o. A% I9 ^1 D% g, I" d/ c
  4. */
    , c1 D9 U2 W9 s
  5. public void addQuest(Quest quest)* i4 {8 `) m1 e  q9 n: a+ }3 ^
  6. {
    - ^; n) |5 T- q& M( C
  7.     if (quest == null)
    % ?) I9 |: i( u' H; m8 n5 L/ N
  8.     {
    $ }$ O4 l, b1 {4 V% v; U
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    / ^1 W$ ^0 J* r) R
  10.     }" q4 s+ c8 h4 ^3 n& N1 U
  11.     . P6 v/ B& _) t8 ~
  12.     final Quest old = _quests.put(quest.getName(), quest);
    9 W$ i/ L6 G9 L3 F6 E
  13.     if (old != null)' r4 k; j1 s& }3 G* N# ?. ^
  14.     {# _) R2 }% S2 ~4 p! o
  15.         old.unload();6 a6 n1 e+ e! w0 |. ~' v
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");( z7 F' a& P' t/ C2 s
  17.     }
    3 ^6 Y7 d* d' Y
  18.     7 t( x5 J+ Z8 ^9 N: @9 h4 `% N
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)1 G, w  b! O+ X* ]
  20.     {( C4 O" F' g% ?' n
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();# f, b4 _( \3 I* r0 E; O, D- M
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    3 j7 @: i6 V$ u' L2 l
  23.     }8 f- ?! F& Y  R8 P9 }% D
  24. }
    8 ~! ]0 f' F( Q$ D
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
8 E) H- n$ S2 t4 E' i" D2 M8 p6 YЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
' X# f+ }, t' }4 N# |( G2 n3 l; Q0 L, V" k0 V  t+ \

( X) O1 _' u2 h1 |0 O1 b5 w# j: [0 K7 P0 F1 A' F# E; Q* a
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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