Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
9 m1 e. N+ R. R9 H3 k! H5 ^; z* r8 i6 @1 S( t0 g  s9 ^
Разбор файла QuestManager.java
! R* ^* y. ?9 \: h/ [5 F
; B' E" Z3 S- G! ]  CЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
1 v2 Y: `! I( {! W+ k% m4 ~Основные элементы9 V/ Q5 a0 m) f: p+ L0 s1 v
  • Лицензия
    5 c3 i# f. `: h0 e8 S2 C  r
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      * Y: c( y% _1 T, {: I# m
  • Импорты7 }# S5 L* \* F, t& X: R4 ^6 x

; S7 R* w: A/ Z5 T- qQuestManager.java — управление квестами и скриптами.1 W0 d  G9 X8 l% H' \' K: J0 r: ~
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
" l5 ~% s5 f6 V* {3 \7 r- C/ Q) j- u. }
: p: z9 @3 a0 o3 q* L
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
; o# i  V7 n0 ^' T% M: _1. Лицензионное соглашение  \9 {" o, B. X9 e: {
  1. /*
    5 @' V" W5 C+ A" u; ^" ~2 h
  2. * Этот файл является частью проекта L2J Mobius.  G4 P# r; ~! ?/ p7 c( {
  3. * 4 j  L% y# h: I: a. Y, _
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять& n& S/ `/ s% r: j# ?
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    5 x% t/ V# ?# }# z: F- R
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    % z: j$ t' k# C5 V7 d
  7. *
    9 _4 A5 M, s  A! D& ?3 W2 ]0 s* J- m
  8. * Эта программа распространяется в надежде, что она будет полезной,
    : T5 i% G% r6 L. Q- r5 q
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    4 b; ~7 n) {8 ?  i% h) \. n
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.; R, D. Z3 m/ R2 U/ y, h
  11. * См. GNU General Public License для получения более подробной информации.
    & X# M) d9 O* U( M' e* P4 r
  12. * & [" ]3 ?1 j7 h; x$ ~9 T- i
  13. * Вы должны были получить копию GNU General Public License
    7 q% d1 N4 B; u4 B, {0 e' N1 {
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    + p' d3 _6 v  w% q8 t
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.5 @! _1 D5 _: @. k# y
; \, Y( r9 ]2 Q3 i

, `/ i5 z" [+ B* r' G8 q( k2. Импортируемые библиотеки3 @  _, }9 S( q
1 y# D& I5 h$ ~+ h% p) r; C7 I1 {" J
  1. package org.l2jmobius.gameserver.instancemanager;
    5 d0 c8 b$ {$ @8 f" {# `
  2. 2 j7 c6 T  L- E8 ?1 h
  3. import java.util.Map;
    * _5 f& Y8 E# g& B* J
  4. import java.util.concurrent.ConcurrentHashMap;% I( ]. h) ]' w1 u
  5. import java.util.logging.Level;; Y: r7 k, D) O: i' X
  6. import java.util.logging.Logger;+ [: w& h/ `5 ]9 G3 c) }

  7. % D4 X7 X- n9 ]! ^
  8. import org.l2jmobius.Config;! Y2 |- p% e! K1 I9 z
  9. import org.l2jmobius.commons.util.CommonUtil;: @: c3 q( ]  |1 S3 P2 q" R  s* N
  10. import org.l2jmobius.gameserver.model.quest.Quest;3 g$ {1 p9 O( J9 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 — менеджер для работы с игровыми скриптами.8 r' o0 M! L' w  X6 q8 [& G
: g+ P/ [6 ^# `7 Z
3. Описание класса QuestManager
6 h3 |8 H# W, ~2 M9 T) j% p
  1. /**% g% ~  I' V1 [" C
  2. * Менеджер квестов и скриптов.0 F2 i: K  S$ d0 Y
  3. * Автор: Zoey76
    / o6 S. Z8 n& R; N
  4. */
    ; @+ [7 Y8 R& g
  5. public class QuestManager" \/ ^  W, o7 S. X2 g4 P0 g, u
  6. {: g' Z6 V$ r" I( ?! k
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());8 K$ B5 i: r+ a
  8.    
    2 W) p$ {1 i: x$ y6 X9 R% z7 x" r
  9.     /** Карта, содержащая все квесты. */
    # G* ^) |: l$ ^. ]% V( i, h7 P
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();5 M2 D# o& B' B
  11.     /** Карта, содержащая все скрипты. */: ?  H. @' O. Z
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    ' I6 _8 B9 `, u" {
  13.     : n1 N2 m2 Z& M4 a
  14.     protected QuestManager(); e4 p' n! |8 Q8 l
  15.     {
    4 K5 X6 H3 S& ]  l, i" g3 [$ x1 }" N
  16.     }
    2 a& X, j2 }! _# @% f9 @
  17. }
Скопировать код
4. Методы( m5 |+ R* ~$ `, `
Метод reload(String questFolder)( [4 A: n9 t! c- f6 e. Z& v; ]1 ~5 n
  1. public boolean reload(String questFolder)
    6 O% Y' b& j% d2 {" D$ b
  2. {
    $ L3 [. V2 U& x8 d' G
  3.     final Quest q = getQuest(questFolder);, M8 u9 @9 G: n5 ^0 S  T. ?
  4.     if (q == null)3 T8 P0 Q/ h9 K, ]! o& q6 A; A
  5.     {( G' p' Y6 A+ U8 Q$ ?0 p" n
  6.         return false;
    & p5 Q. f3 v. _+ |, O) o
  7.     }$ a, Q) ~5 f9 m
  8.     return q.reload();5 i; Y& b* I4 J' J: r
  9. }
Скопировать код
% k8 {+ f* G6 H, @$ T
! i9 ]8 K( G/ G- M% ?, R
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.; @  n$ _. x- }2 R* b$ Z
Метод reload(int questId)  P+ K/ @) y& Q: R5 c
# i: \$ _6 l; q# @9 Y+ O
  1. /**  T: `; w8 S$ F8 i1 r+ x# Z
  2. * Перезагружает квест по ID." p4 M. `2 f+ w) S4 i
  3. * @param questId ID квеста для перезагрузки
    1 `* ^4 \5 s, E8 x- d, L
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    $ {& W2 O  o6 O% i1 z* H" O
  5. */' s- M1 F% L/ r4 n! Z
  6. public boolean reload(int questId)( M- G- N. ?. ?
  7. {
    5 V* B( x9 v% e# K4 Y
  8.     final Quest q = getQuest(questId);0 M& |" W  @7 ~# X4 \5 y
  9.     if (q == null)
    # a7 ^. W4 D, Z" [4 x
  10.     {1 z* I7 w3 J7 {) _$ P
  11.         return false;& t4 _5 t: Q$ }; w* k. n* o
  12.     }* {# S) M. C* D
  13.     return q.reload();% l  k  Q6 X; Z2 K
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.  M) R$ E7 u* j! f; g* d; S
: s7 O' v6 ?0 w3 e
Метод reloadAllScripts()
+ q6 C$ q- J/ y
% E* U* j! j" c; y! F
  1. /**
    5 {( M, l! C4 A" {1 [
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.; H! X  H" \& K
  3. */8 d/ ~5 P) O+ Q$ _6 f
  4. public void reloadAllScripts()
    . G" Q' m& d+ j# ~, R: X5 J: s
  5. {: |# A& ^5 S! U, s/ [- E
  6.     unloadAllScripts();
    4 `7 ?& T5 R( |
  7.     - Y; e6 J7 b$ O  v& b4 q
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    7 ]. l  S  ~: z4 y& A2 t9 r9 Y# v2 ?
  9.     try. n) q2 z. U- z1 Q
  10.     {
    8 k/ ?9 |; k; e+ ^9 w% Q
  11.         ScriptEngineManager.getInstance().executeScriptList();
    ' i0 s/ k( p( V" A; S
  12.     }
    " S6 |+ X  l8 f# C/ `* t, H
  13.     catch (Exception e)
    " W; ?4 n( h9 B4 T' V. h) p9 N
  14.     {
    7 r9 F. d4 P/ R% Y# Y" H
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    5 L' P0 R9 d' ~* i% ^1 i
  16.     }
    8 }# u' i# v& J# c" d
  17.    
    - y0 e6 \4 g. ^
  18.     getInstance().report();
    5 j- a% C- g$ O8 Y, z/ h* J1 E
  19. }
Скопировать код
Метод unloadAllScripts()  t, Q) x, l9 h* k
- r' h; x/ s2 c* R3 E% Y
  1. /**
    4 F% j* }7 a3 H, @5 z& K2 ?9 n
  2. * Выгружает все квесты и скрипты.* S9 G& u2 S: b6 @1 Y/ x
  3. */
    ' E' ^6 o9 G+ _0 X, [2 a, ?
  4. public void unloadAllScripts()- e6 M$ Y6 Z4 ~9 u
  5. {
    ; X4 y% |# l+ u6 G
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    : T- h& K1 h  @
  7.    
    . X2 V" c; ?! O$ k
  8.     // Выгрузка квестов.
    ( j! Z) S5 j+ m: P- u
  9.     for (Quest quest : _quests.values())
    3 X8 X9 u5 \* N. ]
  10.     {
    3 T( L0 J( Q- G# S" i+ e2 W: d
  11.         if (quest != null)
    9 Y0 w8 `4 S( ^- L) ^
  12.         {1 b) k4 ?, F' J$ L. |1 m$ V  e
  13.             quest.unload(false);2 x6 [; u) D* |6 F; \. ]
  14.         }1 k% g/ A0 L& q$ Y3 O
  15.     }
    ; {* F+ M8 }5 ~0 V1 Z9 X0 B' e
  16.     _quests.clear();
    * \0 `! b# w( E7 P7 k
  17.     // Выгрузка скриптов.
    4 }; z) _9 [, |/ W: d$ S9 S- l5 ^
  18.     for (Quest script : _scripts.values())
    ! k- X, ?! `% |
  19.     {
    0 z9 A( U( l" V8 \5 z3 ^8 e
  20.         if (script != null)
    & d5 `# @7 K& S  F# U5 ^
  21.         {
    - A# I- E1 N- R; ^
  22.             script.unload(false);4 o( ?( h1 ~6 t- |4 A2 O: c
  23.         }
    ' y$ W5 ]: ]& r/ e+ B# }: S1 t9 \
  24.     }
    + F# B$ u0 h* }  s
  25.     _scripts.clear();
    + L) m: O1 h' D9 A/ b# s0 U
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.. C7 T4 k4 _& b$ O1 i. p

3 R9 J  B5 Z0 @4 z) K9 x6 {0 d7 jМетод report()
  J: S# B6 E' A% P3 m' ?2 c% L7 j* R$ p! t8 s" I: k" P
  1. /**
    $ e$ V4 T' v, }2 I
  2. * Логирует количество загруженных квестов и скриптов.5 j  |# `+ g1 B3 d# G- g' X
  3. */
    ' g1 H! W5 E/ P$ ?: ~! }
  4. public void report()
    & Q0 i' v7 u- S- j( T
  5. {
    7 Z6 O2 n& U& c2 F
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");) i+ A, ~/ Z7 c* y- c
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    % r' ]4 x! o8 F# m% q
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    ( H) G' H4 `5 {: X9 _, k8 ~
8 ~/ G# z7 Q% j* Y, s
Метод getQuest(String name)# _' N5 U3 X! ^% a8 ]  h: p" `
9 K! n) X8 e( T! ?. Y
  1. /**% F0 m& k  X# M
  2. * Получает квест по имени.& s: F. k, d6 U. Y/ ]! k
  3. * @param name имя квеста
    , f/ F6 i% W- r2 |! [5 \8 Q5 W
  4. * @return квест; O# m: K" c" e  \+ p. [9 F. h
  5. */
    ! ~& G; K. u3 R$ x4 q6 o% ]
  6. public Quest getQuest(String name)
    9 \9 f) b: B' z) b; M8 t- _/ k, l
  7. {3 b) |+ [+ {5 |
  8.     if (_quests.containsKey(name))8 J, _7 g+ x/ S* x3 c' K. P  Y" ]
  9.     {
      A3 T2 C- x. O* K
  10.         return _quests.get(name);
    : T8 Q6 C* ]% k8 E1 N" t" Y  q
  11.     }
    " m3 F! Z; w) m. T4 [
  12.     return _scripts.get(name);  M+ V; p0 o: O
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.: Q6 [# t  _* [( ~5 }: @

  \! O# W* \8 g5 s" xМетод getQuest(int questId)
2 }: R& \/ X9 W& h% ?+ B
  c* |4 E( Q* w
  1. /**/ `& b: z1 A0 x6 {, r8 S4 j
  2. * Получает квест по ID.( Y6 N: D( w1 H& R
  3. * @param questId ID квеста
    " {' F& y0 ]( r. N1 d) {* K
  4. * @return квест, если найден, {@code null} в противном случае0 i; q9 G) V0 n0 e
  5. */3 d$ c: W' @& {  ?5 Q
  6. public Quest getQuest(int questId)- V5 x3 ?0 [5 ~2 G7 c- J+ L. `
  7. {" ]. G2 M5 M: q6 C3 _1 c) j
  8.     for (Quest q : _quests.values())
    & S* a3 ?; a% o9 o( z8 `2 a
  9.     {- v+ u! `; |6 i( x5 ?
  10.         if (q.getId() == questId)
    $ r3 @+ Q4 M/ O1 h# w: q8 U# q+ ]/ A" i
  11.         {
    3 B8 Z8 x% U/ x7 l
  12.             return q;
    / ]6 z  t" y1 X  ?2 c0 L, r0 s
  13.         }
      r) g% I& ~3 d
  14.     }3 A; a6 t1 N! s/ N8 `/ [4 }/ V
  15.     return null;
    ( l+ L, s* w/ c9 Q8 v1 x" j
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    : _) }" X  f4 _
0 _. E, N/ Q( S
Метод addQuest(Quest quest)% t+ _" B& z+ d& D0 I* E
- [9 j3 h8 X; ~
  1. /**. T9 c2 W" M) `' m$ z
  2. * Добавляет новый квест.
    9 @- ^( q' A2 _! r$ Y6 }! @
  3. * @param quest квест для добавления
    % p, \" j; u/ W3 i7 }
  4. */  j# d% M7 ]* o) u/ Q) y, T6 F
  5. public void addQuest(Quest quest)/ u5 m& [6 @3 I" ~" O+ ?9 X6 P
  6. {1 @: v! U/ G3 U5 O" I8 k+ H
  7.     if (quest == null)
    7 V  s# _. q) O: I) Z
  8.     {
    2 O1 `: t) S* }2 D9 s
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    - e- o* H5 J! D# ]' ^, Q9 o
  10.     }
    ) t  p. H3 D; v0 [
  11.     ' R9 p! G5 e1 v# `, @
  12.     final Quest old = _quests.put(quest.getName(), quest);3 e& W; y# ?# h4 U+ ]
  13.     if (old != null)
    & O4 q6 ]8 C8 G1 W4 @" O. F5 ~
  14.     {/ [# ^& p0 G0 C
  15.         old.unload();( X/ m) \/ L1 J1 n2 u, I
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    $ r6 D% N( |7 c: f
  17.     }
    ! {- e& u, B3 h8 l
  18.     ( K$ Z1 r0 a' f  ~! W$ H; I: b8 }
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)0 `) o$ C! @) N- t# g4 ?
  20.     {
    / e. G$ T! p  P0 J
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    , H. s/ m  n# O) X
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    4 g9 b  ]! A' a; a4 n
  23.     }. T* q: V" \+ c- k, Z, Z1 ~2 g
  24. }$ s6 b* l+ z$ A& w! f( D
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера./ O( p8 Q/ ]% f9 q
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
# e$ R/ T3 E6 p5 K
, C/ A6 z# x8 W5 D6 X0 M% k& g8 t! Q% R. @. e( W

" S0 H! y3 ^9 H
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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