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

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

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius
) M, _) X. k  P3 V( {; ^2 D/ V7 v' u: }( z6 Y3 S
Разбор файла QuestManager.java+ ^1 n8 W5 s+ O  s# k4 G6 S. H

6 |, z7 U# S# [! lЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
: h( g) K& g1 s8 E$ C. C7 IОсновные элементы
9 U( {+ K. g! t* b3 ~  U- z/ T- E# I; g8 v: v. c3 F
QuestManager.java — управление квестами и скриптами.( v! {1 u! O* |* D* U  p+ W7 C
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
7 V' @6 S7 d& R0 m4 x5 `
" ?" G+ _/ V$ z# Y
! X1 v) Q9 L6 |9 {/ m
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.. u) w' |' j0 Y) y6 M# f
1. Лицензионное соглашение
- S3 y+ @3 ]0 v# ]
  1. /*
    % O. D7 c% J4 n  J; ]; Y
  2. * Этот файл является частью проекта L2J Mobius.9 h4 A' ^: @8 X; f5 b6 w2 b
  3. *   H7 Z9 B% r# L% b
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять0 `/ G+ g' n  ?# B/ n
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    / V% E3 g6 ~; F. E4 h
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    2 m. k5 a5 X3 j6 ]) i! P
  7. *
    / {; q; N6 U2 J9 h6 C
  8. * Эта программа распространяется в надежде, что она будет полезной,
    + l  @3 o% G% p1 i
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    - U) k* k" |6 M( Q$ u/ H
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    0 Y. k4 r+ S2 ?$ g' C6 n
  11. * См. GNU General Public License для получения более подробной информации.* l6 v4 }2 ~9 J, Q
  12. * , p0 U. g8 r& b* R
  13. * Вы должны были получить копию GNU General Public License
    ; q8 s: S$ J9 f* Z- M4 D
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    $ F8 T  r3 D" A
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.1 O+ w% q9 t! k" k8 K8 ]- e

8 H% Z8 G7 [1 e! Z9 I
8 i2 r7 U2 _9 B2 N# q$ V5 ]* o5 u2. Импортируемые библиотеки4 w2 F. j/ m& m7 r! R& U! h/ x

9 W" j) j5 t0 U; T# W' M; e
  1. package org.l2jmobius.gameserver.instancemanager;
    8 h" c  k8 A4 Q7 p3 H' t- T- [: W

  2. * e/ F% y4 i) e' l
  3. import java.util.Map;9 P  y; C& y. p6 O2 K* y6 d+ A/ \
  4. import java.util.concurrent.ConcurrentHashMap;1 m! O4 j+ \: C
  5. import java.util.logging.Level;
    $ n9 s* \* ~' ~3 w
  6. import java.util.logging.Logger;) `! A" Q3 o* N! E' k* G
  7. - U4 J, g. U+ w3 W4 S- W4 M
  8. import org.l2jmobius.Config;
    8 H! Y; S' V( u( O$ G
  9. import org.l2jmobius.commons.util.CommonUtil;
    / N" k  V5 l, |* j. E3 j& `5 N
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    ! K5 ?1 k9 l) \" |: T
  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 M# {5 s, [- k( O# g  b# T
' H. r8 t7 H) U. h$ s* C) V0 W
3. Описание класса QuestManager8 ~: u- H9 C- b
  1. /**
    + U! b' a+ ~$ L6 y" \  E
  2. * Менеджер квестов и скриптов.; U8 n. e$ O( u0 I
  3. * Автор: Zoey76
    / f) W. n2 g4 z1 g6 O+ y
  4. */
    * V% T: P9 p0 ~$ `! ]
  5. public class QuestManager
    3 V  E# h$ O# S+ q2 b
  6. {
    2 }5 |  {; [7 ~9 F1 n1 f4 Y$ Y
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    + y0 `* Z, s9 T7 X- H
  8.    
    : k8 |/ J) m9 m) l/ B+ o1 P
  9.     /** Карта, содержащая все квесты. */+ W0 L' W8 [* L( D' r
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    : b) i8 @  b4 `
  11.     /** Карта, содержащая все скрипты. */
    4 i/ E" m) P& q- v/ z3 W
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();7 E& J. J- Y, ~# B
  13.     * j5 p3 W, ?/ P; M
  14.     protected QuestManager()2 ^0 p7 w8 `: B" g$ z  n& R7 S- v
  15.     {
    + ^: G2 n* P9 m$ e! s8 Q! _
  16.     }# [( e  w$ _% b# P
  17. }
