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

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

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius
5 |7 E* C% a. r+ e8 Y; }. R# e& r) r% A5 N
Разбор файла QuestManager.java4 o8 ~: K+ y! f$ I% N# b, e

, Y3 R$ V7 G' AЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов." A' ?# a0 ?. y! Y$ l7 C# X/ ]
Основные элементы5 K2 G- i4 b3 r, o1 s' f

& G: d9 V5 P2 c1 w' u9 F, y& EQuestManager.java — управление квестами и скриптами., B. |' p+ s9 g+ G+ {, o
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\+ ^/ |/ b+ l0 h. q! O

3 J# t3 V) N: Z; G3 w! N8 {* i/ d
, e, d3 y% T$ U8 X' `; |' O
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.0 h) Q- g4 u+ g9 o/ v0 w+ m
1. Лицензионное соглашение
2 r+ ?7 \% L# ^$ W
  1. /*  F4 [& }# b0 Y
  2. * Этот файл является частью проекта L2J Mobius.
    ' ^; l, r8 q4 x' S6 Q
  3. *
    4 l) ]% }* U2 G
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять+ e+ ]8 J; B/ i# L) U3 q
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    3 M$ [" L3 Y5 p9 X5 `& L
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.8 R/ A. B  V9 M6 A8 \3 C. I) `
  7. *
    8 s2 Z1 W9 \# ]) G3 O2 r! h2 f
  8. * Эта программа распространяется в надежде, что она будет полезной,
    ; |; @: h* Z0 y" W
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии1 D' `" }6 ~8 ?( a
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    + ?- l8 _* p, Z5 D/ b
  11. * См. GNU General Public License для получения более подробной информации.( Z. ?1 H+ ~$ U( t  c& V. Y) c5 Y
  12. * & e, U4 b' L" a2 z4 E0 b9 G
  13. * Вы должны были получить копию GNU General Public License
    , V: d. a5 U5 o4 Y; p2 v
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    ) S/ l. `5 O# r( S# @) J
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.6 Z! d6 Y5 J) R& A
4 R. Q' b" Y7 _1 A$ `$ D

* X7 R8 @) Q% R" U' n2. Импортируемые библиотеки
( }5 q1 {! l8 H( F7 G" }7 R) W$ J; L: c2 t0 q( O) q4 x- S& N
  1. package org.l2jmobius.gameserver.instancemanager;
    6 T, `1 U# k8 N$ p, n
  2. 0 r+ r6 t' G9 a( x6 v5 }
  3. import java.util.Map;/ A  E8 a0 Y8 D7 a! S
  4. import java.util.concurrent.ConcurrentHashMap;* t+ c7 y( i9 N7 U6 _
  5. import java.util.logging.Level;: x6 x6 x1 J- _" N4 O- m3 E
  6. import java.util.logging.Logger;/ `9 |5 m5 m) x/ h
  7.   \* t  k1 n7 {. m/ V& x: ?( j: U
  8. import org.l2jmobius.Config;) Q9 W2 F; m, L5 W( U$ ]
  9. import org.l2jmobius.commons.util.CommonUtil;
    . N: S7 {1 N: l" [7 `9 V
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    " T6 O1 O7 ^9 P% _& _3 v5 |$ Q0 \
  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 N* G! c4 b+ k- X3 K3 H# i

9 Q8 c1 M6 B( \: p3. Описание класса QuestManager1 a" o8 n: T1 g8 Y- ?
  1. /**. |( J" w9 Z9 C
  2. * Менеджер квестов и скриптов.
    0 O" M( d' h7 E  c7 A8 R+ t6 H6 ?
  3. * Автор: Zoey767 F7 K' L! c& B  d$ J! }9 U
  4. */
    . d* l: |+ I5 b4 ^" {- e. o
  5. public class QuestManager1 J" D+ ]  r. `, f2 _
  6. {- ?# P* F5 ]9 Y# a! b1 S5 ^
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    1 ?" O2 M0 |. ~7 W& F# x
  8.    
    5 y( @7 @4 C. o
  9.     /** Карта, содержащая все квесты. */
    7 s8 X% t$ t/ B3 l
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    & W7 y  h! X$ K- m5 O
  11.     /** Карта, содержащая все скрипты. */2 J) x- O' [  x: ]) h3 O, K8 [) Z
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();5 d; Q" |. {- }
  13.       ?9 c9 i* k8 R0 O* B: E6 |
  14.     protected QuestManager()
    % }+ \' T: W; i3 _
  15.     {9 O" v2 j6 @# Z
  16.     }7 t1 I+ X2 d! k: Z" `7 C
  17. }
