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

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

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius7 _8 {& S  N! O9 t$ U' x4 i& ?
3 J: m1 [/ i1 h1 E- ?
Разбор файла QuestManager.java
- ~+ F0 ]. E' t* R4 B6 C( @
+ f# J- E9 P. x3 G8 h2 VЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.$ z. p( f! p3 o; v9 X+ B
Основные элементы) X3 e# n1 n& @0 o2 H

0 |) ~% O5 d& o. pQuestManager.java — управление квестами и скриптами.
% Q( ^3 e. U' C0 fПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\, @1 g! M/ U" t8 n( z% ]; X1 \

) H% n  w0 u( L

5 G5 ?8 ]+ M. MДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.+ a8 K, x/ v$ N; d9 c
1. Лицензионное соглашение
$ P( V' V, h) [6 Y
  1. /*
    2 A( L' m  p. V2 s% _) v  \
  2. * Этот файл является частью проекта L2J Mobius.$ z( p- }, @. n. _, h5 J
  3. *
    6 C: v( [% t* W( R
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять* {7 S$ N9 G9 u. ^3 o
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    * _$ @4 P& A( Q
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.- ]8 f, W$ M& M5 F4 ]- N* Y
  7. * * P4 ^: |* m* U5 i8 u* O
  8. * Эта программа распространяется в надежде, что она будет полезной,
    # ]$ p/ R$ ~4 v/ a
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии# d8 v* u- U# V$ r; b, _& v" a7 g9 ~
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.2 `$ `! G* q/ W' r2 K* C+ K5 S' q+ t
  11. * См. GNU General Public License для получения более подробной информации." e3 }% G2 v. y! D5 H# Q
  12. *
    7 a- }2 G3 ^# Z* a% k+ P! X
  13. * Вы должны были получить копию GNU General Public License$ H7 [8 R; Z( b5 j: B0 p3 p
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    5 C3 J! u- d) t% |! x9 e
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.7 Z: M8 x7 D! f  C) @. H0 G  Q

# S' V6 y% Y' J8 y- x, L) P: X7 c5 q, s5 H" F) {& b' Y
2. Импортируемые библиотеки5 }% @) Y  {* h4 p! I2 s2 _

1 S! C, ?. ~" s2 |, n: O/ q4 \; }
  1. package org.l2jmobius.gameserver.instancemanager;: W5 D1 {; U+ }2 M8 p
  2. 1 a  P' }+ G- G3 V
  3. import java.util.Map;
    0 Q" _( T5 ^1 W! h7 Z
  4. import java.util.concurrent.ConcurrentHashMap;
    9 o  r: c: }1 @9 {5 H2 ^2 H( B
  5. import java.util.logging.Level;2 z8 X  T$ r: A3 b; C/ i
  6. import java.util.logging.Logger;
    - p/ ^- c: [( k7 G; T( P' \: j% w/ f4 j
  7. 9 w: s* z; Z, `$ a' L; l. b- _
  8. import org.l2jmobius.Config;
    ( Q" `% P+ Z( F' C1 f
  9. import org.l2jmobius.commons.util.CommonUtil;
    7 v! X. P" B, V8 q5 B7 ^% P
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    4 K. D, A+ }: L7 Z
  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 — менеджер для работы с игровыми скриптами.8 {3 M, b* @, O1 J1 `0 k% K

* n- O$ h2 Q$ t" s, b2 r; Q9 J3. Описание класса QuestManager0 ^" B, n* {; Y4 k) q3 J& B% G! D) ]9 u
  1. /**0 a- L+ C6 N- t) v; q( q8 h
  2. * Менеджер квестов и скриптов.  K5 b& B6 j& L: [& Z; L
  3. * Автор: Zoey76
    , k, ~; l4 ^8 x* V1 u' f8 b( c
  4. */
    0 @5 D$ L) k$ }  S! \
  5. public class QuestManager& ~2 Q8 \+ A7 w3 |: I1 n% x
  6. {3 U; U: K! h/ m1 F( f) S
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());% _+ d, J- N; Y% l4 |
  8.    
    ; |4 t" Z/ e! x
  9.     /** Карта, содержащая все квесты. */, Y3 V# n* |: \
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();9 Z( m4 v+ K) ]+ k4 X1 `7 }
  11.     /** Карта, содержащая все скрипты. */& P- C- H) f. }9 s( m3 b7 T6 A
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();1 `( s5 X5 u! y' Q  e2 T" d2 v9 ]
  13.    
    6 ]5 \: i* d+ i% x' w
  14.     protected QuestManager()! G8 v2 ~/ _; ]
  15.     {
    6 }5 g4 H2 J% w6 |% @: c7 W2 a
  16.     }
    % h" b4 _8 J4 b5 \* M! X
  17. }
