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

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

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius
" N' e8 q) U2 R5 t9 k; a& y% |0 x8 B, T: d9 ^1 |9 n8 o
Разбор файла QuestManager.java5 n! j$ f1 p9 m* ?, l6 ^
) {$ k: \. W- f
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
% P7 Y8 |% V1 H3 n( s4 c; r2 pОсновные элементы+ t" B4 G' u. N

  F# p- h/ b/ x# m$ t3 @  jQuestManager.java — управление квестами и скриптами.1 i4 {" @0 E& M7 V
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
7 ^$ Q. Y- _; E( S$ Q7 W) V+ Z) i3 ^7 j/ u6 {
4 J+ {# ]/ l# O. y, w. b) L! F
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
$ Y. l& W" a9 x3 p+ |# n1. Лицензионное соглашение  V, e6 z" z- B2 o
  1. /*1 L6 Q# {& x, z$ R6 L; }0 L* g; p8 k
  2. * Этот файл является частью проекта L2J Mobius.
    1 O( T% c4 U$ |  v% b% d
  3. * ! @1 `/ Y4 {4 Y: }0 V
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    " l' F- D8 U* B. X; a% Q$ |+ ]6 M5 D
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    0 H7 `6 [. e; D( ^7 W% w
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.1 p- \3 [" N3 I
  7. *
    / o" ^0 t9 D1 g6 V5 w
  8. * Эта программа распространяется в надежде, что она будет полезной,
    " d6 m. H4 B9 w
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии+ G, b( x7 H( s; `
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.4 T7 R2 Q& G: A) B6 g5 @
  11. * См. GNU General Public License для получения более подробной информации.
    4 f  u6 q5 j- F( x) V
  12. * 6 T9 P( H9 S; g- R. z' H; b
  13. * Вы должны были получить копию GNU General Public License
    + l) Z; q& R: }, H8 \" u' a5 s
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.2 L5 G) u+ u$ X+ F) \
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.1 x8 r9 d$ Z0 `. J

+ R% B, x1 M7 A/ r, @# [, R, z: o! J* z5 }( U4 J1 {! [
2. Импортируемые библиотеки
$ B' ^; e0 n' D  L" g4 D6 t6 S
  1. package org.l2jmobius.gameserver.instancemanager;6 i6 ]& w% y0 |6 I9 ?# t' D  h

  2. + W7 }- I$ ?/ j- |4 f; ^* _
  3. import java.util.Map;
    . o0 ]; H8 W) i& u" d6 x
  4. import java.util.concurrent.ConcurrentHashMap;
    & t. m8 P0 w; w2 Y
  5. import java.util.logging.Level;
    $ [2 Z( _! U  H- x; I( [$ y
  6. import java.util.logging.Logger;
    " ~7 B- q, R( n3 p- \9 Y
  7. % V+ g( ?8 a% }! ^. ~" ]
  8. import org.l2jmobius.Config;
    / {8 t+ k  Q& Y! z+ w! b6 V& U
  9. import org.l2jmobius.commons.util.CommonUtil;& E! |* s5 ]2 k! J$ r0 g. w
  10. import org.l2jmobius.gameserver.model.quest.Quest;; `# }$ w' b0 |- j0 `$ g% |
  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 — менеджер для работы с игровыми скриптами.# R# D# ~# q% }/ X/ w) d9 r5 r

5 N( D: v& U' ^' X( a% M  x& z; @3. Описание класса QuestManager
' V2 n7 b' I1 t0 n
  1. /**
    6 c) |; K! C' O
  2. * Менеджер квестов и скриптов.
    & `7 M& T, S1 n7 d3 e
  3. * Автор: Zoey76
    . w* X9 ^- T# B, T
  4. */
    5 ~# z) R6 a( a) A# y; ^; c
  5. public class QuestManager0 x0 e- b$ u! f) q+ p
  6. {" U6 D9 T, v5 Y2 ?3 r+ A
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    ) E# ~5 @0 [, m+ H. ]4 _
  8.    
    5 d1 D/ d) ^# P( M2 a
  9.     /** Карта, содержащая все квесты. */$ K' N8 p, j* [* ?0 J
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();: ~( ^; q" D& ]" ^! z2 D" R* ^
  11.     /** Карта, содержащая все скрипты. */% ?# G, {3 D5 v9 @7 t
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    * u: U, U& e! W( N8 @
  13.    
    ; _! f0 v, o1 F3 s. U$ p
  14.     protected QuestManager()
    1 c/ w6 ?3 `  e  q
  15.     {
    3 _9 O8 \6 M  T4 |4 W7 p5 H7 u1 M
  16.     }
    : o) S& W4 b. A2 j
  17. }
Скопировать код
4. Методы
7 K7 s8 t) c3 j, _Метод reload(String questFolder)" e$ c% e% V* |3 r& K
  1. public boolean reload(String questFolder): D% j1 O) `% E. h6 M% D( p& U
  2. {5 t, t& d4 `: d6 O: N
  3.     final Quest q = getQuest(questFolder);
    " P2 Y" `5 B/ L) y1 s  a6 k
  4.     if (q == null)
    4 w7 D0 j$ t( b3 y' r6 \) M! L
  5.     {
    4 q! V, E& o2 I9 }# F
  6.         return false;
    ) R$ M2 o0 O( A, i
  7.     }
    : g; R* l+ I) O8 v9 E# l& H) p7 S
  8.     return q.reload();% D3 G, R+ z7 @7 Z
  9. }
Скопировать код

8 d1 B0 k& d& b4 g/ {- V! o1 Q! ]3 q! p
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
7 O! K2 i, o6 U, {3 E+ [Метод reload(int questId)
. b3 A0 O; q+ I# T. l8 l
2 `1 k7 K0 J7 _, z+ ]
  1. /**
    " i! I4 {+ b- Z* }- w
  2. * Перезагружает квест по ID./ C; m# o" X3 O* j3 i6 P
  3. * @param questId ID квеста для перезагрузки
    ' x# d, ^; ]  D& I0 m6 o) ~
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    , s( L% L# c7 n! Y
  5. */7 {* E9 x7 W$ M
  6. public boolean reload(int questId)7 v( r' n* Q% \! t4 W
  7. {# M0 z( J& i! D% u9 K2 z% n: q* x
  8.     final Quest q = getQuest(questId);
    7 k( n! K, g" f, J
  9.     if (q == null)# c. {) B: }- Y3 R9 B3 K* D
  10.     {
    9 F4 Q+ I8 M. i. v
  11.         return false;9 l1 _# C0 `" C
  12.     }
    0 k9 B' L6 t& h( O; h9 K
  13.     return q.reload();. h: h8 G9 u% h( p* `8 c
  14. }
Скопировать код
7 \- H4 f- b! q6 }
Метод reloadAllScripts()
% X% ~* U# r5 o' {& J- a7 [, v0 T2 W) G1 I7 \( ~- d
  1. /**$ P: s, i' W) V. S) Y
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.3 @# a0 X: q% y  H
  3. */
    5 l: K1 H/ x  z5 E" ^
  4. public void reloadAllScripts()
    - Q7 g- G+ s# z: @
  5. {7 f. L% {9 g- R) l6 y
  6.     unloadAllScripts();
    ( A7 N$ K2 H* U% I* `6 g9 [
  7.    
    $ h8 r' [9 V/ S3 ~& B6 }
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
      d! D) {5 I5 {" Q3 h! |
  9.     try
    . d! B3 L+ a9 ~1 p
  10.     {; r( B# W1 Y, B& T# C' V" |/ @4 Q
  11.         ScriptEngineManager.getInstance().executeScriptList();+ i6 L# t3 Y, O# G2 ~0 t
  12.     }1 M& V; ?  L0 H. @
  13.     catch (Exception e)6 Q  F$ U( d# B2 z8 k
  14.     {% K" [# X0 b! g; f
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    : l+ y8 E6 N; Z/ N' _8 a2 }
  16.     }
    / j4 K+ B5 t2 E) U1 f. X
  17.     0 S' k9 n4 z1 P) H5 J9 A4 Z
  18.     getInstance().report();
    ( @, q: E: ^3 p! O7 |
  19. }
Скопировать код
Метод unloadAllScripts()* ]3 A8 F  x: C% v+ z. w) B
3 O8 n5 @4 _! D3 J: z
  1. /**% z( a! w( B" C1 r7 X8 u
  2. * Выгружает все квесты и скрипты.
    8 B+ D, c$ f+ |
  3. */
    + M% Z; A5 p# j1 C
  4. public void unloadAllScripts()
    8 u  n) k3 S. z
  5. {
    * L; X* O. M' s& M* r
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    " C8 U# X, u) o4 o6 s' v- w* L
  7.     2 I/ U5 \5 g, ]) ^# q4 Q) Q
  8.     // Выгрузка квестов.
    ) a/ J# Y4 l8 I, U4 i. I
  9.     for (Quest quest : _quests.values())
    8 S- y8 b$ X3 z
  10.     {& w' H5 [8 `% F3 b* \
  11.         if (quest != null)
    2 P) F) V2 G8 T; ?$ l" S
  12.         {
    ' W$ u! }5 |) b" U4 Y! [
  13.             quest.unload(false);
    , }+ h6 ?+ _  f3 J$ b
  14.         }0 E* ?$ ]2 t* F* X# j% b, p0 e( C* p
  15.     }" o5 r. X* v* T4 b' D1 [/ R$ i
  16.     _quests.clear();! z6 ^2 D- i# W+ w
  17.     // Выгрузка скриптов.
    : L9 R0 p1 N& f8 `
  18.     for (Quest script : _scripts.values())5 s* p$ e& @, s# T
  19.     {+ ~" k7 c. u3 d3 I
  20.         if (script != null)+ ?6 J2 Z  M. D
  21.         {( B5 p7 X" W0 H3 [7 v
  22.             script.unload(false);
    ; i  O0 g+ m2 N) `( o
  23.         }7 b& k4 l% F! o$ D- P; Y: t
  24.     }
    / Q8 ?1 [  }2 [5 b! B5 j
  25.     _scripts.clear();( D) \; d& E) ~: W' }  m2 O
  26. }