Скопировать код
4. Методы- c# n( F. p! O( D
Метод reload(String questFolder)3 I6 @2 W$ P$ b! _$ S" G
  1. public boolean reload(String questFolder)
    ) A8 |, s$ q& W! C4 F
  2. {- }0 c5 }' }  a4 M3 N% l- I( m
  3.     final Quest q = getQuest(questFolder);
    - j5 y/ E5 p  O# _. H
  4.     if (q == null)$ e  ^, z) [+ B2 k( `) K% Y5 d/ O% i
  5.     {9 s) i6 F5 @% r  E: \' a# ^! a
  6.         return false;
    " }8 X& v7 }0 ?4 B& R) Z
  7.     }0 E5 U1 k1 g0 l6 C, |8 ?( \8 Z- c
  8.     return q.reload();
    ) R- Y1 q% v* K( W
  9. }
Скопировать код

; s) h) I  f) k8 d/ l1 C- @. ^( N* _8 ]' g
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.6 d# M9 U/ Q/ ?/ r) e
Метод reload(int questId)4 |) C5 }% w" ?0 j

2 _' X" f3 |, p8 V
  1. /**
    % l/ \$ h' \* d# a+ U& D
  2. * Перезагружает квест по ID.
    0 R0 s: B, E0 G3 b2 `
  3. * @param questId ID квеста для перезагрузки
    ) n) C3 B0 Y  ]% Y: h9 n
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае) @8 d% ?: d5 ~% x+ ^0 p4 A( u! m
  5. */
    # e- `" ?  U& ^- }' W
  6. public boolean reload(int questId)
    ; }( H* f  B8 C% h! N
  7. {4 C. @! k* ~5 R$ E
  8.     final Quest q = getQuest(questId);8 u% h, c) V/ g! {9 r
  9.     if (q == null)
    9 B0 M" L; Z; \# v; Y4 g- D
  10.     {* W$ Z2 S  B+ q6 @5 G. f& ]' G2 Y
  11.         return false;/ x5 e2 E& W/ O, I" k1 ?
  12.     }
    ' b! C, E* Y" B5 c9 \0 X5 w5 x
  13.     return q.reload();
    ; Y. d0 M) N& |& H, N$ ]1 K. u2 c6 g
  14. }
Скопировать код

! V1 }' }6 `; o7 T/ V& R) IМетод reloadAllScripts()& h4 j$ m% y' Z$ ^2 g- v

