Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
0 l% e& T  r) H+ _' ?
3 G/ w+ e! v. g0 U% r7 Z9 i7 q) HРазбор файла QuestManager.java5 @8 F2 x# E+ I* f* k8 _2 s
4 x6 N- O" w. P
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
/ J1 V! [3 K8 q3 }/ ~" G; X& eОсновные элементы; l1 b" K& |: m6 {9 D
  • Лицензия
    . T4 v0 K5 Y* l$ C
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.6 ?9 W) r& \: e
  • Импорты) M$ \" o0 l( u- i
5 T% s" k- y5 c- u' s3 e
QuestManager.java — управление квестами и скриптами.7 K" c0 ?( U, t! {. i
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
3 `1 f% Z+ [! K0 d+ d/ j; c
' y. ~1 Z4 m; z- u! T! o! U

& X& i1 S) {4 d. E+ UДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
4 S2 ?0 I/ S- q% s1. Лицензионное соглашение
& x$ M) }2 j0 f! e4 L8 |
  1. /*
    1 X, g7 N! h, @& m7 s
  2. * Этот файл является частью проекта L2J Mobius./ y% n) E3 R$ F9 x; A; r& i% u* Z  D
  3. *
    % o! h" d% I. O0 w* M
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять6 b: h- _7 [. }! a; U8 p+ a& g
  5. * её в соответствии с условиями GNU General Public License, опубликованной  F4 T' c# X; I4 |( T
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.$ A: ~# F0 S' H1 h" s. r
  7. * / E0 w4 s- i" r8 h7 I. s- B
  8. * Эта программа распространяется в надежде, что она будет полезной,1 ^3 b! d7 f* t6 z$ B$ Y
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    ' j" s5 g" l2 X( z) h9 w8 c. F7 D
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ., p3 B2 g5 K! g
  11. * См. GNU General Public License для получения более подробной информации.' c- b5 B9 X5 J- \, i& B& E
  12. *
    # i8 u5 {  r$ @+ b* L
  13. * Вы должны были получить копию GNU General Public License: B3 A4 P% N$ j5 C2 |% A# z
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    $ p' v8 N5 s, S
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
, Y) Y' k' {; C1 U2 D& ^0 n& _' u$ K+ ^3 e- e- a

, Y0 q1 K( H" \- @" W2. Импортируемые библиотеки* d$ F9 R+ G& u9 d
( w$ [0 |2 D( `, I+ Q% \4 a9 n
  1. package org.l2jmobius.gameserver.instancemanager;3 }+ j) U: ~- d( K# L7 ?4 c5 z7 e
  2. ; d: S7 k$ X) f6 x+ G& K% i" o! y
  3. import java.util.Map;. ?4 Y2 x: o5 Q. X( l; k; C; y  I
  4. import java.util.concurrent.ConcurrentHashMap;$ }6 T# i/ B) e; P/ p. M
  5. import java.util.logging.Level;, p) g- h: v( [6 M
  6. import java.util.logging.Logger;
    5 ~5 q: w. \7 D/ ]1 b& ^

  7. 8 F9 g( w: V& L% f: W
  8. import org.l2jmobius.Config;0 B2 S6 v! ?! B% [7 D( o
  9. import org.l2jmobius.commons.util.CommonUtil;
      A/ X+ _: U  R" p
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    , e4 A; b8 F% ?- E' c; D
  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 — менеджер для работы с игровыми скриптами.
) G) d9 e+ P/ `0 x2 E1 O/ L7 e+ m' y7 k" ^/ c  C: y% p
3. Описание класса QuestManager4 r+ y9 l2 N7 n) b& U$ q7 k$ q
  1. /**
    7 ?! ?* s9 a$ O3 v. H& l8 x/ b
  2. * Менеджер квестов и скриптов.3 R3 O' @8 R9 G  ]# ~1 p- X
  3. * Автор: Zoey766 X. |! O+ z2 Z2 [! U
  4. */
    : J$ S7 H; I5 K
  5. public class QuestManager# y* L) ~) j' S2 F8 M9 G7 s
  6. {
      x( m: C" G; }' ]7 @
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    ' ]' A" A& f; p, W
  8.    
    1 i* |( b1 E& V  ?$ g( N: |
  9.     /** Карта, содержащая все квесты. */0 T) ~) Z6 n( o) ^' Q
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    ' l7 _: b7 B" I5 G( p( e
  11.     /** Карта, содержащая все скрипты. */1 [- A5 W$ m/ ]+ r- [% s4 [) c
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    % Z$ H  V7 \; h  o# [
  13.    
    5 u2 B' b3 x, N: t
  14.     protected QuestManager()
    + M' K5 y" l3 V% y  {
  15.     {3 Z& I, V' S( j; Q
  16.     }) h) L1 ^6 G& C4 b# w0 ^" T
  17. }
Скопировать код
4. Методы
+ }* j; W1 c) _* g9 ~2 \Метод reload(String questFolder)/ \1 }7 g" _* g) n+ _
  1. public boolean reload(String questFolder)
    ! Y$ \0 U4 [3 d3 {1 ~5 j* v( ~
  2. {. E6 X5 G) I7 O8 j- O- l
  3.     final Quest q = getQuest(questFolder);
    + S- x1 l; k; L' ]' s7 c: e- L
  4.     if (q == null)
    7 Z1 H8 Z  j1 e4 c/ U- p
  5.     {; X0 |1 @+ _) f! m" N; G) |4 |/ ?
  6.         return false;( C2 ~$ C/ k; F, T  a+ T4 O
  7.     }
    2 Y4 U9 Z8 S6 B/ Y0 Q2 P
  8.     return q.reload();" B. X% R! t* f  r+ q, B
  9. }
Скопировать код

' U( C' q, G6 M  q: z- ^) I5 C2 e0 k" Q+ w" k* q; b& i- X; _" }
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
+ C6 ^& Q' i: X  pМетод reload(int questId)
( _7 x8 o) S3 n/ O: h
+ K) `( V( P* ^- j+ ?1 ?2 Y2 e0 ~$ p1 v1 |
  1. /**
    . W: N* v# ?' B1 u' |
  2. * Перезагружает квест по ID.
      o/ i2 ]6 e* k! ]
  3. * @param questId ID квеста для перезагрузки2 l  l2 h* ~, e6 C1 J
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае0 ^8 Z( w' @) s" |4 A
  5. */
    2 q1 e1 ^; ?  p0 }/ M
  6. public boolean reload(int questId)
    $ i! J) Q2 n# t) M
  7. {
    * L4 Z' D% I7 t. z3 U1 c& _& `' e
  8.     final Quest q = getQuest(questId);3 l2 ~/ f( c0 u$ s
  9.     if (q == null)
    % V+ i: G% ^* n$ C' I8 c5 {
  10.     {( [) T  `/ l8 G; b: p1 S* ~
  11.         return false;
    ! K9 {1 o" l6 e1 o; z2 [
  12.     }
    8 p, T, D/ D* [4 ~1 U& S9 y8 U
  13.     return q.reload();
    $ y1 E1 {, r' M$ \8 G# b& ~
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    . V! {+ l4 J3 I2 e( n8 P% K
( x; P6 {' y+ ~$ q$ z7 |
Метод reloadAllScripts()) n! ~3 V1 q8 e2 n( A

1 @! D% k+ H- V1 P' p$ N( }. p
  1. /**2 `5 m2 w' d  \9 @& D' r2 v  C0 ]
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    7 _/ N" ^' _$ x
  3. */
    " u% u: ?6 o2 V5 ^+ J$ d
  4. public void reloadAllScripts()4 _+ b. B, S* x) F! j; e; [
  5. {/ X6 F( W, u* }9 Y4 O, A
  6.     unloadAllScripts();
    ' r* X2 }$ ~' U/ ?
  7.     % |5 A5 X" U: v* c4 h) f
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");+ Z1 N7 V' J" u" y. i
  9.     try
    + @! o, Y2 p+ a( d% ?" C6 H
  10.     {
    3 A5 c8 B+ Y& @* `; `
  11.         ScriptEngineManager.getInstance().executeScriptList();+ c( Z2 @/ Z4 z) M% Z
  12.     }6 ^8 d/ u1 j' K; T. p0 N9 |! P
  13.     catch (Exception e)
    : u7 Z% m7 L+ T: Q/ T
  14.     {
    # `$ }" K; y7 ]$ W) B; V
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
      [* C7 n# U- H" _& F( n/ p
  16.     }
    * @. }" D3 V& G0 L
  17.    
    2 L% O+ D; u% a4 u3 J& O9 b
  18.     getInstance().report();
    ; [/ V, D1 G6 Q6 t- ?
  19. }
Скопировать код
Метод unloadAllScripts()9 o9 N+ U$ k0 \2 ?, a0 ?) e. k5 u+ ]
2 l. U/ v, c: T2 m0 K
  1. /**; t  a2 G' s: @) H' B" T  H
  2. * Выгружает все квесты и скрипты.- h  ~/ i1 i( D1 ]$ ]5 W
  3. */
    ; o* K; ?; o; B7 l$ _7 @6 f
  4. public void unloadAllScripts()
    - H5 j, z0 ?) F; A7 i
  5. {
    . b8 A7 s: M- z% m4 J; \! W+ a
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");2 t: y/ _* @. C( O+ o# e& ?
  7.    
    ! z# w1 G/ P# w, s- B- P
  8.     // Выгрузка квестов.
    ; l5 f' F  Z# L
  9.     for (Quest quest : _quests.values())
    2 e1 |0 s% X& h1 k2 @& ~
  10.     {$ i% t0 t. @5 f1 U! T5 W2 E
  11.         if (quest != null)7 O  g3 ~1 {: b& l+ H% h' Y
  12.         {2 U. t" ]: |+ o7 |8 W5 M
  13.             quest.unload(false);8 w; g1 d' O& J3 P3 j/ a$ [6 A: U6 p
  14.         }
    % m' h0 U7 z9 w5 Q/ u0 Q5 a
  15.     }
    1 ~' ?5 d) b4 G% U, }+ ~& h/ H
  16.     _quests.clear();
    2 K  a  i" b, I$ `0 K' |
  17.     // Выгрузка скриптов.
    ) \8 j8 b6 c. Y8 [
  18.     for (Quest script : _scripts.values())! @* s7 p1 ~/ K8 s) w* |
  19.     {
    4 ^( }9 o) M/ o# y: j2 A
  20.         if (script != null)
    8 L9 k5 Y8 T6 |$ @
  21.         {8 R6 c2 B) S: `" ?* d
  22.             script.unload(false);
    4 o% w8 T/ U6 e, J. c- A7 i6 v
  23.         }4 j7 B8 \0 U% f) [/ M
  24.     }/ ~! W9 ]+ i9 f4 h3 p
  25.     _scripts.clear();8 U3 L+ B. ?0 i0 g% M/ ?, v
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    # P; O/ N7 p7 s0 _$ ?+ n/ K; o

2 E% r( C0 ]) T$ ~! JМетод report()+ h% g) O# L9 h4 C3 o
2 S6 i7 B9 N  c3 g7 X4 l, |0 m9 O
  1. /**( B3 K+ j: y1 k7 Q
  2. * Логирует количество загруженных квестов и скриптов.
    6 ]; `' K; f7 Z2 X0 K9 V: Z; f
  3. */
    7 a  ^+ r$ {, q  l# E) u
  4. public void report()& I. v8 w5 t, S! [3 |
  5. {
    0 t( t: Q% `4 U4 x" p! x
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");2 H" `+ F) i& W: i- r
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    9 [/ E$ ~- t' x! e0 N
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    * `' i; p2 A8 Q( {+ M! h" M

% _+ g2 C& k9 P3 sМетод getQuest(String name)3 z. n9 Y0 \6 a( d! w- |/ m
0 C8 o- O$ r3 M, Z
  1. /**
    , ~' Z$ M& C: o6 z
  2. * Получает квест по имени.$ {; A2 w/ b( M! O) Z. Z6 |: s
  3. * @param name имя квеста4 F" B; c+ u) `' t
  4. * @return квест
    4 i, j0 {  L9 V1 y* K
  5. */
    & q" e8 g" L4 E. w
  6. public Quest getQuest(String name)
    # _2 s$ c! a% b) h2 Q- x
  7. {
    ) B0 g0 F+ q6 |! M) H
  8.     if (_quests.containsKey(name))
    9 G. K- [6 B2 }' b+ K- @, G
  9.     {
    # m. E5 @4 j. |2 O
  10.         return _quests.get(name);/ T0 J$ e# c' e/ F! D
  11.     }8 r; f, c5 R* D$ q3 H) E
  12.     return _scripts.get(name);% L4 w# w* U* k: Z: O& l, Q( m
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.. E  K8 d1 y: P* X: l  ^
/ a" f& i! G3 e1 l# N! z/ j
Метод getQuest(int questId). d1 v! @6 w- t, D  l- Q- a$ m: h( ~6 V

  h9 U: n" H% f: [
  1. /**! m1 n8 x% e# k
  2. * Получает квест по ID.
    ( h* ?9 h5 e7 Y* {) c
  3. * @param questId ID квеста
    # x+ m6 U1 J) P) a+ r1 O: A
  4. * @return квест, если найден, {@code null} в противном случае
    ' l4 `. X2 n% q! _. l# Q: {
  5. */
    ' i, s' R6 j. m
  6. public Quest getQuest(int questId)$ R% l! ?, ?3 P: W, z3 n$ g5 @( m
  7. {3 O/ ^5 B; S. ^, |4 H1 \
  8.     for (Quest q : _quests.values())9 v# q( Y3 @' N
  9.     {
    1 G8 T0 P5 X6 V. K+ i
  10.         if (q.getId() == questId)
    2 k; G6 n6 I* R: A) C* [
  11.         {6 r! {, r& O+ Z1 |8 p" e8 H
  12.             return q;
    " e! K6 ~1 q( h5 r2 l- p% ^) @4 O7 m
  13.         }
    ' i1 {& Q/ s5 T. h* O- O0 C
  14.     }3 b% J* S, S4 @: H% P
  15.     return null;! j0 s5 F4 k/ r( C" o
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.  y* B. n5 A" X$ y% t" J' ^0 D  b
# g- i' C  }. _( W- q0 O
Метод addQuest(Quest quest)
) M1 v2 R+ E6 n/ Q
6 F% X- F$ A1 F
  1. /**6 x* _' q1 G1 ~2 N3 Z7 s. _
  2. * Добавляет новый квест.
      r  F7 d! {; i  C) v
  3. * @param quest квест для добавления6 J( `) V( ~* l3 `6 _
  4. */
    0 a3 n- ^9 }' U5 E1 J
  5. public void addQuest(Quest quest)8 ~3 A8 L! s+ q$ @8 u/ o1 o
  6. {' Y2 o( Z2 x' ?6 i& |' Q' g
  7.     if (quest == null)! |$ z0 n6 ?4 o; P
  8.     {
    2 T+ t" K6 f' A+ }
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    ( L8 X$ A  ^2 z! n# u
  10.     }
    " y: g! A2 i0 `
  11.    
    2 ~7 |& Z5 q/ W, j& j
  12.     final Quest old = _quests.put(quest.getName(), quest);* n# K9 Y& y. y* n
  13.     if (old != null)
    + Y" R& Z' A+ V9 a
  14.     {7 n: k% W  W7 D* R/ O
  15.         old.unload();: N, a) I* S9 u- @9 v: @$ w- [/ e
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    % i/ x2 M( C  V
  17.     }
    ; X/ |$ E& }7 I3 ~6 l! W
  18.    
    & W0 E6 M, u- o
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    ! Y" y8 M+ q' u
  20.     {, k, f: K' O- e8 u4 z6 \: Z
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();+ p1 U, d% L6 J/ \: G+ w
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");# T! J; Q/ @  H7 G; [
  23.     }  y  ?4 f! c% ]2 V8 Q
  24. }
    / V/ K3 x( H- U8 g: L
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
, Q' N( G& t7 X: nЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.' D. D  }6 `. y3 ^" c7 i" g

4 L- @8 ~' s( r) s6 k' B7 d  {4 a3 [* r

- G8 r% B" s7 I
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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