Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius, ]! F4 s* l8 O( K! b% F
2 i, X6 R; o$ Q6 r+ e
Разбор файла QuestManager.java  w' [; |7 z, C4 Y

( I, ]9 m8 T; ~+ W- w/ AЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
, Z/ e/ I/ k4 y0 {5 b- A/ FОсновные элементы
% ]* N5 V9 Q( i1 e6 \1 h8 U
  • Лицензия
    : h& [6 B* v: g5 I/ A" h
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      ( L" J9 X7 S2 e! i" Y' T9 E; {
  • Импорты5 @: ?2 Z/ H8 ]
. |, x" U. ?3 C  V
QuestManager.java — управление квестами и скриптами.5 Z- r3 A/ N) V& V
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
9 N6 V4 M: k2 ?0 M, |( X4 e4 `  Q4 i9 @

7 t' x( ~3 a; N; e7 P0 A% IДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
+ U% ]7 P: D6 n( _" W1. Лицензионное соглашение3 G% s1 l$ G! z: I2 k+ y
  1. /*( R" ^, g0 C$ d2 X* g
  2. * Этот файл является частью проекта L2J Mobius.
    # h, y. U9 \3 {7 r1 t7 R
  3. * - p  n; t" Q6 r( c& W& d  h) O
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять1 P, h  }8 q0 j4 f- a  s- X  e
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    0 X  w; I! P- y' Y
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.# W2 t$ X; s! m8 m; k
  7. * 4 J2 ?) g" Q! Q" v1 j6 A
  8. * Эта программа распространяется в надежде, что она будет полезной,) K% P4 o9 W4 y9 P  x0 v7 Y
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии/ s; v9 ]* l+ I! B7 x1 Z; x$ u
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    $ n+ U5 r  ?5 X+ h8 {. R
  11. * См. GNU General Public License для получения более подробной информации.
    , O- S0 k- X5 H* L* b0 d
  12. * $ F/ I: \: B$ O7 a  c5 m. Y( S7 _
  13. * Вы должны были получить копию GNU General Public License
    / P1 p3 e. r" D+ j6 e7 s
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.( t9 ^2 K8 ?& w5 b7 M
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
$ X4 A7 _. T0 g$ J- P, k8 m' ?4 u0 q" v# J" ^

6 ~+ Z4 {) l' E3 s2. Импортируемые библиотеки
5 f+ @7 Y& }8 p5 L8 n+ x; ^4 u+ h1 n9 J6 e* v2 F3 m
  1. package org.l2jmobius.gameserver.instancemanager;- g0 M/ D2 A3 `. C2 D8 c

  2. ; {4 |9 g* T2 [; U
  3. import java.util.Map;
    7 y; f6 E3 @, _3 r6 Y9 }
  4. import java.util.concurrent.ConcurrentHashMap;: m$ w$ e4 E1 L' w$ D. j
  5. import java.util.logging.Level;% a% W$ I- q0 D) ^- c) x
  6. import java.util.logging.Logger;
    8 Y+ _) N! r$ j- L, M

  7. 0 e8 Q* j5 R" K
  8. import org.l2jmobius.Config;
    + {; ]9 ?% q% o; Z1 w1 `
  9. import org.l2jmobius.commons.util.CommonUtil;
    2 f- w7 {6 W: H# m' T; X+ ^
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    ) S: |; P8 P' l4 v8 C$ P; W6 e6 S
  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 — менеджер для работы с игровыми скриптами.) B4 k# A  v/ I$ n% B
; S1 H. K1 h5 M+ j; f  c
3. Описание класса QuestManager: [3 ?3 y) ?  z! i. ?
  1. /**5 d' _0 r2 X# p: Y
  2. * Менеджер квестов и скриптов.
    , d2 l8 |- m7 l3 s5 k- k* Q  }! S
  3. * Автор: Zoey76- {( |' I) Q2 n
  4. */
    ) Z" m  r2 i7 \( j2 D" f$ ]
  5. public class QuestManager) c$ W) E3 y  ]9 D4 Q
  6. {9 V+ l9 y! g! o( x! ?# h
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    7 ^. S  D$ O6 e% S$ x
  8.     : h/ b3 t4 m/ P& R
  9.     /** Карта, содержащая все квесты. */* {# L) T1 ~5 U. f1 z% _: m
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    . ], V* v7 F$ r1 E; K6 W+ B
  11.     /** Карта, содержащая все скрипты. */( m0 {0 c  L" X  x& V. H
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();  f" ^  H2 W6 i, k: w" T6 ?8 `
  13.     % y$ F2 Q3 l% n* ^: y; D
  14.     protected QuestManager()( T5 |$ @) n8 v2 {/ t+ T5 g+ Q) W
  15.     {
    9 |1 D) g8 W& p2 d; G
  16.     }
    % L. _2 x7 |! j& |7 B1 @% `
  17. }
Скопировать код
4. Методы7 Y+ x2 c3 ^2 T4 l
Метод reload(String questFolder)/ a8 p$ z9 g3 r  _* [' x* R
  1. public boolean reload(String questFolder)
    ) p% U' f2 @" s5 F3 [: ]
  2. {
    # d, m9 }" f6 Q" b
  3.     final Quest q = getQuest(questFolder);
    ' F* X( E4 X1 N
  4.     if (q == null)0 T9 D! ~' B2 I$ @
  5.     {' T6 l3 j6 ]6 ?9 a$ b+ _
  6.         return false;
    # z3 h" C7 f  l0 f. _- d* s- |! A
  7.     }
    8 t0 G  B. [  J: ^' O0 \, s
  8.     return q.reload();
    , Y+ q2 \' g; t! L2 n; ~: I1 h
  9. }
Скопировать код

9 z; H( l& ?3 h% f; V" H# t7 U, r0 r
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
- Z# ^. X! t* m6 p/ D3 uМетод reload(int questId)
) S$ g$ V) o: @$ z" w7 j/ ^5 \% O3 s* F, A2 }
  1. /*** m# ^$ `! i' S" m
  2. * Перезагружает квест по ID.
    / ^; v' S% E# r9 |2 P
  3. * @param questId ID квеста для перезагрузки9 ]1 `! m- r8 d7 c" G* h% S
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    ( i- v$ T) E+ e: [- h6 o1 v5 m, `
  5. */5 F8 U9 _" W9 s6 N' F
  6. public boolean reload(int questId)
    + n* {3 C" {- s7 c
  7. {
    " X+ S' a* @: c5 Y: u3 S
  8.     final Quest q = getQuest(questId);+ u8 Z( X7 T2 b* Y! t# Y9 b! Z
  9.     if (q == null)
    4 P% u2 j3 V6 E6 A+ W
  10.     {7 T  n  s. y! q% h) ]  I+ [& Y
  11.         return false;
    ; @" I7 v" j# I# W" n9 |/ F
  12.     }
    1 D. k  T4 [3 A
  13.     return q.reload();
    " h. w, H/ y* L% ^& g0 M
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    # o4 j$ V+ [9 X5 S) X+ S

+ F" ?' _3 r# ]; f7 I# ^0 ?% Y' SМетод reloadAllScripts()" Z# L; Q6 W  ~. X0 P8 ~; x# f
, p7 ]+ C, ~1 F& v, E  B5 H2 `7 p
  1. /**
    8 H: i" X) \# L
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    9 S/ v+ {5 \4 y
  3. */8 F9 [& Y" r& p' ]+ ~
  4. public void reloadAllScripts()/ ^+ A7 b# X* t5 h
  5. {
    ' S+ K1 X5 Z, H3 Y: X
  6.     unloadAllScripts();2 [3 F; k7 ?, n4 v' u
  7.    
    6 S) L! v. ^+ M) H9 Z6 ]& c
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");. {( J! _; x, e
  9.     try
    " t7 Z( e! c- H" L0 R) F
  10.     {8 W1 W' s# n2 ^# r# F0 V9 U
  11.         ScriptEngineManager.getInstance().executeScriptList();" Y! u6 o* R+ y0 @
  12.     }
    / U1 {+ Z) ?$ _" g8 _
  13.     catch (Exception e)  p& b7 T- H- \6 P& n
  14.     {
    4 R- h+ A6 n/ G3 ^6 F+ ^6 P. }
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    6 N* X1 n- w4 y7 B
  16.     }- V( z3 f9 F% u% A
  17.    
    5 t1 R0 e/ W3 J( Q! v
  18.     getInstance().report();
    6 A7 W+ s8 J! P9 {) a3 Y+ E8 F! ?
  19. }
Скопировать код
Метод unloadAllScripts()
* T3 Y' Y& b6 O: f' _
* M6 ?1 j$ @! T1 w- D
  1. /**
    + g, u7 `5 X" k) i- ~4 {
  2. * Выгружает все квесты и скрипты.
    & l$ w6 x( w) b: H; {9 w
  3. */
    6 J8 \# k( d  [
  4. public void unloadAllScripts()0 Q. Y+ v$ j6 G1 w5 j
  5. {
    3 V* w& V4 @! k% l: ?" h1 s
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");+ B5 a8 J6 X/ ^9 n: u& p
  7.    
    ' u, k6 L: i* D. t+ F0 ~
  8.     // Выгрузка квестов.' z+ C4 S' F9 d. J1 k- v  ?
  9.     for (Quest quest : _quests.values())
    / I  k- B6 E- _% p$ C9 v
  10.     {8 X4 m$ I8 y2 X5 a/ V2 ~( i# z) Q
  11.         if (quest != null)
    ) T5 q& y: V- v2 Z7 t" A2 d- X
  12.         {
    ) H$ r# E1 C6 J1 G
  13.             quest.unload(false);) z7 {% G6 v( g  K
  14.         }7 G% I7 e4 C; F+ G9 H5 o
  15.     }+ d* ^, z- a; F0 s; ?
  16.     _quests.clear();1 A3 L& \) T* h3 N- p- e) E9 m0 ]+ }
  17.     // Выгрузка скриптов.
    + q. l) k% P# [1 R
  18.     for (Quest script : _scripts.values())# ?1 |' c; j% c3 c2 s
  19.     {2 ]# d* B9 S( u6 y% s- D# h
  20.         if (script != null)
    2 F+ t4 |3 b. k) G
  21.         {$ D" S5 i7 q# u
  22.             script.unload(false);
    , J3 R  |8 ^0 c1 |- U/ K
  23.         }
    / N) K- Z6 x. _1 g2 C
  24.     }( E1 r, l8 ~! d0 p. T! V
  25.     _scripts.clear();
    ; W( |1 z$ K/ @2 L0 }; _$ o
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    + k+ z/ I% ^# i% P+ |9 p; q; N) e; {
2 q( J3 X$ c7 \* w: G. N+ D
Метод report()
1 H$ e7 o: t: c/ i) q+ F2 o. b$ T1 w( c3 H1 m
  1. /**
    : j( P; e; F  ^) {$ f
  2. * Логирует количество загруженных квестов и скриптов./ K4 e8 z5 l5 w1 D5 ^7 g, t6 J5 k
  3. */0 C1 B, w$ y1 C! c/ i/ Q
  4. public void report()/ `/ U% D" \" s: X
  5. {/ @8 n8 r2 f1 L% [$ r
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
      i* X1 S% Z; V, i' c5 B0 j1 P- c
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    " s  ~. \+ V! Q  S4 l( o
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    1 s0 N3 k" G  ~9 H$ i

7 s" Q" I' w9 m1 v/ t! RМетод getQuest(String name)
- Y4 q/ }+ R+ a& r+ ~" {( w8 l. S' f
  1. /**+ M5 l5 ]9 M, H# f) @) S
  2. * Получает квест по имени., P5 A. E: r5 d" w# f
  3. * @param name имя квеста6 W- T7 L* L0 G& N5 ~8 Q1 I7 ?' ^
  4. * @return квест- Y8 P  g3 a; ?7 v5 p* W* z5 v
  5. */
    / z% D: }, h$ \% ^3 p) ~  K& ~7 M
  6. public Quest getQuest(String name)
    , ]. {. t+ n9 B7 M4 R4 L
  7. {
    3 n4 d2 T: c+ s1 s  E$ S  ~1 x: R. H
  8.     if (_quests.containsKey(name))
    * T! y( ~8 w0 }- \0 O8 Z
  9.     {
    6 n. n7 T! O4 h4 `! ~. T
  10.         return _quests.get(name);$ M* `. M* `% @$ j( t
  11.     }" w0 r4 Y' h, l; o
  12.     return _scripts.get(name);
    3 U8 g. K' w! y* U& l. K
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.; h/ \/ d4 e: o! e! q5 c+ K

5 N3 O$ R$ X9 @+ {# uМетод getQuest(int questId)
( D4 j. d* d) x# h6 x
% ?+ Q& t/ f1 B
  1. /**( }1 n8 b* G3 N  t7 _2 G( u5 n) t
  2. * Получает квест по ID.
    $ g# q' n0 E# [& ~7 ]
  3. * @param questId ID квеста
    , Z( ]% V& R  L8 w2 C/ i' h/ Q
  4. * @return квест, если найден, {@code null} в противном случае
      j) r! Z6 D! _& u3 H/ q, P
  5. */
    4 u8 q) Z2 h5 W' c0 p
  6. public Quest getQuest(int questId)
    : y% h. Q' {1 w: c
  7. {
    - Z& d0 Z0 U" D, D
  8.     for (Quest q : _quests.values())
    8 ~+ }" U* Y0 Q$ o6 H0 a+ {
  9.     {
    # r) `" u1 a, v# P
  10.         if (q.getId() == questId)& R% C$ g1 K2 P& x% Y+ A
  11.         {
    1 D1 o* L; R, u, f) ?
  12.             return q;
    . j$ v+ I- s# Y$ Z1 v( ]6 w
  13.         }
    . I* E  J. e1 G0 a$ k! w: K
  14.     }6 i3 d4 C' n/ B' {7 ]
  15.     return null;' q( p5 V8 |1 w0 H9 r1 l
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.0 S% [1 z. W7 }% R5 H- d
) g  H7 s! g$ _# l& T' Y
Метод addQuest(Quest quest)
! X$ @5 O5 j* K& ~, b  C8 C# v
2 d) x2 p9 v$ f' K$ [
  1. /**
    0 a) I/ O! U: }6 D
  2. * Добавляет новый квест.( l6 I& M& P+ c7 l* N& j
  3. * @param quest квест для добавления
    # W: {* b2 ~* J8 {* q* k
  4. */
    ; \; d2 K6 [; m5 b
  5. public void addQuest(Quest quest)8 N; b$ v! M4 |% c, T( w
  6. {! C8 f- [- k( E/ z: a6 j
  7.     if (quest == null)
    7 e: n( W2 T& H6 m( O
  8.     {5 ]$ \6 m1 E* F- d& D
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    6 Q4 m8 M: C9 Q& @2 D. E" z% _
  10.     }
    % k/ ?3 p6 B7 H
  11.     7 w8 h; M0 g0 U: S
  12.     final Quest old = _quests.put(quest.getName(), quest);/ m- ?& v- A8 g% ~2 l
  13.     if (old != null)
    : m4 ~8 }& r+ O$ k; H
  14.     {
    , {6 J% r+ _# I. }$ A4 `+ \& S
  15.         old.unload();
    / ]6 a' Z0 P" i6 L/ j; ?
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    5 J3 g/ X4 j  @0 y0 @
  17.     }
    : Q, }& l( |" D: A) X
  18.     8 b, {# S4 w2 T/ M, s' o7 R: F
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)1 T& Z  U2 Y$ a
  20.     {( N# x' Q. u4 O! F7 C
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();8 r2 H* ~! L' n5 A* j5 V6 J. ~8 j
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    3 [" R8 ~* T( G. [- f+ R
  23.     }* S+ E4 l8 ^' Q; a: b# z
  24. }" b6 O4 d) b4 H. p4 P6 J
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
0 N, c7 `. E; p5 B3 ?ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.) _* O) G+ V5 [) Z  {
) Y( \( A8 @( o$ B# e0 R
# g2 W3 p' K3 t$ h" ?/ i" ~

6 t  R# T1 w+ B8 t8 ~. ]
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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