, W) l+ }! ]2 \% W5 m% l/ r
  1. /**3 h) h! W! K( a
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.3 x" e5 h4 X- G; j
  3. */
      D7 r2 v& O5 s1 x1 @/ g
  4. public void reloadAllScripts()
    " a$ p: O: @$ [. I- j! h$ _8 L
  5. {
    & ]. T% q5 R# A
  6.     unloadAllScripts();9 E0 i. ~% m: E/ Q% b
  7.    
    . Y9 e- y! W8 K
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");- f  S' ]$ ?4 \
  9.     try
    # d  @' d4 k0 p. t0 d
  10.     {
    1 x( L; Z) I1 g1 Q
  11.         ScriptEngineManager.getInstance().executeScriptList();
    * W- |. O: q- P& t
  12.     }
    1 W; r2 T' G% Q, t: d7 ?( o4 z
  13.     catch (Exception e)
    5 C  D/ a7 F1 |: G1 M6 T
  14.     {
    ' W) l; l8 e2 B- V
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);! }& I- s7 w/ [8 S. T/ ]
  16.     }6 H# O6 u0 \) E$ E. W- {$ J
  17.     % g% i" @& m+ y$ V
  18.     getInstance().report();
    % a) t7 R% R1 B. o1 K- `
  19. }
Скопировать код
Метод unloadAllScripts()$ W4 T* n& M  \  c% _9 c9 \
6 M+ Y/ p  j$ f
  1. /**5 d0 ~! V  o3 T1 n& u; s
  2. * Выгружает все квесты и скрипты.9 t) z0 g% {1 T9 U9 X% j
  3. */
    / H* m. r1 X+ ~+ V
  4. public void unloadAllScripts()
    6 V( e. m$ z6 t8 S; l
  5. {
    ; G: }. a1 m! q  n6 t
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    2 M, u; c6 M2 K% C% B* Y8 Q7 z
  7.     " x  w! A  T: r6 e
  8.     // Выгрузка квестов.
    % c2 u# x' D$ G
  9.     for (Quest quest : _quests.values())0 c$ x" ]# R+ o% _0 x: H
  10.     {
    $ C' L( j0 @2 w- r7 M/ v
  11.         if (quest != null)1 N6 y4 `; x5 q% x6 N! ?
  12.         {" M; {5 g, Y( q# ?! T" f# N  V
  13.             quest.unload(false);& \5 Z: u5 b0 r; n' A2 U; E/ P! ?2 r
  14.         }# z3 _: z! j/ s* m, Q8 E
  15.     }
    6 s0 w0 ~/ H0 J4 c0 p; ?4 f) D- q8 F  N
  16.     _quests.clear();  b  ]9 H2 I( n
  17.     // Выгрузка скриптов.
    9 O' W1 F0 E: d$ o
  18.     for (Quest script : _scripts.values())8 b& j/ M/ d; o+ R9 u2 Q# n0 r/ y
  19.     {
    ; @. R" J! }4 X% S$ y8 {& f, V
  20.         if (script != null)8 ~3 i' Z4 i& J& U
  21.         {, C7 d- ]* Q+ ~: c8 t
  22.             script.unload(false);3 j9 J9 e. D$ V" ]
  23.         }
    & ]8 z& c3 A! C) I" O  a7 |8 T. ~
  24.     }' M) U4 a! x9 U# ^) n6 \8 z+ H: n
  25.     _scripts.clear();6 Z6 |/ P5 y5 a% n6 m' X
  26. }
Скопировать код
5 g. \0 ?" \4 M* v- i/ v8 O' |0 }
Метод report(): g4 f, r3 u9 }6 S4 a

' Q0 c) w9 T) S7 l5 e
  1. /**, z7 }& X( A! f0 V8 r3 g* u4 b
  2. * Логирует количество загруженных квестов и скриптов.; f+ T  {- d+ h& g
  3. */) K8 O, g8 \& h) }  ~/ W) d
  4. public void report()2 I# \+ N; G6 ^7 ^
  5. {
    . x2 L  v7 W' R  H# j2 n
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");. P  }# K8 p! M% [
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");2 p6 ^1 T2 w  ~7 D* Z
  8. }
Скопировать код

1 v* @( u- q& ~1 w- F, @0 wМетод getQuest(String name)2 ]! }+ m8 g3 d& I3 i+ F4 Y6 J# W

