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

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

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius! G/ G9 p3 t6 U% G: i* p

% {% N, f9 g% }8 [0 @  \. n% D; zРазбор файла QuestManager.java
; @! `" F* o9 U3 ^* N
- U, u/ u6 q* vЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.6 q' x/ z& k0 Y1 O& c% E+ g% R1 H, e4 Q
Основные элементы* w% a- n/ V# W. G/ w

9 D2 m* G" \  M7 @2 |( MQuestManager.java — управление квестами и скриптами.
8 v0 Y+ D+ U3 ]  zПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\# ?$ ~, u7 A3 f$ J( _

, T2 ^7 H# K1 \3 N  }1 c3 r
* {1 Z+ i) Q# U6 }0 W
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.- Z( S) I. T) h* M
1. Лицензионное соглашение
% B$ h( v0 ]( ~2 _
  1. /*
    : P5 l) d; x% y: d
  2. * Этот файл является частью проекта L2J Mobius.
    2 r; s+ ^' y& b) B* z
  3. * - }* |6 t1 g* v4 N3 S6 R
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    1 E% h5 l& [% h3 V
  5. * её в соответствии с условиями GNU General Public License, опубликованной  A# r* G( J& f6 \4 @
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.) G. l) B  {" l) B" t
  7. *
    ( }& l0 z% K5 Y+ u
  8. * Эта программа распространяется в надежде, что она будет полезной,  g1 O, V+ K- Q7 S8 {3 e0 g
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    * p3 B3 x) f, Q$ B/ `* v9 N/ _) E, M
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    1 C) f, |  Z: l! m7 c5 x+ P' o1 b8 y
  11. * См. GNU General Public License для получения более подробной информации.
    & W8 ^" _3 `( ^  `
  12. *
    ' r% c0 b9 p; \% ^5 L. P( O: f
  13. * Вы должны были получить копию GNU General Public License! i4 L% L4 v) [4 J; F4 z; `1 x; Z
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.+ k3 |% T! P1 h8 }
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
& m1 k  G8 f$ k' l) H. {: A7 K1 @

1 i& o5 u% ~( E6 r+ A' q2. Импортируемые библиотеки
! X& f: r! B- {  F5 ^
5 {$ [+ |$ }, h
  1. package org.l2jmobius.gameserver.instancemanager;
    " K% @2 S4 ~$ ?4 u' z
  2. 0 e- C  w' l) A4 p6 p9 D
  3. import java.util.Map;3 I: R# p" k5 K' T$ n8 z
  4. import java.util.concurrent.ConcurrentHashMap;
    7 A8 _* h7 v( t8 u9 Y9 Q9 F
  5. import java.util.logging.Level;  D, h6 W- a8 x5 A$ k' [
  6. import java.util.logging.Logger;6 z: [- u3 f9 l( h1 E& n

  7. . ?. _) y8 R6 t8 M) e1 [
  8. import org.l2jmobius.Config;4 e6 k  H* M/ K  P0 [' w5 U/ t
  9. import org.l2jmobius.commons.util.CommonUtil;. I& D. U2 Q0 x2 b9 J
  10. import org.l2jmobius.gameserver.model.quest.Quest;1 ^" S( @  k% x" _: t
  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 — менеджер для работы с игровыми скриптами.
$ f, O4 K5 x! P: I+ A) [/ U- M2 O5 r  J, n8 M6 C
3. Описание класса QuestManager' U/ p# t; Q" Q0 S. f3 S
  1. /**$ F0 y! }3 R7 R* x- v
  2. * Менеджер квестов и скриптов.
    - ^6 e4 G: b4 r5 N- U+ o3 _9 @; O7 |
  3. * Автор: Zoey767 F( D, _$ l: p  ~1 a0 r
  4. */! k5 R9 K4 j- Y& @
  5. public class QuestManager- K4 v  n) v/ S$ A) w
  6. {
    " @: o* F' R2 n. o5 J
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    8 W0 h! t  a5 E/ S+ w4 K
  8.     ) p2 L+ B7 N  B3 D. w: M
  9.     /** Карта, содержащая все квесты. */4 F- j: C% g8 j3 H3 |- q
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    . e& c9 i- J8 p- N
  11.     /** Карта, содержащая все скрипты. */
    1 x6 r8 A, D) ^$ Q" u
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();$ o. i4 i' b& T
  13.     / }8 u, H+ ^; w
  14.     protected QuestManager()
    5 B' y+ N* u; T1 ~
  15.     {
    & y* g4 ~" u2 o2 @# o' n' H
  16.     }5 S: v7 ~& R, d# B) A/ y5 g
  17. }
Скопировать код
4. Методы
" C5 a9 R+ A, m9 V  ~; |8 a$ wМетод reload(String questFolder)5 y% E( W" c& x2 B# z, j7 C& S
  1. public boolean reload(String questFolder). ~3 u  r+ t  [5 I7 S, m
  2. {
    7 t, b# ]2 \# n
  3.     final Quest q = getQuest(questFolder);
    6 n: D2 j8 W! ]. d& m; D$ H" }
  4.     if (q == null)# X" c9 F$ v* }
  5.     {
      T9 w; j) I$ J/ I* Z' |# S
  6.         return false;* o( u: w, G* Y$ G
  7.     }0 J1 Z- n4 I/ Z8 ?
  8.     return q.reload();  U) {# T0 ]& I9 t6 T0 R
  9. }
Скопировать код

) g! g: e9 u' H1 s% \$ I2 R9 [/ O  B" y4 n1 l  s2 @
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.$ B8 A) `- a/ N+ V) _2 w/ a
Метод reload(int questId): A2 ~! I5 M- K7 y. ^5 t
# n9 o! b8 T# F' t
  1. /**
    / ?( p, h+ @5 v) a/ e
  2. * Перезагружает квест по ID.
    ! R4 K9 R! g1 t
  3. * @param questId ID квеста для перезагрузки
      @4 b# S& ?) x% T: G- X& Q
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    / F4 ?7 o1 u$ n- k; p2 X& }5 c
  5. */7 u" J- ], ]: X( E0 ?, _
  6. public boolean reload(int questId)5 C# N! [+ h9 V$ W
  7. {
    6 k9 z7 m- ]: l6 B3 ?# f$ H- q$ i
  8.     final Quest q = getQuest(questId);
    " ^  M, ], B% r: G2 j) a6 `% t
  9.     if (q == null)
    + H7 g" y0 k. y& E; B5 b
  10.     {
    $ O# {' Z2 C6 D+ I6 S; Z7 F
  11.         return false;
    6 R1 g; T: t8 I5 E
  12.     }
    7 Z" B; S0 n7 Q, \  T
  13.     return q.reload();" \" V* N  D& z* C* ^. z% Q" X
  14. }
