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

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

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius
' b: ?# ~3 _9 E" a
+ m$ v, I* K; p, B: pРазбор файла QuestManager.java1 n7 v/ a& P) `& D7 W
2 {1 P! |7 K8 z5 B
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.' {& g4 k& \' |" ], E% g
Основные элементы
; K8 `5 b+ r8 v5 O3 f4 Q3 w+ _9 ?0 I4 c2 x; k
QuestManager.java — управление квестами и скриптами.
; k: K% G- d0 W( G; h- e2 |! Y& _% ~Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
# S! {1 W8 `" z6 S& A; X. m' ~! `5 A

/ V6 r% J  i/ [% ?" EДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.9 m+ f3 ?1 O% K+ M# d: l3 [
1. Лицензионное соглашение* p& M3 h$ `1 G& G* q( p3 h* [  g
  1. /*
    " s7 v6 C5 e# L9 Q; g$ N& a
  2. * Этот файл является частью проекта L2J Mobius.
    # l2 ^2 k8 y/ f0 n; i4 w6 E
  3. * 2 Z2 V, A  {: B' Y
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять+ b  }) K* Y( q1 |
  5. * её в соответствии с условиями GNU General Public License, опубликованной4 f& p$ d- M# c6 K' a+ P" X
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    6 F& i; Z4 l/ }- Q5 }  n
  7. *
    ( w  \( `% R2 W) l
  8. * Эта программа распространяется в надежде, что она будет полезной,' O  u# r" B3 `8 `& |0 `4 U
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии$ y. R1 s6 F! G4 H0 @6 z
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.! y2 [. C# |6 V
  11. * См. GNU General Public License для получения более подробной информации.
    8 V7 p7 M/ t) x. e7 T
  12. *
    4 L& m% O, H( b, S( a: A1 u
  13. * Вы должны были получить копию GNU General Public License
    + E0 M7 B  h0 B2 \
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    7 ~* `" R; v4 O, q) B) ?  S6 @0 U
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.: \( b: j1 e$ f
! L( E& Y2 d8 F6 A0 X, V
' E3 m: [# F. i. V, S, i
2. Импортируемые библиотеки
1 `/ y) t8 g% a& s
4 K! n. S2 Z& A( U3 C9 z
  1. package org.l2jmobius.gameserver.instancemanager;  y, O9 \( K6 }/ B  M' o. X$ y

  2. ! G$ k2 }# b. u& D
  3. import java.util.Map;& t" [8 S; B; l1 ^0 V. e$ j
  4. import java.util.concurrent.ConcurrentHashMap;
    , R: K/ m1 k1 K% K& w
  5. import java.util.logging.Level;! N8 t' P" q- S
  6. import java.util.logging.Logger;
    $ Y$ U' A$ U4 x9 L$ u0 b
  7. / M; j3 g2 t8 }0 _
  8. import org.l2jmobius.Config;9 n+ j$ I% B9 G3 z3 X$ T9 \5 Q
  9. import org.l2jmobius.commons.util.CommonUtil;
    4 g+ K' o' p$ h
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    ' ^/ [- Q3 J8 D8 B6 y! {, u9 a: \
  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 — менеджер для работы с игровыми скриптами.& g2 O$ H( d& n( |" k$ X

5 m) f" n* @, \, N; }3. Описание класса QuestManager
' m6 A2 t2 ~( B: s' V
  1. /**
    8 N( E) w! x1 O+ ^
  2. * Менеджер квестов и скриптов.
    ; U9 I) ~) Q( ?- S( e7 y
  3. * Автор: Zoey76( }& [4 s# z6 W
  4. */0 H) e  A  W7 d4 g5 j" k: N
  5. public class QuestManager
    5 Q" \/ G8 r, T! ?# s3 V* `
  6. {6 H8 C: w2 U0 {/ I' q  \
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    , S/ i1 [1 e. Q$ C
  8.     - J$ N5 t9 t) o6 t/ k- f% c
  9.     /** Карта, содержащая все квесты. */
    ' Y' f$ }# U2 P  C' T
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();3 g9 W. R' w5 @. v
  11.     /** Карта, содержащая все скрипты. */. S, |/ g) q2 I  B
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();3 g: u% I, I7 M
  13.     $ m2 D9 i4 |9 i3 M2 l
  14.     protected QuestManager()
    - g6 L4 s5 e; I9 U+ f
  15.     {2 O6 b$ x4 i# M2 s2 S
  16.     }' c/ l5 S8 y5 R  {' J. e8 g3 [- k
  17. }
