Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius& x7 I/ R" u1 X: n6 C2 Y9 M6 ~

1 k; [$ E0 q+ ]. t+ n: v/ sРазбор файла QuestManager.java; E+ [/ f' L9 K% y, [% Z1 w: N; Z( |
* O. I9 x, Q9 E* P1 W' i
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.' Q) b  i3 Z. H1 F/ i
Основные элементы" G) i0 R2 n2 `
  • Лицензия' W. G: C+ F. ~3 O! l
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      6 C( f3 T# m1 {9 [
  • Импорты
    & l& {5 ^: e( A+ ~8 l

; |% x& C( G) z! f' E' BQuestManager.java — управление квестами и скриптами.
& K$ J. ?7 c7 ?/ R/ Y* H- Z6 cПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\3 s2 U9 ]) |8 b4 o; i9 }% I
0 F& D) t4 s, l5 X: K2 N1 Y
2 U2 D7 g& e: K5 v) _1 n4 k
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.5 ]% X2 r7 e5 L. w
1. Лицензионное соглашение
- }5 C/ ^% x  D7 O8 E" P: `
  1. /*% g0 M2 L  r! j0 ~/ j- A
  2. * Этот файл является частью проекта L2J Mobius.0 N) a, R# n4 L$ f  O6 h
  3. *
    7 U4 o$ g4 f+ y# X; _9 b
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять, E4 |) R: U" J3 D+ ], H# _  c! W
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    7 g" z5 @5 T9 \2 y; }8 D/ |
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.8 i/ n$ R8 C9 ?3 f
  7. * 9 @0 n5 O# t: R  s2 n' R5 L" ]: P6 z
  8. * Эта программа распространяется в надежде, что она будет полезной,+ D$ R8 Y; \* ~9 Z$ q0 f
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии( \* e2 O- b; ?6 j3 k" s. W. f
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.4 X, G$ [  v9 c/ m# p! @9 ]: H, o
  11. * См. GNU General Public License для получения более подробной информации.
    " w' r* Q4 G. h. G$ {
  12. *
    # u% q* j0 X4 E! D0 }( X
  13. * Вы должны были получить копию GNU General Public License
    0 |6 o* y( q3 p- h
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    - B3 b- U5 R' j- a2 Q
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.% K8 q7 ~, ^: ^; g  o: D7 x
& Y: i! D+ N' m  e8 S! W

0 g+ G0 }+ ^3 f3 g" L2 u2. Импортируемые библиотеки
) t8 D; R; n: ?" ~, \0 V
! N# A7 i0 [* ]# d! T/ h, ^: I2 Z6 t# ~
  1. package org.l2jmobius.gameserver.instancemanager;
    9 n4 |1 e) t# G: a# \, I
  2. - l( X7 X* o: X4 v3 R
  3. import java.util.Map;4 R  a4 ]" U# ?4 \8 o
  4. import java.util.concurrent.ConcurrentHashMap;3 U5 f$ T4 K$ P+ U
  5. import java.util.logging.Level;
    : ]; G/ \. A& n. n& J* e& O' b
  6. import java.util.logging.Logger;' }: ~# W- B& P( i' h8 Z2 _- ^

  7. : F$ y1 g$ a0 P$ ]1 c. y6 |
  8. import org.l2jmobius.Config;
    8 b" Y" ~& ?( ?0 s3 @- Y
  9. import org.l2jmobius.commons.util.CommonUtil;- `5 ?( z  H" `% d; D* W* w
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    : Z  c  P# G" l
  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 W6 X0 Y% R6 R4 w1 J. z8 ]2 b, ^  s& H
5 ]! j- q3 A9 Y: B9 {+ [" X3 s3. Описание класса QuestManager
4 t7 @3 F, `: c% n( C
  1. /**
    ' n0 ~2 \# u4 \5 _; R1 K7 o
  2. * Менеджер квестов и скриптов.: n: V4 b2 p0 w$ _# W% c
  3. * Автор: Zoey761 s: Y. O0 ^" t4 B2 h' l* ^
  4. */* p1 `) G5 F4 Q4 |! C1 i5 q
  5. public class QuestManager
    6 d8 Q4 y) y8 n/ L
  6. {" V. J" ]2 J1 a: X9 k0 X$ L
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    2 O6 \7 X8 X( v2 M
  8.     8 A" J6 m/ ~2 p5 O8 j
  9.     /** Карта, содержащая все квесты. */
    ( o/ J  F* W; Z. F- X
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    2 e! S* F1 t* M% {
  11.     /** Карта, содержащая все скрипты. */
    - @7 E! u) D+ F2 q/ U6 T6 m) [
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    7 L% c) i0 {3 M  Y$ Q/ i( P
  13.    
    " l7 k- |) U) j! [$ ^: K
  14.     protected QuestManager()5 [, L9 C- C' O2 s9 e: ~* x$ c& w
  15.     {8 f3 r% j1 M/ S  A
  16.     }8 e0 F9 h# u& F$ U( d  V
  17. }
Скопировать код
4. Методы
( ~" l# D( R( AМетод reload(String questFolder)3 A0 z) k  N2 l5 q3 z6 N
  1. public boolean reload(String questFolder)
    0 W7 N- u  p! q& A* T/ D
  2. {
    . q4 E3 L$ w' v( Y( s
  3.     final Quest q = getQuest(questFolder);8 K: a6 L- _, ?
  4.     if (q == null)
      D, C) e8 O5 b, G5 t
  5.     {  u* |; r; c8 x8 ~1 j: x
  6.         return false;5 i& S1 I0 t$ N; c9 _
  7.     }
    8 }5 O0 M5 x& ]3 l- l
  8.     return q.reload();
    ; ]7 _1 J* k, x  G8 w
  9. }
Скопировать код
. z; t" o3 G/ |! i+ ]/ `! y7 ?) _8 a