Скопировать код

' k8 J' X' S1 V/ I* x( DМетод report()
# j9 x: R9 }# ]( y0 @: G/ ^3 H$ Y$ G  U& l
  1. /**
    7 n) h9 Q4 v/ O1 {% N# b. @6 @
  2. * Логирует количество загруженных квестов и скриптов.# r  z/ p. S* a$ G. d" z- D
  3. */
    ; p5 _* I- k- n5 {
  4. public void report()
    + S) T4 ]6 T$ x' e/ _
  5. {. S( v  ?) d  \% B! {9 v3 R# K
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    ) g; h0 p6 y/ d6 v$ |
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");* x7 j+ h' A: T, j- \$ @
  8. }
Скопировать код
( P- i" ]6 l+ T! G7 j# r) I7 S
Метод getQuest(String name)
6 P# ]  ]  w) H/ c) k% s2 x  i6 C7 g2 M- O; A( a
  1. /**+ ^9 Y, {8 _; d. v. [7 K
  2. * Получает квест по имени.9 }) Q5 K5 P' M6 @0 `8 B7 H- P! D& c
  3. * @param name имя квеста
    8 t9 K4 b) u4 E2 Q: y! U
  4. * @return квест
    3 G  D+ O. Q0 P5 b3 n6 T
  5. */
    ! ~: q: D' n  y' E3 [" _/ K9 P
  6. public Quest getQuest(String name)
    & ]' }8 N$ i& K
  7. {  J4 H* W1 g) U5 w) S  `' e
  8.     if (_quests.containsKey(name))9 ?% ^8 A/ l, I  t
  9.     {6 x) e  ~( D4 t2 S3 _9 @
  10.         return _quests.get(name);
    0 A3 N, _& s5 Z1 C
  11.     }
    $ Q. z3 b! }+ a: s8 ^) F! H7 I# X
  12.     return _scripts.get(name);/ I& O: {$ W6 v: V" w
  13. }
Скопировать код

0 \( \$ l& m3 |7 B" D9 G3 _Метод getQuest(int questId)
+ h& q/ B. S# ~7 R* G5 j. c
1 z6 }+ ?; z. G/ g, k
  1. /**
    & f9 N4 Y4 z/ h  Y
  2. * Получает квест по ID.
    1 [- K9 m& W" h' S& ^) D
  3. * @param questId ID квеста  ^: P+ b# {+ W; S, E4 \
  4. * @return квест, если найден, {@code null} в противном случае
    ; R( R/ N; V4 [: C4 l4 m
  5. */
    ( x7 R- Q5 c( ?
  6. public Quest getQuest(int questId)1 s, K& }; B% i+ `* X3 [
  7. {! B3 _, X0 ]  U7 y, k) v. H# r
  8.     for (Quest q : _quests.values())
    " J1 h; _  P/ k7 y' w9 g9 q
  9.     {1 [3 ~3 I4 z' k1 P% ?( }% B4 |: b
  10.         if (q.getId() == questId)
    8 c# l8 a5 O: K4 U5 f! M
  11.         {% k& Z( _' ^0 M
  12.             return q;0 t1 C/ s. q  Q! ^2 D, j
  13.         }
    / g0 s7 f, g- ?. i1 y: J, m" }
  14.     }% `, d1 y! X7 ~% v+ ~
  15.     return null;! ~0 P; r+ U  f3 E) `, G' T
  16. }
Скопировать код
  ~+ a4 C* ~8 L& Y8 q" {
Метод addQuest(Quest quest)( m  }: t; U+ ^

- q: |, K) }  p! z# a
  1. /**
    & F+ P. ~" w! F! Z, |" L. W$ |& f
  2. * Добавляет новый квест.; t2 \5 j0 m* M! E5 r2 }
  3. * @param quest квест для добавления8 r" c% ~1 m4 ]( y- u$ }
  4. */; ^* y) F' h/ `, [: I' _
  5. public void addQuest(Quest quest)
    ' m8 Y* A0 f" A$ w3 a7 r; P4 T
  6. {
    # x7 R- U9 l. g6 ~& \4 E3 P! ^+ L
  7.     if (quest == null)
    ! ~8 g* }) M. p( _* o
  8.     {0 }$ W1 p5 d/ }
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");  ^! L3 g5 K+ A/ Q
  10.     }* A2 ?. }6 X! W7 t) z% S1 |3 R
  11.    
    $ k( F6 z# R, Z( M
  12.     final Quest old = _quests.put(quest.getName(), quest);
    0 g) `# q4 {" ~+ D0 \
  13.     if (old != null)6 z! F! P+ X( E3 P
  14.     {
    ( a2 [, G- t( [+ r
  15.         old.unload();
    ; V) c. ~2 J- ?$ z
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    - j: U, B$ @; T1 J; W/ a
  17.     }
    / _) N: ~+ r( D0 Q  n$ S6 v
  18.    
    ; X) ^& w+ o/ L/ n: @, p
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)# w; f9 A' j2 [. M! P" _
  20.     {
    5 y0 Y3 H  S2 t# s4 k
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();/ f8 s2 N9 c# @& D
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");; ~) P, f1 b5 k, {4 t
  23.     }
    - F$ B2 q2 v) n9 Y
  24. }
      H" |* K, ]% N: c
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.5 {) l- C* T/ X4 C! G
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.. v% Y& E/ ]6 b; v1 d
- p, ]! B# i1 H+ @& u8 t* m7 j

8 g0 j2 [. P; F& b% ?# ], I7 Q9 ^* q8 R





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