Скопировать код
4. Методы
' `, D# X& ^; uМетод reload(String questFolder)4 M( B! Z9 @' y* I* L/ _& k4 X
  1. public boolean reload(String questFolder)
    $ N7 F' p/ N7 U7 F
  2. {
    - M+ p, z- K# C% b0 i5 ~( _
  3.     final Quest q = getQuest(questFolder);. j/ v2 P7 ^, h' Q4 x
  4.     if (q == null)
    # F7 H9 h8 i. v- ]) S0 H! d
  5.     {
    , W7 e8 w- j. A5 B5 I* M- t2 Q
  6.         return false;
    # E6 ]6 g& z! S% I
  7.     }6 N1 c. e! h* l% k
  8.     return q.reload();0 v9 ^$ w9 W3 e, {
  9. }
Скопировать код

! d7 D3 r  `: |/ `2 A8 r; r' r5 [
2 w! }% d" S/ B8 b. g1 ?& O% G( [, ]Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.- q9 M& o, J3 n# z
Метод reload(int questId)6 y/ x' W! |0 Z5 V

5 Q- M+ }& |! s. v7 T
  1. /**3 H6 V% x  ~# I# E
  2. * Перезагружает квест по ID.( J* t2 p3 o) P; m) m
  3. * @param questId ID квеста для перезагрузки
    " S7 i9 ]5 a# h2 x) |% V/ ~
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае, y- z4 h! U- O; |! w5 d
  5. */
    ; d8 y% l) K5 K. D5 M. O
  6. public boolean reload(int questId). K' H+ W9 a8 v! t
  7. {
    # W* t5 w( ^3 X+ W2 L
  8.     final Quest q = getQuest(questId);
    7 X/ B, v2 e" B
  9.     if (q == null)
    6 R3 r6 w% n  ]& p& n) g
  10.     {* z7 K- B( r0 p3 K# D6 F
  11.         return false;
    7 z1 e9 b1 Z2 J. Y
  12.     }  }: Q2 M% A4 i/ M3 N, V/ c
  13.     return q.reload();( y$ j7 b% c7 n; z4 e) a: }; T% r
  14. }
