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

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

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius
# L1 f9 m& ^  q% T3 T$ |8 j9 V: |6 Q+ y/ h+ j  q, i0 p2 [1 T3 C
Разбор файла QuestManager.java: X4 J6 X4 g3 y3 Z9 D6 S: q

; z+ @& _3 u" x' f* `7 \! UЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
/ x( D2 v- |; N( WОсновные элементы! O% A+ ~  z1 o6 ]. O: S4 A

. t  ]( U9 K3 e2 ]( DQuestManager.java — управление квестами и скриптами.
4 `& C1 c0 A+ FПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
# D* M# m& P1 E% k& ^, G. C; _9 ^  _0 C
2 r& X; W4 |4 F4 A( |
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
/ m6 T7 ~  q" l; ~$ @7 Y1. Лицензионное соглашение
0 T, i0 `) i. h( \
  1. /*
    4 z1 d* d; u  \" u3 \0 e
  2. * Этот файл является частью проекта L2J Mobius.
      c- ?8 _) W* G9 s+ n
  3. * 0 A4 \9 X& K+ ?% D
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять" s; A+ A5 x2 q) e5 N
  5. * её в соответствии с условиями GNU General Public License, опубликованной  A, q2 |* p' y7 Q3 v) w
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.4 N" p5 J+ a2 @' \7 }( K! C! W" u
  7. * - U4 q8 c5 r/ A- \7 ^6 T& K  q
  8. * Эта программа распространяется в надежде, что она будет полезной,
    " Q8 U! i) F" w7 R
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
      k) |) Q* g+ V2 o/ s5 @3 n% K
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.5 F" y% |( d. q
  11. * См. GNU General Public License для получения более подробной информации.2 f& \1 F+ U2 t( v1 p" e
  12. * 8 Q, H7 Z3 R# ~" c: ?( j+ ~
  13. * Вы должны были получить копию GNU General Public License1 t: Y! z/ t! @  [6 `' Y
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    % x7 Q, |& F& Z9 b
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.; P* ]. ]4 ?& }! F0 N& \$ V
3 }9 X  {# z& @  g& _; l
" }9 T1 x( d9 o( S% k' l' g+ o
2. Импортируемые библиотеки
4 ~- d5 O9 S" P
6 s2 K" Q  p$ o" Y( f* a
  1. package org.l2jmobius.gameserver.instancemanager;# |7 r! {& j9 X1 c# l- Y
  2. # a' c! K6 p1 ?* z( x! t
  3. import java.util.Map;% B& n+ [/ y& O* M1 N: h% J
  4. import java.util.concurrent.ConcurrentHashMap;- F9 a) s( q3 A3 n( e- v8 z& y. E5 l
  5. import java.util.logging.Level;
    5 D, g2 q- u! u# I/ A# J3 p" _
  6. import java.util.logging.Logger;2 t& X3 [. p% C5 d( `
  7. 5 P! _! J3 r- Q4 h5 z: n
  8. import org.l2jmobius.Config;, r* t( R- k& _/ e' X, o; c- n  ^
  9. import org.l2jmobius.commons.util.CommonUtil;  ~% O, \; f$ B
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    . E0 v1 c- @+ ?* |8 R. M, v* D
  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 — менеджер для работы с игровыми скриптами.1 y% a* q8 I# v6 `! \) G3 Q
, w$ f4 }( m, _+ W0 y
3. Описание класса QuestManager! r8 C- X7 ]( m- N: K0 N
  1. /**
    7 I- g/ ^, J1 s/ j6 n
  2. * Менеджер квестов и скриптов.
      P. ^4 U& F9 n8 T0 N- v+ F& b& o1 `
  3. * Автор: Zoey76( L1 r  b; g, U
  4. */
    $ Y# V3 W4 q! c( {, n  U
  5. public class QuestManager% Z( W8 b" U* |& R% ~. F
  6. {% l6 i) d( c% |6 W6 ]
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    6 T0 g* P' A+ P" F- B3 H
  8.    
    ! T, K% M) q; ?- M* b
  9.     /** Карта, содержащая все квесты. */. T+ w" j; l! W  w0 Z
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    ! [% U+ r2 W* q( s2 {" a$ I
  11.     /** Карта, содержащая все скрипты. */8 C  r1 j* Q8 I! Q2 D. y* F9 g* Q
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();  G* H: \* [$ G- z6 R
  13.     + H0 h$ v& I* {
  14.     protected QuestManager()
    % v& s9 `/ @6 N3 ~$ c- i; L
  15.     {
    # `: r! @7 T! i% y+ S/ B9 O$ Q
  16.     }
    9 u3 D2 N/ Y2 [5 ]
  17. }
Скопировать код
4. Методы8 {) N* E/ Z, _" O
Метод reload(String questFolder)* h9 Z9 w9 w" V2 U
  1. public boolean reload(String questFolder)
    $ n1 F- C8 _1 j% Q0 k% i
  2. {
    5 P! S1 }6 g( ^; |& q8 T
  3.     final Quest q = getQuest(questFolder);7 o  {9 ]) b7 x( F7 h1 k
  4.     if (q == null)8 r  v+ @4 i! c9 ]
  5.     {# I( J- ?0 y& u
  6.         return false;
    3 l1 ]% q# }, {
  7.     }
    2 y+ `, ^0 j5 U% u) \0 D
  8.     return q.reload();
    3 v3 y% L+ Y6 u0 t) S
  9. }
Скопировать код

0 R9 }, Y. q. k5 a3 k  L' s! _# Q5 H1 W  H
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
0 Z2 J2 I* M& L! \; TМетод reload(int questId)
6 x' H6 [, E, c  P0 h1 E  J" l  ^- g# o- C
  1. /**! ~3 K3 [, Y# L! }$ k
  2. * Перезагружает квест по ID.
    ( l* K  }9 g3 n8 F5 ?9 H9 ?2 M) K
  3. * @param questId ID квеста для перезагрузки! U6 @  t6 ^5 K0 Q+ m
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    * M0 E% E# p9 ~4 i9 V; u
  5. */
    / ]4 @) Y5 b! w. X
  6. public boolean reload(int questId)+ v1 o, x  x# B3 J1 b) r0 U! Y: z
  7. {6 W5 ~% O) Y  _9 u% V
  8.     final Quest q = getQuest(questId);
    ; C& q+ T9 j$ d) \  g+ U! p
  9.     if (q == null)/ ~' `9 |! N' ~, a: E6 w4 a/ |
  10.     {
    % y! g% X0 k/ H! _7 W
  11.         return false;
    * [* _5 m6 y. s
  12.     }
    3 k$ ~6 n. A% o0 w# n5 A; y
  13.     return q.reload();: X0 u/ J: M" b( M: h
  14. }
Скопировать код
/ T& G6 o6 k( U
Метод reloadAllScripts()$ s, }( l: ^5 u. J
  I; i6 x. G& v
  1. /*** F- [5 X) x7 ~/ F! O, Q
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.; [9 Y/ I* p8 D3 V( z7 G* g
  3. */
    7 w% k/ h$ N# G
  4. public void reloadAllScripts()0 o* o6 q- i) s  l) z
  5. {
    1 ]5 [1 t/ O- ]5 l4 c1 d
  6.     unloadAllScripts();; S( w# Z" ^. T- e
  7.    
    $ A/ k' K* H* [) |
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    6 a# s9 C% ?9 D, O( ?8 q' H, i
  9.     try# D# v, X3 F1 T, o% \, G
  10.     {
    % u/ E; \* P9 z' V( ?
  11.         ScriptEngineManager.getInstance().executeScriptList();
    $ L  c7 ~) z5 N: D& T0 a
  12.     }
    5 Z) C' {) T. F/ W) r
  13.     catch (Exception e)
    5 ~5 h/ |& p! `
  14.     {
    . N7 l$ w+ B7 c/ p' [/ v
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    3 }) `" X7 p' Z0 `* o( D
  16.     }
    / S" r7 J5 N: g; d' H
  17.    
    7 I# Z1 ]/ c) q. q$ g
  18.     getInstance().report();
    0 z+ ?; b6 {" u. M. \% a+ U
  19. }
