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

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

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius
& r" V9 A- P* d! b
  Y; t0 S% c: A9 f3 z# N( u9 YРазбор файла QuestManager.java1 S4 N3 X9 R* m8 L" i
9 d: F$ u3 j2 K/ f
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
; l* G) T/ T2 dОсновные элементы
6 ^' D+ L# m+ T( E
; |9 _, ^+ U( [# bQuestManager.java — управление квестами и скриптами.
, L8 q9 M: Y: k$ z3 xПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
4 q6 ?0 q# i$ P- w2 I; l- @* E, d  w( m: a/ D3 U
1 J$ C8 X& z$ U
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
7 S2 J, q5 A' }/ [6 y( ?1. Лицензионное соглашение: v8 G) \/ h0 Y
  1. /*
    8 F5 \3 I. A! n5 m& f
  2. * Этот файл является частью проекта L2J Mobius.
    ( D! i6 E3 N6 Z
  3. * ' m9 V" Z' ~: _
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять. j7 h( D1 x" k% o- p( F
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    0 B6 o# ~; B+ e. L, _, z  h
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии." O% D5 b; B* F7 K5 `& m3 Q
  7. *
    + F6 x( V" }/ m- D: r# \
  8. * Эта программа распространяется в надежде, что она будет полезной,
    & [* b+ A3 `& s$ }; }
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии& e3 ]' {% s0 V
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.* F9 B$ t; e' T. J
  11. * См. GNU General Public License для получения более подробной информации.
    5 j, h8 w5 s& ?' K
  12. *
    ; B1 N: M& `" ?% a
  13. * Вы должны были получить копию GNU General Public License
    3 A0 R' c; [$ w7 {/ T
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    7 ~4 y$ ~( J( n0 c  w! y
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.0 M" z* u# J" [: R

5 w; v' n, f: x" }8 Z8 [. M6 N
1 R% |/ H6 s0 }2. Импортируемые библиотеки
/ F) D3 g3 C4 W( \) [0 {2 I% ?# N  E1 [+ i
  1. package org.l2jmobius.gameserver.instancemanager;
    5 J* T5 H+ \3 ^8 c

  2. % t: B1 T: g( j. c' _. e2 |
  3. import java.util.Map;
    * X/ }! G3 u+ o) g+ ~
  4. import java.util.concurrent.ConcurrentHashMap;5 S! a4 V0 v0 c# O$ Z% k
  5. import java.util.logging.Level;& H& X& ]5 a" V5 u' k
  6. import java.util.logging.Logger;
    # v: i7 U8 v; z+ s. R
  7. 8 A5 \2 ]! C* S
  8. import org.l2jmobius.Config;
      J! f2 ?2 ?, J5 j, W
  9. import org.l2jmobius.commons.util.CommonUtil;
    $ T8 ?8 [3 O2 Z4 f  S
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    7 ]5 ^# d2 b4 r5 o! D# d$ _, I
  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 — менеджер для работы с игровыми скриптами.2 `; ~! a3 T: A  G, }' E

# R5 s3 M4 y# S3 o3. Описание класса QuestManager- S& |1 N# @7 l$ f
  1. /**
    4 g* n+ T& Y1 F7 B
  2. * Менеджер квестов и скриптов.9 P! ^& h% c3 L
  3. * Автор: Zoey76  N# P8 t: n' y9 J2 I" N
  4. */3 p0 r- h3 M% o! l9 i
  5. public class QuestManager2 k. d1 c  C8 H4 [, n% z
  6. {
    - D! U- t+ h) W' p- \1 H4 Y
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());  o# K  {; f* \
  8.     3 K2 E2 x' u1 V) o+ a
  9.     /** Карта, содержащая все квесты. */
    1 y( `; J9 W4 a# Z/ y- w6 m/ M
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();& `# f" C' ]0 q9 v( d3 \" J
  11.     /** Карта, содержащая все скрипты. */8 i- b7 C) a5 `: `
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    2 D. v. ]( R) v/ P
  13.     + I' D% I0 o" C
  14.     protected QuestManager()) z5 ~/ E+ t( ]! m+ I
  15.     {& U$ c$ l5 ?( d! K+ v
  16.     }+ l8 U7 g9 O/ t% j
  17. }
