Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
' M% G9 h7 D7 r$ T- n. R5 M+ f$ G7 y4 z0 M! a
Разбор файла QuestManager.java$ H7 p) A/ j( U7 Y9 n6 x+ S/ F

9 q4 }/ l7 k- N  _+ d6 v* fЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
/ j/ V4 i7 K; U( PОсновные элементы
) [& ^  z" ?$ A# L7 _; D" }# q
  • Лицензия) y* [$ N: L5 K9 G. L9 V7 s9 k
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      2 h/ b9 ]& D' Z8 A6 D
  • Импорты8 {; H/ J5 T8 a5 a  g# f3 h8 I

5 ~  j" R$ D( V+ s! W  g! u3 sQuestManager.java — управление квестами и скриптами.
* \$ g6 F  y# e1 ?" w( L6 `Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\# j/ y! Z; C) R: \$ B0 U

8 Y4 |+ t$ t8 {3 a5 t  v

: M5 M. Q$ L+ Z" Z5 f2 KДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
! }1 {' q% Y1 w* s1. Лицензионное соглашение0 n  c! U; O$ N
  1. /*
    0 n2 p- Q2 w& C. V5 j% t$ c
  2. * Этот файл является частью проекта L2J Mobius.
    * g: z' _- f9 i0 r! r
  3. * $ Z) V: C* G: x
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    : W7 R% M0 D3 q
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    " ]& B0 i6 N7 ]$ N
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    # m' D$ R" a0 b( @# o
  7. * . U8 ^. D% ^% v! k6 m$ i& P, ~
  8. * Эта программа распространяется в надежде, что она будет полезной,
    # o6 }: a+ g1 E2 O0 T- ?% Z
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии8 w, J+ }9 g4 w" h3 P
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    . A' W& W! D; V9 _1 M
  11. * См. GNU General Public License для получения более подробной информации.
    6 c. m' Z, \; `$ }
  12. * & o7 M! x* f) r6 C
  13. * Вы должны были получить копию GNU General Public License
    * C$ f  `5 G! I
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.7 ]/ F6 y; {4 T0 s* C3 n3 K, N
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.* C) ]- I- p2 R% Y( j

4 c* q* L, `; k' C6 A1 p/ ?) h) ]% }" H# e; D; @8 t( k( m
2. Импортируемые библиотеки' a- I5 I- G2 A# e7 C- o2 x
7 C/ I0 v9 x6 F4 r1 F/ m
  1. package org.l2jmobius.gameserver.instancemanager;/ D, n6 h5 P! e
  2. " |3 y) f% u) J
  3. import java.util.Map;
    ' e) E- L1 [! ^' `$ Y+ B
  4. import java.util.concurrent.ConcurrentHashMap;% g! [/ u1 |6 P4 J: U5 o
  5. import java.util.logging.Level;. B/ y4 ^) |4 e" L9 T
  6. import java.util.logging.Logger;& f( O8 Z0 Y1 U5 m# F+ M3 I
  7. 1 H: p8 R& u8 R6 h, v) I
  8. import org.l2jmobius.Config;* }) Y3 E# H# \: Q8 X& }0 x/ {
  9. import org.l2jmobius.commons.util.CommonUtil;5 M' j6 O9 }4 O3 B. o/ Y
  10. import org.l2jmobius.gameserver.model.quest.Quest;0 _+ r7 y0 o  M
  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 — менеджер для работы с игровыми скриптами.) c1 x' q+ R" D1 Q2 u" e
, |" ]* L% n& I) r& E
3. Описание класса QuestManager
! g5 P) S4 }# N: M6 b& ^+ `
  1. /**
    * q; [7 M$ Q5 D  L
  2. * Менеджер квестов и скриптов.
    0 D2 F/ o/ N2 X+ d" t0 u/ v
  3. * Автор: Zoey76( t! n6 s8 W3 R4 u0 Y( `& W0 g2 k
  4. */, X0 j. O0 ?( k6 V$ Y
  5. public class QuestManager
    8 h- J) z; n( e% X
  6. {
    # V% l2 r# K/ i9 [& h4 x6 |! C
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    4 }! a7 R: {7 O3 O9 j
  8.    
    6 A9 Q: a7 k- j5 O  y) c
  9.     /** Карта, содержащая все квесты. */
    6 Z7 b1 u( @' j  `4 u; l
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    4 M6 C' u) E- U2 e$ O# o
  11.     /** Карта, содержащая все скрипты. */
    5 R  R$ y% O- h
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();+ l8 i" P% g. @* a
  13.    
    , `& O/ `# R% e0 g0 O: [5 Z+ u( x9 d
  14.     protected QuestManager()
    2 Q, p: W2 n9 M8 z; y) s
  15.     {
    4 E0 P7 W( _  D0 Y  L# d1 x
  16.     }
    6 I5 k6 @: U0 ?# g! {9 a/ o
  17. }
Скопировать код
4. Методы
9 G3 I8 W* ?9 @. @* Q& jМетод reload(String questFolder)0 a) a) q& V' w  A* V1 c0 W
  1. public boolean reload(String questFolder)& o! m2 p6 q) x$ m) P
  2. {
    7 S% O. x# o+ X
  3.     final Quest q = getQuest(questFolder);' B8 d  L; ^3 ~& u* o; p
  4.     if (q == null)" u% E+ @2 q$ G% z1 {& f" F9 r
  5.     {
    " R8 q& w/ x1 _4 M- c0 n; k
  6.         return false;
    " g# P' ~8 o5 l& \
  7.     }
    , C* A: R8 S9 Z& R* y' A" @+ i0 ~
  8.     return q.reload();& w. i9 d1 o" d
  9. }
Скопировать код
5 _6 c' k, m+ q# y8 s- K
$ n. F8 W) u* {
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
7 s; A) u( F" q8 r# `9 N* T' k; f: jМетод reload(int questId)
. r( N5 c' K$ {7 D2 p: w" E- s+ U# y* v) H$ w/ Q- f, {. ]
  1. /**8 e+ T" p  [7 x! U6 [2 J0 |
  2. * Перезагружает квест по ID.
    ( u# G: |! c  W
  3. * @param questId ID квеста для перезагрузки
    ' H/ c' H! B% |2 o% s2 \1 d, T
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    : r# P# O$ {* [7 j
  5. */
    , c$ V. w5 s! A9 v0 j9 ~; U
  6. public boolean reload(int questId)& j% U7 W( X. B+ R) i* }
  7. {( w' p. y1 Y, V+ h3 P6 B, P
  8.     final Quest q = getQuest(questId);
    1 F' d+ j$ g: z- t- ^, z9 H
  9.     if (q == null)
    " v: W; |/ k; k5 N
  10.     {
    4 n4 b: N  g1 v, w% q
  11.         return false;1 Q8 l9 V7 ?# e' f3 C% n* X$ O
  12.     }
    1 z# c( m: {; p
  13.     return q.reload();9 u6 S# D3 h. |! l
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.3 k! A- X' s4 I0 Y
. z/ P6 j; H7 j" d0 n- t
Метод reloadAllScripts()
* N' ^. Y4 a# o+ n. g4 d+ n1 y  {4 a! p4 `0 I" y) D
  1. /**
    : D$ e8 m( B! J" E5 s
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.3 o. c; S. y+ E
  3. */
    4 k" c4 r. M& {  g" |+ h
  4. public void reloadAllScripts()
    $ K* O; g: r& S
  5. {2 x( u2 r/ Y2 E$ w3 d
  6.     unloadAllScripts();
    & H8 _" w  ^# k3 [
  7.     - n! o* Z( L* x+ N# ^0 V( ^
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");. K; \6 T! J- N3 f% d) F4 G& Y
  9.     try% Q8 F  N4 h" I
  10.     {
    ! f; a# ?) e1 [. Z( Z, }9 A$ P# {# E
  11.         ScriptEngineManager.getInstance().executeScriptList();
      t8 N, T3 t# D1 Q
  12.     }
    1 F! J! x. Z- {5 n+ e
  13.     catch (Exception e)
    % @0 d0 n2 m) }* Z- ^+ D6 T% G6 ]  s. \
  14.     {: v1 @( H  E  l- U  }
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);+ f9 P6 ^& p, P) g: G' X
  16.     }  D% e3 H5 y! E2 w$ I  }1 w) ?
  17.     0 u* A* g8 `0 a2 N) P
  18.     getInstance().report();1 u" g+ n, b5 q5 [( B! d
  19. }
Скопировать код
Метод unloadAllScripts()
+ H* \- p5 ^0 W1 L8 G5 w  E- q7 Y" `5 C: o/ t3 P' Y3 N
  1. /**0 ?7 B9 k/ P* `5 {" E9 C0 ]  o
  2. * Выгружает все квесты и скрипты.9 R1 S6 d- z& d9 y, k6 s& r' }
  3. */. x9 K0 A& p: _1 s9 \( U% I& c
  4. public void unloadAllScripts()
    & h' B7 Q$ d% M: O) S* p$ b# a
  5. {2 c3 P+ a. R) a- w8 `, ?4 I
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");8 |) X4 k' ]6 k; m; d9 F5 \! i- I7 L
  7.    
    ; Q: k5 H# y7 e# u2 S
  8.     // Выгрузка квестов.
    9 t( G  p: X1 I4 @& W; _( u  }
  9.     for (Quest quest : _quests.values()); p) d& R" S/ R2 J) @2 C& B
  10.     {
    % Z7 a8 u' o2 P6 h2 l. U
  11.         if (quest != null), v2 C. X9 D9 m3 N, z/ k
  12.         {
    + K$ M5 y" L) Z1 K( `- B7 r. D0 I9 t. k
  13.             quest.unload(false);% U$ D  D* t8 z  G6 a
  14.         }
    * i& ~) \4 B8 ~; `
  15.     }, d2 Q- D0 g' O6 s
  16.     _quests.clear();% W+ e# E5 \7 w9 D' Z
  17.     // Выгрузка скриптов.
    9 `% h& n* y' K/ `
  18.     for (Quest script : _scripts.values()), N* L; X" Z3 g8 S3 S
  19.     {
    ( {1 C& x) E! p# u) ?4 {. A
  20.         if (script != null)1 t, v2 F0 l8 ^
  21.         {
    1 @7 |- x" q* d0 e4 v
  22.             script.unload(false);6 ^3 q% q" R" k$ C0 B
  23.         }
    : ]$ z7 I2 u& a) H8 x+ j
  24.     }
    $ e4 N7 z5 Z! e/ K$ Q1 X! x) Y
  25.     _scripts.clear();* g# c$ L  j' I: D/ a. c
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    + R' C3 Q9 d3 P; U