Скопировать код
Метод unloadAllScripts(): e8 R: I1 \% P$ K9 n

2 e% v, ^! H3 A8 c8 c, C: i- L
  1. /**
    & F( v" n) X) m8 }
  2. * Выгружает все квесты и скрипты.9 b7 d1 o6 ]% C/ l
  3. */' R. P8 @, i. K2 k- R, ]
  4. public void unloadAllScripts()' Z2 R8 r' s7 D# @+ ~  r' n3 L
  5. {
      t. I) z7 U# Z3 J7 w, K
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");6 e* e" ~  k' ?' y% t7 C
  7.     ' g2 f; ^: @) n; Y+ k9 h
  8.     // Выгрузка квестов.
    ; F' r, ^/ O) u  ]
  9.     for (Quest quest : _quests.values()): }& t% c5 f: G$ Y
  10.     {3 {3 W, ^+ b# t6 E, J5 ?, }
  11.         if (quest != null)
    % ~! [$ F- a0 |" z
  12.         {8 r6 |2 Z# O! R( o$ H( w
  13.             quest.unload(false);
    / l5 G* C! w: n% _* N
  14.         }8 N- d. F! v- w
  15.     }2 ~* [; w! Y2 p0 H8 {5 ~* l  J. D
  16.     _quests.clear();; v: T* K, Z5 x$ ~) n
  17.     // Выгрузка скриптов.
    : ^( Z$ M! h9 T8 F% q; @6 i- R& H
  18.     for (Quest script : _scripts.values())% g; J: }0 Z2 _2 D% _
  19.     {
    & g% e6 F7 J/ E4 F$ U) c3 G$ b* ~9 m
  20.         if (script != null)" L0 ^, D# p. Q  G5 c, [
  21.         {
    ! e" Z" y; _- ?" J' U- K. T0 y
  22.             script.unload(false);0 W/ s( a: m" s9 I" j7 ]7 J7 I2 q( Q4 P
  23.         }) L3 ?3 @6 e/ X/ C4 A6 \. h% p
  24.     }
    ' L* ?) F7 ^7 t& W
  25.     _scripts.clear();
    " E4 s9 S8 G" {
  26. }
Скопировать код

/ a% Q: ~# F0 t$ cМетод report()& |" n- N+ L9 s( A: _! Y
7 D4 J+ E) p3 ]
  1. /*** p: n5 {7 D. u5 r+ R
  2. * Логирует количество загруженных квестов и скриптов.+ F1 v6 K( X5 m( {
  3. */' x$ `6 o; M0 E: j; ?& @
  4. public void report()9 ?, q& m! j% N6 z) |
  5. {
    " p* P. f; h3 R
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");: N" U8 |1 i/ a; a. ~, A
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");  K" ?( t  N& {% ?
  8. }
Скопировать код
0 P. {" z4 s4 u
Метод getQuest(String name)
1 V7 k5 I( X. P4 r: P
# p. e4 G" H: z2 C5 [+ ?" L% {
  1. /**
    9 p# |" Q. r/ P) v2 M
  2. * Получает квест по имени.
    1 V: |' \7 K" M" T/ w1 q( y! @
  3. * @param name имя квеста
    / U1 @) Q+ ?8 C1 _- a4 A
  4. * @return квест4 p! b0 s( X& G) R) z
  5. */: T* N( B$ _" n
  6. public Quest getQuest(String name)
    4 \. |( ]' W$ c% y3 F1 d
  7. {4 Q; t4 N9 i2 e+ w
  8.     if (_quests.containsKey(name))
    # E7 T% K; r9 A1 L3 @/ ~( [
  9.     {1 p0 P% ]1 W7 f: r
  10.         return _quests.get(name);( W# f9 t0 F# i/ n! K
  11.     }. Z. b$ W  e! {8 M$ T+ Y3 V
  12.     return _scripts.get(name);
      m/ g5 }5 D2 ]! ]  h# e8 A
  13. }
Скопировать код
- n' ~5 ~( I  j+ v  B, J
Метод getQuest(int questId)
( p9 W. R) z# o$ M6 p1 |6 o# `; V
( C& W$ A4 p" ]4 }6 [
  1. /**: f4 [5 F9 E! t; r) H
  2. * Получает квест по ID.$ q! P; [0 c5 d0 Z
  3. * @param questId ID квеста
    5 E7 X) c" s9 E4 a& R  Y; ^
  4. * @return квест, если найден, {@code null} в противном случае
    6 a% g/ t2 h, T+ Q
  5. */' L- o4 ?, Z6 l2 u
  6. public Quest getQuest(int questId)3 Z: F: F) Z( j
  7. {0 K! m, o. k7 A
  8.     for (Quest q : _quests.values())
    7 W) p  _$ M; K( p' B/ g1 e
  9.     {# q5 ~. I: R7 ?. ]" _# W0 {
  10.         if (q.getId() == questId)
    . S! N0 `2 O- f4 P3 x5 V& _3 g
  11.         {5 w% e0 J' z; {
  12.             return q;: J2 _' \. ~) z3 s( H; |4 H% p
  13.         }( v* W) E* v2 r& |' s/ ~
  14.     }
    & m1 C* d  o' h8 d2 x
  15.     return null;7 R. v/ C$ S7 {! X
  16. }
Скопировать код
  b: J7 z! J% `5 N
Метод addQuest(Quest quest)
# h; n; Z! W/ P3 }5 J  p% b% h
+ ~9 C# J( z$ ^5 k/ _. y4 S
  1. /**
    + ~; @5 e' _% ]
  2. * Добавляет новый квест.* O+ U* }2 [2 s4 o' v
  3. * @param quest квест для добавления  r' G6 H; d. T% M2 \
  4. *// h, g+ V7 q7 @
  5. public void addQuest(Quest quest)- }. H" J8 W4 ~) r* T: z
  6. {
    + W! M* E# J& o% e  P' U
  7.     if (quest == null)
    6 G( F/ `  P% q: j7 Q( W" X
  8.     {. F* P" e" b2 }+ t: E
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    7 X5 z8 C. S8 r1 |2 b2 X
  10.     }* o, J1 ^" q: r1 {  M
  11.    
    - j! b8 a+ g4 T7 `3 a: M
  12.     final Quest old = _quests.put(quest.getName(), quest);4 R/ u4 E, c4 O% ~; w7 t6 ~
  13.     if (old != null)
    2 y6 a/ _* B) z  e
  14.     {
    3 {4 H' o3 o" m: G1 b
  15.         old.unload();+ w; K, ?. g6 D8 f
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    0 {% ^5 ~1 P- l  }
  17.     }' O* O! a, n6 j, @
  18.    
    5 a# J: ^0 h( T( e9 f
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS): `! Q% A# ?: p/ T( n3 `
  20.     {
    ( v# H/ N6 e7 f3 Q4 c" g2 d4 h% d6 p
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();( t4 m. B' V$ J
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");; s+ j$ K0 o. i1 B) U
  23.     }
      l& {1 \# V1 t( F, j
  24. }
    ; _4 \+ n5 v0 B
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.* l* h5 \( C7 M% |) q: S6 m
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
" _1 p% {% j% m- B8 I$ [  F& |: E; V' Z/ y9 H$ H' ^+ x% C

1 U" y- T( W. a' S
, k, ?0 \! |8 k! X4 S




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