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

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

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius; o; O( G( m- B, k1 j

) [* `$ ^/ H- p: C# x  ?7 \Разбор файла QuestManager.java9 O9 P( d' I' ~) L+ J7 l) c4 H

/ \8 a  d/ O& @" ~Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.& i1 Q  g0 V, w: I
Основные элементы. q) L6 `" e& r2 e, [3 R+ z3 |

. Z) @3 {( \4 |: s$ \. |QuestManager.java — управление квестами и скриптами.
" B. q$ J8 \$ ZПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\4 T: ^" Z6 [+ ?  Y3 @! Q& r7 y

. z1 ]+ q9 E/ R. c
+ A" O: r  N5 m: s/ _& ?4 i
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
7 t$ d6 O6 r( t. ^, z  A. F4 j# K1. Лицензионное соглашение
; a* x% n  h* x+ B$ L
  1. /*
    " S6 y/ y5 z7 B/ N4 K9 ?
  2. * Этот файл является частью проекта L2J Mobius.& ]& K2 Q0 A( y- n6 U3 V" S7 W' K
  3. * 1 F5 S8 e2 S) d
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять% o) m1 V4 g8 ]
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    ( z- B' ?$ S: |2 n% T- x+ e
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    ) F/ k) i5 k- b' R9 `$ m
  7. *
    6 v" K" M& V7 a$ @
  8. * Эта программа распространяется в надежде, что она будет полезной,* u8 _3 y1 V% z4 t( O
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    3 n/ Y3 h6 e" x1 m
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.' ]/ q. l2 O! t& e
  11. * См. GNU General Public License для получения более подробной информации.+ U8 S4 Q. e6 ~; E3 A
  12. * 9 v% ?0 m9 Q1 R' e7 F0 d
  13. * Вы должны были получить копию GNU General Public License- d8 m6 X' h$ X1 V
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    8 p! T% J$ k! j* {; q
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
! H, W! Y2 C& N* M" Z& p+ z8 D1 B$ U/ d2 v5 i# J8 j- q
; U# [% F& w6 ^: R9 o) G
2. Импортируемые библиотеки
3 ?# S; O' W  y3 {; ~
; \+ t* \5 v# c/ \
  1. package org.l2jmobius.gameserver.instancemanager;
    7 ~% @5 K3 m: u/ @3 Z  y$ k6 v
  2. # @  R5 t9 O& N7 g
  3. import java.util.Map;$ I" I) @( a6 J; `
  4. import java.util.concurrent.ConcurrentHashMap;! ?8 D$ d8 {2 v0 u' z, {) t! {
  5. import java.util.logging.Level;
    * g) @) X5 e0 x% f8 _
  6. import java.util.logging.Logger;, C# _& o" F# j% T# X1 a  r

  7. - k4 r1 B$ E9 V6 n1 Y, s9 s
  8. import org.l2jmobius.Config;7 f7 E# Z* d8 Z+ M) J* e$ ^* r
  9. import org.l2jmobius.commons.util.CommonUtil;) X" ?4 p: P2 T0 y
  10. import org.l2jmobius.gameserver.model.quest.Quest;  R8 g3 O* U+ J) j
  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 — менеджер для работы с игровыми скриптами.* ~9 R9 S3 f% j1 Q
, c/ d' v, c/ u2 y# Y9 ~; C& H+ m
3. Описание класса QuestManager
7 A" p: Z) _0 u
  1. /**
    & P. N% O/ k) W9 D1 f3 u
  2. * Менеджер квестов и скриптов.
    1 d9 I( r8 e1 T" ^( K( F7 J
  3. * Автор: Zoey765 X# s) N/ L! U# s
  4. */
    . W3 H. o: O% S" }
  5. public class QuestManager6 ^0 ^7 `+ B' m
  6. {+ Y1 [( ~3 l. C& n9 ]
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());# E7 n: v/ g4 N& S0 Q' N2 S
  8.    
    # S7 K. L$ d* J2 v7 M  C
  9.     /** Карта, содержащая все квесты. */: z# [9 r) v  \" s8 n; B
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();" p6 X% a1 b5 L9 b, G* b
  11.     /** Карта, содержащая все скрипты. */
    , q6 V3 [: h; Q4 r6 Q* ~
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();, A& g+ C6 L9 ]1 ?; z5 X1 z
  13.    
    2 Z4 h9 d+ j+ c: Y: U) E# t6 _
  14.     protected QuestManager()
    % q5 |* X' X! K/ c: F
  15.     {
    * _7 a" O4 A# Q- E5 W
  16.     }; E: P5 m% F+ \* j9 E3 G
  17. }
Скопировать код
4. Методы
1 K1 V+ z! q# l+ k! ^5 }! YМетод reload(String questFolder)3 h$ t+ |9 Q7 W3 C7 [* t
  1. public boolean reload(String questFolder)4 d1 j# i& X8 l1 m, {! {
  2. {
    ! `/ `8 o0 C2 t3 |5 b. I
  3.     final Quest q = getQuest(questFolder);, v* T, _- p# ]$ V. |
  4.     if (q == null)
    , n9 w6 u5 h# x2 u: [
  5.     {
    / ]* X: B  y, `3 H. I  m
  6.         return false;5 Z! }- T$ R" D# Y9 p
  7.     }
    8 _, |+ n4 k% S- s# \3 B
  8.     return q.reload();
    # q6 x# \3 b' N) S1 ?  E0 q
  9. }
Скопировать код

7 w4 ^6 \8 Z; P4 |4 ?+ {9 ^' N$ G4 w$ a# Z, ^7 t
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
! b4 \; [& l. y0 D3 ~/ FМетод reload(int questId)
- j/ \- C6 o2 M3 d0 O3 m3 W( z3 z( v* w2 y' N$ z" u  S6 t0 h
  1. /**' j& C6 d+ s$ g" y' P$ s
  2. * Перезагружает квест по ID.
    6 M. G9 d; {4 m$ F
  3. * @param questId ID квеста для перезагрузки* V4 M1 @, I& W6 x
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    ) e* ?+ n/ z$ n8 h# N
  5. */, T7 u4 C; N( t6 |$ ~, h; z$ L: S
  6. public boolean reload(int questId)5 o; d7 P8 T5 K
  7. {  L! Q+ @$ a- z% ~( K
  8.     final Quest q = getQuest(questId);
    4 [5 V/ T9 X+ f5 _" U6 s3 |
  9.     if (q == null)3 E9 C$ S" d  ]' t8 ^
  10.     {4 S6 O3 q7 S, ]
  11.         return false;( e; D" G7 H" Z
  12.     }5 K6 ?: a& R0 l7 M. M: @7 G5 ?% ]* Y
  13.     return q.reload();' i2 L8 Q. o1 J7 n: F
  14. }
Скопировать код
# _0 i* a) a  |( c' u1 C% F
Метод reloadAllScripts()) {/ k  ?" O0 L0 }# ~

/ F7 ?$ d# @2 l- @5 ?( h
  1. /**6 E2 P1 ?. e; V; w
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.2 N9 [4 ]$ c) ~& R: x6 L
  3. */4 Z; J4 q) D' V- q! e/ N
  4. public void reloadAllScripts()
    , f. Q4 j, A6 R; f) k
  5. {. G! K8 }+ v2 Z7 L0 f" W5 |" ^
  6.     unloadAllScripts();
    # s7 y) z: A0 ?! o# U/ z
  7.     + k% C. O4 R& i
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");- G) x1 q7 v& z
  9.     try
    $ |/ Z5 f' ]" @
  10.     {; A4 b4 q* e: H) x  x! Z3 A
  11.         ScriptEngineManager.getInstance().executeScriptList();6 F# h+ \" S/ A7 I% Y! |% W4 p; i
  12.     }
    . Q1 X* Q. p) Q, y# M
  13.     catch (Exception e)6 d% m0 Y- f3 U
  14.     {
    9 R; z& `- A5 e, [% @. K) }
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    / Z1 L/ y. f/ P' r1 }5 L
  16.     }
    . k8 N$ F" N# x% G! r, L, u. l# x
  17.    
    % c$ y+ F5 V' T8 _. C6 O
  18.     getInstance().report();  T3 k" \4 K0 @3 @. p+ v3 g
  19. }
Скопировать код
Метод unloadAllScripts()9 w7 J0 E" J8 b! l- X
. N: a# b1 M0 }9 P0 i$ J0 y! H
  1. /**: j5 W# n2 M0 X" l; p2 V1 G! A; w- V
  2. * Выгружает все квесты и скрипты./ b1 s4 k1 ?5 i8 u4 I, S
  3. */! q" h5 x2 g' h5 {+ X
  4. public void unloadAllScripts()
    & T& e- W" f9 y+ L% w7 x
  5. {
    * X8 C2 y2 V0 `) `* m
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    ; J. @, o. H2 l; P
  7.    
    : ~6 ^% v5 Y4 N+ }; t
  8.     // Выгрузка квестов.
    0 m7 I+ K% }1 m) H/ ~
  9.     for (Quest quest : _quests.values())
    8 v" ]3 }* Z( P
  10.     {* R- R; }" f: Q& I5 O" x
  11.         if (quest != null)
    ; T0 O, ?$ y5 O* o9 ~$ _/ Y% Q
  12.         {( Q. q( ~: Y+ a5 l  |; ~% A& W
  13.             quest.unload(false);2 _- k; @$ P0 P$ X: f+ D: b
  14.         }
    9 ?1 N! u" R: c. m* T
  15.     }/ A* T& ]& g; d, K0 f/ A
  16.     _quests.clear();
    $ K* M& C" {, }) ]5 r$ f  I
  17.     // Выгрузка скриптов.$ r. c4 [" {- Y
  18.     for (Quest script : _scripts.values())
    6 k9 O9 m0 y6 {; b
  19.     {
    . [2 x. V- e3 H: W+ t
  20.         if (script != null)
    9 b. Y0 W! H6 W  W; o
  21.         {0 v5 C9 ^, o. ?/ i4 c/ M  g
  22.             script.unload(false);
    ! K: b$ c( j; @4 f6 N8 E+ a
  23.         }# w4 y% A, h* t& j) t5 b
  24.     }4 ?9 S/ T7 ^/ p
  25.     _scripts.clear();
      `7 I1 U6 s9 r! w* _- Y
  26. }
Скопировать код
/ I, E; d1 ?# E/ l* E
Метод report()6 `7 B- b# ]# H7 t! q! \; K
, z1 _* K' s4 X: A: D8 F! M. W
  1. /**. a8 `- d0 d5 ?
  2. * Логирует количество загруженных квестов и скриптов.
    6 @* F; i/ [( q8 n- e0 M
  3. */
    1 k7 E: r5 r% p5 o
  4. public void report()
    " S: e  H  ]6 f; d6 I0 z% m5 T6 ^. N; R
  5. {- R" L3 ]; q: `, B
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");" X! k& E2 J% @: T! ^& `
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    4 l% I! d; m5 P
  8. }
Скопировать код
' E. z& Q' d! @7 z3 D6 S9 l: g, C) L
Метод getQuest(String name)
6 x! M/ V+ q# _0 H. r6 G; J! w
7 @+ _2 I. n* j& y# b3 d  f3 o! G  k
  1. /**
    9 x5 t  H- H% o) Z. W& b
  2. * Получает квест по имени.
    6 G/ p" a2 S  d- }4 B
  3. * @param name имя квеста
    " S  G( {; d* m2 }
  4. * @return квест
    3 ~/ u$ r& ]* N5 a0 c7 ~
  5. */5 R) p8 i* W+ \! J+ }
  6. public Quest getQuest(String name)+ J1 F! W( V) j8 W
  7. {) ]1 l3 t  y+ L5 v
  8.     if (_quests.containsKey(name))- g; W9 D3 `2 F3 `. E
  9.     {% S# h) X3 B8 V: d+ g2 K0 ?+ S2 W
  10.         return _quests.get(name);- M. J  ?2 D  w! w& ?5 m0 s! [6 P" h
  11.     }
    5 B3 o3 M$ q  U* t3 G5 P( w. B
  12.     return _scripts.get(name);* x$ B+ V$ c, j
  13. }
Скопировать код
# ?( {2 j1 z; w0 l- O
Метод getQuest(int questId)& Y* t% g$ L/ v  i7 D
  r8 I" B$ }; H! |5 C( q8 G
  1. /**5 m! j/ o8 A. Y& O
  2. * Получает квест по ID.
    4 w( t+ W" A6 T+ I
  3. * @param questId ID квеста
    % h9 O: J% E+ t) o1 F
  4. * @return квест, если найден, {@code null} в противном случае
    4 K' d. v$ P  @( q
  5. */
    9 G6 B. u+ p$ p- V: [7 J. {
  6. public Quest getQuest(int questId)
    # H& B7 a% g1 V/ R
  7. {) [# H8 H; W# x& [0 B- s" l# q4 N: W
  8.     for (Quest q : _quests.values())
    0 h; N! w  a6 r- g
  9.     {# ?% i% ~1 a; N! y) P
  10.         if (q.getId() == questId)
    - N  P& e& v7 Q* J1 p2 X' [7 B
  11.         {
    ! L+ b: O( U1 Z7 ?, m( m
  12.             return q;
    ( e1 Q- J4 D' S1 K: d- c5 w
  13.         }
    + O! K" ~' r. q5 N& F
  14.     }
    8 p- v6 ]* T3 q" F- T, w# D
  15.     return null;6 n  N0 {) G$ {. p- f9 N
  16. }
Скопировать код

" A! v. K" ~* z' ]5 I, F( |Метод addQuest(Quest quest)
, n- f7 {" l) C, h/ V# u! _. L
. S0 g0 a+ w2 ]# O" j9 s
  1. /**- C0 w% O% I/ J2 |0 q: V
  2. * Добавляет новый квест.# L' s/ E% b- I" W, P
  3. * @param quest квест для добавления
    9 V  T- x3 w2 W' g: f" [8 K3 V
  4. */
    , M4 N. b. C7 n# y, e1 @$ d; f
  5. public void addQuest(Quest quest)0 s4 l$ ^9 R% C+ u* Z! \
  6. {* [. `# E0 z% S# I2 |. _
  7.     if (quest == null)
    0 t  s8 S6 c# W% ?; O
  8.     {
    8 G  R/ h4 R7 H1 W/ U6 `
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    8 r9 G0 l1 l: U5 P
  10.     }: L7 O& R1 r+ d, W
  11.    
      J9 i$ D3 z: w+ M) T9 s- a/ e
  12.     final Quest old = _quests.put(quest.getName(), quest);. _  L1 @) C# V, g' B
  13.     if (old != null)# |$ {  a) n* T0 {  V  j" B
  14.     {
    " M0 N2 I& [1 L8 `$ J# d8 B' d% T
  15.         old.unload();) Q# c, M& c% g3 Q
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    , c& c# Q( u6 P+ s( {$ O2 Y. y
  17.     }3 M+ D$ F1 C) I) F
  18.    
    " s( a% \) s1 D9 c
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)/ D; j$ d- ^- g# b" x
  20.     {
    & z* U6 W" Z8 [3 ~' P6 h
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();1 h1 U0 j1 T3 F; A0 X
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");& J; M9 W+ L. J: [+ U( g9 I3 Z
  23.     }
    : d+ J, N- S4 x
  24. }
    . N8 Q/ x3 T0 i1 v% T
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
1 M8 [& e  i# P7 _ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.- P( |6 m% z1 A* c+ a

$ a  g! p- |$ ~. n' A& h' B1 X( _$ d4 b' Y' T
: a" @4 ?/ j2 g( ]' Y0 p6 \  y( D





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