Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius3 O5 o' V# ^& l7 U

$ L' W8 f$ Y# G. m. Q- OРазбор файла QuestManager.java
5 x+ J/ i9 k& m# E3 p
" V6 a- D' `* R0 b" F8 j7 PЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.4 k3 O" q+ e( N  l5 h
Основные элементы
/ a& P! [0 O9 r+ r$ S0 G
  • Лицензия
    ) R: l6 \- ], Z+ x) `7 C
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      9 p9 a" q8 c- z# v5 f" ~$ g
  • Импорты
    % \# w# E- f- c& v+ C9 H
, V8 @6 B# c% I- q7 @& C9 I
QuestManager.java — управление квестами и скриптами.
. f/ }" C: o! a" Y# F: B5 ^Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
. s5 d6 T. r, S& A/ \6 t# ]$ E' Y  P" O

: h# I8 [) \6 m( y9 X" DДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
* @$ W1 K: H7 ?% |- r1. Лицензионное соглашение
$ [: B& x/ K) E3 o2 F7 l1 s
  1. /*8 c6 [7 y  h  [
  2. * Этот файл является частью проекта L2J Mobius.
    ( R/ n; b" z$ ^! k
  3. *
    2 y8 L( L2 l$ ?6 @
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    ! u& Z6 ]( A/ S$ @
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    ' X; F8 k- ~: ^& P" I& n7 ^
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.  W6 `3 x* K" |  m1 z3 _: \
  7. *
    ' K5 U( m# y6 M, H- O+ _
  8. * Эта программа распространяется в надежде, что она будет полезной,
    2 B4 a2 C* Z6 @! a, K% q& A
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    " f9 h6 R, x3 J* [* k
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    2 f) ^$ ]' e# P. q6 J+ Q) K0 A5 x
  11. * См. GNU General Public License для получения более подробной информации.
    ) b: Z% u% U5 V5 k7 h: T- N1 W/ U7 h
  12. * ( j5 G# j" x5 d; D! z
  13. * Вы должны были получить копию GNU General Public License
    2 z8 d, z# ?3 F& ^) r6 G
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.* Z3 v$ a3 F0 D
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
6 `, u* G! ?" \' w( s& v; H4 f7 w- @5 J, N7 R
" ^# N5 b5 l" K( I5 `9 E
2. Импортируемые библиотеки4 y7 x" V0 n0 }

1 l1 K2 D! o) d, D3 n& s
  1. package org.l2jmobius.gameserver.instancemanager;
    + A3 _+ M- ?" H. Z
  2. 0 Q4 Y$ `) i' ]3 R$ g
  3. import java.util.Map;
    0 ?# C& R+ m; }$ ~( K' Z6 A
  4. import java.util.concurrent.ConcurrentHashMap;( r7 F8 K4 k# _2 w* b3 S
  5. import java.util.logging.Level;
    3 `) f5 T6 e1 G/ o2 B- |
  6. import java.util.logging.Logger;8 g: I( O) c! P  L

  7. $ E$ X7 K, Z8 j! H) B' h
  8. import org.l2jmobius.Config;8 |. G) ?% J4 h0 t. [3 [$ b4 p
  9. import org.l2jmobius.commons.util.CommonUtil;
    0 I; ?( m4 Z7 m2 ]
  10. import org.l2jmobius.gameserver.model.quest.Quest;5 g% Y( P4 j+ V
  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 — менеджер для работы с игровыми скриптами.
: Y/ k; B; N; q& Y1 p  A1 Y3 ?7 L* O7 H2 N0 ]
3. Описание класса QuestManager8 |3 H4 E6 U$ R; G1 D
  1. /**
    ) f' B3 i" e' B( Z0 q, J. G) z
  2. * Менеджер квестов и скриптов.& L; [5 n8 K% N5 X
  3. * Автор: Zoey76
    : y  H7 [. Z  S0 l& u
  4. */
    # O& ?: R6 ?9 k% ^7 T
  5. public class QuestManager
    0 o, m  m( W( I2 o5 _  a: j
  6. {
    5 f# Z2 U% @% j% }# F
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    ' ^: x- }7 @0 d4 \1 C$ R- Y
  8.       l- N& y- Y" ]% T& L4 {# ?4 z* {. w
  9.     /** Карта, содержащая все квесты. */+ D% k5 t. d4 D/ v, U
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    $ g# M6 V7 V7 K0 M: x
  11.     /** Карта, содержащая все скрипты. */" ~: z! f: W0 p+ ^$ c* C
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();$ ^7 u6 _* l& v
  13.     0 x! x. `% E$ ?
  14.     protected QuestManager()
    & e4 L  d" e! g. J, x
  15.     {: {) [. n6 w1 \7 e
  16.     }2 d1 N8 a/ K3 x! ?9 ^0 g* I0 j8 V
  17. }
Скопировать код
4. Методы* f9 Q4 b5 j# {, [! ~& H2 S& a
Метод reload(String questFolder)" ~% i; |& p, u( p3 J, j
  1. public boolean reload(String questFolder)
    ) d0 M) q, Z) g8 Q
  2. {
      N7 v& g3 r0 A. V# I
  3.     final Quest q = getQuest(questFolder);
    3 h5 H; F; g, {6 ?8 g
  4.     if (q == null)
    7 ]9 q! w2 p+ C5 @
  5.     {8 ?& @4 [; s3 \7 r- T/ a
  6.         return false;  o3 J1 h/ H5 P7 R$ z
  7.     }
    $ a7 W6 S3 o) Q2 I* t
  8.     return q.reload();# m( M6 P3 _4 u9 p
  9. }
Скопировать код

) N' i9 g# D) J) ^2 V
, N' o2 S8 q3 EМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
! s- f8 \: U2 f. uМетод reload(int questId)
0 B3 S0 y4 q$ O$ ~: V9 `, D0 j, S1 x+ y! l
  1. /**
    ; j1 F& m+ X8 P
  2. * Перезагружает квест по ID.+ _: A, f; c& \6 h1 S
  3. * @param questId ID квеста для перезагрузки
    7 ]2 d& _( c3 \- E, e  y/ T
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    9 A7 [; |1 X; u, m  ~
  5. */9 Q5 t; c3 L$ m$ ], b8 M. [
  6. public boolean reload(int questId)
    5 [% u& W% z3 ~" F7 g
  7. {, _5 Z+ r$ @5 c: @
  8.     final Quest q = getQuest(questId);
    * I6 i! _8 }5 [" k& C# O# q
  9.     if (q == null)
    # F) U: ^5 J/ A. `: U% d+ y3 z
  10.     {
    3 E+ A  @4 K6 a9 D5 U
  11.         return false;
    : S- x1 F5 a. K2 ?" ?& {& v. M0 n
  12.     }1 q+ O  i) w) y! H* \7 t
  13.     return q.reload();7 e* d5 |. z/ h
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.7 y/ f6 D2 w% x9 d; S* g) ?# {
  y2 a. R* P+ q( K+ ^
Метод reloadAllScripts()& K+ J% O( z, p) j/ ^
1 e0 B7 G+ `. l9 z/ i9 X" y
  1. /**
    7 H, N( }, N2 |3 S  A, K2 J  K
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    . r( e2 [4 p9 z  h  U$ |: z
  3. *// s' @5 `" b% K# L6 j
  4. public void reloadAllScripts()0 y3 J4 @. z' C2 l
  5. {, J/ v- e  Z8 u' ~
  6.     unloadAllScripts();( F: _& m4 X) J5 X
  7.    
    ; f& E. ~& S/ F7 Q5 `
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    ' @  Y1 N3 ]- L, i  z
  9.     try9 Z" C6 x  b- C1 m4 G
  10.     {
    - @1 G$ t/ Q) g  S
  11.         ScriptEngineManager.getInstance().executeScriptList();. O+ q5 E: P! _! _7 o
  12.     }, \1 ~2 b) ]  Q! s) {
  13.     catch (Exception e)- V4 d' q# R" f: I' _- _
  14.     {
    ( K; ?1 C* B2 H; k+ F
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    ! @/ q* N$ C- ?' C* _( j+ y/ s
  16.     }
    3 }: {$ `' s( P/ \; p7 h- O  W
  17.    
    # B+ f, j9 ^' i: J  Z+ N" |/ j/ c5 K4 S
  18.     getInstance().report();
    ' C4 l( T7 @* h
  19. }
Скопировать код
Метод unloadAllScripts()7 i* Y' |$ [% [5 e" G/ i
  }7 D! @9 s6 l3 n' s- r
  1. /**) R  B" a: y. j0 j. f
  2. * Выгружает все квесты и скрипты.$ @: |8 T: y6 M0 u5 x6 p8 r
  3. */* q* c% s0 ?- o; v0 c) d, h
  4. public void unloadAllScripts()- n8 d# N3 p0 R
  5. {$ c$ r& W# M* j
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");/ @* V2 X3 @3 v. o; X
  7.     ! ?* y8 Y( ]( L# |- F6 m
  8.     // Выгрузка квестов.: k5 _+ e9 f6 d. J; V
  9.     for (Quest quest : _quests.values()), R/ h+ _0 |1 ]
  10.     {: Z) H' H8 i( I3 B4 c# p' t
  11.         if (quest != null)
    1 U" r% Z7 U. \+ y$ I
  12.         {
    8 K$ x2 J- ~$ O- M
  13.             quest.unload(false);% _+ Y4 Y$ }* x- s) R8 i
  14.         }
    . R7 g3 c* c& I: H
  15.     }
    - _$ g/ b$ k1 a% Y  L. c3 j
  16.     _quests.clear();3 j# m' `$ X0 a5 Y2 c
  17.     // Выгрузка скриптов.
    ! h) k7 |+ X  ]+ M
  18.     for (Quest script : _scripts.values())
    . i4 j9 r6 ]8 @- X4 h: B
  19.     {+ g! E9 i: |. A. T
  20.         if (script != null)- E; f! a. B7 V/ x3 P4 z4 O# ?( |
  21.         {* ]- S) W5 O3 S4 |! b% Q
  22.             script.unload(false);
    & s) r! b: _! w' g' y& I
  23.         }
    9 U! W4 T( q  ^+ A
  24.     }
    / L0 k+ b, _& n" R2 C
  25.     _scripts.clear();
    & E# M2 i# I, V
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    9 ~! K7 ]7 c$ x1 k; f
3 a/ n5 l, `+ a# ^2 T- c! c( d/ T
Метод report(); j7 z' N2 v' V9 F/ b% ]( J. B0 Z

) u" W) Y5 f9 J1 l& `. }% i
  1. /**8 @# x4 \# I8 S, ^6 v* x
  2. * Логирует количество загруженных квестов и скриптов.; R- H$ ~8 ?! J/ N
  3. */2 Z" O4 P8 q9 |  ]
  4. public void report()8 Z9 [. B9 `6 H9 f3 J& T5 `
  5. {
    ' Y. K9 j% `& ]5 A2 T2 i& A. \
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    - L8 ~- y8 E. K7 Q/ F3 Y0 y& E
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    7 w5 e9 I1 k& z- i& o6 H4 u$ {
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    & C: S" ^, m( C
: t4 F. R0 u/ p# Z
Метод getQuest(String name)8 m( R, @/ V4 |4 v! q0 ]) \
3 \2 B1 v" N. L7 ]% P* `
  1. /**  m: }7 `9 c0 ~! `" f) V& C* u1 r
  2. * Получает квест по имени.) W, p* [; z, N( X' S; ]
  3. * @param name имя квеста
    * @' I' d  \5 w2 j
  4. * @return квест7 L" a0 q/ ~; q: I
  5. *// V2 f& ^& j, f2 G! ?
  6. public Quest getQuest(String name). s5 S4 R) V" G& z5 w
  7. {
    6 M5 G5 Z5 a( X9 [  B! K# P, y
  8.     if (_quests.containsKey(name))
    7 N% F% _& u/ _* `" D. C; \
  9.     {
    * V3 o5 R  {* S/ I7 m1 j; p- V9 m
  10.         return _quests.get(name);. ^4 M# O  Q) C5 ^4 p
  11.     }1 b# @( Y8 q7 r" |' S  C
  12.     return _scripts.get(name);/ O0 B) s; j# @* j3 D& K* F" Y
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    - o# N) a, c& F7 _4 ~% R
, A9 t8 b2 W- f, `
Метод getQuest(int questId)+ R. n) ]$ O! P0 X$ L7 t# p

: y* D2 i* w& d) I! s1 t8 h7 v" x
  1. /**9 |: T8 Y/ Q* N0 y+ N
  2. * Получает квест по ID.
    . v6 v% D: V" m; ?, _7 n" v6 d
  3. * @param questId ID квеста8 u, y- x# w6 U0 U# ~) P- L" S
  4. * @return квест, если найден, {@code null} в противном случае" F/ C' q* K- L
  5. */; H  `8 g6 G+ W5 r1 W) l2 ?9 f
  6. public Quest getQuest(int questId)
    " O; h) l2 G( t. i6 @% a9 B+ W
  7. {
    8 ~" E& q( M  ^; t3 s) a; @* a; Z
  8.     for (Quest q : _quests.values())
    7 U( K: s1 T4 J. T% K3 z
  9.     {
    4 u$ x4 y6 w4 ]8 l/ }: m
  10.         if (q.getId() == questId)1 D' F4 T  E3 }( S# s) s
  11.         {
    8 K" X0 n* x3 `
  12.             return q;! |9 g' k; X3 ]
  13.         }4 z, X' x5 k4 @/ T- T' x# e2 m6 e
  14.     }3 N" y+ s( ~2 A2 F4 J2 U
  15.     return null;, Y  A7 j; U* L4 |$ B# n* W
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    ' r6 d, x4 j2 J" w* Q6 {9 n
2 d' k$ q  o3 |" C1 i
Метод addQuest(Quest quest)
, O4 j/ o1 V) v: R+ s* d& L
. v" E/ z5 ^6 r7 \- W
  1. /**9 W5 D; S3 o  l, X' H( P/ y
  2. * Добавляет новый квест.
    : \0 {8 a/ ?* ~1 Y
  3. * @param quest квест для добавления$ R) t$ L/ k& X& _, k* q
  4. */2 m  r1 z1 o# I  k- t- m7 K
  5. public void addQuest(Quest quest)
    2 [0 _5 m1 e/ Y/ J2 S! R, Z
  6. {
    % _, Q6 L4 [; L8 N9 L7 o
  7.     if (quest == null)
    , R! b) D2 P+ O* N, ]& h
  8.     {1 f* Q$ S  z3 A) S$ |6 U1 x; f
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");# L- T0 f- `# \( }
  10.     }
    " b6 y& n- l' t! `0 S# q/ ~
  11.     9 u- y2 \. x  i2 j; e# `8 {
  12.     final Quest old = _quests.put(quest.getName(), quest);0 G) g( Q4 @" O2 W$ S/ K
  13.     if (old != null)
    $ O, H/ a' @2 i8 ^" u' q' t
  14.     {
    / [- m6 }( L$ D% `
  15.         old.unload();
    3 }- R8 J2 c2 L0 e
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    # x( f: f  C1 g3 K. t
  17.     }0 C: @5 n2 u- ?) I" }
  18.     " h4 Y& b/ ]& E
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)$ _1 Z" Y* C& ?/ }8 H3 ]- k# W
  20.     {' h$ x( P# W$ G1 h
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();9 K* t# s0 m0 A* ^* H6 W  d3 N0 y
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");9 A- o# H% ?' i! I0 d
  23.     }& @8 j  X' C6 }3 v3 A3 D9 i
  24. }
    8 v% k. G. Q8 u
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.) G) h% d( n/ J% y6 u* p
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.7 {1 J( S/ I$ b. Z/ \( g0 _
# R: u% V3 a+ t% E1 O

& G. q. j, z) {3 V, `9 m9 Q) f+ ]( ]1 f0 r
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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