Скопировать код
9 T, P5 N+ V3 B7 ]" x; @6 Z6 O
Метод reloadAllScripts()* W) u, A5 C* o3 q9 X
3 @& k/ S5 ?$ T8 D
  1. /**
    * h* v( ^# L0 X  U+ [( L5 t, W
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.+ z- c; }% k  V8 b+ m0 [9 C2 I
  3. */
    ; j6 t; n/ H. q6 X& K& |
  4. public void reloadAllScripts()8 O3 y2 h9 R8 J5 ~: x
  5. {& }  |8 g. j. R( `
  6.     unloadAllScripts();- Y( n( U8 ?' Y- F% p2 D
  7.     $ B9 }1 t+ p! J$ L) O1 I
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");: r; k, t# {* a
  9.     try3 r& F/ ]8 h; k; C. k" p
  10.     {
    / j; n6 G; V. _6 ^! g* t( v- w
  11.         ScriptEngineManager.getInstance().executeScriptList();, p' d* c+ U3 c+ `
  12.     }
    # h+ Z, D. N* Y$ B( C9 `: z
  13.     catch (Exception e)! L* K; o  l) X3 c- H/ \8 }9 T
  14.     {3 S# o# u0 Q- u
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    * t" \( k( e* l) K, v5 O+ y
  16.     }
    + F  O& o2 K$ N& {0 Y
  17.    
    5 d3 J+ q( A- y) {4 \( d4 `0 }
  18.     getInstance().report();; Z# F' A' T( @/ t
  19. }
Скопировать код
Метод unloadAllScripts()/ x% F- v8 [; }1 N

5 z: L) p8 d6 P4 i  T: y
  1. /**! R( [: ?- i" b) \
  2. * Выгружает все квесты и скрипты.
    . m+ k' J" o$ C! M# E8 y& ^9 N/ O
  3. */
    6 b5 j5 _/ ]! M6 K/ s
  4. public void unloadAllScripts()" a: @5 h) F! y; h3 }5 i) e* i
  5. {8 v. h4 e$ Z! f) a% J. l
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    , _" C: s( W; {& _
  7.    
    5 H$ [: B8 w  f  l# q! `
  8.     // Выгрузка квестов.% ~- @8 X5 D/ z* ~0 z2 A
  9.     for (Quest quest : _quests.values())
    4 o2 P& Q5 q. ]4 v
  10.     {
    + D8 V9 F4 F# l& ^3 S
  11.         if (quest != null)
    . s& j( ~: u  Z7 h% `/ z
  12.         {2 ]' H* l/ ^- Q  p- Y; J: a" l
  13.             quest.unload(false);! g! _% F& I4 M- Y) O" ?
  14.         }- g2 w  s0 G1 l# i/ p
  15.     }
    8 p/ z/ g3 \8 a# M7 T4 ?
  16.     _quests.clear();8 G0 s' {1 G! X# V; D
  17.     // Выгрузка скриптов.
    : ~) I# r7 t' N) V- ?
  18.     for (Quest script : _scripts.values())- v7 s8 T+ v; }7 F
  19.     {( A1 T' Q0 [, Q, F0 n5 }" r+ u
  20.         if (script != null)
    2 A; u+ A' g+ u1 C% b
  21.         {
    . y4 Q* @2 B. a
  22.             script.unload(false);1 |+ l7 L3 P' X9 @
  23.         }, o( J# ~- c: u2 W+ R
  24.     }
    9 U$ c% D) G1 |% x) ^) k
  25.     _scripts.clear();  b2 Y; f* z% Q+ M8 I0 ?
  26. }
Скопировать код

, G, {2 o- l1 x; yМетод report()
* B- p0 A3 c7 k. L. M
$ E' O, A  n% B
  1. /**6 X" `' ]( n3 @2 E' |3 `- c- g  t
  2. * Логирует количество загруженных квестов и скриптов.$ b3 A8 a7 O: P$ X  @  K
  3. */
    % J) ^9 G3 V" D; P8 |# c/ C
  4. public void report()
      r) k9 u0 u; u3 _9 P! V: r
  5. {
    3 x: q1 I9 U' V' G. Q7 e
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    7 K6 S1 @. S( b) {: L+ U' U3 N
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");5 n  L# |" J0 W' Z* [
  8. }
Скопировать код
9 R' f7 b, _8 L" v+ T, X# _. H
Метод getQuest(String name), ?6 l* W& C6 x  u$ ~4 v% ?
& g/ P# S: V% m% h
  1. /*** E. d; m* [# M/ ?
  2. * Получает квест по имени.
    ! C" R# h& ]# W! A6 V# o
  3. * @param name имя квеста. C: B$ ?1 X: W7 w5 t
  4. * @return квест, {3 W5 V2 {- c' T2 \; H
  5. */  }7 _0 I8 M0 F; p+ q
  6. public Quest getQuest(String name)9 j2 T( p' t1 D! I
  7. {
    , D! S" W7 v+ N
  8.     if (_quests.containsKey(name))
    / t7 s  L* b8 r9 D
  9.     {
    6 x1 Y% z$ X: X8 \0 P
  10.         return _quests.get(name);; N$ C- B( `5 D2 {9 T
  11.     }5 M7 c1 @5 u) K: l- _
  12.     return _scripts.get(name);' Y& F: V( r9 A9 i" G
  13. }
Скопировать код

. g# ]; d% C" V: G. k" d$ GМетод getQuest(int questId)! g/ O0 I, F+ o8 i$ J' J# h

2 q7 _  b; @- V6 V9 W7 D1 u/ M" H
  1. /**: Q4 g# f7 n7 m! e3 y: O
  2. * Получает квест по ID.- C/ F" p/ C' n
  3. * @param questId ID квеста& e6 w/ A% Z, ~2 t8 v
  4. * @return квест, если найден, {@code null} в противном случае  @+ U: F$ }: F2 M
  5. */
    ( u0 ~+ I+ a8 e; s% |
  6. public Quest getQuest(int questId)3 ?. m6 [( p, H* X
  7. {
    6 E' ^  G+ F, m4 e0 `1 S1 t
  8.     for (Quest q : _quests.values())1 v1 P! O& ~# j- J- F
  9.     {
    # U$ ^/ ^0 v4 ]' a
  10.         if (q.getId() == questId)
    & M3 E! R8 R* A
  11.         {! {( y2 ]  S: \" r6 k
  12.             return q;
    6 C: L) K( e3 }* ]* I$ i- O2 X: o
  13.         }; J2 Y& Y. Q9 ^& Y& r+ _/ K
  14.     }
    : `- i: @6 V9 A- w- A9 W# }
  15.     return null;! p$ z) a# g6 G4 K3 d) o
  16. }
Скопировать код

% j4 b) y# l/ L& ~6 k2 S5 D7 gМетод addQuest(Quest quest)5 M/ `$ n$ f9 v7 u, k' p

2 t2 Y' o, u6 q: s7 s
  1. /**% |  S' @# }) o
  2. * Добавляет новый квест.: v+ F) N% c! l1 S0 I/ V$ n' `
  3. * @param quest квест для добавления
    5 r$ C) o8 |) a2 [( ]" F8 ^: k
  4. */
    ( b- s. P9 z3 y; c: {
  5. public void addQuest(Quest quest)) a) Q2 w; q/ v
  6. {3 a" F4 ]0 f/ O" `% s$ ]
  7.     if (quest == null)" ~; q8 z1 f. Q0 m/ l8 a3 {
  8.     {
    3 E- c$ S7 \( B7 v7 P$ {: r
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    8 a9 }; o% r- E- N% H2 }# L- ?
  10.     }  Y* E' }, ~/ A. P2 h
  11.    
    8 |/ S! i0 r: U8 u0 m, \
  12.     final Quest old = _quests.put(quest.getName(), quest);4 s+ U; _( _$ A$ ?9 H( t
  13.     if (old != null)
    1 _* Y3 J- F% b' o
  14.     {& C* ^( r9 k7 }$ M3 i2 K7 k
  15.         old.unload();: T" [/ ?) v- o" m6 @: y3 E; R
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    9 f1 o; V; z2 F  p; R# p. a
  17.     }+ p) \$ x9 H, d" p) r
  18.    
    " |$ X$ ^. V0 w( e; Z
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    * a: A, }# d4 Q2 C* Q0 S
  20.     {
    ; Z9 z6 i+ ^9 B2 P5 y
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    ) \3 u0 N2 r# _
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    1 M2 b1 Z/ @4 |* ~) c% S  W5 i
  23.     }
    & Y# r( u; r% e0 X4 o/ s
  24. }
    ( D% H; J& k6 g2 N! R4 k# {6 [
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.7 Z1 n( U7 L& {! `
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.% m! z4 D3 ^  N: |0 A- x

+ U$ A2 M! |# \: U' f. v
$ e' p* u! ~5 _. }; \5 c/ n
- {7 F* g: @/ g9 q' z% |: v




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