Скопировать код
4. Методы$ y3 `6 M2 U, G: x. b
Метод reload(String questFolder)- z' _! V. Y1 Y7 _/ \) m
  1. public boolean reload(String questFolder)7 n3 a: H8 L, ]& r
  2. {
    8 r( `% {/ N7 u6 D! @0 q- j7 @
  3.     final Quest q = getQuest(questFolder);( O7 k7 P4 V. k9 c9 X4 p
  4.     if (q == null)
    & \1 j2 r+ F  q. T, ]/ }
  5.     {
    - O8 d7 n. e/ C6 O7 e  _
  6.         return false;
    ( w" _4 A  \/ u. C  `9 c
  7.     }
    $ @8 x8 n! F: k" H  O
  8.     return q.reload();# U7 a1 e. D  W$ @( w, R
  9. }
Скопировать код

1 t, T5 D( h1 G# j# C0 h/ Z3 z
$ b6 v" z) E  H+ JМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.. f  W- [% `6 s7 N  E5 m' G
Метод reload(int questId)/ K8 @0 C+ J- _1 X& N

: q) z7 f8 t7 u: J
  1. /**5 S/ |8 C4 j+ I. A1 j: u! o
  2. * Перезагружает квест по ID.9 E. B% h# H6 O) l3 x
  3. * @param questId ID квеста для перезагрузки5 t. W5 n7 _5 W  g6 ?8 O5 b
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    0 K. }( _: a" C9 L- L
  5. *// J, m% @: J; C2 l
  6. public boolean reload(int questId)
    9 N7 N6 c9 y3 G1 w: |
  7. {
    ) x/ z7 S. X( h! j) K. m
  8.     final Quest q = getQuest(questId);
    ! f5 Y% e! T6 Q, L
  9.     if (q == null)7 W: h! {& d6 y  W
  10.     {/ Q0 L0 J  p( E+ f" d
  11.         return false;
    3 K% \, W- L7 S/ o
  12.     }6 U+ |8 f8 G, r3 I
  13.     return q.reload();) @4 g5 \# a# |7 g4 ^
  14. }
