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

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

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius
% p/ e# M! P1 m- l+ }. e) c* K- q: [6 k- V' F
Разбор файла QuestManager.java
/ h: {4 r% W; m6 q7 _9 M" g: |6 N  h0 t$ A7 d/ }* m' T* w
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.6 m6 V. ]1 a2 ]9 H2 d% U
Основные элементы' W$ J* ]% ^! {8 o1 D$ F0 k% r
* `# G$ a8 _. M) C, v! A; s& h
QuestManager.java — управление квестами и скриптами.  y# c* B$ Y( c# y
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\' q/ y) m7 l2 }% T
3 X* X( i2 u) A7 U$ @

. h' b5 o% M* h& F1 W. t8 TДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.3 P% ]6 W  D6 |7 ~  y  E: e
1. Лицензионное соглашение- K1 L0 e5 X+ w; H' j' l
  1. /*; g% C- w. j# ~( G) ], E
  2. * Этот файл является частью проекта L2J Mobius.
    ' U9 |; c) k9 a  Z$ i
  3. * ) [# v/ q& i( \6 q4 W
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    + T0 m$ {# g9 F- N. n4 q
  5. * её в соответствии с условиями GNU General Public License, опубликованной" u" b/ o$ k  I! C  S
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.6 b/ P4 Q  j0 C
  7. *
    " e) e6 ^' G, c& J3 @
  8. * Эта программа распространяется в надежде, что она будет полезной,
    " M: e$ J: p6 U& u* W! @# w
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    2 m, l: Y3 M) N5 X* ~
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.& u$ ^- w  H; p. d* z1 D
  11. * См. GNU General Public License для получения более подробной информации." k! j4 x1 e- i  M
  12. * ( o) d1 }2 X' o$ @) q) B8 L0 h
  13. * Вы должны были получить копию GNU General Public License: ^+ C! Q8 E" V
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    + S5 I2 P( l; q5 e; B: O' ~$ {1 |
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
" K: `) B' o9 \5 p% u: c8 h
% c; I' c* F7 d' N
$ F6 ?/ m- O  S$ w! Y2. Импортируемые библиотеки
% K" ]. n! [  o0 V( i! k' a
' t; D! S& b2 u/ l' P' _$ _- r" z
  1. package org.l2jmobius.gameserver.instancemanager;
    + |9 V! j8 Y$ @% y* V$ r

  2. * N. x7 F- Y; V  o8 n: |- j
  3. import java.util.Map;
      ^7 u; y& m- o; |) k! p0 N( L" S6 s
  4. import java.util.concurrent.ConcurrentHashMap;
    " p/ R3 H2 U) K/ C
  5. import java.util.logging.Level;; J% H! V, N: |
  6. import java.util.logging.Logger;8 D. ~1 d) ~5 t5 [9 a4 N6 }# C- t

  7. / c) X, w) m6 L4 T' `  B
  8. import org.l2jmobius.Config;
    ) @0 o" C4 V2 p* o
  9. import org.l2jmobius.commons.util.CommonUtil;
    ( K6 U8 L. |( I4 |2 z! R) d
  10. import org.l2jmobius.gameserver.model.quest.Quest;) q3 ]2 f! [2 W- C/ X3 \
  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 — менеджер для работы с игровыми скриптами.
! v* z$ ~  I5 _# ?' j$ |
% b1 s" {& _/ S0 T* s+ B3. Описание класса QuestManager/ O6 ?# D0 c0 W* I, A( {4 |# I
  1. /**" V" T  K8 v8 r; K
  2. * Менеджер квестов и скриптов.
    - p. Z5 ]* v0 t) [7 k; E' M
  3. * Автор: Zoey769 s9 Y# M, L* a) ?: J
  4. */
    4 n. Q& v; p$ G" E* x
  5. public class QuestManager
    & O* ?+ Q) U4 }; d8 |7 L
  6. {. A4 A+ w9 c! C3 J) j2 n- c7 g! A! c
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    " h% C! R' \/ u) ?# k
  8.     4 Y& q3 e. D% `7 j
  9.     /** Карта, содержащая все квесты. */
    7 @/ t( Y' J# h3 m" ^( X' e
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();- \0 v5 C; ~/ T" W# K
  11.     /** Карта, содержащая все скрипты. */
    ( f# M; w0 u+ S( i( g# \3 {' q
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();8 x2 \; {5 F2 j  H* F% Q
  13.    
    8 r) H% _- Z+ f3 j* c! y& V9 ^* X
  14.     protected QuestManager()5 [/ M* ]; M- L+ \) V6 L2 a
  15.     {
    6 y% y$ Y7 Y+ S4 _! p+ i5 ?
  16.     }
    8 P( r, e5 o6 j+ D$ ^; ]
  17. }
Скопировать код
4. Методы
8 b; ]. f; p" ^0 k) D' A4 Q8 M) cМетод reload(String questFolder)
" z% S5 H5 p% {( ?" W
  1. public boolean reload(String questFolder)1 q: n2 |% K0 Y$ ?' h+ V
  2. {1 S  f9 H: i5 u/ d# l
  3.     final Quest q = getQuest(questFolder);
    , |8 n9 I# A: _: q: F+ K
  4.     if (q == null)5 \& p) c! {& T
  5.     {
    5 y2 B- {- i2 l' S2 T8 A9 \' j( N' @9 A3 z
  6.         return false;
    2 @; n! ^$ r3 w- J: P
  7.     }
    4 o, l9 P+ G7 X+ [' u5 Z
  8.     return q.reload();* Q' o) L; N8 L3 s
  9. }
Скопировать код
9 @- r% `" l4 v, p$ P+ _' H

