Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
$ a3 Q) F- k$ ~9 T9 m0 Y+ [; Q6 H5 c! H# h$ A
Разбор файла QuestManager.java9 u3 W: S, D0 s5 B4 \( v7 o
8 G. w6 t0 V/ h. H
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.! [8 a) Q# E- s  L: `1 ~1 K
Основные элементы. S: B" U4 j- C7 f, z( f2 G1 u5 b
  • Лицензия2 z5 n  g" k' {; L
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.* R# w. c8 K* m. x. J
  • Импорты
    1 S# d+ t' |, S. H4 y
5 A! i8 d8 |- I+ a9 [
QuestManager.java — управление квестами и скриптами.
$ B# `0 _' _: aПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
% f6 m0 M  `: b( }; j$ F" O: T. E+ E' I2 ~/ W  G

* T: |5 l) a( W1 t% K7 IДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.& W" G+ O% ^" f7 U' c/ Y" b
1. Лицензионное соглашение
8 _+ m& D# l( u9 U0 X4 A$ a
  1. /*
    % S0 L8 }5 N6 ^3 r; l4 C3 c( o2 ^
  2. * Этот файл является частью проекта L2J Mobius.
    " i& \- d) c& w( `5 b
  3. * 2 E+ o9 b( N4 a& M6 D
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    8 h; f: [' y: e6 i. p: z- j
  5. * её в соответствии с условиями GNU General Public License, опубликованной* N, B* A- N+ @. m6 s( O% f! f
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    ) K) Q* x. h& T* {6 |4 q
  7. *
    5 g+ ]' c0 W) q; V
  8. * Эта программа распространяется в надежде, что она будет полезной,$ U* X6 T; q) R8 M# V$ |- U
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    4 |. S- z* a& |/ X7 U' k7 L
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.) G9 H& R* L) G( Z
  11. * См. GNU General Public License для получения более подробной информации.( R$ s! W5 P4 x
  12. *
    ! K; [% |% k$ Q$ [- ]( {' Z
  13. * Вы должны были получить копию GNU General Public License9 d  }* E& \9 Q7 X
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    ) q) j( g1 C7 K7 [" I4 j; V. B
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3., S4 H! [. F/ {6 n

7 K: i7 k6 B9 S5 J4 K" O) N8 p: }6 Y/ Q4 j- b! x8 `
2. Импортируемые библиотеки
2 `$ O8 L  q+ ?+ e+ N. h+ {
& ]) t/ s7 P; i2 [, k2 T
  1. package org.l2jmobius.gameserver.instancemanager;& Q$ i5 }/ n0 [: a1 ?3 ?6 Z

  2. 9 m0 L' W- X; ^7 T: f
  3. import java.util.Map;* Z1 n- E5 m" }7 C: O" j- |
  4. import java.util.concurrent.ConcurrentHashMap;" B& {2 l' g$ d" P; ^2 b
  5. import java.util.logging.Level;
      \( `$ K. A& X( O/ u& S) ~! T
  6. import java.util.logging.Logger;
      A* N. X# T! a. F3 P; B

  7. " H0 {9 g: Y% v5 u
  8. import org.l2jmobius.Config;+ ~( k' Y5 `3 a% Q9 }7 P8 C2 L  V5 D
  9. import org.l2jmobius.commons.util.CommonUtil;
    ) w" D: ?7 A/ N7 R# r* J" ^$ q6 P
  10. import org.l2jmobius.gameserver.model.quest.Quest;/ ~7 t1 q  D& [1 G3 c1 \
  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 — менеджер для работы с игровыми скриптами.
1 [, i( C3 ?- U+ M) ?  R% z
/ g5 D# p  C! D- A5 Q3. Описание класса QuestManager0 [4 V4 s  `+ p/ ]
  1. /**, J2 |7 |/ P3 }4 u. c3 c
  2. * Менеджер квестов и скриптов.
    9 t2 Q" A! O5 J$ r! O. C
  3. * Автор: Zoey76
    " F2 n) g6 P+ S% n. a% M: u. J1 E
  4. */6 V9 X! o2 G9 O$ B7 l7 L3 ?
  5. public class QuestManager8 E1 R  M, ?7 `
  6. {8 v. L5 \7 r2 S0 B$ I+ O
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    1 {( e# L5 D$ S( O, h2 V9 l1 _
  8.     . z1 Z- V- q0 \8 n* Z0 P& j! B- O: r
  9.     /** Карта, содержащая все квесты. */
    ' V  v5 M5 y: R9 C/ t% ^
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();$ C: C2 T7 u6 H1 c* B3 _
  11.     /** Карта, содержащая все скрипты. */  J/ o3 X- X# X- A/ i4 l. C
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();7 N4 z2 z2 o/ b: U
  13.     - z% Y1 m5 D, x6 X
  14.     protected QuestManager()
    # I0 A$ V# ^) F8 W- m
  15.     {* z: g, ]; F! C6 {
  16.     }
    " H8 ^  z8 l( r  V0 n1 G
  17. }
Скопировать код
4. Методы
0 C/ I- x1 F) XМетод reload(String questFolder)5 }6 T5 A+ ?; j4 b: X3 K: g, _. {
  1. public boolean reload(String questFolder)( j) }7 }- Z# f3 a' g
  2. {/ M) ~+ r% c$ F) c
  3.     final Quest q = getQuest(questFolder);
    ) {1 c1 @' A, u; ?" O
  4.     if (q == null)3 I. Y0 D0 |) h
  5.     {
    % V* o3 K6 P" x$ |9 _# u
  6.         return false;
    ) m5 J& n! u2 L9 j* E
  7.     }' a4 u' i! z% R+ H+ \9 o
  8.     return q.reload();7 \. f9 S9 |5 C
  9. }
Скопировать код
1 q+ W$ Z3 X7 P- E

. A- B' G5 P% aМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста." s: u, x3 b5 S7 N
Метод reload(int questId)
  y. s8 W( j% z) f; d" d7 i2 K
! y2 X/ w/ k  v" S
  1. /**# A( ~6 L; W% j1 X( J3 ?( J3 M
  2. * Перезагружает квест по ID.; y: h. j" }5 R( J3 m5 a
  3. * @param questId ID квеста для перезагрузки
    $ q2 l% q$ a) K3 C* |' I
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае1 Z1 v* j, Y7 |0 K9 M3 \
  5. */7 w: w5 o# f) R
  6. public boolean reload(int questId)
    : w) |$ V& l- B  `: e, D) g
  7. {
    7 V8 \7 o5 m$ [) f
  8.     final Quest q = getQuest(questId);
    0 T4 U+ c8 f; r! N
  9.     if (q == null): z8 [6 v/ _, n# V
  10.     {
    3 }1 `7 `; T# F2 _2 s
  11.         return false;
    2 a8 g- q) l$ h$ e2 y& t
  12.     }! z# l' y+ T4 K5 i$ u  q/ a8 Y& o0 o
  13.     return q.reload();
    * Q& C0 J+ n: @% N# f
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    ) G9 f/ x3 m0 O# r% L: q. Y
' N8 _" r$ J" d( H4 K
Метод reloadAllScripts()
8 d5 o- \+ [$ J* G6 G
/ B: }+ |# [1 D' b& g& }* S
  1. /**( r8 H) F3 U* {, v. n+ ?. `' X
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.; F2 O4 l  }; r3 q3 Z
  3. */
    ' M3 t1 K  O  |" G9 L3 W
  4. public void reloadAllScripts()
    2 z! k0 i9 L  Q/ b" ~: Q' w3 U
  5. {# u0 h" P  k. p, f
  6.     unloadAllScripts();
    0 w  u: q4 p! F* o6 S8 e
  7.    
    ' G: ?9 j6 S! |. U* l1 J8 b2 \3 ~
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");3 K) `7 {# V- W
  9.     try# f$ ]/ Y( \( Z. A$ y/ q
  10.     {  Q! W- E# G# ^& N& Z4 B+ t7 a
  11.         ScriptEngineManager.getInstance().executeScriptList();( ?* J8 p; O! ]
  12.     }
    0 q! G1 \  W9 E. {, c
  13.     catch (Exception e)) l* u6 n) s8 H; p, b
  14.     {
    9 n5 o5 S( s* R/ k/ O8 X# v: F$ m
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    4 Z0 f! ^1 S8 @. \4 u* T8 J
  16.     }' e0 ?2 Y; @8 X3 [: T1 _6 C' v: V* h
  17.    
    $ ]" S5 z5 j$ z6 T
  18.     getInstance().report();
    7 m. q# j* F) t# n
  19. }
Скопировать код
Метод unloadAllScripts()2 {7 I' M/ N5 a: j8 G- H1 Q2 q' I

* i9 |/ Q, f  `6 n4 v1 K
  1. /**; Y- x0 |8 l3 n& j$ G4 H
  2. * Выгружает все квесты и скрипты.  s  d2 p* \# y$ \! Z2 l2 n9 C# u
  3. */6 t7 a; m) H5 v
  4. public void unloadAllScripts()
    7 |% T+ g+ ]0 M, D
  5. {
    8 a7 n$ f# R4 Q! L, E: b( v
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");  B: O# m3 _) b6 w- @/ ?' i4 R/ v
  7.    
    4 d6 P5 c3 C- ^  P# @
  8.     // Выгрузка квестов.; w0 R" I6 ?4 T7 a& r8 ]0 G7 h
  9.     for (Quest quest : _quests.values())' q% Y1 `: S- Q6 {' F
  10.     {- c9 ^- M# u+ Q3 ?( U0 E- n
  11.         if (quest != null)- c2 D% v4 H( _; Y5 P, G
  12.         {
      g3 ]) g) ?$ R$ a* P2 z4 g: A
  13.             quest.unload(false);' d8 j! |, M0 U1 j$ t
  14.         }
    " I' x: S7 z( O  O0 m$ G
  15.     }
    8 W' H; h3 O/ Q! s! o
  16.     _quests.clear();$ x/ l: M4 G) L4 d' d
  17.     // Выгрузка скриптов.
    * `4 ]% f  _% O9 b" W
  18.     for (Quest script : _scripts.values())
    3 x" A# G3 U6 P2 ^- B0 ~# a" ^8 }
  19.     {
    " {9 q$ D" T9 I/ }
  20.         if (script != null)  J6 g# L* d3 H4 B9 n1 a
  21.         {7 l9 X* L& ?: v( W+ o
  22.             script.unload(false);
    ' P1 A) o2 D' R
  23.         }2 D4 k8 x" F! Y, h' |. V8 r6 {
  24.     }
    ' b# b: S6 a- F6 g/ S" L2 X2 f8 k, E
  25.     _scripts.clear();; t. v! u4 l$ O, }- j2 \+ @
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts./ [' k0 G) e7 [$ w2 O7 f8 O
: L$ q2 F$ F2 m8 ]
Метод report()
+ f4 v: Y, A7 D- T; O" f# Z4 R2 H8 d, H8 N3 u3 [8 S
  1. /**% v$ \5 M+ P9 Z2 X' S6 k" Q
  2. * Логирует количество загруженных квестов и скриптов.
    6 P5 X' B( \1 P) l3 L% u% s3 Q
  3. */+ [/ c5 o. e; a0 @3 q7 [
  4. public void report()
    4 y* P8 a# o( o! E2 x* X
  5. {- L9 a$ j, R' S
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    ' Q: d. w' m( a% J4 Q# H
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    4 S- c9 _( ?3 o4 t; T( V, \
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.* c" r- b1 D! `9 o* |; ^/ Y2 ~: T! Z
0 ]! a! E( d" t
Метод getQuest(String name)5 [+ V* n( ~% f

8 ?4 {+ j2 |+ x, R8 T+ M
  1. /**$ o) R1 n6 i& R. B& @& O4 O; y% |
  2. * Получает квест по имени.) i% q+ i4 `5 f' ^) j$ f
  3. * @param name имя квеста" l) l3 b8 I2 ]1 l
  4. * @return квест! z6 {% V2 T8 h1 u! T
  5. */
    . J: I( T: l& f% ^/ E1 g$ A- n
  6. public Quest getQuest(String name)
    8 h, X0 ^/ j4 {1 c
  7. {
    8 q3 e" B( P) F/ W8 j1 e
  8.     if (_quests.containsKey(name))
    ; c$ g, _% S  X$ h' V! n6 g
  9.     {
    9 }& T8 k, C& p2 @4 s
  10.         return _quests.get(name);
      b0 @' ^- q9 b" T3 G$ Q& ], U
  11.     }
    : s8 p1 J" X! B* L" B) ^; D: I$ g  V
  12.     return _scripts.get(name);6 B4 D1 _, s; v3 ]/ U- J: n
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    1 F2 i; }+ t: h# G$ d5 V

6 s& _& [/ a, U5 X- S  |Метод getQuest(int questId)
, D( S. X5 b7 t% g4 M* j0 R9 f$ E5 Z2 X2 P1 q. f3 A2 z  \
  1. /**  _1 T7 O# e) o# N: v1 f* x6 K  P, ]
  2. * Получает квест по ID.
    1 _2 Y; D( k5 V0 h
  3. * @param questId ID квеста* ~2 {/ b  r4 g5 r( B5 g4 g
  4. * @return квест, если найден, {@code null} в противном случае
    0 J2 R9 C; s5 W: H
  5. */
    / ~5 }3 K. `3 D3 p* D2 M
  6. public Quest getQuest(int questId)
    2 f) U8 a1 [& P
  7. {! J8 U2 u- L, {' S5 v
  8.     for (Quest q : _quests.values())- K) X1 C+ |) M" a% `' k7 J+ B
  9.     {" G1 z' i; i( {; W( |* t$ c* U
  10.         if (q.getId() == questId)
    : u" W$ d5 }% a- C
  11.         {# F/ g2 W& l2 x3 B% {& z
  12.             return q;
    ) ]& H, N7 V0 x6 b3 w9 e
  13.         }
    0 O/ d, i0 p$ F' a. U
  14.     }! E, G  G6 H: F' K  k3 X
  15.     return null;' S; v- S- A8 p  e8 U
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    0 K* v/ ?5 y6 X- {0 ]9 g# b

8 I. f, N# ~, m$ }% u4 TМетод addQuest(Quest quest)
$ C5 R1 R: n" M/ o* {5 h5 D+ z# c
  1. /**! Z4 k9 E) y  a4 i! @
  2. * Добавляет новый квест.) k; h) b8 w% i( U5 S; {3 x
  3. * @param quest квест для добавления- ^5 }( @8 Y$ v8 T
  4. */+ |! s; w% d* p6 N
  5. public void addQuest(Quest quest)8 ^8 v1 N9 W/ ~0 o7 Z; O, L
  6. {* j. k5 p9 l) d
  7.     if (quest == null)- B9 i2 F5 g% B( `! v3 R8 T; n1 l
  8.     {
    0 ^9 m- N( I$ X9 k
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    ' N: j7 U6 C& j$ b1 ~6 J2 \
  10.     }7 x- W" B9 P1 y5 h8 ?
  11.     9 I) ^* B) W8 z7 }+ Z+ @, |. |
  12.     final Quest old = _quests.put(quest.getName(), quest);
    9 ~0 i9 \, n( A; n$ D6 E$ ^& Y: }0 `
  13.     if (old != null)
    , a  D; e6 q. n9 @1 o: N7 T
  14.     {- F# |& _3 O  V1 p8 _
  15.         old.unload();9 w% A! u, q( W- r% B" J
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");$ a- H- X) V2 |% s
  17.     }+ W$ {; Z9 {0 H- u0 t3 u5 T9 ]+ L
  18.     6 ?/ p5 V, \0 t% Q( v. r2 B
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    9 V2 K! q$ f$ A) A2 N6 i( P& p
  20.     {
    + l$ @$ e  e3 ^) [1 Z7 _
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();+ `, Z# M9 ^: K' h, N
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");( Y, L) \( y/ }. B6 G( c  m
  23.     }8 k1 W* Z" ?) w6 H
  24. }$ B$ t8 E' ]$ C+ Q" g* @4 j* Y
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.& `$ j/ ?/ V. R9 M) x$ a
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.! k- h; o9 J7 ]
4 P0 J9 T4 p; I5 p" a$ x
9 h" @( y) K: V  Q9 ~* ~

/ {3 E1 O! F! |- c# S% O9 k  h
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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