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

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

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius. y$ O$ m' Y5 a+ f0 t
9 D* F2 R+ U1 X* v! ^- i
Разбор файла QuestManager.java
' T6 U3 T" ^/ d+ p" _/ C  i+ \1 G
9 d1 j8 u  x% n4 RЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
5 ~0 Z7 a) L' B; K& hОсновные элементы. }4 M8 w6 r+ c4 b1 S; G* r

) n9 q4 t" u  b5 @1 V8 `$ YQuestManager.java — управление квестами и скриптами.
2 L! G$ O" H! `" C4 s$ hПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\, U; j( S+ S9 _  Z4 S

4 t6 k$ x& R" v7 f6 }: F+ V

  |$ F) s6 N- p. J# D* x( B7 jДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.4 t. Z/ h' j3 q
1. Лицензионное соглашение2 x7 ~0 |4 p- B1 _
  1. /*
    + Z9 i; Y0 U; S/ u
  2. * Этот файл является частью проекта L2J Mobius.; t# _7 e  o8 N' Q
  3. * * n! y4 s2 D7 Z* n
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    + J/ o! h/ t+ c. r7 e9 ]
  5. * её в соответствии с условиями GNU General Public License, опубликованной. K8 s5 `" B: R) x6 e
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии., w; s( J, a+ K7 J; ^
  7. *
    # e& W9 Y% `' i7 H
  8. * Эта программа распространяется в надежде, что она будет полезной,* e0 {8 w; G+ N# w! d
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии# Z0 \  s' g8 R+ i% H' H( \
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.3 }2 ?* b2 f0 F/ B6 E; w. B& A
  11. * См. GNU General Public License для получения более подробной информации.1 i7 P1 z, z! I9 T5 N
  12. *
    - N2 @6 {* r- V9 y4 p! y# n4 g
  13. * Вы должны были получить копию GNU General Public License% f( t% w% Q) {- f0 A
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    / B9 m% T/ z0 T  l- C2 _' W+ W
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
' P9 w: k  {. P" ^' h; a# x# u; d% F5 Z
2 P. u; e" g0 C. u$ ]  Q
2. Импортируемые библиотеки2 z& v% f% C3 O: J( T
2 s6 R8 z. j) E9 }, A* A# K+ E. \
  1. package org.l2jmobius.gameserver.instancemanager;
    ! f' [, j! {: Q: R9 z
  2. , t5 g& L% C) [, j# G" H; d6 j8 W3 ^
  3. import java.util.Map;$ C! d% W0 t' q% z
  4. import java.util.concurrent.ConcurrentHashMap;
    ' c& \8 l4 B" ?  o/ J! k
  5. import java.util.logging.Level;) I! a2 A; [) Y# M; c; u4 f: P: X
  6. import java.util.logging.Logger;
    - H3 g  c5 ]! X( M8 ?0 l
  7. 8 m/ g' {: Q! }' f6 _
  8. import org.l2jmobius.Config;3 i. \7 N2 \+ l& s! k. e
  9. import org.l2jmobius.commons.util.CommonUtil;. K' `  ~( V- A8 r
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    ) v4 S- @( E' W. @4 J6 Y
  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 — менеджер для работы с игровыми скриптами.& q1 W; N( [1 U" G: B

0 C8 F' i( B+ W( I# Z! z9 U3. Описание класса QuestManager% r- s& F  m+ b+ B. y
  1. /**
    7 R9 I; a; H" W! O
  2. * Менеджер квестов и скриптов.- p! ?3 q  N" M( r6 `2 t
  3. * Автор: Zoey76
    8 ?+ K3 e  w+ N0 g% _7 [2 s. q* A+ m
  4. */" }) k* F! P( q/ Z- e5 A/ n
  5. public class QuestManager5 c& E+ q( e( I  c! q6 J
  6. {" E+ U8 G. J  I* F9 W
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());+ \: ~; c4 m- V9 Y1 U$ b
  8.    
    " Z8 [0 e0 ^' g8 p, @; ~( V
  9.     /** Карта, содержащая все квесты. */  N* Q5 S8 z) V/ n/ H3 F
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    ; J4 D. v9 K1 E: d
  11.     /** Карта, содержащая все скрипты. */1 T& H# V+ r$ b5 i
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    ; [( |- h. `2 q7 t% M! x3 g/ U
  13.     - N) K* O8 Y; A
  14.     protected QuestManager()
      p' r/ j1 o' e
  15.     {/ |: b* R* ?* x: A. y
  16.     }
    # W3 m3 }6 E  t" N3 j5 Q0 I
  17. }
Скопировать код
4. Методы
2 U) r% h/ j6 Z4 u& ?; fМетод reload(String questFolder)
1 n; t; M7 {( |
  1. public boolean reload(String questFolder)( {6 l+ @- O0 \  @3 M6 g
  2. {9 ^% K& w3 z" I0 C& r
  3.     final Quest q = getQuest(questFolder);$ P( A; D  {. m- `9 {# R( t
  4.     if (q == null), g) h% u- R0 J5 M4 j( t% s' u
  5.     {4 H# g: r; q# l
  6.         return false;. V. u- _( V& Q1 u" ^& T! s
  7.     }
    9 t$ v# `9 k1 a, k" g
  8.     return q.reload();
    5 [) N8 j! |8 n) o
  9. }
Скопировать код

% [1 S) i% k# K% }" z7 {9 ?0 P: r# y. |
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.: V0 X9 h  R5 ^! b! J
Метод reload(int questId)
$ r# L. l8 D3 Z( I" V/ r; k. W( `$ y4 o5 q, U9 N5 C
  1. /**  v+ d, A. [' U0 I  \  U5 `
  2. * Перезагружает квест по ID.1 U- R3 N* _! ?0 w. {8 @4 V/ F: q
  3. * @param questId ID квеста для перезагрузки0 L% E  {6 `/ A
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    9 Q' n0 V' Z. r# s( |4 B' F6 R* X
  5. */
    ! z# U: @: O$ W/ i
  6. public boolean reload(int questId)
    / B- Z" U0 ^/ [& y' w2 C
  7. {2 p: j6 G0 H4 E
  8.     final Quest q = getQuest(questId);( u  U/ E/ z' E( U" Q
  9.     if (q == null)' p% q3 b7 x; ?" [2 t6 L; O
  10.     {9 Z" M: l& a/ s0 j0 P  J6 h. n' q
  11.         return false;
    ) @" F# C  ?5 R0 O2 N' O
  12.     }! E5 k: I. H: a% u. U% ?
  13.     return q.reload();7 e: v. {# t7 N2 g+ Q# \0 V
  14. }
Скопировать код
& Q3 K* ^, ?  E
Метод reloadAllScripts()
' z0 ?$ A- f, h" x, ?9 m% d) u+ @; y& b# m- N& l& K
  1. /**
    & B, v9 h0 }+ q) F! C
  2. * Выгружает все квесты и скрипты, а затем перезагружает их." ?5 s  ?9 g6 N) J% W
  3. */9 p" b4 g$ e) Z
  4. public void reloadAllScripts()+ W& g  `. }' R1 X/ V; \" i; p
  5. {
    / D- e0 X  r; V/ [4 I! V
  6.     unloadAllScripts();
    + B# o. ?' m( |0 I# C
  7.    
    ! S! U% G* H5 O7 H: M* w
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");" T3 k( d$ _; s6 d$ K+ m
  9.     try$ d0 w; ~/ j' o% k1 y; J
  10.     {
    2 Q6 P1 a2 u- E% j/ E( b( ]8 _' ~9 h
  11.         ScriptEngineManager.getInstance().executeScriptList();
    . ^9 A0 O$ }1 w1 \, p% e
  12.     }
    5 ?5 w: Z" j# |: t( t' i
  13.     catch (Exception e)( X* r8 Z  }/ b, A
  14.     {; {6 g( S8 ]- F7 w- }
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    " q  W  i$ o. A8 b" d* M
  16.     }* K) a$ d: I: q" x
  17.     6 @# ?$ {5 L; j. G) B+ L6 {) B2 `
  18.     getInstance().report();0 j4 ~. I7 B* k5 C" N( E; g
  19. }
Скопировать код
Метод unloadAllScripts()# g. R; S" w, b9 J3 K& b8 X
4 K5 }4 t1 Y* r" w) d- g
  1. /**
    8 O8 H' V, [9 o( E
  2. * Выгружает все квесты и скрипты.
      F5 E$ @1 r7 L) G( p# s: X
  3. */
    8 G' P1 V1 h5 U8 s2 z& A
  4. public void unloadAllScripts()4 t9 _' T* \5 H/ M& u0 K8 [4 |
  5. {
    6 w0 M, H( Y' X! f
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    & N, N* \' @# W; i% `
  7.     6 ^3 ]: P8 f, r4 M
  8.     // Выгрузка квестов.
    5 E$ {8 t. b# _! P0 i* c$ \3 o  f
  9.     for (Quest quest : _quests.values())
    ) }  ^: }2 u; L& a2 U
  10.     {* Q1 X) X$ r+ X8 C2 |% M
  11.         if (quest != null)) u0 n  u, t3 l- Q+ L
  12.         {6 V6 P. L, ^9 r# v  @$ ?! l9 I/ K
  13.             quest.unload(false);  p8 ?# \0 {( V5 n6 B  P0 `' e
  14.         }0 ]4 J, Y- t  h6 H. D3 ?2 z
  15.     }
    * a" m  R' T! z% E, S( j
  16.     _quests.clear();
    4 A7 ~4 r4 y/ x& R
  17.     // Выгрузка скриптов.7 S4 w, |2 H8 Y- i$ j0 ?
  18.     for (Quest script : _scripts.values()). e" w! V( e- G/ c8 K# W; J) U
  19.     {& }; t2 N- N. j. `8 W1 b$ Z8 ^
  20.         if (script != null), P/ }7 B5 n4 G  u9 \& U
  21.         {$ q1 t8 i3 A+ _' _
  22.             script.unload(false);
    ! W1 Z6 ]5 W7 N; T4 Q9 @
  23.         }
    * g( w% s7 [8 g. a: e/ a- m
  24.     }, h4 A4 Q  d5 {4 n
  25.     _scripts.clear();
    / ~: K0 S2 {  ~7 }* w
  26. }
Скопировать код
( n3 ?% W% D4 k5 t5 ^
Метод report(): \& `# _  c$ v+ _' Y' `$ d

