artace.ru - творческий сектор

Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius [Версия для печати]

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius
/ Q0 s! N5 S: d1 I: b/ e. ]8 ~
7 P0 X5 g, H3 n! _% f' p9 _Разбор файла QuestManager.java; X4 S& f2 {! g' d

# t. k$ l' H  ~Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
) @+ Q, Q1 Q* ~Основные элементы, w, k# `% j( t- F+ j5 t
) \" x; @0 g8 G" c/ Z. J
QuestManager.java — управление квестами и скриптами.7 Z& R1 k, A5 p% ^$ [! n
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
0 x6 c, h- g% n6 ^
5 D: n+ w( N& L  I, ]" d
# {% U7 Z( A3 U0 Z
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
: t5 c' V8 U/ b" Y5 y1. Лицензионное соглашение' a" ~3 P, f# _
  1. /*: y# N" H7 w* T1 @% y
  2. * Этот файл является частью проекта L2J Mobius.7 p& n# _; C6 C
  3. *
    . s- i) B1 y0 n3 p
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять, V9 c9 n9 l, W2 ~$ S6 b
  5. * её в соответствии с условиями GNU General Public License, опубликованной! C  `) W* z* s  h/ N# F8 b8 N
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    " D0 T8 W. A, L
  7. *
    6 G$ h3 q/ q  V& S  f( m
  8. * Эта программа распространяется в надежде, что она будет полезной,
    4 p% g' T' Z3 w" P0 h1 I
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    % H8 ]* S, q. a0 }5 {2 T
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.5 c9 `& N7 T, ?2 l
  11. * См. GNU General Public License для получения более подробной информации.& x( ~7 }4 ^- K& H5 E5 i
  12. *
    ! y8 i- z1 X6 q. g4 Y1 V8 y8 b
  13. * Вы должны были получить копию GNU General Public License: J0 n6 j! q. {6 q
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    " {$ n  I! |+ A- b: w; E4 s
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
' u* `9 z5 B6 F
4 g) `2 E; _! h2 q. x8 o# E
% I1 H/ X9 e. @( n1 v6 t2. Импортируемые библиотеки& G  d% y  j- R0 z# Z( T
3 x6 C: D; G8 N2 I; F# \* ?
  1. package org.l2jmobius.gameserver.instancemanager;
    ! E* t6 Y. n5 a, [7 L, A4 {
  2. . X% Y5 e7 O, z; S5 M: N! @* K
  3. import java.util.Map;
    6 E1 U' ^0 X% i% w8 D  W& C
  4. import java.util.concurrent.ConcurrentHashMap;
    ' ~' y# [/ I* [
  5. import java.util.logging.Level;
    6 u9 s1 P6 y7 ^0 C9 L
  6. import java.util.logging.Logger;' Y7 t, S9 w$ |/ P$ o
  7. 2 N2 V& c& z3 [1 ?! b
  8. import org.l2jmobius.Config;
    ; o3 B- L8 ]7 I1 f+ O& p1 _. `$ Z
  9. import org.l2jmobius.commons.util.CommonUtil;
    - L7 v2 b' P4 }; \+ X$ ^0 O
  10. import org.l2jmobius.gameserver.model.quest.Quest;3 [( \% \8 ~. w- c: {& s/ d- z0 J
  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 — менеджер для работы с игровыми скриптами.
. S( D4 N! D0 M4 f. |+ c7 y) u9 G
3. Описание класса QuestManager% G3 k* k1 f- `  ~- M! F
  1. /**+ q% J6 i: f& W5 O$ d
  2. * Менеджер квестов и скриптов.* q  A& e0 q0 p' Z7 m. y6 n
  3. * Автор: Zoey76
    1 v. i6 f# e5 _" u' V
  4. */7 U: U; @3 w6 n( \, p/ O& Y$ Y
  5. public class QuestManager1 _7 D1 ~4 r, Q% Z; e% ~0 d
  6. {& x0 r# N+ B4 A3 S
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    8 h4 `& I- E5 n) t4 @
  8.     . D: ?+ {) ]2 i7 M) C0 A
  9.     /** Карта, содержащая все квесты. */
    ( Z* m; L8 V# l( a1 M; W
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();5 ]9 j) L" p+ m  W  `; `1 H
  11.     /** Карта, содержащая все скрипты. */
    # r: e  T! D# D  t- z' K% C' T* u7 G
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    * x/ ^, E: Q3 S: Z' n( M! n
  13.     6 K  i  w0 D# m3 h3 P# G8 W( f
  14.     protected QuestManager()* z4 }. ?! V6 q- f- H; N5 V8 ~
  15.     {
    / `$ S+ r0 R  i0 N& K/ |- n
  16.     }) d0 s$ m& d3 `! h) Z" w8 W
  17. }
Скопировать код
4. Методы
) C, t# O$ `5 @% ~  KМетод reload(String questFolder)
, K8 c. I; v: y( C; K6 F: o8 E/ c
  1. public boolean reload(String questFolder)6 o+ k1 j$ E' i7 `7 |
  2. {
    9 Y9 x0 A1 T( m5 ]
  3.     final Quest q = getQuest(questFolder);
    # w! r* t; C) H, X
  4.     if (q == null)
    : D5 H& E# G8 I$ L6 {7 M
  5.     {" R! \  g2 ^7 n2 f! c2 {' c
  6.         return false;0 C1 H& o' u3 W
  7.     }
    / f0 D9 a2 p* ]% f6 Y% N% u1 h
  8.     return q.reload();# e4 C, `; [5 C+ Z, g, A1 j
  9. }
Скопировать код

) p; _' n$ ^2 f3 x
' }; Q7 K/ D% p+ F9 a) T$ @Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
9 n1 Q+ D9 j3 V9 l5 l7 _; v5 VМетод reload(int questId)6 L3 M; ]' M6 @0 y2 T! A* }