Скопировать код
4. Методы% G; H% g1 W; S  s/ F5 p; ?
Метод reload(String questFolder)
' i7 T, A" z5 j
  1. public boolean reload(String questFolder)) c. o( u; s* p# z: I2 M- m! L
  2. {
    - J3 t: u! [5 I8 X
  3.     final Quest q = getQuest(questFolder);' h% m9 |6 t/ l- l
  4.     if (q == null)
    * y6 g8 W( ]# W* |6 z% I; J- w
  5.     {
    9 J/ S6 r' J. M0 d; g
  6.         return false;
    - c- a4 p+ {% N9 J7 b- A* o) r
  7.     }4 ]7 R6 \9 J; J* @- J5 b5 t9 W9 ]
  8.     return q.reload();
    ! \2 {* `* a9 r" u0 @3 Z9 c
  9. }
Скопировать код
! j. q. f" V3 s8 X: {( o/ A
! ^) u% a1 t* U) U4 B' d  p
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
0 J3 m" e+ a; C* O1 [Метод reload(int questId). I* Z% L, Q) w3 ^. F; O! w& j, L4 ~
/ W" x0 _# t1 }# Y' b- m: ^
  1. /**! d2 `: l- K  q5 B
  2. * Перезагружает квест по ID.
    " t2 l" K! l) Q% O$ S
  3. * @param questId ID квеста для перезагрузки+ p2 u% Z: o- I) |+ c( {: ]; W5 J
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    8 d6 g6 J& j( g( |; K- E0 U
  5. */2 b3 f* r5 }3 T6 D; r, r/ E1 {5 c
  6. public boolean reload(int questId)
    5 f: W9 _6 w% |9 Z) J9 `
  7. {- L, h1 X+ W" |# N& R7 U( K- n* R
  8.     final Quest q = getQuest(questId);
    & D8 B$ k" b! i* r: q( o
  9.     if (q == null)2 D# k( d, `! w
  10.     {+ p4 @$ D8 T0 ^3 }  E
  11.         return false;
    ) v4 O; a- x  u1 P1 f
  12.     }
    9 I$ L6 H- U) t* G" _+ h2 _
  13.     return q.reload();
    + s, w$ j& K% D$ ]3 F7 |
  14. }
Скопировать код