Скопировать код
4. Методы: J/ m4 n2 J8 ?% f( `/ o, x: K
Метод reload(String questFolder)3 k* ^& D& r  V2 M9 _
  1. public boolean reload(String questFolder)2 u/ [6 N* s' b; U1 v% k% I+ _- i
  2. {- t$ b5 |( b( C0 O# P6 A
  3.     final Quest q = getQuest(questFolder);) _4 \% Y( N, r  G
  4.     if (q == null)
    ) |4 `7 x9 Z( @
  5.     {8 C# j3 \; ?+ A6 L+ C( W9 Z& b8 c
  6.         return false;9 }* m( [* Y! @' A/ H, J5 ^; S/ L
  7.     }
      R6 n* t* ]& c& y" R! c- T1 j5 R; q
  8.     return q.reload();
    : @: e  l& x) x) C; o
  9. }
Скопировать код

9 B  h7 D/ T9 F. Q" S! U8 ~( d  Y* d
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.% K# j+ E/ Y+ r
Метод reload(int questId)- W* [6 ^( J$ n3 v& n

4 t( z& i: R, E- h& ]
  1. /**
    5 \9 w. y0 V( _3 d) N
  2. * Перезагружает квест по ID.% Q7 [1 t9 w# U* P
  3. * @param questId ID квеста для перезагрузки3 ]( ^* _0 G+ p4 x; Z
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    3 {+ A/ ~, Z' r- E  k- \
  5. */& q7 a2 T3 L8 S3 q6 l& }' `
  6. public boolean reload(int questId), j2 a9 K9 R3 d/ _" B4 N  E
  7. {* P5 T) ?. c3 S) n/ n6 y% u
  8.     final Quest q = getQuest(questId);4 H2 b# f) R* h( e
  9.     if (q == null)1 ?* q+ x$ q  C
  10.     {
    9 S, z, _9 }8 L
  11.         return false;
    . \& [: C" \7 Z& @/ N; g
  12.     }
    ) @0 {% Y; Q- V  d6 N$ a- d
  13.     return q.reload();; z2 W% i- R5 I! T+ z
  14. }
Скопировать код