3 |. N  R3 v2 k+ fМетод report()
$ e2 M/ H0 a6 K  [% j6 K' s1 _7 f1 {' J0 q, Y4 @, I" v0 _" H8 B
  1. /**
    7 H3 o# G  i; S) ]1 X
  2. * Логирует количество загруженных квестов и скриптов.- b2 x, Y" f* S  x  f3 u; _. m
  3. */
    & Y+ W) J* p3 C7 Y) i
  4. public void report()6 E" G% ^% c; T5 o" ?* S5 C
  5. {
    + s# D4 V* d# ]6 B! b
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");& N/ o, ~( S2 V' a( v+ h
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    9 p1 v  g, t7 P: s5 D) j$ i
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.# C0 a) k# q7 C- ^. t" h

( }* ^" q9 p; V6 RМетод getQuest(String name)
  u% p+ c% g+ t! E+ G% h/ n8 l9 l4 N4 ]. H
  1. /**
    2 c. W6 t0 }$ i; ~4 Q
  2. * Получает квест по имени.
    8 }% ]; u% I% O9 C
  3. * @param name имя квеста
    8 F% F/ x- q: r% c
  4. * @return квест, Q/ d; M  f4 ~+ `* _, `* h
  5. */# `" q% E6 G  H
  6. public Quest getQuest(String name)
    ! P' R  P3 V# {/ i/ r1 O
  7. {+ f$ y+ [. T, Y; P. Z, w
  8.     if (_quests.containsKey(name))+ ?: A/ L' H( m9 u+ J
  9.     {( J1 _. j; K" r) S
  10.         return _quests.get(name);; y, a7 M3 C! X( }
  11.     }
    / d) m# h, y. t- z9 l" h
  12.     return _scripts.get(name);9 e5 S+ z. M$ I8 J. D
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.& V/ u+ g7 a4 X4 T; V$ U+ T

+ p1 j2 D2 V2 X* p, p; C& sМетод getQuest(int questId)
3 K' e/ v1 B% f4 n* W$ D7 g, b. ?' C! C8 N0 ^
  1. /**2 j0 t! j( t8 {) z5 V
  2. * Получает квест по ID.
    ! S8 c5 T6 K! h3 p! o
  3. * @param questId ID квеста
    5 q9 h# [8 g, @! G# r6 N% I
  4. * @return квест, если найден, {@code null} в противном случае
    $ o$ j; Q3 n& W1 I- S4 K& T. v
  5. */) K8 i0 m- l: M6 H3 t1 D
  6. public Quest getQuest(int questId), A' _3 g, `6 F6 c
  7. {
    : T$ J/ _& C" _
  8.     for (Quest q : _quests.values())
    / r$ L+ _% t, a! H, P  X
  9.     {
    , e6 @7 k' P1 W8 D4 p5 O
  10.         if (q.getId() == questId)" F4 s9 \# U( q0 x, V
  11.         {
    & g' Q% N2 `* K6 @* [+ V- h
  12.             return q;
    4 I7 E  |/ w4 U1 B. Z
  13.         }  X3 L9 U, i( h
  14.     }
    2 F0 Y4 e6 e, H+ y8 V
  15.     return null;
    ) R; z. @! q* @' }% n4 _
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.0 A4 }* S* J4 j- f* N9 Y) `) u
; A: p9 p% z4 a+ l- h) f
Метод addQuest(Quest quest)
1 c! q: e+ O, q$ ]/ W. Z8 I9 v0 I6 ~  A* r2 ?
  1. /**+ f, L  a: o3 M9 ^5 c6 o
  2. * Добавляет новый квест.
    , j2 ?% ]2 C# L$ u$ Q
  3. * @param quest квест для добавления
    4 a! x. ~( u4 ?3 o% N
  4. */
    9 }+ z/ K" a  O+ {2 V9 O
  5. public void addQuest(Quest quest)
    ; g- _* e: R' B; W  P( h! J
  6. {2 l7 J* J  s2 R2 e
  7.     if (quest == null)
    - @" h6 t& ^& }) t/ {0 Z3 e
  8.     {
    % B5 Y5 v5 @6 n9 N1 \7 @' \5 i
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");* X* m) N' ?4 o( G4 {" N) C
  10.     }
    - s: |3 Z4 R8 m, U
  11.    
    + X; A; Y! ]$ `( I3 a8 n6 u
  12.     final Quest old = _quests.put(quest.getName(), quest);
    ) q  k5 a% l1 ~4 x; x
  13.     if (old != null)* L* x+ x) A$ j, @: E: W
  14.     {$ _4 W0 z, @. N4 t( m
  15.         old.unload();
    8 c% l, }% A7 p  I8 k' w
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    # X& x! P' ?( A* i; X
  17.     }
      d* T% p2 D4 r; m4 L; ?6 h
  18.     5 w* n! _4 \" U
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)  {' ]2 J2 o  i) Q/ {/ q" T
  20.     {3 N% e! K/ [' d4 j3 \
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    ' r7 k. K& x0 O  X3 M* a
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");4 Z* P: H5 `% v4 h
  23.     }% a% N& J$ ?- ~  l6 e! w
  24. }
    ( H! V) H8 g: D7 c% ]( C0 Q. u# ]9 t
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.* L. F8 K/ V" m' x4 a" p4 l
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
! I3 u3 B% y& K' |8 }" K! K, O9 A6 C& S& F, q
- ?! Q9 r3 ^1 V, b8 A4 u7 n) l

9 j' x! S7 w* H6 V7 R6 j
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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