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

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

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius
) N. s  |( Z; y0 Z5 L- B8 U1 `/ w# K" W4 [+ H- g- V
Разбор файла QuestManager.java
: V4 v3 p# A! a* d( w7 r5 v
/ z/ o, x- U/ U2 wЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
8 ~4 v4 J9 i5 e+ j0 H( _, mОсновные элементы, @0 ?  _3 Z2 i3 }# ^9 `

$ m; ?5 V& V) j8 ^QuestManager.java — управление квестами и скриптами.+ u: \6 I: W3 }6 p
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
( L/ t7 Z: x& _! I! @- o& F9 ]
% e0 r0 h8 x: N1 @' Z1 M8 ]

  H4 n9 r* `% cДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
+ o5 i8 o0 m, _, X: t1. Лицензионное соглашение' z8 ~1 H: P  h/ w- q  h* G
  1. /*
    4 o# O! \! @1 T9 A9 \+ y
  2. * Этот файл является частью проекта L2J Mobius.
    3 [. I: ~  D. y. `- G( {8 J+ \
  3. *
    9 ~: ~1 n, p% q( _5 @2 p
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    ' ]1 P8 J4 S2 H6 J! P' M
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    # R( E1 J2 E8 b7 N$ e0 }4 _
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    , S( }8 }; ~" G) D- o
  7. *
    ; s1 v. S+ l+ D: w
  8. * Эта программа распространяется в надежде, что она будет полезной,
    : L3 L# x# s0 A; s' f: w, w; G, i
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии5 h3 i* T- |1 ?
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
      r  R  S0 E8 v' x' m; b6 r
  11. * См. GNU General Public License для получения более подробной информации.
    ) z: B2 T  z# E2 V$ N" p: u" H* M
  12. *   o7 V6 C3 v- s/ O1 Q
  13. * Вы должны были получить копию GNU General Public License) N5 h3 V) r) m% g0 {/ ?
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    ! d. _& E. }7 U
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
- {& ]4 l- d+ b; a0 k
4 w( _! G: s/ S3 z5 x* o+ h$ f/ K. G' N( E8 u
2. Импортируемые библиотеки! N$ w7 D! q* {

) u) r& W" Q3 B; k
  1. package org.l2jmobius.gameserver.instancemanager;
    ' f5 z& u1 h* _: Y) g3 q6 M

  2. $ B8 e9 a4 u5 h5 }8 ]) V
  3. import java.util.Map;
    + {4 i+ J+ m* E
  4. import java.util.concurrent.ConcurrentHashMap;
    ( ~. }5 j9 N+ f& U: `7 c
  5. import java.util.logging.Level;
    / W# ]! y# r( Y7 W( Y
  6. import java.util.logging.Logger;
    7 N" C) F2 Z1 m% v! H( D- T

  7. / b& f1 M2 n/ v; k6 }2 K
  8. import org.l2jmobius.Config;4 V. P0 b6 i1 L; g
  9. import org.l2jmobius.commons.util.CommonUtil;" G! I' W4 p: k1 u. k
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    8 M. L2 b5 x" ], _! M% S( u' u
  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 — менеджер для работы с игровыми скриптами.
4 R9 Z( E! K  ]9 L* A  N0 B3 `# {- M9 a4 O
3. Описание класса QuestManager2 M3 |, H9 {: b
  1. /**
    1 y) H! F: T  T' v4 a! F6 |
  2. * Менеджер квестов и скриптов.
    9 p. X+ [) C2 i$ |' ]5 ]0 m
  3. * Автор: Zoey767 ~9 H* `3 ]. W% O
  4. */, {! L" d& B3 c0 l2 U; c* s
  5. public class QuestManager. ]9 O- A) z1 W, b
  6. {3 N( {" Z8 Y( ~. j
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());) \' _' F8 V! W- I! c
  8.     0 ]3 x  R( P" s- N! H
  9.     /** Карта, содержащая все квесты. */: f* ^% H% E. U1 a2 w
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();; c% ]/ P* B) ~9 N/ L+ {
  11.     /** Карта, содержащая все скрипты. */% l7 S; A/ d% Q
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
      `% l" L$ D5 B  w4 k2 G: C
  13.    
    - H. T  ^  W$ k7 N( ^
  14.     protected QuestManager()
    5 S6 D: F" l- w* r
  15.     {; b0 Y' y: s) |
  16.     }2 L. k, N5 u$ F  R  @8 w
  17. }
Скопировать код
4. Методы
- D; c3 r& n- Z' ]! {Метод reload(String questFolder)+ u9 @& @; b$ r- ~+ V. y
  1. public boolean reload(String questFolder)
    & f! F% A% z) b
  2. {
    & S/ ~# G4 [# ?2 l# `8 I2 \
  3.     final Quest q = getQuest(questFolder);
    , s2 x" A2 N( p
  4.     if (q == null)
    $ a) J+ R# v1 S: w: R/ B! \
  5.     {
    / I9 d9 G. }* Q4 G
  6.         return false;9 m* `' q3 n- |
  7.     }
      T/ p; `1 e( `9 V( {7 [" S
  8.     return q.reload();
    + {: N( K3 r" I
  9. }
Скопировать код

& ~' ?% m- \. z9 L8 H& @
( T7 v# k5 ^# [" }: OМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
: k1 p2 e3 J) b0 M6 d5 qМетод reload(int questId)
( c6 u/ H# N% n6 c$ b
5 d& n" @6 P2 B' a
  1. /**' R1 w) T' o! o" u
  2. * Перезагружает квест по ID.' U5 M. w& [. q/ C) Z6 `
  3. * @param questId ID квеста для перезагрузки! Z* H+ u/ X* L- Y
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае( K3 Y/ W; L, u9 {  o2 {
  5. */
    6 W3 y2 c5 S0 `0 U7 H
  6. public boolean reload(int questId)
    8 M0 ]4 U; @! \/ [* g8 |
  7. {
    ! b* W: v/ X3 n. f# U0 z
  8.     final Quest q = getQuest(questId);
    7 X: C7 J* s' E+ R+ X  r
  9.     if (q == null)' z. e6 V& U0 K, y2 n1 h
  10.     {
    9 A1 o& H* ]$ }7 v, L
  11.         return false;/ q. u; R4 G! R& _9 x" A. I. W
  12.     }0 q0 m" F& O. g. G& n2 N6 Z) P/ G
  13.     return q.reload();
    . f3 m! C6 y3 T0 C4 [+ U3 u
  14. }
Скопировать код

$ T2 @* l  ]# V3 {: aМетод reloadAllScripts()
% e# c7 z; L" e% @* ]
  D! R3 g; {4 s* a' w
  1. /**
    ! B  Q0 [6 v. }7 J) e
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    ' Z) T' F' n0 x* V
  3. */+ u7 A6 [0 V4 C9 b4 s9 d
  4. public void reloadAllScripts()
    0 O/ `7 \. H# C7 J# m% W6 l
  5. {4 [9 ?  g; h- A' e5 R
  6.     unloadAllScripts();6 i% c0 b+ n+ P/ |' j
  7.    
    6 B! P- B6 \3 l3 e7 I: L+ @
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    : O: g; b) ~' W8 t
  9.     try
    ( o8 M, O6 C% \8 z  l) p
  10.     {
    ) o- D  s, A7 ~/ a9 T0 N- F
  11.         ScriptEngineManager.getInstance().executeScriptList();
    ) D8 R2 K9 S6 f9 x
  12.     }
    , I9 P% c# J. W% Z) L
  13.     catch (Exception e)# ]# c& [# c3 t0 }: Q7 F% H
  14.     {
    , \* ^2 s3 M* R! N$ T
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    : \- L% n7 {/ K# f9 E6 T7 |1 {
  16.     }
    6 L' K: m4 v* A6 U5 }( i, Q* R( n) ?
  17.    
    2 A/ a$ t& U6 [% x7 X7 |
  18.     getInstance().report();) |+ z8 O' Q3 d+ Z$ }
  19. }
Скопировать код
Метод unloadAllScripts(): }6 i) U# i$ [/ Q
1 u1 B- D4 H- i; r4 S
  1. /**: w5 Y$ E) r4 O# D$ K* D9 u
  2. * Выгружает все квесты и скрипты.3 L% J6 C: S. u2 z; ^6 r
  3. */
    1 [6 k0 [1 `$ r2 r
  4. public void unloadAllScripts(), E7 Y# |0 G# t: a" Y
  5. {
    # n8 P! ]2 I+ E) Z) S
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    6 p  X+ ~. m* u3 r, t
  7.     5 F- K: Z6 |# b7 x
  8.     // Выгрузка квестов.
    & E4 P! I2 j0 v, z
  9.     for (Quest quest : _quests.values())
    ( s, S3 _$ t* I  `
  10.     {
    ) m7 A6 A7 D( r% [5 N; n- a5 r- F
  11.         if (quest != null)7 \0 P+ B. h) k
  12.         {
    2 s" m/ n8 a, L: O& n0 O& M
  13.             quest.unload(false);
    3 U  l; y/ A- e1 a, \4 G  x4 @3 x
  14.         }( ~* B$ r: ^, R/ ^. t  ?
  15.     }& s* a( Q6 v5 p; A4 t* v! N5 X
  16.     _quests.clear();, T5 H( `' z  z) ?5 A
  17.     // Выгрузка скриптов.
    3 A9 |; F; {- f  U. V4 u
  18.     for (Quest script : _scripts.values()): u# W7 n6 x/ |6 A
  19.     {
    " b- ~9 ?% J4 F7 Y1 x+ t; |
  20.         if (script != null)
    7 j( _9 X* i8 t! l# ]( |# u
  21.         {
    . K1 L/ k0 i( a" |0 ]
  22.             script.unload(false);) S9 |% \" D9 H2 K( d% ]
  23.         }! D; z  k6 t5 H
  24.     }
    % ^2 r/ H- M9 w  V# d: e3 S
  25.     _scripts.clear();! R- E1 a/ Y. s% b( ~  M
  26. }
Скопировать код
0 x7 z4 t2 T( P
Метод report(), D5 G, }5 x' {6 i7 w" X

! R$ N: f! K1 d0 K$ D3 t4 M
  1. /**
    1 p# e& U8 O- p( k8 F' a9 W
  2. * Логирует количество загруженных квестов и скриптов.
    1 H2 u4 T0 G) P! m! I4 y
  3. */# J, ~) q# \- A' M* {
  4. public void report()
    ! n$ m( }8 r3 @* e* |9 I
  5. {2 J% Y+ x9 A& E% s  _
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    - ?& o) E/ W1 X% H
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");  L5 {) V: c* q5 C8 Z4 i* u9 A: {
  8. }
Скопировать код
  [3 k7 ]8 M4 S+ }4 V7 e
Метод getQuest(String name)
; n* M& x( C- K' ^/ R) W6 ?
& g* g/ x, p8 s3 H$ Z
  1. /**. _1 r3 L/ @1 B; X7 J
  2. * Получает квест по имени.$ H% A; o2 X: H7 K/ s$ g( M
  3. * @param name имя квеста0 Q% F" X+ Y3 S
  4. * @return квест+ h* d1 w2 E- j/ z- a- ^- W
  5. */
    . W" [# C" ]6 e& S& h& j; ~. j
  6. public Quest getQuest(String name). g: s" A& m/ k* A# b
  7. {
    , ?8 r( I& M, U. L. j
  8.     if (_quests.containsKey(name))
    4 a4 S- m) o' H+ l
  9.     {
    ' r4 B5 a0 _, N; \  ^, [
  10.         return _quests.get(name);& |8 Z% T( w2 @+ b
  11.     }* ?3 N7 R! j/ J# t/ P8 I1 M4 i
  12.     return _scripts.get(name);  m9 k. @! f) O) B# R
  13. }
Скопировать код

% U/ e/ x. D8 b) Q+ e* eМетод getQuest(int questId); m2 K- G# k/ [3 c, t& J

5 L3 K3 b$ n' n2 d# a' l
  1. /**
    ) i% x3 K+ G: a. R. G
  2. * Получает квест по ID./ _/ M) g2 L; H: \& ~
  3. * @param questId ID квеста2 W5 G! F* ?: @1 ~9 @- ]/ x" R
  4. * @return квест, если найден, {@code null} в противном случае  H- q6 ~& b: j! W6 c
  5. */3 G/ t& S3 d2 g  P
  6. public Quest getQuest(int questId)! P' u  k. Q. r% r& p
  7. {1 @% S6 @$ F3 d: p5 B. G" B
  8.     for (Quest q : _quests.values())% Y- I+ M6 T' f# M
  9.     {4 C0 b* d- {! }1 e; ~" E
  10.         if (q.getId() == questId)$ Q" R6 ?0 w3 s1 [% ^
  11.         {& ~6 e+ q1 S9 k
  12.             return q;
    2 x6 v4 V, W  x& H* O1 G1 X. ^0 \
  13.         }
    - c2 ]# u, [$ C1 N; d
  14.     }
    ( Q" {7 m3 d) M; G( d) h
  15.     return null;
    - C1 b, [% u6 }- A' c1 c( c
  16. }
Скопировать код
3 p) l6 A( e9 c
Метод addQuest(Quest quest)
% `, {: t( T7 X# u6 d- d% M
3 J  C# Y( B  w: T9 r
  1. /**0 x8 a1 b: K5 p9 I) y- b" E
  2. * Добавляет новый квест.: Y) g0 B: Q! E; l: I
  3. * @param quest квест для добавления
    7 Q8 K1 S3 T; h% Y
  4. */
    . a/ O2 t2 N% c; V8 `
  5. public void addQuest(Quest quest)
    7 z  {4 T2 g( t' y! ?0 A
  6. {
    4 R! k6 s, x8 ~% u- s6 w( W
  7.     if (quest == null)6 V# N1 S- a' ~/ m) I; D/ m
  8.     {: q! y  A% f& c" U
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");6 k/ k2 ^, o4 N8 o
  10.     }4 K' q" }* p+ b/ a' Q  m" }5 v) M9 _
  11.     ) C2 [1 v# p5 _) @
  12.     final Quest old = _quests.put(quest.getName(), quest);: X6 s0 `7 O) l5 X" q! s6 C
  13.     if (old != null)) h4 `* D( Y, N' B  B" B
  14.     {% E, K& Y, X  i* g
  15.         old.unload();
    ' X& o. x! j) _1 Y- |5 o
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");6 z1 T, v! m3 P4 x1 g
  17.     }/ w) x6 ~$ Y) K! k) _% A8 I
  18.    
    & `5 y3 L. J4 d5 P
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    2 c, ?$ B0 f$ x) f9 H
  20.     {
    " r1 _, R; `  x; J
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();" ~4 z  w. L( _  }' `. ~0 Q" t
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");5 e+ z% u) k7 {' S& ]3 F1 [. r7 s) b1 k
  23.     }
    6 @4 c0 p  y  d( @% [; @7 K$ }
  24. }
    - J, p: a3 f, e1 m, y4 }
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.2 }4 O, V2 q  T$ u
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.- U9 l' x  d* r, C; [3 t( I+ p

! ]( X9 d, U3 a" D+ g3 v3 y# [3 h+ `: `& n- U- N9 v* e
; Z: O) W8 ?5 w( \+ P





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