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

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

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius/ q& e; x/ V# Q5 _

4 D( |; h, o$ t# yРазбор файла QuestManager.java9 M& N) v1 U8 H2 a) r7 j$ ]
9 S% w$ b; I  O# w
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
' q4 m3 Q8 ]- g$ oОсновные элементы
+ M5 ^% W% v6 c! ^3 {( c, O5 }$ t" z- A# y2 F7 n' ^
QuestManager.java — управление квестами и скриптами.
5 I7 P0 m) [* F2 A# fПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
: r! u' V8 q0 [: C$ q2 k( V5 t/ k
2 S0 f/ X* m4 j! P! O' l. }% g
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
& h9 _2 q; ~+ l0 \5 {- ?1. Лицензионное соглашение; p: |$ F5 M9 T2 x( y& g0 z: a0 d
  1. /*
    $ ^+ C3 K% O1 C3 _: u
  2. * Этот файл является частью проекта L2J Mobius.
    / E' z3 N; ~$ t: ^% |# G# n( }/ W
  3. * + l9 A! [5 M3 W/ ?* r
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    ! _, J! \6 Z- X; E: l( b
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    * I/ X& A; j- R, v, I
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    " r, q9 X! h, x! `, u. A+ x3 }
  7. *
    # n4 p* u3 O! G! V5 L% e* t
  8. * Эта программа распространяется в надежде, что она будет полезной,/ }/ h" t6 l# `' F. o3 H% j
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    1 _0 v% k5 r" V. Q. t9 x5 I  p4 t
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    - s. p% K* }) D
  11. * См. GNU General Public License для получения более подробной информации.3 \2 Y) Q) P4 l  O
  12. *
      s1 I2 u+ o5 X  ]& x
  13. * Вы должны были получить копию GNU General Public License
    1 N. e+ L+ O3 ?( w# y* \
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>./ M, C: K( z1 P) u6 S. h& U
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.+ O7 z+ ?& F* [: I% h, {

. p% Y9 E3 d  p0 R) r
+ V4 v, \2 B, R, Z$ ~  O2. Импортируемые библиотеки" V6 B+ o* Q$ A1 z! _! F' d& m

& h- r9 [8 Z, r& Z# j5 ?* U! t) l/ y
  1. package org.l2jmobius.gameserver.instancemanager;
    4 `* n0 D/ W) T# y
  2. 7 @5 M! S8 B0 X8 j5 S" N
  3. import java.util.Map;
    ! ~. W1 G" N' O/ B( l
  4. import java.util.concurrent.ConcurrentHashMap;# B  V) K$ Q  g! S5 ?# \
  5. import java.util.logging.Level;
    4 L) v. K0 e- h' I! X
  6. import java.util.logging.Logger;
    , J: s' V0 z4 S7 A
  7. * k' A# r$ V4 N7 Y  e  d# }9 [
  8. import org.l2jmobius.Config;
    % C5 s, B# X3 f; v# U) r
  9. import org.l2jmobius.commons.util.CommonUtil;* Q8 M& K+ w& j3 f
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    6 b  d) v0 F& p8 w1 i2 V9 v0 G
  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 — менеджер для работы с игровыми скриптами.) r  _2 T4 ?* l& ~  f/ T; Y2 d
/ W0 q2 h. ~+ E" |& H/ A3 u
3. Описание класса QuestManager
5 N4 J, z3 U: K8 D% `5 X
  1. /**# f5 Y! \5 G* X0 }& Q; Q7 h1 Q
  2. * Менеджер квестов и скриптов.* V# ?1 z  ]. e6 U
  3. * Автор: Zoey76
    & L% t7 [5 S: z, h+ d1 D
  4. */* O! u7 [( C6 t
  5. public class QuestManager# E, l+ u+ `5 Z% d: ~$ o3 h! o
  6. {2 r" o& |8 q9 C) E7 }) f5 c( e
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());5 ~' `" x$ l0 E2 P6 O+ Z
  8.    
    " G; b4 Z  t6 ~, Y
  9.     /** Карта, содержащая все квесты. */
    8 ^; Y) e" ]* f: a/ A' O3 E+ a
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    0 A  g! O% w/ Q  |$ H* C
  11.     /** Карта, содержащая все скрипты. */
    / Y( ]" l$ r; G1 |  S' r# b" z6 L& L. i
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();1 K& r, q  c# W5 k, @; h
  13.     * i, ], W/ [5 V
  14.     protected QuestManager(). P1 m. f1 K7 `# m6 u" Y4 D! @5 @
  15.     {7 S/ z4 A  I7 P2 ?  W7 f$ x
  16.     }- |7 v( o, i) T
  17. }
Скопировать код
4. Методы% V- Q: t) r) [) @8 b
Метод reload(String questFolder)* [! F5 |  W* n3 c# l. l' ]
  1. public boolean reload(String questFolder)/ v# L; I4 {1 H0 H$ n
  2. {
    ! ~) Q- N/ G  F% {2 T  p1 s5 k: ]
  3.     final Quest q = getQuest(questFolder);
    ' {7 i& b( p$ G6 e9 `' p
  4.     if (q == null)
    4 @4 v) a; ], l* H6 E$ g
  5.     {
    ' G8 k0 ~; l" g- Z' s' u# _- t
  6.         return false;
    # c. H0 X- U# h; H, j
  7.     }
    ) [! e8 B: r0 ^$ u6 G  H- }
  8.     return q.reload();
    6 F4 @% D% \2 z1 _
  9. }
Скопировать код
/ q! q- I# q% V" i" e- s. v0 U
& _! A5 H  R. U2 I" ~) Y  L
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
, a1 W! ]0 O8 ?Метод reload(int questId)0 _+ ?! {( ^# a# V- Q  f9 e: M
" ?5 g9 p" O5 b4 G
  1. /**/ i* E& I, S$ D4 {/ Q+ E
  2. * Перезагружает квест по ID.
    - E8 x: W( J% Z9 p+ O& Q, ]. C$ G
  3. * @param questId ID квеста для перезагрузки
    6 `7 M, M4 k- c5 Q. H2 u' W/ a+ Z
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае; i5 Z! p$ V" d! g$ _8 `5 G7 d
  5. */+ j1 a+ \3 M) r* v- m* e. n
  6. public boolean reload(int questId)0 O/ v! V* [* H2 U
  7. {" h  T! ?) \1 c
  8.     final Quest q = getQuest(questId);4 B8 u# V0 l- |, J: H
  9.     if (q == null)% K9 e  {$ x& @" I9 {  n
  10.     {
    / D5 K3 V2 s; Z( n$ A; `
  11.         return false;2 H$ b0 b9 t; |/ c$ u0 B
  12.     }
    4 [4 l9 r# e! m2 {
  13.     return q.reload();' [& K* {& o7 T$ g* A" b  I: g
  14. }
Скопировать код

9 z0 Y; |5 f3 a" ~2 zМетод reloadAllScripts()& N3 s! W, r# v5 T5 [1 E
, w8 d( p- p, B' m% [
  1. /**
    % {$ M* L7 k  v: h! c
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.9 A4 x; l5 Y" ^9 ~5 o7 Z
  3. */7 s4 Z& }! K" r" D- N' \! k" u
  4. public void reloadAllScripts()# E$ F1 O+ R# P+ j& Y! X
  5. {
    6 S$ [/ ]  Y+ @, _# {
  6.     unloadAllScripts();2 f) Z- z8 a' K4 }& {+ ~
  7.    
    8 W* y$ u. x6 u+ ]# Q! ]
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    % r* x/ l/ E' x% n' E+ I# H
  9.     try
    % q* R& c' {, M& Q( e; ^; k
  10.     {
    ! [2 W) Q/ U1 r! G2 |+ a2 j$ V' ?0 O
  11.         ScriptEngineManager.getInstance().executeScriptList();: G  t% V- B5 e/ [) a3 F
  12.     }
    * b% f  f* ^' y& a! \7 K' I
  13.     catch (Exception e)
    3 {! |- J6 L( x4 L( V5 K
  14.     {
    " h" g3 g: X4 H
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    6 j9 x2 A2 F; P7 ~5 m- E; e  j; w5 a7 _
  16.     }2 m; r  y2 x& B' N
  17.    
    # X% `( ]4 ~7 g9 R' H' \
  18.     getInstance().report();
    # c+ Y% ?" |' ?% d. E$ |0 B
  19. }
Скопировать код
Метод unloadAllScripts()4 B, {3 }' _$ H

$ n( u5 W: o6 A$ Q8 w( j- M: Z
  1. /**
    ) }, Q% \8 t- g
  2. * Выгружает все квесты и скрипты.
    0 R) \6 m# i! U9 x6 o- s
  3. */
    6 |9 `6 P# }" r, `
  4. public void unloadAllScripts()3 ]2 B+ I, M. f0 }7 c/ k& @  j+ c
  5. {7 \* t, Z* a  y6 a5 E8 g
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");* k- N3 b+ X; C: b, e
  7.     5 I% A" Q( L8 U8 [& |2 q* \" k
  8.     // Выгрузка квестов.1 M) }# |: w8 ^
  9.     for (Quest quest : _quests.values())
    / G; \' o5 K/ F2 ^
  10.     {: u# H- @6 W- r
  11.         if (quest != null)
    " Y$ }% U5 ~0 P( z
  12.         {
    9 Q' q% Y8 ]6 Q7 ^; Z
  13.             quest.unload(false);% D6 a( e/ w+ k
  14.         }
    % ^% l* r; Y; h" p* M
  15.     }6 M+ a9 b. n( R0 A
  16.     _quests.clear();
    ) h/ L8 g% V8 b1 M
  17.     // Выгрузка скриптов.
    ; e2 t& P8 e4 M' e
  18.     for (Quest script : _scripts.values())
    " W2 o# o$ n$ O2 W, `
  19.     {
    2 O- t4 C" j4 x- y% i
  20.         if (script != null)2 [1 |* }; j% P( D) G4 j
  21.         {
    . G4 J+ `; Q  Q
  22.             script.unload(false);
    6 _+ ]( e7 \5 Y7 m( E
  23.         }
    " L+ y' v! Z6 X( H3 y/ c
  24.     }% L; |9 V$ o9 u9 _$ `2 a0 ]
  25.     _scripts.clear();+ @+ m- u6 w9 K6 j4 t8 B. ~) o) w
  26. }
Скопировать код

# D) M% I7 h% w  W8 iМетод report()
! P/ @! [0 j; C: g8 p/ O) I/ v* K, ^2 A( Q1 N4 P2 a
  1. /**
    * N/ s! {6 @" A
  2. * Логирует количество загруженных квестов и скриптов.9 {  b8 ~9 v; j( R& d( S- `
  3. */! n3 Y) t: @9 O. h: a8 V
  4. public void report()% R8 t4 b- ~6 Q8 Y+ N5 a& l. R; {
  5. {
    & A& E6 z0 t3 @8 F, x+ O
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");( w7 A9 o& G( x7 p' A  K  C
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    4 \7 u: T9 _, v: X/ c8 |
  8. }
Скопировать код

6 ]; O$ k0 \7 S; S- y6 O: v1 qМетод getQuest(String name)
9 m; \. C, V. F, G. L9 {* k! w" `$ c% o
  1. /**
    9 S7 {: `/ T6 |' t2 f2 D6 c& K
  2. * Получает квест по имени.
    . w5 i! {! X) W' C* I0 P5 z5 W! f
  3. * @param name имя квеста
    . K+ T8 X  u8 E, K& N& ~  S
  4. * @return квест& q* I$ E0 t8 ]
  5. */
    ) c5 t4 O9 {5 ~5 ]" `$ t
  6. public Quest getQuest(String name)9 J9 A( R: E7 }& a2 \0 C
  7. {
    ; x+ a8 S( T! k. G! \5 E. r
  8.     if (_quests.containsKey(name))
      ?1 A8 n: ]* F8 |  b/ D( j. A! C
  9.     {- M/ t+ ~0 Y2 t/ F
  10.         return _quests.get(name);' ~, d: Z8 W; ?9 L/ ]9 t" [
  11.     }+ G+ C$ |/ U, W. P4 z
  12.     return _scripts.get(name);- q5 {: E* @7 q) p
  13. }
Скопировать код

2 H" K5 d6 B0 L* r8 qМетод getQuest(int questId)% `' g1 j% ^; j. h( m, k6 @% K
% o% }0 r( t' g: Y2 T8 G, i3 }  w
  1. /**
    7 L, O1 S1 q7 z- m" O
  2. * Получает квест по ID.4 k6 T0 F: E( J- L2 K
  3. * @param questId ID квеста8 t$ M$ k$ [: R2 m
  4. * @return квест, если найден, {@code null} в противном случае
    % P. q( p; \/ Q8 f/ z* f( z! O
  5. */
    & t6 ~* W0 M" X) K
  6. public Quest getQuest(int questId)9 M" L) ~: Y1 j9 O3 B
  7. {1 X! ^% Y* X9 Q, ?4 Q& J; B1 `. a
  8.     for (Quest q : _quests.values())
    + H$ T- K+ }2 g. J
  9.     {
    ' g7 i6 U& `: d, o4 G9 j4 g
  10.         if (q.getId() == questId)/ M% E7 O- l  j, i0 M$ V( R
  11.         {
    7 [8 {' F4 m1 [" A& P' w. O7 p6 I0 n
  12.             return q;$ w. d$ A+ E' B8 X: [" R
  13.         }& r6 K7 @: J% @9 j7 \4 K1 z
  14.     }3 C8 p1 J7 N  P. T% k
  15.     return null;7 K9 m0 P0 z* @) M; w
  16. }
Скопировать код

& [4 ^& S8 [& L6 [* E1 x- wМетод addQuest(Quest quest)0 g1 x1 {  ?: P( Q7 e

- z: l& y7 ?' i
  1. /**
    ( _( Y/ U2 p  b, o. M
  2. * Добавляет новый квест.4 F$ k- J7 b( y% o. \* X6 d2 f7 a
  3. * @param quest квест для добавления
    ! [, P+ \2 [6 p
  4. */
    4 ?4 i1 P( n. n8 c6 X! {, d
  5. public void addQuest(Quest quest)
    & ~: q. R7 A- b; H! L( p
  6. {
    6 s( r: o5 B/ a9 d* L+ m; n& k& W
  7.     if (quest == null)& Q! M5 k+ U' O- w$ D
  8.     {8 D  O, \) z* `2 R2 b
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");0 u, U* @+ i7 L! W2 ^
  10.     }* ?1 X* Z! j0 |- Z6 [7 B; r& k( Q
  11.    
    & S+ i: }* h' Y6 `% ~) }( d
  12.     final Quest old = _quests.put(quest.getName(), quest);8 [5 j* k9 u+ ]/ U0 S  d# d% B8 F
  13.     if (old != null)
    ; i  ]  S# N* Z& d" {
  14.     {0 _' q+ ?0 X- Z" C& N; B! \
  15.         old.unload();5 Y+ E6 a$ q, o8 l! u) |
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    $ G6 W1 |+ b' c0 i) h
  17.     }
    " C1 ^7 J' `) ]; I) [+ u
  18.    
    2 L- E. V. A. v/ h! G) h0 ^& h
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)+ S8 K0 d& Y2 Y+ l. n8 [
  20.     {, ~6 R! N# o5 }+ X, D9 N2 [& |
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();4 }4 k; x3 a4 ^' |
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");+ k% p$ Q7 j0 v; }9 U% p
  23.     }% X" i, S; J% P
  24. }2 n% B' I% o# c2 N" U
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.* o; ]- s8 E& }- I" ], ?0 w
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.0 i. c1 T0 m8 ^
9 t/ O& a0 V$ ?! g" P1 u& M
, \" E4 Y" w/ H! C7 h. [- G2 q0 L
7 M2 L' _0 ]/ u5 d( A





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