* K5 r8 y4 d7 e, ]7 yМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
! n8 L4 m% y; J7 _& X" v8 xМетод reload(int questId)* b& y$ I" X  E: T% z9 \
' G5 I) f5 s- V: w. Y. G
  1. /**6 j* m& {4 U* F/ l6 f& L$ R
  2. * Перезагружает квест по ID.
      S" ]4 l3 d3 F- h4 f2 `+ s/ J
  3. * @param questId ID квеста для перезагрузки7 L: g/ ], b6 T, z% t- b3 X
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае. X* }( P: Q7 V3 _1 ~/ g  |, P0 f
  5. */
    8 U6 U: N1 J) v- }* j# s4 n( ^2 d8 w, i
  6. public boolean reload(int questId)+ |* |8 `* F) C! `
  7. {1 o0 j0 n* N+ U- s$ U
  8.     final Quest q = getQuest(questId);5 I/ m2 _8 a0 F5 f+ G0 T
  9.     if (q == null)' |# _8 v1 S* ~8 h0 t( G
  10.     {
    5 z7 r- K( r8 C7 ]
  11.         return false;# E6 z2 W) G3 m& u2 N$ [
  12.     }
    9 [: v) o- g' e/ z9 M
  13.     return q.reload();
    $ Y( L5 s; W: {5 e& u9 Q
  14. }
Скопировать код

" G9 w5 G( u: z4 @7 VМетод reloadAllScripts(): z5 E4 K0 p6 T% y9 |( Y: r# F

0 ^* a/ e/ ^1 V, y( H
  1. /**! T& q8 `6 k. X/ U# t1 H
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    0 n; y9 v9 F1 `7 O
  3. */
    ) A" [- x' \5 ?! i* l+ G% O
  4. public void reloadAllScripts()% U/ l' y- E) }# m/ y4 b# G
  5. {
    4 N- O; y% i2 P$ i( x
  6.     unloadAllScripts();
    8 ~9 E% o: a1 I$ \
  7.     # _8 M' E. [( R/ J
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");, `% r) x1 l5 q$ ~4 u: U7 ^* Q( O
  9.     try. J% g( P  ?9 |7 z+ J
  10.     {
    ; Y/ Q0 X5 w  v9 E: t) o
  11.         ScriptEngineManager.getInstance().executeScriptList();
    - k$ N* {" [: }8 B1 E0 _" A
  12.     }/ J/ N) k, s/ \# m' N
  13.     catch (Exception e)
    # u0 U4 q6 f) n! E. I
  14.     {
    * @% e. B7 u/ ^3 [' `# w1 R
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);5 r4 U8 z6 A6 R( }9 s
  16.     }
    4 p0 v4 f1 [" z
  17.     " }2 u- o: I* V- B( Q# C
  18.     getInstance().report();! R4 Y: `. b+ W3 n5 a4 \+ m8 o6 `- G8 P
  19. }
Скопировать код
Метод unloadAllScripts()# p: I9 _8 a5 ?% j: C' b

: N! N4 ^+ g/ `  Y7 P
  1. /**, _( k5 r& q/ k
  2. * Выгружает все квесты и скрипты.: t& L- n/ E' c. n+ M6 _: `7 e
  3. */
    3 }* }  Z4 I) d1 n& f$ S* B
  4. public void unloadAllScripts()
    " n: p2 T% ~1 p& s
  5. {. s6 L. o& L0 F. x0 S" g' j( ]
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");' c1 Q. u# X$ J4 Y# q4 h
  7.     7 x3 O6 R+ L- ~" Q
  8.     // Выгрузка квестов.. S0 m' J8 H7 C+ A# V  M" X
  9.     for (Quest quest : _quests.values())5 C8 A% e0 c/ ^& D2 m
  10.     {
    1 A9 n% j: D: O8 J1 ]
  11.         if (quest != null)1 k0 x  Y: A3 I2 @* o( G  Q
  12.         {; g' y7 u# Q) w1 V) q! l
  13.             quest.unload(false);; i& `. \* O( u1 i# ^0 d
  14.         }( o5 u. B* B9 i- h$ |
  15.     }8 G9 L" d6 m; z$ U* w8 \% m
  16.     _quests.clear();7 C! r  U# W3 G; e0 m5 T
  17.     // Выгрузка скриптов.
    : F! x& B6 p5 u
  18.     for (Quest script : _scripts.values())7 w8 U; D5 C6 I+ K' X: d/ q
  19.     {
    3 o& _7 R/ w# V- ^! W- C# c
  20.         if (script != null)
    . _& S6 H7 S; Q9 B) Q
  21.         {
    3 {6 a6 d8 Q' L5 P- Z4 a4 {
  22.             script.unload(false);
    # @8 o7 }8 ~; I4 p( ^% j
  23.         }
    2 c* ^- J$ |; |0 @* o) y
  24.     }+ ~" G) m6 h( b7 x) A  x
  25.     _scripts.clear();
    . C9 n" F6 v" J
  26. }
Скопировать код
- e1 _4 b0 B9 }* ]
Метод report()7 ~3 o4 w  g- E1 U! X2 V
" H' \* z" C/ {- B. B
  1. /**- m& @8 k. r9 y* p* v
  2. * Логирует количество загруженных квестов и скриптов./ L6 `! E5 ]  u. Z4 q* K! o6 i4 _1 l
  3. */
    3 Z$ B6 q$ R" N5 m% V
  4. public void report()
    1 T# f1 o4 g$ s0 [& w! m% I* H
  5. {
    $ s# m: r$ t  X$ X
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    : x! T; s* O" }1 w- ]- `& j6 s! v) n
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    % \6 t& g9 m# `) S
  8. }
Скопировать код
4 a6 v# t( g  c  I" L0 c4 Z" M
Метод getQuest(String name)
  d9 v9 v0 P* _5 ^, P6 f; B$ M
  |0 O& Z! y$ w$ P* B4 J1 z/ J
  1. /**
    ; A! C/ ~6 s$ L7 q" n; R- |; |
  2. * Получает квест по имени.3 c! f1 q6 I8 r$ m6 L
  3. * @param name имя квеста
    " o4 U! |0 J3 V9 L& {
  4. * @return квест
    - @/ v$ y$ k/ j, x
  5. */
    / p8 I6 z3 {! ?2 T# C$ c
  6. public Quest getQuest(String name)
    / C: s# t1 W; X- a8 u
  7. {: B2 U: `( m2 b7 l
  8.     if (_quests.containsKey(name))" E0 Y& Z' t' p( t6 {$ A" S" v
  9.     {
    3 J# o. h$ d( e# m/ i/ a
  10.         return _quests.get(name);
    3 W" H$ C. k* V: K" t
  11.     }' r5 \5 n$ I; e) e2 a, L
  12.     return _scripts.get(name);1 r1 l. I: N7 M3 \5 i( G. g3 [& K
  13. }
Скопировать код

: G+ x% |0 A8 a- Y2 pМетод getQuest(int questId)
8 h* w! T) J: l2 R- F5 {# ~- |. F
, t3 l* e8 R/ x! k  D
  1. /**
    6 n7 F5 a% L! h" o! s/ \  {
  2. * Получает квест по ID.$ e4 s; o  M$ p; w7 p0 J6 `
  3. * @param questId ID квеста4 N* `" \# R+ O5 k2 _
  4. * @return квест, если найден, {@code null} в противном случае
    % }3 x& I: ]6 v) v; b7 J8 T) m
  5. */
    : {5 C3 h; |3 ]) i
  6. public Quest getQuest(int questId)8 b/ J$ Y/ ^$ G  |6 @
  7. {
    ! G7 \1 }$ v& J: [0 g+ p6 Z& V4 ~
  8.     for (Quest q : _quests.values())1 @; |! {9 U; y
  9.     {; B' W! i  K: ^5 E
  10.         if (q.getId() == questId)( p! V) ?- M2 L* O" q
  11.         {9 b2 L- l$ I/ d# f& ^( _* i: M
  12.             return q;: b8 w& M. \% `7 K3 a5 @4 w
  13.         }
    8 b6 g; b7 |- [" ]* y& }. |& z
  14.     }
    4 R6 _/ y% f$ a; Y/ @! ~6 L
  15.     return null;4 \* p, X1 z7 n5 f  B9 i6 W: ?( }
  16. }
Скопировать код
* A6 R% _8 G. L3 G6 x' y7 N/ _
Метод addQuest(Quest quest)0 m2 R5 O! |# [$ D' N3 Y& ~6 a
& [; Y# h+ B. p7 g1 W
  1. /**/ h1 m6 g/ Z8 h+ u( T
  2. * Добавляет новый квест.8 u( P1 t" N( [
  3. * @param quest квест для добавления6 G& ]: r* b5 S/ e
  4. */4 ?4 {) j# @# p) C1 I; G- ~+ n8 ?# o8 w
  5. public void addQuest(Quest quest)- v$ x4 R* ^$ ~" t/ e1 O* K; z
  6. {
    9 }/ n+ |5 k$ w% _0 G; [5 h8 ], A
  7.     if (quest == null)
    1 J, Q- Y) B; V* M/ P8 ^, p
  8.     {
      @' D# ^0 a# Q
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    1 ^  x, J/ v  e2 M9 |
  10.     }# q2 s& |# Y& Q+ A* R
  11.     1 d# ?# \. s8 E1 I- h4 v) |! Y
  12.     final Quest old = _quests.put(quest.getName(), quest);6 Q3 ~6 m; u% g* M
  13.     if (old != null)
    3 N4 \! V! l0 b! k8 m
  14.     {9 Z5 g3 Y8 F6 e2 V6 |
  15.         old.unload();2 P9 Q! Z& ^  U7 Y$ x
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");; U5 }0 x2 N* O
  17.     }- K$ `& h& Z- Y
  18.    
    : L7 f" F, b( O8 h, w- x3 M3 J
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    ! {4 z5 A# s) M+ U- p+ j$ a4 Q5 `9 T' ^/ O
  20.     {( @# X) M" X  S. h3 V; X
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    9 o, }* X/ u# h, ^, j
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    ! m) r- G" U6 d1 ^' g
  23.     }
    7 q+ J/ U' J! l6 N5 i2 `; J
  24. }9 r/ U( K3 X$ J( A! Z  B% J
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.* c5 _5 c% C/ i, F! k
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
/ b" R. U5 V& p! Y+ u1 m. U9 F' }8 q9 ?) u5 y: S; u
, c" [6 g; D' k" n+ F+ j4 j

$ I, M' k2 J& A! z; B% v. y& s




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