1 v! w- ]# h( b5 ~- y. h( j3 FМетод reloadAllScripts()
, L3 \' @( ~8 |" ]8 o  P: g7 U, a  F+ @4 D2 i7 z9 a4 W
  1. /**
    ; V  ~+ U% D7 H+ H: ^, ?
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    2 D5 t2 g  @- i: @1 _
  3. */
    1 W# |) I. O5 d; Q
  4. public void reloadAllScripts(), z' n% J# r4 R4 F6 t
  5. {4 [* E- f, z8 D. n  T% l* N
  6.     unloadAllScripts();
    0 A' \3 r% {3 t4 p  f$ q1 W0 X8 f
  7.    
    5 o5 O4 r# f5 R* j8 a
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    9 n  P# s: J/ n
  9.     try
    9 M; i1 u0 O9 N' P- @
  10.     {7 V9 g( G* P1 G% j4 b3 \
  11.         ScriptEngineManager.getInstance().executeScriptList();  Q5 Z- D: u+ e8 `& f2 w( m
  12.     }
    ; j. _4 k9 i- }' H
  13.     catch (Exception e)$ [" Y' i. D, Q; x5 \; i9 Z  v
  14.     {
      k: K5 Q, Z2 }1 T- w. Z) \; c% W2 F
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);% M' m) H0 {; V; |  u: K
  16.     }2 `3 A+ `6 g3 U! G. x
  17.     / Q1 g# B' ~! F5 `; E# s7 C
  18.     getInstance().report();0 q6 c/ H$ r" i; I9 e$ [
  19. }
Скопировать код
Метод unloadAllScripts()/ e. `" S5 c9 F; q+ Q* y

# p' {% o' d& ~0 z* Q2 `, M
  1. /**- {1 }* |* f1 d1 a1 z& D
  2. * Выгружает все квесты и скрипты.
    1 D0 K9 \; V) z2 O+ n- Z
  3. */, u  X6 h: ^6 E/ ?3 k. K
  4. public void unloadAllScripts()# O  s- b  r9 @  L
  5. {! O+ R& e6 ^4 K3 q! z
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");$ |6 d3 O6 E! g  f- y  j
  7.     $ G# g- N* [0 a( l0 @
  8.     // Выгрузка квестов.6 N0 J6 G: j$ ~
  9.     for (Quest quest : _quests.values())
    - v" Q3 `2 q' @% |
  10.     {
    & ]1 J  Q& p( A
  11.         if (quest != null): A; r4 \9 h- S/ Y. }+ l
  12.         {
    - p4 G/ T+ U: m+ O
  13.             quest.unload(false);
    4 P+ d% B+ X9 F* R, B6 J4 ~7 T
  14.         }
    6 K& u) t3 G; m" V
  15.     }6 ~' U" Q! H5 b( m# t# X2 m# M, q
  16.     _quests.clear();6 M4 i% S+ U$ V4 w/ X$ A
  17.     // Выгрузка скриптов.! g. r" }# Y# J4 N
  18.     for (Quest script : _scripts.values())3 V' K% S) b( `0 P/ [' h/ Q
  19.     {3 Q8 i% k1 f/ k6 O" q( n
  20.         if (script != null)
    ! C# i7 N3 ~+ s6 u0 y
  21.         {
    ( l- _8 q# W& T7 f; R  l" `) y/ c
  22.             script.unload(false);4 T8 a4 y- ~- i* r' P( m
  23.         }. ]1 h% m; `, d. R! W0 I0 _
  24.     }
    2 P$ g% c, e/ o% [# g
  25.     _scripts.clear();8 _# U& K/ U! l
  26. }
Скопировать код
( A: y; s4 d5 H3 h
Метод report()
+ S" M/ @4 `& {4 o% W
3 S8 v5 d, K% S+ d4 P  C2 b+ x
  1. /**1 b( i  H  j6 Y3 \
  2. * Логирует количество загруженных квестов и скриптов.
    8 s; k: h% A: l5 d9 w
  3. */- }3 l% e, r8 U4 z' O. I. b5 p) b
  4. public void report()
    + n- _* L, w$ \) f% l# x1 R5 I  m
  5. {0 b2 S  D" F$ `  G
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    1 V) w) d# ]* T
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    & R' n9 Q# k# l) O: x
  8. }