3 e3 h- m3 D% d. f- `6 \* }
  1. /**
    + H7 |, l1 f; D
  2. * Перезагружает квест по ID.
      f5 h5 {! J& n* G& n
  3. * @param questId ID квеста для перезагрузки
    + R* w& L* \2 p7 @: y9 O. P
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае' i9 z2 Q- e! M- v" r0 x
  5. */; S. a4 Q, p0 W" |0 G# c9 I
  6. public boolean reload(int questId). d6 g: Y! Y# s* \  `: K
  7. {1 v+ ]$ D- g7 W' a: S# j9 z# g
  8.     final Quest q = getQuest(questId);
    0 C. W, @- Y) R5 Y. Y
  9.     if (q == null)3 y6 u& S* R$ I5 m
  10.     {/ K+ _2 S0 Y  q3 b
  11.         return false;
    ; p/ v: ?, L5 ~. E6 x! d  U
  12.     }7 q. O0 l; b4 t  v
  13.     return q.reload();
    ) N/ T1 Z, ^0 \2 r/ j  C
  14. }
Скопировать код
' O6 w& x0 h6 t, E8 C
Метод reloadAllScripts()$ k3 R- ^0 R4 t2 I

( m: q) N* u& u! @
  1. /**5 \/ R( R: I- S2 F8 z
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.$ W- h9 m) A1 i
  3. */
    ! |( ~8 H3 L$ C5 Z) Y
  4. public void reloadAllScripts()
    - Z+ c/ k8 F7 s7 R( }& ^
  5. {
    : W  x' O; ~' C8 U" O/ m6 Y  J  b3 J
  6.     unloadAllScripts();
    , ~6 V, R8 e6 Q6 h& d
  7.     - g1 n, i1 p5 ]- t$ b/ l
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");8 j: ^# z! G, f
  9.     try5 G$ W; H& @7 \4 s) p( L
  10.     {( o! H8 d$ p5 ~  ]* s( D) V
  11.         ScriptEngineManager.getInstance().executeScriptList();  {; X/ @* D# T9 s: b
  12.     }) F) }2 Y; e8 k
  13.     catch (Exception e)
    2 d% }" |: B0 L& B2 z  R
  14.     {
    $ z3 j: n, o, X/ U
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);( @4 Z) b; @! V$ ~9 j4 ]
  16.     }
      P* S5 J2 r& v+ ]* f# B2 _
  17.     . v  S0 ]6 Z3 s3 |7 J
  18.     getInstance().report();+ g: o: G9 k$ L( N2 }1 c
  19. }