, i, p0 ^/ c3 \+ e3 `6 O: X
  1. /**
    6 `$ a" u4 r0 R0 x8 V5 ]
  2. * Получает квест по имени.
    3 {. Y! h6 Z) Q$ M7 d" I
  3. * @param name имя квеста4 P8 e/ q3 z* z  x
  4. * @return квест
    6 ?# x8 C6 r5 y& ^) b( u0 _
  5. */
    7 {- r, x+ k1 z3 f9 m2 Z& y( ?
  6. public Quest getQuest(String name)) o7 s% o6 _! W, {5 O
  7. {3 t- s: I- S/ W
  8.     if (_quests.containsKey(name))2 T7 ?4 l2 H1 L% ^  C7 [" c* N  f- j5 R
  9.     {
    4 m8 K/ u; l. Y! g+ C6 Y. Z
  10.         return _quests.get(name);
    + u9 H  M) J! z
  11.     }
    / f8 {: O/ h# `1 R
  12.     return _scripts.get(name);# _# l3 p. [1 s3 n5 H
  13. }
Скопировать код

- b1 w4 l7 `- n5 v" WМетод getQuest(int questId)
, M3 P/ ?; Y" q- O% V" U
! {; F8 r- K9 F' @/ D
  1. /**
    2 \0 ]2 V" o; j) z
  2. * Получает квест по ID.
    / [+ e# f5 E# P5 e  V
  3. * @param questId ID квеста
    ) G6 s3 V8 {. s
  4. * @return квест, если найден, {@code null} в противном случае. C8 u7 m) ~9 i8 a
  5. */
    - _/ j- d+ K3 D* X0 u
  6. public Quest getQuest(int questId)3 X, u& h. E2 m6 \! e
  7. {$ U. S& g. z  d7 \
  8.     for (Quest q : _quests.values())
    ' i& E& o  V# q$ E9 L  I' X' f3 e
  9.     {
    ' d; P0 s4 @6 O
  10.         if (q.getId() == questId)! H5 x% Q" a8 b# m% n
  11.         {
    4 {' Q9 O5 l% }
  12.             return q;
    $ o9 u6 G! {2 F) S
  13.         }1 x3 l7 |' f0 O
  14.     }" W5 N  c( m/ N& j' M
  15.     return null;
    ( U+ N: h8 K/ g* V1 o, L9 }
  16. }
Скопировать код
9 E2 ~* l7 F0 b( j2 r# ]
Метод addQuest(Quest quest)
  }* F( W# r7 o- j: D1 N& O6 U* Z& K9 U3 B. u1 ]: I
  1. /**
    , d" _2 I# R# M9 y$ {
  2. * Добавляет новый квест.
    / Y5 F  W" o5 R! t
  3. * @param quest квест для добавления# G9 O6 v4 k3 B) A" K4 B
  4. */5 U: H0 D* |+ b9 G: L
  5. public void addQuest(Quest quest)
    , H3 g4 J4 e3 R: A% x  \
  6. {
    ! _$ O; f+ n0 v
  7.     if (quest == null). H. F) Y3 c1 l7 ^! [9 D6 m
  8.     {
    . L0 g* q+ s% p0 y# M7 i4 \
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");2 H; v+ |- z9 W" E  V
  10.     }
    ! ^: M+ r' M1 }, B4 n2 e! _
  11.     & m& l9 b- K& m  L" K0 B0 M, w7 `
  12.     final Quest old = _quests.put(quest.getName(), quest);7 k* o# w7 O5 g2 \6 S; ~* ]
  13.     if (old != null)
    8 h, b: C, O+ R
  14.     {1 U8 U# P; u2 v/ U' k
  15.         old.unload();
    % n* k! u$ Y) Y" K6 z
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    ! u2 o* M3 h/ b  N
  17.     }
    8 A3 D5 L6 s( B: s. W
  18.     1 B# w5 J" f& y( z3 n" s  L3 ]. D
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    9 b% e' X4 P0 S; O3 j
  20.     {( F. |8 F1 D( G4 K7 w
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();( N( f+ R" P: t( i) E
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");- ~. |. W$ o% \1 M; f  ]9 \, b
  23.     }
    & H7 c& ?- d; c  p
  24. }: U6 p9 _7 U" I- \- S/ ]
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
. {3 i( R- g/ T( AЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.3 h5 c1 n) q# U6 Q# N/ |. K4 G
0 o. W  ~; K6 G& @9 U3 \; e

) C. X" m: i4 F5 |6 X4 K
2 l3 E7 F' B9 S3 j" p




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