1 k4 ~5 C( d9 vМетод reloadAllScripts()
7 A1 v& G9 O6 J. M  b3 o1 r5 T, ~: E8 @7 I( H- \! u
  1. /**9 [9 L% a9 ^; W7 x
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.: o. M. \% O; m2 V+ |5 O
  3. */
    ' X9 z# h6 \( |& n; I
  4. public void reloadAllScripts()
    . n, g3 b, p; }+ c
  5. {
    + c9 x* s) e, i8 |. d
  6.     unloadAllScripts();' ~: A/ K: A4 X
  7.    
    $ N. i9 h. x8 L
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");% c& U" I3 u( @: q+ V
  9.     try5 {' x5 O0 |; A9 V  u" s, [
  10.     {
    4 \  W" u5 i7 [
  11.         ScriptEngineManager.getInstance().executeScriptList();* G8 M+ p" ^9 \; G/ j) m
  12.     }
    2 Y& ]1 N; B9 t: ], N
  13.     catch (Exception e)
    0 w! F3 R- A: M  ?" v
  14.     {& W" x' o% }5 J% u
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);4 t  G* i$ Y: Q" V+ w& G* I
  16.     }) `6 \# F2 x$ _  _  T
  17.    
    ' d, ]5 F+ M! F
  18.     getInstance().report();
    , M% B2 X( P" y2 I3 c% N8 D
  19. }
Скопировать код
Метод unloadAllScripts()
4 s- A; o9 ], l$ @) F8 w6 O; U+ l% G& ^" S, l
  1. /**
      |& w6 Z$ T3 `
  2. * Выгружает все квесты и скрипты.+ J' ^' e# l, w9 x3 l  g
  3. */
    # q* [0 {" S" K7 o0 a( E
  4. public void unloadAllScripts()
    ( o  w: z8 x, |2 U0 z
  5. {% w; w+ j: R  v. K2 f4 [( O
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    + G3 ?; W: [6 a, c
  7.    
    5 a. J6 h* T2 k. L2 H
  8.     // Выгрузка квестов.# Y. r; Q7 O( }' U/ ?% j5 x
  9.     for (Quest quest : _quests.values())
    4 `1 T3 U+ J& l  K7 G0 H2 A5 ?
  10.     {8 T& i9 t3 B: z
  11.         if (quest != null)0 ^9 e/ G3 m- n( Z3 ~
  12.         {$ W4 T3 u9 k& k$ Q7 M4 ?; B
  13.             quest.unload(false);
      Q- ~9 O5 r) `" W' m$ }: @
  14.         }: x% L' W6 A& ?9 |) C% g+ k7 a; J
  15.     }
    ' t# H3 J9 E3 k. w6 c+ a
  16.     _quests.clear();' d: D2 o6 D! L- V7 z: R
  17.     // Выгрузка скриптов.
    5 h8 s5 ^/ k! ~: l4 j
  18.     for (Quest script : _scripts.values())' L6 {6 J( y$ w. `, d, W; \5 ]
  19.     {' K, p" x$ ~3 s  G  M
  20.         if (script != null)7 {3 M( m/ }& Z0 M- D! n8 h5 T
  21.         {8 Q% Q& _/ H/ m
  22.             script.unload(false);2 d3 A$ @# M5 w: x  p2 F
  23.         }8 W% X, t* x& W# T
  24.     }
    3 x, `3 G; J1 P' ]4 T; o. r# [
  25.     _scripts.clear();
    7 i: `8 \% j- \! T; j
  26. }
Скопировать код
9 F3 Y1 X$ z5 @( }9 X3 m1 K) T
Метод report()3 ~( J' j% W6 D8 \, c/ R# E
9 m3 O8 W, i. A$ \
  1. /**0 ]1 z* h# a% F; O3 b: r: |: A
  2. * Логирует количество загруженных квестов и скриптов.
    - N4 z( f5 l) y8 V; v0 G
  3. */1 c$ O; O# v* j, ~$ \5 Z9 x3 F
  4. public void report(). k4 T$ }* ^3 h% u5 b& N
  5. {0 w6 }7 T- D: {2 P* m; d
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    ' v% S1 o& |6 Z
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
      H$ S! e8 p$ e7 a% o
  8. }
Скопировать код
3 i0 Q( k' h! I5 L) }. e
Метод getQuest(String name)* ^/ R) F! ~. q* t$ i

6 [7 o0 t7 ]9 t$ W* j% P8 ~) }
  1. /**, i) F8 `- _' z& n# B
  2. * Получает квест по имени.0 S  O3 c! s% X8 {
  3. * @param name имя квеста
    1 i1 _" W5 K; a7 \3 \- _
  4. * @return квест. t- E# l6 }+ m7 R+ V
  5. */
    # _$ _' r1 }( T
  6. public Quest getQuest(String name)
    3 y3 c* J6 y) f
  7. {
    " r# m6 l6 y( C% {
  8.     if (_quests.containsKey(name))
    % X$ T& `( ~, t$ w  h. u. L8 F, P
  9.     {" q) Q3 c; i0 O8 z) k! a# U
  10.         return _quests.get(name);
    1 F- V2 U4 F4 z8 A
  11.     }
    6 T1 Z2 w6 ]* k5 z& |$ t/ n$ p" c
  12.     return _scripts.get(name);
    / N; a) D7 N6 j+ k- J) u& g/ R
  13. }
Скопировать код
' g- f, Y8 i6 o! X  F7 V
Метод getQuest(int questId)
/ Q  @" P0 t6 _+ Y7 Y/ }) {+ f: ~1 `# d
  1. /**5 i9 T6 ^, p" u6 J5 l2 p" A
  2. * Получает квест по ID.* k1 c- u9 H$ L5 i- l
  3. * @param questId ID квеста* U) S: s2 B. \+ F; \1 w
  4. * @return квест, если найден, {@code null} в противном случае
    " J; a6 |$ r/ m4 B% b
  5. */
    / A7 J9 _3 ^2 j& L: {# a* `" t
  6. public Quest getQuest(int questId)& _. z+ f  Q1 ]+ u" r8 C7 l
  7. {. d- w* O/ a" B. g# X
  8.     for (Quest q : _quests.values())
    3 c$ |8 B2 z5 O7 d, L0 v
  9.     {
    9 o$ a/ `* \0 i3 o  d/ r% X
  10.         if (q.getId() == questId)
    5 U; ~+ N# O5 K2 R( ?  j6 ^
  11.         {8 h2 F7 ~. c; R( W" n# w9 @: [
  12.             return q;
    * V0 Y& f( B' N! K6 ~! d0 ^& N
  13.         }5 j. k( T& P8 ]2 k8 r  F7 j" H. `" k
  14.     }: g: Y$ f( t' t
  15.     return null;
    9 y6 X% e  _- t9 h: O* q* m
  16. }
Скопировать код

/ s# u9 f4 R# w* ]& tМетод addQuest(Quest quest)
2 a$ x7 j- ~0 y! M% g2 ]# {. ^" ^( i, k" q% `: U, c
  1. /**
    % t1 U( a3 o5 A( |! R  [* N
  2. * Добавляет новый квест.
    ; ~6 Z$ M1 ]+ S& q9 W6 s; g
  3. * @param quest квест для добавления5 V$ i3 s* K7 D6 L! f8 V
  4. */
    + c8 N- z  V/ ?& @
  5. public void addQuest(Quest quest)
    2 e: r2 w( c: r
  6. {" C9 Q% d0 S- h6 Q
  7.     if (quest == null)
    - f' \8 R3 E1 w0 l7 U
  8.     {
    7 J( k* ?. {  J1 @4 h
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");) u3 a7 X& o- c: S5 K
  10.     }
    ; M5 V0 v3 a2 N" w* v3 I  b
  11.    
    5 @0 Q- {" ~: F0 H
  12.     final Quest old = _quests.put(quest.getName(), quest);. M4 D/ n: U; z) g7 }' t
  13.     if (old != null)- Q2 w5 D8 q$ h8 c+ ?# P
  14.     {* U. ]0 q: k; M/ u' z
  15.         old.unload();
    2 h0 [" _5 L2 C9 e- K/ i# E5 I9 J
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    : P  k; K7 I( |% O' c' {
  17.     }
    " ^8 A" j/ f) s6 {2 R8 n6 b
  18.    
    % D9 f& h# ]6 B- |8 u
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)1 h4 L' h% S5 m  R( z
  20.     {' {* \0 e, Z0 C8 z. y( c
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();0 P  A6 O" I1 Y2 k/ h' f+ G. D
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    / w2 r. H& F! W' ~' a7 C  k! p) C
  23.     }
    + @! v+ j9 o/ a4 J, p" N
  24. }. u( M% H9 I, s" R
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.; A' `; n+ w# |. c# i
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
! e) ^7 s% V9 _7 v$ c  w4 n2 R. {2 m# k. r0 R
8 O! v' c; `7 u6 z# r
5 ^3 T: o- s, W$ ]2 v3 E6 O7 {$ D5 r





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