" ?0 V: U% D0 X+ g9 a6 W
  1. /**
      _. O3 f' K: Z0 X; q% M
  2. * Логирует количество загруженных квестов и скриптов.6 ]0 l# N- ]% d) N9 t4 t3 Y! ?* j9 h
  3. */
    9 k, V0 C& ]" V& w# Q8 F& h( y$ ?
  4. public void report()
    5 _' R1 J5 o# ~" K$ W
  5. {" Z6 z, x; B9 v1 V  P5 m$ |
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");+ U7 M! C3 T2 V7 o( q8 `" [
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    7 v4 W8 h+ P% X, T
  8. }
Скопировать код

9 s& l) n! h" JМетод getQuest(String name)! a6 P$ n: u7 |* e" p
8 L" L1 Y- `. @$ G, f3 }
  1. /**+ w2 C0 C$ B0 E" T
  2. * Получает квест по имени.
    8 `9 O1 P! G, o6 g1 ?. q& t
  3. * @param name имя квеста
    & l% ~: h+ w  d. W( x. V! w
  4. * @return квест
    / c" Q; ]3 a# a
  5. */' q: ^5 v; E/ D9 t8 l
  6. public Quest getQuest(String name)$ W; h. N/ \$ D4 a9 I* h# p8 n
  7. {
    ( P2 ]5 P+ Q7 Q& w" C! W0 q
  8.     if (_quests.containsKey(name))6 o! {0 N' t  L% \4 s, \" u
  9.     {
    7 \& M1 s9 N4 U1 b. Y
  10.         return _quests.get(name);' f0 G. u7 f: j# h! x
  11.     }
    % n/ c# m0 p! U- S; x) T1 |3 ~1 w( K
  12.     return _scripts.get(name);
    & ^  _0 A0 Z. x
  13. }
Скопировать код
% D4 {7 v8 a+ S2 A9 ~
Метод getQuest(int questId)
4 J- a& W0 y5 s8 A# q6 W
! _: e4 _0 Y+ g1 a6 v
  1. /**/ o1 E+ t; N; |5 N4 b* p
  2. * Получает квест по ID.
    7 a. V( U2 D& `3 W6 y$ l
  3. * @param questId ID квеста
    & e$ a5 w0 u/ b+ l, q) e# ~+ i
  4. * @return квест, если найден, {@code null} в противном случае9 q6 o% T7 V" I0 h) @
  5. */
    * F, Z8 E6 g% C( q$ i* V
  6. public Quest getQuest(int questId)
    3 }1 ?" S; W( p
  7. {7 \) i4 _5 [  c3 z# o7 K
  8.     for (Quest q : _quests.values())
    " Z6 A( W. L( G2 L% D
  9.     {
      p7 P/ ?6 ~* F& T
  10.         if (q.getId() == questId)3 \7 w/ S, p4 l+ }* W) X1 q
  11.         {
    9 n& I& V& l& k( _. m- x
  12.             return q;
    $ O7 Z/ [. ^. p
  13.         }1 `( G9 O1 `3 y7 @0 t
  14.     }
    ) W/ L6 Y) `9 a  O. E5 }
  15.     return null;
    7 }& S6 h+ H  d! j0 f
  16. }
Скопировать код

% v& F* V* v3 i$ ]4 jМетод addQuest(Quest quest)
8 p' O; r, F3 Z4 ~0 K5 |8 |
3 D! r. |5 s$ |$ J
  1. /**3 \" s9 \# D. o" {' W9 Y
  2. * Добавляет новый квест.
    + M( W+ o  X0 Q& m3 H) f
  3. * @param quest квест для добавления
    & ~, C7 e# l! Q
  4. */; Z, H! \+ |' K, t- ~) q
  5. public void addQuest(Quest quest)
    - m& A3 O# }, O' `: F) `; ?
  6. {
    0 v0 G" p- }+ x  E: m
  7.     if (quest == null): w% {/ L9 p! v$ [% B
  8.     {& C) @# g) j+ ]! Q, M
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");7 A: H/ t. ~( O/ T) `6 J  _7 |
  10.     }
    4 E8 M+ ?1 J* I' k7 n3 u. P! i
  11.    
    / |, o0 f- B( N0 B* x
  12.     final Quest old = _quests.put(quest.getName(), quest);
    8 ]* X. B, n7 k0 e/ S2 v/ |- p
  13.     if (old != null)
    ! q+ h9 g/ X& {
  14.     {
    * M# V. v/ \! `" a( z& F- u
  15.         old.unload();8 B; D' s, m1 ?! Y1 q6 y
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");* a$ f2 N7 f, c& @: U9 ~( g- _
  17.     }$ K: n- X! B/ |3 {6 W5 c
  18.     ; u, S4 G8 o' t
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)8 K# S0 m/ f* b3 t, l5 [
  20.     {& r; c" o0 @1 p4 z* o. p
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();/ z  \. o9 I: d+ z# q% I2 d+ m
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");7 x: |6 e0 m  x9 S/ I( s: z1 R$ \: a( j
  23.     }
    7 y# O: }/ j2 r3 e6 R
  24. }, N0 @6 f/ ]$ k
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
# H( ]7 t/ t1 ^  y  `7 @ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
: Q7 I! K1 ?# k7 D* b7 n/ [- z$ E: |9 a- `6 I1 J  m% i

, W/ a. M+ n& z: P# u) v9 s  H- ?
: `5 e, j' M# l




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