Скопировать код
Метод unloadAllScripts()
0 w: W+ O- @4 j2 w2 N2 T2 T, K# B8 w5 w* O$ Y: i- q4 t. O! k3 k
  1. /**
    / F4 u8 y/ P' J
  2. * Выгружает все квесты и скрипты.3 w9 X6 t, s2 a0 J$ p* Q& K
  3. */* F0 n% p. ?5 n, u4 [. ]% w% Y
  4. public void unloadAllScripts()
    + J6 \0 }( {- J1 G2 z* N; R
  5. {
    & a: H" c' I9 R9 N- j; s1 p
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    ( J. x( ^6 V( x, b2 a- Y0 A
  7.     # O4 @4 Z' q  T; T# n/ X- U
  8.     // Выгрузка квестов.1 I; B* J( m  \' }/ Y8 |, L% i+ c
  9.     for (Quest quest : _quests.values())) ?# }# P! Z& x+ R# H  N8 X
  10.     {
    . D$ \! v* i( w# t* M* I
  11.         if (quest != null)4 u; c2 G, W1 p; T
  12.         {& H6 `+ F4 s: D, G, F
  13.             quest.unload(false);
    1 [. {( {' ~. _, m9 v
  14.         }
    3 e1 l# V( M$ h% W6 Y' l8 o# u0 c
  15.     }
    + I$ [+ a& |" K! ?" P- \  `
  16.     _quests.clear();3 N. ]$ A5 [5 B6 \
  17.     // Выгрузка скриптов.
    ! B0 W6 x4 I9 Y: D9 B" A, S9 c
  18.     for (Quest script : _scripts.values())7 ~) [0 W: V8 u7 X  z
  19.     {5 b3 @- u" g) E! d5 [
  20.         if (script != null)) G1 `' u7 b& G6 Q& C) |2 R  f
  21.         {* d, h' [6 Z3 a0 ~
  22.             script.unload(false);5 Z9 ~" X9 i$ f7 H+ T
  23.         }
    . X5 i3 X6 l7 N* R7 j6 Y: |  `
  24.     }$ l& R) l, p0 Z5 ~0 U9 Q
  25.     _scripts.clear();5 L/ i. ?  q2 H! b6 x8 W1 E
  26. }
Скопировать код

- R) K$ x% F7 {9 H2 c+ L1 FМетод report()* E1 v. s: ]7 T" F

1 I& ?4 Q9 U* k, W+ P6 J/ b8 v
  1. /**/ S, G0 l* }* x8 v3 m- q2 e8 f4 o
  2. * Логирует количество загруженных квестов и скриптов.
    9 _8 P# B$ K0 q% c
  3. */
    + J8 J9 m1 G3 T. ~7 S3 c
  4. public void report(), V8 p+ j: L2 z0 w) j% [: p7 z) H
  5. {' k% Z/ K% P1 W/ W8 Z
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    . \, F8 X; T5 Z. t
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");, S) u6 m. K1 p# T8 n1 d$ S
  8. }
Скопировать код
/ _* c; K! ~: p, b7 P3 I3 S
Метод getQuest(String name)
* M: v' Q: T5 H7 ?. p$ d* N; g- I' H
  1. /**. y; ]3 Y: x  \# G% f
  2. * Получает квест по имени.; U* \. m# L/ w2 M) C
  3. * @param name имя квеста4 `: k) m. Q" G7 _/ J
  4. * @return квест1 R! v- @3 B4 R5 k9 A: Y5 O
  5. */% _$ d5 ?5 Z0 w% @
  6. public Quest getQuest(String name)
    # c- @. I  b; i8 B( E2 p
  7. {
    + I- {1 Z3 ~1 q9 H1 h- w
  8.     if (_quests.containsKey(name))
    7 M' l0 [, W7 Y: d2 q
  9.     {6 t7 r2 H1 Y9 f, s
  10.         return _quests.get(name);
    5 _; v6 P) l( c6 ]0 Y1 g0 J
  11.     }$ |' ^. \+ x4 u& }& F0 B- Q  e
  12.     return _scripts.get(name);8 [# s* v( i% c
  13. }
Скопировать код

* _* \, S6 p0 s2 P. B% MМетод getQuest(int questId)& W5 j4 ?5 n+ c
: y$ w: S6 T! g, n; P0 q+ |# d
  1. /**
    $ K( p5 m& {* Y- X" M8 T5 C& l9 ^
  2. * Получает квест по ID.+ r) |' Q9 W8 ~/ Q+ [6 ]9 U- Q8 `
  3. * @param questId ID квеста6 T# s3 L% }9 [
  4. * @return квест, если найден, {@code null} в противном случае) h# i# \; D6 W9 V; j  o' U' p* R
  5. */9 l8 `, c# u# P1 }0 X& R
  6. public Quest getQuest(int questId)% u: Q. t; u3 b1 [+ t# U
  7. {; r! y  G- D% y3 G
  8.     for (Quest q : _quests.values())5 F$ I/ U3 [! R& p7 N3 b! ~
  9.     {, _/ L% O+ F3 u) u2 A) o
  10.         if (q.getId() == questId)1 q/ S* q) A; K3 s& W
  11.         {4 O7 Y; p" F6 `! N# n9 l3 A
  12.             return q;
    % W* |% P! e- z& D
  13.         }- G  p+ n' o' c
  14.     }
    4 w' H$ l8 ?) n# m: L
  15.     return null;2 N. @  B" I5 p/ K
  16. }