Скопировать код

  d1 [& Y8 E6 U3 rМетод reloadAllScripts()
. G" {* M5 E; h% z* G, \: G. N0 N- j$ l
  1. /**
    6 P1 J6 Y0 b+ P, Y
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    ) Z# O6 K: E3 ]+ e$ z( J
  3. */
    0 d* G# t, G9 m" j$ f
  4. public void reloadAllScripts()
    8 J1 B* J5 v& {' X
  5. {
    9 X9 J0 E+ h" B+ ]; g! z8 ^5 w% O
  6.     unloadAllScripts();
      a: n1 x1 |* U; N2 z
  7.    
    ' M! a" e+ O3 V- L
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");0 s6 u1 Q+ [8 o+ r
  9.     try5 d+ S- V# ?2 b. O& b7 g) s: M
  10.     {4 T8 L/ t5 z; X$ E& m; z7 O" L
  11.         ScriptEngineManager.getInstance().executeScriptList();
    % R# V6 a% G. x  F
  12.     }3 _+ _$ }! R$ {- F9 y& `
  13.     catch (Exception e)
    * ^; ~  G* r! W+ P
  14.     {
    1 U; ^  M( G  J( @% O% c
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);2 k+ ^' `1 ^+ o
  16.     }
    9 k& E4 X: ?4 T& N  q( Y, \& h
  17.     , r: J# F& |9 N
  18.     getInstance().report();1 A$ {5 e6 m& x6 f
  19. }
Скопировать код
Метод unloadAllScripts()
/ D1 c& H% y  P. i6 j. N0 r) p7 X( D7 d" S% e" n% J+ C/ w8 v
  1. /**' ]9 ~7 ^7 W' K5 x: u
  2. * Выгружает все квесты и скрипты.
      O% H( C& [$ ]! R3 e+ d
  3. */% E2 r4 w/ D& b; |8 W+ E* ]3 h
  4. public void unloadAllScripts()
    4 d- [& _. k" j5 [# j
  5. {9 n# x8 s! U; @- S
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
      M9 ]0 [9 x! y$ C4 B5 W, |
  7.     % a- ~# J1 W+ D# g2 l0 a1 F
  8.     // Выгрузка квестов.
    7 X3 Z) q5 s+ M% ^! L% t3 A
  9.     for (Quest quest : _quests.values())
    6 v% N  F+ a2 B* t3 P
  10.     {% d) h+ ~) N3 U, I& w8 F9 J
  11.         if (quest != null)7 z, L9 O# k* l$ ^/ M2 e
  12.         {
    - o6 z( m( Q: o, O0 ^6 F
  13.             quest.unload(false);: a9 n: c  D. }4 d
  14.         }2 d# a: Q) i1 w; o) N! N
  15.     }$ J9 F+ H; \+ \
  16.     _quests.clear();% q$ Z/ t/ N9 b1 o
  17.     // Выгрузка скриптов.
    " o! B" o$ [2 T) B' u0 h0 a9 r. F
  18.     for (Quest script : _scripts.values())) Y( t& ?, y+ M& j# U* G, w
  19.     {1 o% |8 B$ \3 v6 ~8 T
  20.         if (script != null)- F& t9 {, L1 F% C/ r- Y/ ~& G! c$ [
  21.         {' u" J8 {, w8 u4 ^3 X# _! V
  22.             script.unload(false);
    $ l) o1 s7 Z2 t3 I- s" H
  23.         }
    0 {8 _% K4 `6 [0 v; Q
  24.     }: q) U& l' h: k
  25.     _scripts.clear();
    2 s8 c! P- T  p4 b, e6 x4 q
  26. }
Скопировать код
2 k% G4 Q& N* P( `' E
Метод report()0 _6 i9 U. J3 s  N3 d
  C& Z: Y$ c" ?: B
  1. /**; I) Q% q: S. X9 D* D
  2. * Логирует количество загруженных квестов и скриптов.1 \5 f) P- T* z3 u5 c6 P
  3. */
    * E% `, ]+ N9 }
  4. public void report()3 ?7 I2 C1 V1 l) G! L
  5. {
    4 j2 m; E% W- a+ q; p* @
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");; x1 m! d6 p$ ?/ p- c, @
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
      |6 d3 E) d; F: Y
  8. }
Скопировать код

+ I* h- v7 y5 T: [6 T; W- oМетод getQuest(String name)3 w7 O  _1 ?8 e, Y( `
' }  t5 A! Z4 |5 u# X- k3 }9 _- Z
  1. /**
    8 T8 X9 {0 `" r% i. _1 F
  2. * Получает квест по имени.# T; _) F: t( y) g& Q
  3. * @param name имя квеста; k5 }7 h3 W9 [, P
  4. * @return квест
    $ ~$ x& {' i- O+ W% d
  5. */; l3 C4 O1 s6 {& }
  6. public Quest getQuest(String name)3 ?6 [! K" s2 W2 p! h0 n2 |+ D
  7. {
    . e4 ]) j1 d7 t" }! P/ Y
  8.     if (_quests.containsKey(name))8 ^4 X2 r# ~( b+ I+ n
  9.     {8 d2 s4 R1 I; n" C
  10.         return _quests.get(name);
    ( p$ }: s  u( y% l9 f+ |; c
  11.     }
    ; w- E9 n& o$ S2 ?: l" I2 ^+ r! C
  12.     return _scripts.get(name);8 d3 l( S5 C: }/ M% v' K3 V: X) w
  13. }
Скопировать код
' w" z! H) R1 W1 K# N
Метод getQuest(int questId)
' H' t4 g  J0 `( u$ H1 D- U
2 t; e! k- e5 O2 r' [! _
  1. /**
    4 @. T$ W! M4 y1 D2 X8 a9 I
  2. * Получает квест по ID.+ l/ {8 O! W: i# W6 r
  3. * @param questId ID квеста+ q1 U/ \2 n( L3 d3 Z
  4. * @return квест, если найден, {@code null} в противном случае( L' _' B, g6 t+ \3 a# c" {8 q
  5. */
    & Y, q. o4 F. y8 y2 [$ F1 u
  6. public Quest getQuest(int questId)' M- O' W& m: f) g  H2 W
  7. {
    3 h& J4 ~! e( Y5 |0 B  ^
  8.     for (Quest q : _quests.values())/ ^# Y+ e; l: ]5 G
  9.     {
      J- a% _8 y0 p& H. s, h
  10.         if (q.getId() == questId)& k- D6 p8 \1 h# s8 z
  11.         {
    4 A' C2 a$ h$ c' h
  12.             return q;- E) g) Q$ I7 f7 _1 `1 i
  13.         }( d' i% k! S' ]6 `3 C3 T
  14.     }' w6 b( v: M" _. N& g0 y+ Z& w
  15.     return null;5 q  z1 [" ~. x4 H# N1 S8 U
  16. }
Скопировать код

% q+ H+ q, k. {" _/ JМетод addQuest(Quest quest)/ W- r9 d' N8 I! w# I4 f  j
' k8 g/ N0 m% a7 Q8 d
  1. /**8 B; t- j, y- G
  2. * Добавляет новый квест." Y$ z" z$ `$ |/ a! ]
  3. * @param quest квест для добавления
    5 g( j  u+ U% A9 B& G  r/ ?0 O5 _
  4. */0 }+ g$ i1 w5 M% \: y1 _" G
  5. public void addQuest(Quest quest)2 V2 `5 j; z% ~9 [
  6. {' g, J, }: ~: G) k
  7.     if (quest == null)
    8 L# k8 y0 |8 A7 K/ p! L; O) t
  8.     {, U5 q3 F( b4 J; p* W$ C
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");# R+ [& g) F5 v; |3 r
  10.     }' p9 _4 P7 y  v5 Y# _. H% T9 ^! h# T
  11.     ! R4 F) x2 f/ b4 j% @
  12.     final Quest old = _quests.put(quest.getName(), quest);2 q+ W5 U5 [7 P: j3 O! M
  13.     if (old != null)& F& |0 h. k3 d: @
  14.     {
    % N, }/ \3 Y; x9 m& _8 W
  15.         old.unload();
    3 m' ^9 c$ Q. r8 P' ^' q, Y
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");, c; M6 E0 L- M3 @* @/ o
  17.     }6 J( t' i: L% E+ A* [* K
  18.     8 Y) @1 V+ {. [& b
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    ( R4 j0 W* }- f
  20.     {
    * E! c. z9 v! v
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    ' w9 p& k3 f" @. h2 c6 N( U, p, `* I
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");; M$ ^! S9 a1 N
  23.     }% f6 u/ i4 k' D+ t7 {+ t6 J
  24. }
    4 Q$ D# V. |# o; O& R
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.5 \6 }4 M4 {8 o# b3 R! _) Z
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.9 c7 X4 n; ], ]: m; ^

. S; j, _: A# o+ C7 ]% d" V
7 E* t9 Z4 y, t
1 p. C, r9 p3 x9 R




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