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

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

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius4 v+ a0 e- J7 S; M7 k
6 Y9 D6 h0 t1 P3 N4 Y
Разбор файла QuestManager.java# W$ ?6 M- ?9 t7 V2 N7 O7 [& M

# l& s+ [( r7 UЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
( E2 E; E4 B  ~Основные элементы
6 R8 _. a: m4 r$ [4 [
* e* J: S1 _# l- U* t' z: p7 sQuestManager.java — управление квестами и скриптами./ ~% ?4 ^5 f% ^1 H9 q
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\- V. L, \. s! n8 e( t

9 o' I; u8 t" G+ ]% u+ W
; v& ~3 G3 n/ u" R% {: p
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
, v! W$ m; q$ y1 s& s1. Лицензионное соглашение# d, d$ y0 ]0 d  j" O
  1. /*& T: i7 B4 V" Y
  2. * Этот файл является частью проекта L2J Mobius.
    . o2 {+ J6 L' j9 s# u
  3. * % T% ~' S0 |  D
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять& K3 B: e' y+ P4 E
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    ! U  W% E/ {4 m6 K
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.4 H$ ^# e, ]3 e6 E; t$ I; d
  7. *
    0 h6 h0 @8 c3 `' O  |! c
  8. * Эта программа распространяется в надежде, что она будет полезной,/ V$ ?* ~+ |& ~. W1 z
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    . `* _! v2 N3 j, q8 X
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    . ^" [, J8 o# v9 d7 Z- Q
  11. * См. GNU General Public License для получения более подробной информации.5 g; N% W! U/ \
  12. * , v2 T. e: s( C- j6 H$ R
  13. * Вы должны были получить копию GNU General Public License
    $ P: C/ m- z0 e' I1 Q* _
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    & f1 U( U* Z/ \5 w
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.7 ]* f% W/ N0 G, U& [8 n

$ c5 ?) H3 Z; p
+ w3 f: N8 a) w$ m# L" t/ K! W2. Импортируемые библиотеки
; r$ B5 M* m& C& G  f% ~$ O
% y0 N" v6 K; c6 g
  1. package org.l2jmobius.gameserver.instancemanager;
    % F* t# x1 O: A4 Q
  2. $ _0 y8 d$ E. p& ^3 Q
  3. import java.util.Map;3 y4 u: w0 [4 i' W! q$ }" h
  4. import java.util.concurrent.ConcurrentHashMap;% E! R) B1 {6 _1 C3 v% E
  5. import java.util.logging.Level;9 N1 c: A  z' N3 @+ R7 O$ \
  6. import java.util.logging.Logger;
    ' I$ ~  U7 p7 D' `# \; c, A# O' e
  7. ) [1 L- l" Z$ Z4 ]
  8. import org.l2jmobius.Config;3 S2 E0 U: O- Z1 o( X9 C8 Y, ^
  9. import org.l2jmobius.commons.util.CommonUtil;$ N6 f- {2 X7 Q$ m) }7 x
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    ) E7 d; x9 ^6 r( 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 — менеджер для работы с игровыми скриптами.0 I8 r2 F0 x6 R

* [* a0 ?9 d2 x0 B% {  n1 T3. Описание класса QuestManager
: i8 m4 V  A, H8 G; t1 h
  1. /**% C/ U2 Y, R0 [& P7 A3 p
  2. * Менеджер квестов и скриптов.8 o9 V3 i1 ^# |, i
  3. * Автор: Zoey76+ P  B. S1 |# W" g
  4. */! v8 _8 d0 B0 U7 R' R, i
  5. public class QuestManager. r" m. N3 q8 E6 A  K6 {
  6. {
    9 I, T6 W7 K2 ]9 i# L/ a
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());& J8 d+ n9 {* u4 ?8 [
  8.     / G7 E& D& \5 ^' S' u
  9.     /** Карта, содержащая все квесты. */
    9 r6 B% L  X* P: |! a2 [/ E
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();) w, S' G. t" p
  11.     /** Карта, содержащая все скрипты. */
    ( g% F0 ?1 S, w1 d( `" Z' b4 F
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();7 U! O* @. k6 o- [
  13.    
    ' R* j3 |/ x( z. `
  14.     protected QuestManager()
    3 u6 V$ h0 }- Q7 B9 A3 t$ r  M6 Q
  15.     {
    ' J: [8 P% L$ B" i: k' ~% p! v
  16.     }
    / l* j& o: n" ]" i
  17. }
Скопировать код
4. Методы
2 j, |. k: T7 P8 |- Y' TМетод reload(String questFolder)
3 a7 P# ?3 T0 _3 l
  1. public boolean reload(String questFolder)9 h7 k5 B, K' p0 i, d
  2. {
    % [# x: h; r% Q  G0 M. E
  3.     final Quest q = getQuest(questFolder);8 O8 r  R( }% w  {0 M# c7 ~1 o
  4.     if (q == null)" a. n  x# }6 }/ j0 x9 I: F3 b
  5.     {% u1 b  U# o- m" U% S; g; j5 c# e
  6.         return false;/ P! J. v2 w4 R) B, h1 U
  7.     }/ ?1 l# m" r" E5 A' n; J1 {" T2 x
  8.     return q.reload();& {# o( U0 V5 o5 j
  9. }
Скопировать код

% v# m7 S3 L3 S6 ~* i. c
0 e3 u; U4 @& L. v! ~! KМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.1 _2 h! G9 y0 [- V2 b9 k
Метод reload(int questId)
2 ^, H5 V& ^9 i1 |  |5 L
# R. ?1 `  t9 ]) X
  1. /**0 v8 n" v# q  @$ @& a( d
  2. * Перезагружает квест по ID.) L5 y) X7 y+ r4 o. h
  3. * @param questId ID квеста для перезагрузки
    . j$ W$ @+ V/ [, ]" `- n0 `
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    ! S( x# d* Y9 [% b* q4 C
  5. */
    $ y$ t7 B* F; C. O' S
  6. public boolean reload(int questId)# h1 h0 u% f. ~8 O/ w' P
  7. {
    2 p1 Y* A: o# {3 Q4 ]/ q0 F, x; Q& d
  8.     final Quest q = getQuest(questId);
    9 W0 C1 O) u$ f1 g. _2 z5 I7 Q) K2 v' j
  9.     if (q == null)
    + a: d, T0 ]" M0 t7 }
  10.     {
    7 J4 l( d% t  x$ @( P8 b
  11.         return false;
    , J5 J8 M' ?* ]0 i& K: N
  12.     }$ ?- n2 h3 G( d& B7 t) l0 D9 H1 O
  13.     return q.reload();
    9 T, W  N+ ], y% D; R3 e
  14. }
Скопировать код

- D8 E  G) x/ d5 A  e* e5 ?Метод reloadAllScripts()1 K1 Z2 d: a; M* |' r
6 c' S1 h) y7 p, P, f# Z0 l
  1. /**
    ; O3 `7 j5 s& L! S9 O; d
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    5 `7 h' _/ D1 n4 U- j
  3. */
    2 |/ {, N. A9 c8 J' F
  4. public void reloadAllScripts()8 B8 y5 I- C3 \
  5. {
    0 Y6 f; A1 @: ^" n0 z7 C
  6.     unloadAllScripts();9 |2 D4 `7 V0 F. @
  7.     3 L2 D& u6 V3 }- Q
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");( _0 k, D1 |: o* L
  9.     try
    ' p3 R% A3 D2 U/ K" ]$ E
  10.     {0 z1 L" \4 F1 U1 m; [+ I& j/ c
  11.         ScriptEngineManager.getInstance().executeScriptList();4 e! \) B. _; Y0 w. i1 ], K
  12.     }% H, F% l9 |: c( B7 L3 a
  13.     catch (Exception e)9 d, B2 |' J% m4 p
  14.     {
    5 Y) E7 `& e+ R$ K; z
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);3 c; x# R$ U% K1 e& J, e3 l+ Z* J
  16.     }
    , D3 Q- @" v7 O' H! A/ J  B- _
  17.     " u! h/ Y, `6 _  j3 C
  18.     getInstance().report();; f, m  {3 h& L$ Z
  19. }
Скопировать код
Метод unloadAllScripts()  M' A3 Q. s) _3 M6 c9 h9 A

( A" I6 }6 E) u, \
  1. /**3 F* r* I5 h  u. v& W0 e
  2. * Выгружает все квесты и скрипты.
    , t  C7 p9 T7 G! }
  3. */
    7 b, B- Q6 G9 C
  4. public void unloadAllScripts()
    1 J; R! I, M% F% |
  5. {9 V  C; ~# q9 R4 |3 q/ D5 M, t
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");, C. A( r: V/ l  k
  7.     ) K0 h: E: |- g' Z  |0 X: b2 N% g
  8.     // Выгрузка квестов.
    5 X5 Y# C4 S3 @4 O8 H% b5 P
  9.     for (Quest quest : _quests.values())# _) v* s! e& b: R3 m+ w
  10.     {: D9 B$ H& P4 N$ M4 h
  11.         if (quest != null)
    - }  Y+ A0 g: v! s& L8 S/ I
  12.         {/ h( ]2 `0 u5 P5 P4 p
  13.             quest.unload(false);
    ( V! m( ?1 z% t4 k
  14.         }
    - @- k, P7 r$ }: e. q% ]5 i
  15.     }. O3 F& S8 ?! C' P/ F
  16.     _quests.clear();1 e/ K* P+ |2 @7 f% x, D
  17.     // Выгрузка скриптов.
    . u+ g% O; E8 M$ i1 Q) N/ E4 O
  18.     for (Quest script : _scripts.values())
    ) `: S" ?2 D% ~6 e
  19.     {
    3 |' |# Z7 }% M- z9 {& T% A
  20.         if (script != null)
    * {- e+ A/ G+ R9 I# G$ ?: ?
  21.         {) g: u5 i7 R. l8 B
  22.             script.unload(false);8 }! _6 O9 j5 z6 s* q
  23.         }
    - }& G5 c* X$ }; l& A) ]" B- B
  24.     }& X! F* h/ u5 w; {
  25.     _scripts.clear();
    0 b" Q- R% E  \/ j$ M! ]9 ]
  26. }
Скопировать код

% k( w. n: l6 o6 cМетод report()% u* N# b. ~2 p$ L7 b2 Q
2 g& T! z+ g% z$ _- m, O* O. U0 Q% _
  1. /**
    ) s9 |( B6 f0 w5 Q* _0 w
  2. * Логирует количество загруженных квестов и скриптов.
    3 w6 W' f- Q- F% q, Z
  3. */1 z" y1 h- l# d& ^! N$ R2 T4 O% z; Y  u
  4. public void report()
    9 y/ c4 P4 ^& u$ h. b
  5. {
    , }. p7 C. V) t6 j4 F
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    : L& w; G% G* E0 \" c7 z
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    - \: n- z8 a0 B9 I8 P- j5 [
  8. }
Скопировать код

( `- c; |  Q4 C. ]* Z3 Z" mМетод getQuest(String name)2 E! J" E+ c' n8 M8 t% m" ]8 i

  h3 K. O% `+ B6 t
  1. /**
    , C- }& p  n0 U' t
  2. * Получает квест по имени.5 d8 ~6 W$ Z) i4 p6 u4 |* t
  3. * @param name имя квеста( L. a* [" i' {) ]
  4. * @return квест% F, u) i! v( @' M- \, g
  5. */6 W; D+ r8 U1 B: l& X
  6. public Quest getQuest(String name)
    5 O6 W4 z5 V0 U- X
  7. {
    , C  F( c; L8 u2 Q- E) w' ?
  8.     if (_quests.containsKey(name))
    6 \6 x5 X6 z: H8 B9 B" c8 C6 X- w
  9.     {
    7 ]9 u$ _' f4 M9 @& x0 R# M7 k
  10.         return _quests.get(name);
    8 G. K' X5 ]4 T* v
  11.     }
    2 A- E$ r$ P* n' h; z- R6 m
  12.     return _scripts.get(name);
    , L/ f' R3 A6 ^" s& r
  13. }
Скопировать код

: ]" c, [, @9 W1 {' D' K8 HМетод getQuest(int questId)
0 C4 l4 C, Q" C) }" {& r
) C4 s; M& @3 d# q% N5 q" l
  1. /**
    - O6 g5 K# _7 p, v5 k
  2. * Получает квест по ID.7 K& L, T3 S7 x; A/ j/ N8 x0 P/ e
  3. * @param questId ID квеста+ W5 O4 e4 u, s
  4. * @return квест, если найден, {@code null} в противном случае6 `* j& I/ i+ ]' S; R4 I
  5. */0 y: o% F' m! s$ w( S
  6. public Quest getQuest(int questId)% @& {) d- E4 E1 Q3 n3 Q
  7. {
    2 H2 A( i( ~6 T0 C1 t
  8.     for (Quest q : _quests.values())/ F. F8 f  J3 u9 w4 z  J: C1 k$ C
  9.     {
    * v3 i2 d* u+ x3 B2 j" B6 _
  10.         if (q.getId() == questId)
    % a) h. C( j0 U) u3 q6 p' |
  11.         {
    1 x  G, M1 h, F/ a* C8 ^5 h
  12.             return q;
    4 {5 G; Y0 d! u
  13.         }: ~3 o9 i2 J7 F7 H, V
  14.     }# `8 b+ X6 n: _
  15.     return null;
      K  r, d4 r# V1 q& a
  16. }
Скопировать код

6 I( p4 F' g' t, M/ c" g  J  ?Метод addQuest(Quest quest). S# _2 w$ _0 l/ E1 D) X/ R

' R* x0 A) r: l4 n6 e$ [
  1. /**1 i" e$ I+ P) B0 G7 W
  2. * Добавляет новый квест.
    ( m* l4 Y7 {' _6 M  q3 X& X3 I
  3. * @param quest квест для добавления! I; {' d; p' j/ _( K) C: I. `
  4. */
    8 m* l- M# z1 H$ _( t
  5. public void addQuest(Quest quest)
    3 L0 H0 I( V2 L' ?( }; `
  6. {  S6 U) }1 ^" d" l5 b
  7.     if (quest == null)
    4 w2 J. H5 S9 N+ a4 t
  8.     {
    - n/ T* {+ S4 t' q  T! a7 z5 ~" G# v
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");! |8 D% _" N9 z0 e  x
  10.     }
    % q3 ]  g5 v- j* O: y  u' Y
  11.     * c& g! w' p; {
  12.     final Quest old = _quests.put(quest.getName(), quest);* z+ H! k* E% s7 n; f
  13.     if (old != null). H! E! ~' @4 q# t9 W
  14.     {$ I0 F: J" t, n
  15.         old.unload();
    0 k3 B( E; F5 q/ U
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");. q: \. r# B- i7 s: \0 w
  17.     }
    6 ]* C0 e1 T( k
  18.     0 I1 `2 C( d+ j# G- }
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)' [. F- Z! g( P; `' c/ h
  20.     {
    0 y5 {) w: y8 v- {: V6 _
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    . q. E3 D% n! f' q; U' M
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");( ]- S+ b, @# G
  23.     }
    / x7 _9 v6 |, k4 ^7 R, p
  24. }; ~  _4 |0 E6 [+ e+ O$ |
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.) \. _2 v- r7 y$ Z
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
# b; q2 y, \$ X
0 B4 v: T! W: V  e, |# z* a  A3 u1 G7 n
: w7 s# P) f: M





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