Скопировать код
! {. t) C  g! Y' [: S5 {& I) I
Метод getQuest(String name)) M, `1 G: }6 Q1 C0 i

5 A+ S# j4 r) P' u: {, _# X
  1. /*** h- K( U" Q9 I+ ^9 p# D
  2. * Получает квест по имени.
    2 ~  f) G5 x7 o) L
  3. * @param name имя квеста! z3 H1 t$ O" X3 f
  4. * @return квест
    ' m2 J4 ?% S' X/ Q/ G
  5. */( T: {& W# p( r9 \9 b7 f
  6. public Quest getQuest(String name)
    5 C/ e+ L' J' c+ ]) |
  7. {+ R7 c& c+ k8 I, O4 D- ^, Q
  8.     if (_quests.containsKey(name))
    5 o7 y* [" h. B7 U$ r* `
  9.     {
    1 t5 g/ U& X2 U( X. S$ v- N
  10.         return _quests.get(name);! z$ G6 H. x" `! }+ u) b  v
  11.     }& `' @4 p. ]6 J0 c2 _& o
  12.     return _scripts.get(name);9 M6 ]( H- h1 k, z3 j
  13. }
Скопировать код

% }0 X% f9 U  h; \+ A1 FМетод getQuest(int questId). d! U; N$ @; }4 @0 S- G% r3 }; W

  T5 K' Y) J4 X- k. x, N
  1. /**0 p) R6 T7 C4 {7 r) s
  2. * Получает квест по ID.& P3 ~% n5 p4 h. t% h8 q. A0 Y
  3. * @param questId ID квеста
    ; X2 b* h4 ]# F. `
  4. * @return квест, если найден, {@code null} в противном случае2 t1 @; H% _0 H. ?
  5. */
    9 |$ z! @$ u# R% P
  6. public Quest getQuest(int questId)
    . M4 v' V, P8 c6 C, F2 G! d
  7. {
    0 {" U; D- ~, Y* {; s! r+ [
  8.     for (Quest q : _quests.values())2 G# \0 j( r( ]' f8 i
  9.     {
    4 f4 g9 O+ ^! d5 n5 u2 \
  10.         if (q.getId() == questId)
    / @9 u3 c' h& `2 [. W. o
  11.         {
    5 y! s; J! e) H; M; ], r: c
  12.             return q;2 W- U+ b% y8 L5 X
  13.         }3 H6 k4 n# o* Z6 j% x
  14.     }% u3 r8 z+ i' Y0 j( C! z" {
  15.     return null;! V* ], X0 l) B: [
  16. }
Скопировать код

5 g% h/ f4 b$ n+ ?; dМетод addQuest(Quest quest)5 R. Z2 h$ w2 I0 c
/ X' s0 _- m5 U# [+ [- }  X/ z
  1. /**2 {0 Q6 R7 s9 y' _
  2. * Добавляет новый квест.
    3 Q& H9 p8 t/ R5 F: w% P7 s) C
  3. * @param quest квест для добавления2 \' [" z" Y1 }- K3 m
  4. */( X3 ~+ A' J/ B2 l
  5. public void addQuest(Quest quest)
    ) @8 ~2 m$ n7 |/ }8 y2 w
  6. {
    # m+ u1 @2 P" E* ^4 s
  7.     if (quest == null)
    * r) H5 S) `5 Z2 }* G5 G- G/ C4 n
  8.     {9 [1 m% i) o1 R; \& G7 X$ v0 G$ c4 I
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    - T0 V+ r; o  f) ]  _, d0 L/ j
  10.     }
    / w0 s# W/ e  S! c, s! H2 P" c' p
  11.    
    % X3 q) v* F  w2 ]
  12.     final Quest old = _quests.put(quest.getName(), quest);) S- j% w9 q  }
  13.     if (old != null)
    , |$ k7 w5 ?8 Q# X, |. ^
  14.     {  y# V" |, F, b/ F& O& X/ r
  15.         old.unload();/ D  c& Z- \7 O/ Q' A$ o+ ~* {4 ^
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");9 G7 y5 h0 w' _& {
  17.     }
    5 `, g4 g! c! G' t2 e9 f
  18.    
    & I& F5 c5 @. f! y5 T. g
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    ) }5 a. M! ~4 j2 y
  20.     {
    ' }% o- [5 y) {4 N
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    ( p6 o* c  c3 W/ I# B" }
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");7 ^! _$ F8 x3 W- O0 \
  23.     }
    ; ]! W2 R; b# u
  24. }
    , E4 p" V9 _& a4 n1 v
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.' u: P) Q2 X: _# Q" O
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
3 Y9 a& Q  L  F2 X4 j" y# r* e; x0 p$ k/ S5 M8 g! B: X6 ~/ F( U. d
# ?5 Z" c. {$ r

, a' e! z3 P. z; z# V4 k2 V




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