Скопировать код
5 Z& V0 c" z5 g0 D$ \
Метод reloadAllScripts()
& N9 @6 J! _% F7 A0 E  c$ Q+ [
4 T! S) Q/ t- b' _+ U; n9 b/ W7 k
  1. /**
    / T7 b, M4 W8 @2 \# ?  q7 H6 m. I
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    0 p, ?# v) @4 K' k5 t$ m( v
  3. */, R0 o; v# D& J
  4. public void reloadAllScripts()
    2 v7 _' C4 K) T: q" z. d& ^& U
  5. {4 I- f, O0 W0 \/ @: j; K, g9 R
  6.     unloadAllScripts();
    & {- I: G# S* f; z/ G2 F) ~
  7.    
    9 {& I6 E. P3 A0 c- L+ b/ u
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");* ?1 x2 X7 k( P9 |( Y
  9.     try! a8 d1 ]* N  P- U; @+ c* z$ N0 X- r
  10.     {/ j; L7 F3 w9 R' K0 X
  11.         ScriptEngineManager.getInstance().executeScriptList();
    - u# T7 C3 i9 C& h
  12.     }
    % `' x* a% I/ D8 B4 p" m
  13.     catch (Exception e)4 ~0 n& V9 W$ r9 z
  14.     {( y; Q; B7 ]+ J1 ~2 I" z) ~
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    6 O% u# p- i# _  b/ I. Y7 a
  16.     }
    + G3 ?, [. l1 p$ n& Q
  17.     * }2 C$ `5 r) B! D! p0 D# L
  18.     getInstance().report();
    8 y! _( Q6 W6 l$ y* v
  19. }
Скопировать код
Метод unloadAllScripts()
  ^/ F8 Z; b8 C. s9 Y. v8 O* L( |9 ^4 e5 d' @5 |2 U- H8 K
  1. /**7 z3 ]: F% A; C* ~0 N& v! @, y
  2. * Выгружает все квесты и скрипты.4 A" @! @1 V2 x1 P3 `4 T
  3. *// p: A' J" r4 ~: l) M+ |2 U
  4. public void unloadAllScripts()& n+ J! D! A0 W5 X
  5. {4 H7 t' m6 F+ p4 j5 m( J
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    2 X8 V! h+ O$ M: H7 u
  7.     ; g8 P" q8 t7 G4 c: k
  8.     // Выгрузка квестов./ N- u" g& f$ [- u. `
  9.     for (Quest quest : _quests.values())
    ; r6 h6 X* W0 J( u
  10.     {' z. s4 k# J  Y- ]+ ?
  11.         if (quest != null)5 b$ i$ Z5 m1 O5 X0 t* ]
  12.         {$ A& Z+ E0 `: d% S7 m7 m
  13.             quest.unload(false);+ A: a1 \8 ]5 i' g7 m
  14.         }& e- l2 Y5 l4 R
  15.     }
    ) I' F% I, `: |( S0 T
  16.     _quests.clear();
    , \& R1 `. l# z1 h1 D, N* Z3 @2 a- L4 I
  17.     // Выгрузка скриптов.
    & I0 Y+ y/ ]7 I5 y
  18.     for (Quest script : _scripts.values())
    1 m' J, [- n9 |' x& f
  19.     {
    ! u% `" I* H* @% I6 C' x% H% Q
  20.         if (script != null)! y6 k6 T+ s% |' H0 N
  21.         {
    / p2 w, l& P- y/ h" `# J% o$ p0 r" ?
  22.             script.unload(false);) `$ a6 x! z/ z! k4 d( p( g; x! V
  23.         }
    / P/ V( i' u, R" M, i
  24.     }( u- J0 ^0 \; o" Q2 q7 p* @
  25.     _scripts.clear();, C. M2 X0 {4 l/ _. d1 y: ]
  26. }
Скопировать код
8 N( B. q. z% ~
Метод report()/ f1 W/ o$ H- g( `0 o$ z- m

2 l  d; y8 Q2 p# a4 j$ O
  1. /**7 k, t" f& r" @( Y9 d6 U9 h
  2. * Логирует количество загруженных квестов и скриптов.
    4 U' [$ u) }# o/ g
  3. */8 `, ^% d7 H% S/ {, [
  4. public void report()
    - ~' N+ h, x) F; N& y1 H! ~8 c
  5. {0 C4 f, r. I# @8 b
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");: ?. p6 U! F3 y/ G5 g
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");* f1 R/ \9 T0 G. F; h( G
  8. }
Скопировать код

/ O/ Y( `7 g2 F8 Y0 ^9 ^Метод getQuest(String name)+ M1 ?( r  q- I7 N6 A
* U5 ?9 |0 e2 p2 l
  1. /**6 i% ~) @+ g$ P7 K9 E
  2. * Получает квест по имени.
    ( U- C1 e1 y" c. D" U; j2 O
  3. * @param name имя квеста
    7 h1 v  y3 H. h! Y
  4. * @return квест1 H7 I  G! k9 a8 _( Z2 w% {
  5. */: {3 Y* F8 q6 v5 \$ i
  6. public Quest getQuest(String name)
    / g0 R  \0 |1 _+ n3 {7 q
  7. {
    ) X% ^' \$ R& f% A2 v/ B+ R
  8.     if (_quests.containsKey(name))
    5 C# w: `3 m: Q7 O1 d: a& V; c" H
  9.     {
    + Q( e1 O% ^5 h* V+ M/ c6 X
  10.         return _quests.get(name);" _* @* x. L7 `* p2 S( T$ J/ l
  11.     }
    # V# Z9 D/ i3 J% ~* J) \: C3 T4 P& h
  12.     return _scripts.get(name);7 ?. D6 H0 u7 u
  13. }
Скопировать код
2 @; ^4 C0 L: ?2 ~  D& X
Метод getQuest(int questId), p, h2 p9 Q2 ^! {1 c: s" i# L

! ~7 J& [( C, y7 P9 a5 K; @
  1. /**
    6 L* g) ]2 K) P4 ~/ _' y" O
  2. * Получает квест по ID.
    9 H$ ^. |7 d. b9 i( b
  3. * @param questId ID квеста
    4 M1 U1 t) K; J1 a# R& _+ R7 o$ h! ?
  4. * @return квест, если найден, {@code null} в противном случае
      e5 R7 N& ?; b, s. z5 z* `
  5. */8 T; b' |9 Q  x: [& v
  6. public Quest getQuest(int questId)' [. n; _' M# j" g* R# u1 v% G
  7. {
    0 j  y2 z* X1 x. Y) o
  8.     for (Quest q : _quests.values())
    ( q6 H7 x$ p  Y" l0 K, Q
  9.     {
    4 f+ b1 x& F" z
  10.         if (q.getId() == questId)
    ' d/ C0 D/ y7 ]
  11.         {4 G* W8 z9 l0 k& L* @
  12.             return q;
    # J7 R7 T- g6 m" g1 s% j
  13.         }
    ; i9 [. w4 G1 q( x1 o& m" P3 ^7 m
  14.     }% K7 z( ~$ {& A6 p
  15.     return null;
    " t& e0 J* N! t/ r
  16. }
Скопировать код

9 r2 i; U( `3 I3 c3 `' lМетод addQuest(Quest quest)- o2 @. g/ D$ l3 ^, i6 y* c5 [: b( w
$ X0 S0 h: \$ l$ ~
  1. /**3 x& o/ Q  x  q* Z
  2. * Добавляет новый квест., Y' k7 X. _9 s  M& }7 K8 h
  3. * @param quest квест для добавления. p+ }2 h: n3 G
  4. */! |- J; A; k  e$ a
  5. public void addQuest(Quest quest)/ w2 P  ?( W, V1 v! J
  6. {( r$ s# R+ O: X5 c% C- u2 E
  7.     if (quest == null)* d; C$ }: W; G3 n# X
  8.     {
    . }& T- t4 Q2 g( t3 P/ l$ O
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");0 t, r4 H4 U7 `# p& i+ w
  10.     }
    ' `5 X& a/ k& E: @
  11.     . E  s6 L" @5 p9 A; H- J3 g; I1 x, X
  12.     final Quest old = _quests.put(quest.getName(), quest);' Z( X5 L+ P* O; U
  13.     if (old != null)
    ! r' [$ g) Z9 N. m7 Z/ L7 L& |! _. C
  14.     {
      L! X! l; S1 g3 o
  15.         old.unload();" h, u/ ?8 @$ Z6 g  [9 ~3 n3 c
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");. @" b& H! L" D5 V
  17.     }
    ( p! T+ b2 I( w9 s
  18.    
    * r& t1 _$ m+ M; y+ @3 C, T
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)  {8 _3 `1 T0 e5 Q. u! Z. w
  20.     {
    : V0 q. Z% `/ {0 x
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();" Q# k% a& @: g7 a# G
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");" ]: z6 g2 C8 `6 S- E. {9 q3 K
  23.     }
    6 B2 R" g7 n% V4 p% Q# A
  24. }. ~  j& R4 l5 d6 M+ x2 j4 Q% k5 l  [
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.% G# j! ^- m* }% F* l+ ~
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.8 z' d. D: ~# d
" \, P3 s+ v% |' d. U/ Z$ O

' r$ t! X; h  H2 E# d, w! ~" }% T, i4 g: n





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