Скопировать код
. i/ M+ [+ |+ |; {
Метод addQuest(Quest quest)2 A; E4 G5 k9 w8 n& O  y

; T( @: M" S' [, `
  1. /**
    * C$ h  A* V1 j' m' X6 |
  2. * Добавляет новый квест.
    * {) @3 s6 I8 {  n
  3. * @param quest квест для добавления
    8 P" J8 V' c& F6 ]
  4. */( i8 \2 N1 n& U5 u" |1 S
  5. public void addQuest(Quest quest)
    + Z% ]& o- l) o5 J- d. \9 g0 ^* q
  6. {2 Q& ?# @3 \  d% I" o! I
  7.     if (quest == null)- K9 _! _2 o* Q
  8.     {
    ! O" f/ Y% k8 a9 i& N; S: E
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");( w2 R0 p) {) }- s" C; F- A
  10.     }
    : S# v. M( |% ]  s9 F+ o
  11.     ) O7 X, G. w* ~4 _* \
  12.     final Quest old = _quests.put(quest.getName(), quest);
    3 x+ u# @/ f0 q: L  ?* M
  13.     if (old != null)
    . `7 Y+ P$ S$ x, J. ?9 j
  14.     {
    $ u4 P  ~+ R; {2 c
  15.         old.unload();7 [) @" f: n3 k9 ]+ r5 X8 K! ^
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");; L" G! b( y7 v. S2 i0 e" @* j
  17.     }& u0 \7 b0 f. k, m# }/ y9 Y2 M' l
  18.    
    # }# }) x0 [, L2 U! G3 W* G. q3 C
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)% T5 K4 H, J5 V+ F
  20.     {
    ) T( {# h% d1 J$ ]% _$ Z5 \
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();# W  j/ W+ d: y# |9 Y7 v
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");+ D3 E  Z. i" Q1 [  w+ J1 ?
  23.     }5 g3 I5 V( c& H6 h
  24. }
    0 |6 V5 c2 F7 q( s( O9 q
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера./ g& a/ ?2 X5 ]1 K" Y4 j( V6 w1 J
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
+ `# u" H" T: u/ l& ?$ @* P$ n/ L% J' Z# b: N6 i

6 n9 i! d& e) N) z0 F4 o. P/ X) q$ t





Добро пожаловать artace.ru - творческий сектор (https://www.artace.ru/) Powered by Discuz! X3.5