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

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

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius5 ]3 r8 e# P1 ~! I5 T" V
! ]* f% {9 K5 V$ x
Разбор файла QuestManager.java
5 n' \/ y1 n  L+ {2 v5 M2 q
5 H. s4 U  t& a( M) yЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.1 \6 Y' c' _( o8 W5 M$ t2 p
Основные элементы
8 ^+ D# \$ l! n! Z! L; k
/ j' J* h, o8 k  Q8 DQuestManager.java — управление квестами и скриптами.' p7 S9 X9 U7 Z7 j
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
/ M! s$ O* S% Z+ W9 m, A  N" o! i& U+ M( z

0 ?* ~5 r* n" d+ v6 S( B1 kДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
' c; v6 P0 Z' b# B% {$ a9 G. ~6 u8 N1. Лицензионное соглашение5 E2 \' L0 K$ X. x8 U* E
  1. /*% B% S( V8 k$ m# `
  2. * Этот файл является частью проекта L2J Mobius.* k' _3 |% F  V1 m1 V0 b
  3. * 1 M3 D2 A3 m+ [" L$ X2 v; N' ?
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    ; q9 C, T9 D( S4 m
  5. * её в соответствии с условиями GNU General Public License, опубликованной  r' S; I. e- ~+ a4 r+ m" y
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    4 T2 Y1 S( M4 f$ n
  7. *
    ) ~6 s( ?7 o) K7 U7 {! b
  8. * Эта программа распространяется в надежде, что она будет полезной,5 l+ n2 {# R/ w: T; }2 ]' }/ \$ @: E
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    5 |0 ^& {2 i; x" B  V
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.' h0 X; B$ K( z  g$ y1 d
  11. * См. GNU General Public License для получения более подробной информации.0 G6 P" \( A$ N$ U8 d* H; S4 {
  12. *
    ( w0 p5 k% ?8 f
  13. * Вы должны были получить копию GNU General Public License
    $ @, g' v% ^/ E6 y5 L+ B
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    & K3 `8 ^( x. l1 U+ U# c
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.+ p4 A- T& X  ]( d8 z& X/ H

; i7 `* G8 L& e9 r. U7 O# c  Y; b, t+ Z3 F5 i
2. Импортируемые библиотеки
$ o) p9 R: ?( h, Z
8 X# J0 }: W2 I% I5 q
  1. package org.l2jmobius.gameserver.instancemanager;
    * j  a  \1 a6 b% U# ?8 C8 H
  2. $ O  m( I7 B  [) B3 Y, |6 l* {: p
  3. import java.util.Map;/ W  L0 S% {* R( }1 C% g/ ?6 K
  4. import java.util.concurrent.ConcurrentHashMap;+ `. B3 y3 x; X
  5. import java.util.logging.Level;
    7 C( [0 W& C% q% b: c4 w
  6. import java.util.logging.Logger;$ ]: |/ M  h( j
  7. 1 x+ R; Z% W7 Y0 Q# u9 o- }1 {- X
  8. import org.l2jmobius.Config;* o* `+ p4 d' a% Q5 r- D
  9. import org.l2jmobius.commons.util.CommonUtil;0 t% i5 Y0 Y1 Z& t* ]; _
  10. import org.l2jmobius.gameserver.model.quest.Quest;3 }. h7 J1 T+ Q9 K! A0 w
  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 — менеджер для работы с игровыми скриптами.
# L! `* y7 \' K& L2 n  N0 k0 v$ f2 W3 K# m1 L% L
3. Описание класса QuestManager
- W* F9 X" r1 B1 [) v
  1. /**
    5 q: s3 |3 [- t9 \: ?' i( W
  2. * Менеджер квестов и скриптов.0 k. B- }# {' c; S
  3. * Автор: Zoey76: y' s; \: ~4 R; h) u2 S0 n% p, p
  4. */) C8 {5 |6 s6 l, p
  5. public class QuestManager' O' a5 e3 R' z9 G. \
  6. {" Z7 O! s! V1 p/ W% t0 t% ]) f3 }$ b
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    , K- L/ H* B* b% I
  8.    
    8 j$ Z% d. Y9 l/ h( o
  9.     /** Карта, содержащая все квесты. */
    # a# s( M6 K" v, C& p
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();4 v; b! ?8 }4 T6 X6 O- B/ Q; B4 }
  11.     /** Карта, содержащая все скрипты. */9 `3 D; H) O4 [
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    ; \, O& u7 l2 E& b" W7 W& l, Z, v
  13.    
    0 v* [  M; v" [! ?  R; x, l
  14.     protected QuestManager()* N/ ~- Q; `: [9 Z
  15.     {. p8 l- L' H- [( S3 T
  16.     }
    & B- o" Y3 H! V7 E2 L, ~: R( t
  17. }
Скопировать код
4. Методы' |" w1 ]( D  U$ v2 n; V% C( H
Метод reload(String questFolder)" O! u: s8 C$ S* V
  1. public boolean reload(String questFolder)# T6 V3 d* r3 i! x( c- {1 G
  2. {
    . N+ j& e( V- J3 g0 H
  3.     final Quest q = getQuest(questFolder);
    ' r7 L7 Y, [; ?& x9 Y
  4.     if (q == null)* N, l2 ~; l% u( b  t& j2 n
  5.     {3 U. L* B" E! g5 P) }7 R
  6.         return false;
    1 w; ]$ b  J( S
  7.     }" A, r: L& D, L! t! Z) H" X# Z
  8.     return q.reload();
    ) f( ]$ }: R( v$ r
  9. }
Скопировать код

! w' W- ^" P! ]8 |# J3 c) a% X5 |! j8 o; n" t8 k* c
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.- w: V. ]) \& Z" e
Метод reload(int questId)
7 |& v: C2 C. U7 Y; m# J1 Z; m9 @; u  C0 E8 ]" X; B- p
  1. /**
      U& Y! h9 V: o) s  X5 R0 v* B
  2. * Перезагружает квест по ID./ G, X$ @8 E, z9 {7 U
  3. * @param questId ID квеста для перезагрузки
    8 T( ?9 A, v) S4 x. J6 u
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае" \* g' L9 }" q4 e, F
  5. */2 c! K! x, Q% _
  6. public boolean reload(int questId)
    8 |/ K; N5 G8 ^/ M
  7. {& @. }! w1 M; D6 |! i2 e
  8.     final Quest q = getQuest(questId);/ Q2 q( f+ l3 a- T. S2 m& P
  9.     if (q == null)
    5 ]6 r7 k. {; C8 s2 J+ u- ]1 o$ J
  10.     {
    ! I  t  I/ j% {3 r6 h# ]- R
  11.         return false;' B# r% z, `3 T' K. {
  12.     }3 Q* D% Y6 m9 D2 D" c, x
  13.     return q.reload();
    - O  A% i1 P  t. l! q5 v
  14. }
Скопировать код

- E+ _2 t9 H# V* a+ vМетод reloadAllScripts()+ [6 T( Q3 R" T" A- D% w' E

2 J0 p3 r) o' P6 T8 q' r' a7 |
  1. /**
      q! ?+ o) D2 b5 ~/ P
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.6 X; M3 L- A6 x: d5 a5 A3 |' c7 u
  3. */$ ~% G4 T: j* C$ s! w' H! B! D" o' D
  4. public void reloadAllScripts()
    1 f) |/ C2 h% B+ h$ g! A) ]
  5. {2 [8 w6 E: w4 J8 Y: e/ E0 b0 f
  6.     unloadAllScripts();
    & J. N) ]+ x3 Y$ y/ a% S
  7.     - R( g3 P- w+ ~  d) [. S
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");" K' x0 I# O' h$ C  j
  9.     try$ e: f/ q  x9 I' }% O
  10.     {' n& {: m( M% N4 M
  11.         ScriptEngineManager.getInstance().executeScriptList();; |3 Y7 H4 e( g* n2 A1 g( _
  12.     }9 `* c# r% Q& B6 S3 o/ s! T6 b9 y
  13.     catch (Exception e)
    ) ]2 x) Q0 X% e9 o$ Y
  14.     {
    9 ?, N+ f8 X& F  }9 F/ U
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);! M) x0 X! G: e5 B
  16.     }
    4 P" s9 m) ^5 I/ f. h
  17.     3 F$ |: S# e8 T: n% y; J8 k
  18.     getInstance().report();7 G* W: T3 d3 n* ?
  19. }
Скопировать код
Метод unloadAllScripts()8 l" Z9 X3 e, l) x8 j

* M* j4 o+ `1 l* [$ I0 X
  1. /**
    + {1 j* N, K$ U  E
  2. * Выгружает все квесты и скрипты.
      }' x7 M6 [5 v
  3. */! E1 G6 w4 G, {8 [; d5 p
  4. public void unloadAllScripts()6 O0 |( Z$ p. r& \
  5. {
    - d( w1 T4 E1 t" X2 L9 Z
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    . N: |- P) M* M; e* j/ b$ w
  7.     9 ^; R6 R* t% }, Q$ @8 b8 p1 d
  8.     // Выгрузка квестов.5 U5 t; T* \" p" A
  9.     for (Quest quest : _quests.values())
    / Q7 A+ f3 k" b8 \4 `
  10.     {- b( ^' k: r: {8 c
  11.         if (quest != null)
    % k9 I8 A6 O  o, o' K" U
  12.         {
    & @, c5 v3 v' q; u/ u' e1 S
  13.             quest.unload(false);, ?0 S0 V$ o6 _, R4 B$ n# X
  14.         }
    . y) ]$ @6 o5 U- l
  15.     }
    ( j9 N  f* `+ z( ^
  16.     _quests.clear();
    0 w( b# e1 ?4 U2 F- J
  17.     // Выгрузка скриптов.
    2 o/ \2 M. r4 E
  18.     for (Quest script : _scripts.values())0 C3 a( z" N4 W. |; L4 T
  19.     {' E$ R3 ~' ~! w/ V( c4 v
  20.         if (script != null)' F/ s$ w/ `- l( T$ z
  21.         {
      ?& `+ x3 _2 @* f! `. W
  22.             script.unload(false);& m) Z% a$ I& h$ r3 X% S4 {2 N
  23.         }! V1 r) b" ]. m2 B- g. A' L
  24.     }( }* H0 @+ j# O) a) i$ l. F& ]
  25.     _scripts.clear();
    - Q* p" w+ p: W' x% x
  26. }
Скопировать код
4 Y  B, P( P( i1 G7 `$ J+ v  a- w/ L
Метод report()
. @- A2 Q( D- J, U
7 F/ t  ?) T3 o' H  j/ F
  1. /**( \9 b3 l  M6 `8 p: T
  2. * Логирует количество загруженных квестов и скриптов.
    3 E) D. j. d* z5 o
  3. */
    9 w% G, ?" U. X6 o. k/ x1 x
  4. public void report()
    2 r  s  y" p( y0 n* Z
  5. {
    ; F% P) p* ~; k
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");2 ?$ I# u" o8 X" i0 d
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    ( F7 Y# k" g  o9 }" p( ?  ^
  8. }
Скопировать код
1 |: |) D: K  \$ D
Метод getQuest(String name)* t* U+ _6 p1 @) S8 B
/ E, N+ E& P3 Q9 j
  1. /**) L2 ~- y+ e; V% h
  2. * Получает квест по имени.  k" }* n8 M' i" {; F$ s
  3. * @param name имя квеста
    , L- {, v6 p% N/ R2 v
  4. * @return квест
    4 K6 v  b1 \4 y% D2 n0 N
  5. */
    # B: ~# }: @- F$ u3 s; J
  6. public Quest getQuest(String name)6 M" `* m& r+ \# h, N& q
  7. {/ @( ~, }; [7 a5 s/ [$ }
  8.     if (_quests.containsKey(name))
    % T. X+ e8 X0 k: h
  9.     {4 A0 \! a8 ~# g, ]2 V; p
  10.         return _quests.get(name);
    0 U- S* K9 y" H
  11.     }. v7 Y$ {$ [4 X2 Q2 Q% L$ u
  12.     return _scripts.get(name);
    5 g1 C9 E. d) t% g% f5 T; A
  13. }
Скопировать код

  A& ]2 Z5 J: sМетод getQuest(int questId)
& c, z' B) p5 W) U& T4 Q
: q- x1 p+ n9 M$ ]7 O1 ]$ ~" g
  1. /**
    - J. w( _3 g3 X+ B" ~0 n
  2. * Получает квест по ID.
    7 t6 o# {" V' d* N# c2 }! m. f
  3. * @param questId ID квеста
    7 U! N. A4 [. v- p" J4 R0 h9 u
  4. * @return квест, если найден, {@code null} в противном случае" D2 |8 H) {. }- j+ ]
  5. */+ X! @! _5 ?6 [3 i
  6. public Quest getQuest(int questId)
    ; n: H# t: N! p: c! f9 `! g
  7. {1 C6 X: f5 g* [" p
  8.     for (Quest q : _quests.values())
    / J( V' R4 ?& j( p
  9.     {
    1 c8 |% R) @; j- J
  10.         if (q.getId() == questId)
    ( J$ V& T7 n. Z6 h3 P$ y+ m, [
  11.         {
    8 h, {; N! m: _/ c7 v( v' F, e
  12.             return q;* p4 u* E( F9 }+ T
  13.         }9 o* a* d7 c4 }9 d- d0 p8 y0 E
  14.     }
    1 R8 P9 U  N, [  p0 s2 H
  15.     return null;
    , J9 r) L5 O0 Z0 W  W6 [
  16. }
Скопировать код
; T5 e( v9 k4 v
Метод addQuest(Quest quest)% x  C1 q1 t8 M- L
$ f2 I7 I1 R# r# E- H6 C( B! N
  1. /**
    : g; q6 a4 J. c" J8 T7 q# y! t! ^: @
  2. * Добавляет новый квест.
    ) [" `7 @/ k4 H. D
  3. * @param quest квест для добавления$ ?0 A/ k7 V3 w/ l
  4. */
    1 V2 N& V+ q# X! b1 w- L3 g$ h
  5. public void addQuest(Quest quest)
    " a) n% N, ]) X2 _( c& L
  6. {
    ; W" }* {: L, m5 _4 a
  7.     if (quest == null)( M9 C( E: _: r* K
  8.     {
    6 W0 c! B/ V1 q  H1 [
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");% x9 U+ g6 Y: |
  10.     }
    + L# N3 O' ^' {3 H
  11.     , n3 i5 v2 ~6 q. c
  12.     final Quest old = _quests.put(quest.getName(), quest);2 t% X- e3 x- t  ]: p
  13.     if (old != null)/ m& f9 [% ^/ J& [
  14.     {; m) h8 D) l6 q4 D. j. O
  15.         old.unload();6 j/ O: v1 }; @: n3 H/ I6 U
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    * z  h7 L) K& k& N9 L
  17.     }
    , S6 m6 q- n0 c( K& i! Z& K6 Q& V
  18.    
    : q% S6 a; ]* J* f; R# f
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)$ F: _( K4 i( c: B5 R( ?" _
  20.     {( T4 ~% a% S  r9 ~- V+ T# _
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    $ U$ E& Z, Y& u
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");  z0 y3 N% ~* z6 ~2 U
  23.     }
    $ Y" A6 K2 R9 B- j
  24. }
    5 g4 _" V( y0 k7 f4 ^3 y
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.( C# G" z6 v, o( S* F( }
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.' M9 j+ {% x) C& [$ L, G( w$ P* m& Y

2 x: J5 r. q- _0 C7 C; m6 H2 C* h, o
9 K$ `& y8 T9 o- }
& J) m0 g0 r- U$ r2 P  {




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