; g. A' W: A# _+ s9 l" \1 JМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.7 G! t7 Q. M" Q* C8 U# R. w" D
Метод reload(int questId)
# j1 N! D9 D- }# p1 \/ b5 k4 Q8 [9 q& m& O% t3 }
  1. /**
    + W9 y; f6 l& h
  2. * Перезагружает квест по ID.
    4 K4 W2 [# d, {2 X3 {1 J
  3. * @param questId ID квеста для перезагрузки8 Z1 Q! h4 K+ Q+ s0 B
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае, P( X: }6 L' T) H) c; L( l8 \
  5. */0 ]' }' S+ s) P: T
  6. public boolean reload(int questId)9 [+ P9 x: O0 x' A
  7. {! x% b8 n- K. Q0 |: L
  8.     final Quest q = getQuest(questId);: Z% ?* t; v) m% ~; V$ N+ A
  9.     if (q == null)
      v1 F# N+ P% Z. ]' i
  10.     {& y# Q; j. x8 C& _
  11.         return false;
    ; G7 W# w. n& }7 D
  12.     }# R- I9 c* [/ j  o" g9 x
  13.     return q.reload();* g/ g4 E$ v# a8 H0 t" X" p8 j
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    7 G  b1 \' X! W* o# R" s: A! X
' ^" H" ?6 a( O
Метод reloadAllScripts()
9 \- h) Y5 W5 ~. R1 y7 l( i& X: _* v, t% c  ~: u
  1. /**1 r" k! _( M- H8 P
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.( _# T; z3 n' u. P! I
  3. */
    3 e6 Z* r9 M' t- X
  4. public void reloadAllScripts()
    ; h; H' B# ^) @$ I! o8 C
  5. {7 F6 u; h3 x  z/ N
  6.     unloadAllScripts();
    4 o8 f/ G. e0 e  _" G
  7.     # d6 G) O$ h* o3 P% f3 Z( i: ]4 m8 @% O
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
      K0 v& _3 b' y
  9.     try
    ( p9 e* g1 v1 Y. Y! I: G
  10.     {7 N9 l* p9 N7 Y: {
  11.         ScriptEngineManager.getInstance().executeScriptList();
    0 H2 ~! f  W8 W! s: G2 q
  12.     }
      v* M8 ~! F2 m9 A) a. w5 d
  13.     catch (Exception e)) p$ ^/ c& b) q; t# K
  14.     {
    ! h0 n. U7 `8 K2 H  c# J/ e
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    1 \* _6 ]2 P( M) i7 d% V
  16.     }
    " F0 W  n% f5 S5 w+ x' ?# U
  17.    
    : O) u7 F' T" y0 R/ C4 l# M
  18.     getInstance().report();
    7 M9 z  o: ?- s/ o3 W
  19. }
Скопировать код
Метод unloadAllScripts()' b) d# \9 g5 W" t, Z
* G2 Q3 j' z* A
  1. /**5 \/ l) p& P; |  L' s5 \. s! \7 `
  2. * Выгружает все квесты и скрипты.
    1 J; g, x: E' c0 o$ X5 M" @
  3. */! s/ J0 S" Q- \3 W
  4. public void unloadAllScripts()2 `4 l, m, G! z
  5. {
    3 ?4 |) K' Q( o6 ~" t
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");  e( S1 T/ b9 a4 T' u
  7.     9 }  `' t5 L- x" W
  8.     // Выгрузка квестов.7 Z. [  c  G2 y
  9.     for (Quest quest : _quests.values()). Y. U1 D6 w' U; k
  10.     {% P) z5 D6 x( l4 T
  11.         if (quest != null)
    & @6 e+ h' e4 ?* a' L! e
  12.         {
    ; Z/ `+ _/ `$ L! d2 S0 @
  13.             quest.unload(false);
    ) P0 i4 Q7 l" S- c; p% q2 y
  14.         }3 m2 J: m9 `' t0 z
  15.     }! T5 j* R) T6 O
  16.     _quests.clear();
    , r4 b8 C; N1 J& |6 F/ h
  17.     // Выгрузка скриптов.! X1 s' ^3 X. b8 o  R& m3 _% m
  18.     for (Quest script : _scripts.values())- a' x9 l, b/ l/ [
  19.     {9 x+ {% v) P, V% z) r5 d1 O
  20.         if (script != null)- h1 _0 Q& |: r2 V. i# R
  21.         {0 A; o: f, }" w. x; Z( [
  22.             script.unload(false);
    6 a/ q5 Y# {: @' N
  23.         }
    5 l( a# q3 {; u5 C
  24.     }% c- _: h" J: _  h6 K
  25.     _scripts.clear();3 \+ k5 J: [  F& A+ I( f4 w* V
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    9 \0 H7 Q% T) v

( R0 U  P+ n# F, }! y. `Метод report()( n0 P( Z4 l0 d% r2 d5 z* K" N# g
% n; Z0 w' w! }0 ~3 {
  1. /**1 M1 |7 \4 J( i7 {2 q! t8 @+ `' R
  2. * Логирует количество загруженных квестов и скриптов.
    ) j5 o8 u! S) W+ m+ g6 C& r
  3. */
    # v7 F2 `& x5 K& h8 I, T% m
  4. public void report()
      ]) v" S1 I  H/ W9 k' }: ]. E0 m
  5. {+ S" K- L* m( ]  S$ b: a
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    ' o9 `- H/ }9 m. W3 P. `. {
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    / I5 n$ j$ D# E4 ^% \: F
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.) {( s8 b+ f& L4 r
  C0 W; {7 j5 p2 z
Метод getQuest(String name)
: x( x& H6 O9 h, C# _% I( G, R' d% j
  1. /**
    # a4 T8 S2 N$ `' |. v* D
  2. * Получает квест по имени.
    ' B% B2 r& j: ?' D8 y1 @! z
  3. * @param name имя квеста
    / o' M7 c7 k& T2 [* G2 X
  4. * @return квест) ~9 d% R$ ]+ t5 r& W
  5. */  J# C( H0 w* a
  6. public Quest getQuest(String name)+ n  D8 L7 `4 K
  7. {
    $ w- g% y; @% Q; S
  8.     if (_quests.containsKey(name)); h+ w8 {2 W" y" v1 p
  9.     {
    % W/ c0 [, I* X) r7 e  T
  10.         return _quests.get(name);
    3 a' W- j; s3 m" j) I
  11.     }
    % h$ E* k. p3 Z% G/ |
  12.     return _scripts.get(name);
    4 P# N3 G; w2 f8 m. N4 j; N; R; X
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.4 \6 E; c1 u" f% Q/ H+ A5 @

# g& }- D! v% o+ i8 J3 lМетод getQuest(int questId)
7 W) h8 f# K6 E/ U1 Y
8 Q9 H8 A9 }) s, R! M3 C; ^8 A- T
  1. /**+ M! f7 m5 ^( g  }/ Z# A- C
  2. * Получает квест по ID.
    7 V$ F* W8 _) n8 A! L' T# e
  3. * @param questId ID квеста& J3 \! _9 O/ K# S5 Y0 h' e$ v2 h
  4. * @return квест, если найден, {@code null} в противном случае
    ; F+ f& M$ q0 }# m( k. k
  5. */
    9 {( e7 }2 l  o& ^2 `4 q4 ?5 m
  6. public Quest getQuest(int questId)
      j5 K2 A0 E- Z4 |4 t% ~* T
  7. {
    & X( ^0 N8 q, L. @
  8.     for (Quest q : _quests.values())
    0 V& E0 {0 L6 O
  9.     {0 O: N' `0 h7 J
  10.         if (q.getId() == questId): B" I- t, q4 ]) R- u
  11.         {- X6 i/ A$ `# R- k* X
  12.             return q;4 l* w/ n( H# g
  13.         }
    + E% Y# g5 c& ]# A$ T
  14.     }
    1 M9 D- m& R: k3 j* N6 a
  15.     return null;
    ( H  t0 n+ x3 {8 z6 \; D
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    . N( B4 p: g" X, o1 G3 G/ Y  m
1 G) s3 g9 h+ \( X9 }
Метод addQuest(Quest quest)2 R# _; G9 X* K6 }3 U/ l+ |0 r

2 }! I* d% J7 Z* ~
  1. /**2 A; n$ V1 e, d3 C! ]8 ?, E) V6 b
  2. * Добавляет новый квест.5 C& M; U( Q. g) P
  3. * @param quest квест для добавления
    - y0 J. v' l: A
  4. */- q, T7 _4 g+ V, E! O
  5. public void addQuest(Quest quest)6 i1 J) D. D# Y. t& Y8 X' q4 s
  6. {& K# {# f5 b; V1 ^$ x: ]$ S
  7.     if (quest == null)
    ' Z: X8 b: D; p) L. i6 a) O1 i
  8.     {
    3 L0 t& E5 M' W5 A
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    & r" e2 m& {% s. s) x
  10.     }1 G4 }% Y" u( ?+ [: T; K1 R
  11.    
    7 f# n, q  W9 i; ~: g
  12.     final Quest old = _quests.put(quest.getName(), quest);2 Y  B6 R3 c: Z+ K
  13.     if (old != null)
    * d5 k8 b% Q  U1 p4 Z( N  K/ i: M
  14.     {% |3 N* F8 {: `3 B
  15.         old.unload();
    ' V6 P' V" F8 B  Q2 C7 W) j& A5 L
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");8 }) b" W0 e) {$ e/ H
  17.     }4 c9 Z; W' c  H
  18.    
    , ?. W: ~, t$ O% l
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    " \; P: h( g4 o6 n' L8 G6 N0 U
  20.     {8 d. c( I2 i1 T
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();, ^4 Q, m) {: H& \! l6 ]! l9 C
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");0 i7 ~  w6 i" C3 k
  23.     }
    : C+ {1 Y" d% y# `
  24. }
    * w! W8 C5 O5 y. R: S
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
4 T% O% e. g3 C! {ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
% D" i; v9 n: u' b: ~/ L' G4 k; S, }* [* k7 Z. |
6 u: f" k* J* t# {2 f4 N
! \7 J7 I% x8 [7 F( `
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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