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

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

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius; D0 x; n! ?2 j4 k; L5 v
- w" r  f* H# N- F6 ~
Разбор файла QuestManager.java7 p4 ]& ]# @; b+ w/ @+ `
1 h0 ?5 W& o# ^
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
0 _* G0 e6 W4 n! cОсновные элементы
. k: B& d. M. `* T
9 Y2 x( S, S( z3 L% \/ mQuestManager.java — управление квестами и скриптами.
" ]8 T0 q+ q, x0 @/ h$ f8 HПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
! N/ @1 E, S! d5 F; V# `5 o7 F: g
; m* v7 w0 L7 @0 {

& j5 C6 O7 y, R4 ^, dДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.' ?+ Q% P, |5 D, V8 |
1. Лицензионное соглашение
2 \7 I& y/ O% c0 N7 _
  1. /*3 H: @9 Q6 U# l6 \/ V
  2. * Этот файл является частью проекта L2J Mobius.% [; `2 e; x& T6 S* R& s
  3. *
    6 g  A* t: O7 S7 @) p
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    : P; U' s1 U, q/ @" l3 M8 l* c
  5. * её в соответствии с условиями GNU General Public License, опубликованной* _: a0 [/ m- W# X! p, S
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    * L( k  s4 w6 i
  7. *
    0 b$ S5 P  k% H& E5 j
  8. * Эта программа распространяется в надежде, что она будет полезной,* b4 }! Z8 @, q/ l% |# D; m
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    5 x) H6 _, Z6 e) k9 r0 I9 W
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.* X4 E* u4 I" E8 L# D+ u' W+ y
  11. * См. GNU General Public License для получения более подробной информации.1 d7 L; U0 c3 b5 {
  12. * 2 z( y9 S7 `' N; T" h  i8 b1 Z
  13. * Вы должны были получить копию GNU General Public License
    4 G# I0 x/ G8 s
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.2 r4 |* }6 X+ d, }! B$ L
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.  a6 `8 z; p' w. \( {

9 B) z; g) l: y. Y# d2 [5 o1 i
8 k0 i  s/ y# M3 v2. Импортируемые библиотеки
: k# q) S6 v5 |+ E
3 f* d" Q& p! y! Y/ B
  1. package org.l2jmobius.gameserver.instancemanager;) X, h  N( `4 v. ^8 i4 y6 \3 {: W

  2. 2 _9 S8 Z# |) d( p& e
  3. import java.util.Map;
    ' p. K9 y7 J! p
  4. import java.util.concurrent.ConcurrentHashMap;8 U& f9 i+ B6 |, @" Y- ]  x  H2 C
  5. import java.util.logging.Level;
    % l) Z& e9 O1 n* d( r) c
  6. import java.util.logging.Logger;4 r. m/ q7 h7 a. {3 G2 N

  7. 9 X9 |" A( V, p  e5 s
  8. import org.l2jmobius.Config;, \* O- \# A- H& k' s4 }4 X
  9. import org.l2jmobius.commons.util.CommonUtil;
    9 g+ d  ~4 |# e
  10. import org.l2jmobius.gameserver.model.quest.Quest;: J/ S( f2 o6 d% `8 W* r
  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 — менеджер для работы с игровыми скриптами.5 D& F$ r  k1 V  ^, Q) u

. y! f2 [" m) t6 S; _* D0 f3. Описание класса QuestManager
: Y( h- P( M: o: C0 p
  1. /**' W. L& E3 }5 y: x  z
  2. * Менеджер квестов и скриптов.# d0 R! T+ T0 V9 T: A9 V
  3. * Автор: Zoey76
    + T$ x9 K# ?& ~- D3 t- ~: A% v9 H
  4. */# L* ]7 P" j0 z
  5. public class QuestManager. D) n5 q( z  ?4 D, f, F6 S5 c' ^
  6. {
    ) d& D3 I) U! z# {. S* p
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    ( E' f7 O* _& |5 S' S4 _/ }$ V% f
  8.    
    : T3 D; q4 |6 y0 R) ~' K3 |% I; \
  9.     /** Карта, содержащая все квесты. */# W( R& @" x1 l
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    " i& L' [6 M* W; O
  11.     /** Карта, содержащая все скрипты. */% B, l- E8 R" c! S
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();' `# C) `' k1 M2 Y0 l% P0 v
  13.    
    . l( ?6 T: L& Q- L" I
  14.     protected QuestManager()( y- C' N$ c. r) M  H( F! A$ e$ @
  15.     {
      C8 c# k* {) [
  16.     }
    + `# J& W8 c9 q9 z
  17. }
Скопировать код
4. Методы, x; g  Q& X9 [
Метод reload(String questFolder): ?% D6 _! o6 {) k4 D! j; y: Y
  1. public boolean reload(String questFolder)6 A% n. W1 g2 @- B8 G$ q9 F
  2. {) {( t# `! M0 s
  3.     final Quest q = getQuest(questFolder);
    6 \4 J3 [% Q) [" V
  4.     if (q == null)) D3 d" Z+ }8 Q; ^( I* F5 ]: c& v
  5.     {% E8 q- L+ j8 h# ~# |" `
  6.         return false;
    3 n+ G" A- w# K6 Y/ R0 N/ d" c. l% s! B
  7.     }& E% v! _/ i9 d$ l8 v; ^
  8.     return q.reload();1 d# c1 g5 I: _3 H. _5 ^
  9. }
Скопировать код

/ |1 B0 C) D  P1 E1 i4 ?
  D9 D' L6 f5 c4 XМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.6 d# G$ z1 f5 C) q, I$ j
Метод reload(int questId)3 n2 s) S* b! N$ g# Z& M5 O
. B& Q! v: H7 p& |
  1. /**2 ?+ k, p1 ^) Q& f/ T
  2. * Перезагружает квест по ID.& r3 Z9 V2 |7 W
  3. * @param questId ID квеста для перезагрузки+ X. F8 U; h" _' |' O% D6 P7 ~
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае- b* w& {4 M% T/ F5 ~: q; m; H
  5. */
    0 O/ E1 [$ r! P/ Z
  6. public boolean reload(int questId)# G" k/ ~3 H/ E0 H
  7. {
    , K) Y+ }8 _" K+ P  k* H
  8.     final Quest q = getQuest(questId);2 I; S" O& A) v# [
  9.     if (q == null)7 t/ m) f/ O' i' }4 u' R* Q. _
  10.     {
    3 m2 W, s% n4 T3 ?# L$ u
  11.         return false;
    2 w1 V( |- O4 H6 b; B, v. c
  12.     }
    & V+ \' D: z$ g( P' X
  13.     return q.reload();6 F3 k( G5 f5 K) k
  14. }
Скопировать код

4 t/ k) e% v2 z  @- ?! VМетод reloadAllScripts(). A- o6 l1 V4 Z0 j& |8 K
0 E# J7 u! ]! `) _4 [+ L2 X
  1. /**  C' |& v/ ~( c2 l
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.& g2 d$ t, C9 V7 f( G7 E
  3. */0 s) q& A4 L3 H  [
  4. public void reloadAllScripts()
    2 t2 j/ ^; d, n. n' N
  5. {8 e7 y+ Y( y5 _6 e$ Q
  6.     unloadAllScripts();3 o. u) Z. x% I0 j7 g
  7.     : F4 _5 D! n- R: a0 i, T- W
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    / W! x+ d. ]$ G; [/ M7 x! g
  9.     try
    % D- L$ _8 G; g( d
  10.     {! ~$ S5 ]2 E, ^1 ~
  11.         ScriptEngineManager.getInstance().executeScriptList();
    ( c) J; b% x2 q/ u4 E1 h
  12.     }
    3 P0 L3 x7 @4 n$ q5 F. k
  13.     catch (Exception e)% H3 N& c4 o9 l+ S6 ^  l- q
  14.     {/ k, P: D$ d6 o
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);% ]. I, j+ M1 ^( N2 H# }
  16.     }
    " b6 G+ Z# G2 v! h
  17.    
    ( [( g2 i( L! |3 W3 V7 ?( l6 Y+ K
  18.     getInstance().report();/ q. f/ P8 }# p  ~- h
  19. }
Скопировать код
Метод unloadAllScripts()6 G3 N) k  I" v5 K: ]8 _5 @) [) F2 q0 i

6 j. S, }4 \0 p* M/ ?( b# Z
  1. /**& i6 V" F  L2 Q& F8 B# g5 \
  2. * Выгружает все квесты и скрипты.
    ( b5 j* E0 R! W4 w2 ^2 P  f
  3. */! F5 p6 E2 s; u: j3 N4 _
  4. public void unloadAllScripts()
    * V: U4 n  K' [- O4 u
  5. {: k7 ?% B/ x1 A: S+ \9 K! d- Z" i
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");0 C6 `7 @$ {/ G; a
  7.    
    * u( t8 e9 n1 x. `1 T
  8.     // Выгрузка квестов.
    * x' O3 y& [) d6 Q/ l9 `; L
  9.     for (Quest quest : _quests.values())
    : I( H' u6 A* {1 U" m
  10.     {, ]: \0 e, c8 G; N% U  ?3 L( \
  11.         if (quest != null)9 s' F. b  \9 Y- P
  12.         {
    6 v/ ^, w; S& A. V4 m6 A9 {
  13.             quest.unload(false);1 Y5 t: c" @) z
  14.         }9 b( c, e* g' X8 y0 N! M* f7 o
  15.     }: Q) }- r7 v7 [) ~# ]
  16.     _quests.clear();$ I" G+ A: }* d) Z! S8 Z; _4 \: [9 z
  17.     // Выгрузка скриптов.
    1 |. q6 X+ J3 o4 p
  18.     for (Quest script : _scripts.values())5 e5 Q! c& T2 y, Z% j
  19.     {- J+ l' q: G1 c( n- ?
  20.         if (script != null)! W% M8 f  O) g% i) e, a2 W
  21.         {
    2 ^7 g: }2 B$ ]$ y% l8 {3 g  @8 f
  22.             script.unload(false);
      _; O# m4 y! |
  23.         }
    6 D8 g8 Y* K2 [  O
  24.     }! l0 W/ L- d) e" s5 D; R1 C
  25.     _scripts.clear();
    ) ~9 A# ~: t& M/ |
  26. }
Скопировать код

0 y4 Z. \3 z6 b* e0 n( U$ J. ]% w* aМетод report()% [* X/ V: A2 p4 p
! u  t8 ]% B/ d$ h
  1. /**
    & r+ N( b. o; M$ l# l6 S
  2. * Логирует количество загруженных квестов и скриптов.
    $ V" k! ^" J, ]8 i8 ^  V
  3. */, t( Q4 J+ e0 ~% I% G
  4. public void report()
    2 _0 u7 x  E: c$ `7 V8 X% j' ?
  5. {
    6 Y* K; \# a  Q& Q( M
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    1 w! B$ {" b* x: |0 d/ n* }: p
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");8 V: [" d8 x& ]
  8. }
Скопировать код

. r% Q) x% N. Q; PМетод getQuest(String name)1 i4 M7 y5 H( S, i5 T
% b0 P8 l+ j& [2 T0 M& w5 Z1 |
  1. /**
    , ?0 n6 L  c1 f6 W  M+ O" b* F
  2. * Получает квест по имени.
    6 _7 C. L6 z# w3 P. S
  3. * @param name имя квеста
    # w  y. Z: a6 E5 F
  4. * @return квест
    & p6 G" |6 L/ w! @% D
  5. */) S  e! Y: e8 t3 Z; Z
  6. public Quest getQuest(String name)
    ' o6 `) K, x& V, C  y
  7. {
    ; Y- n) L% z" H' h6 O
  8.     if (_quests.containsKey(name))  w" x$ E# F$ ~3 x) ?7 h- @
  9.     {
    6 S7 m: Z. e* e4 Q5 {, a1 Z/ O- e' A
  10.         return _quests.get(name);8 I- }. R0 Z$ _
  11.     }
    % r, \0 F3 h& n
  12.     return _scripts.get(name);
    2 Y8 p' @6 w/ @
  13. }
Скопировать код
: B4 I6 @! d1 P1 I9 Z
Метод getQuest(int questId)/ U. h- f" N# j. H* b! K

; T: C8 j4 o2 _* |
  1. /**  q! L2 M- G$ K0 i
  2. * Получает квест по ID.
    ) u( n3 A5 J7 w
  3. * @param questId ID квеста
    ; m% M+ |% B) d  a
  4. * @return квест, если найден, {@code null} в противном случае; Y3 M* }' F8 Z3 ?
  5. */
    3 k( H0 U. M, e
  6. public Quest getQuest(int questId); b# M+ n! Z$ W/ R+ U
  7. {" v0 p& t8 Z: a8 E7 p) |
  8.     for (Quest q : _quests.values())3 G' U4 s: W' o8 K
  9.     {
    ' L* m; o1 \+ E8 K
  10.         if (q.getId() == questId); q0 V8 [% Y; t$ v7 A: ~
  11.         {
    & q( f- @( _: o, k$ ?- U, t
  12.             return q;
    * c+ k; o+ W8 Z2 Z/ Q
  13.         }
    $ P: ]/ ^8 @  {. @4 L& T& Y6 {- V7 x
  14.     }2 ]- Z1 Q8 |" p4 `5 C
  15.     return null;+ Q; p1 P5 L% O1 X9 G
  16. }
Скопировать код

5 d3 u" N1 A7 ]: Y* |) \Метод addQuest(Quest quest)
' d7 Z( e! m, v& H$ Z9 ^- B% B( p* m  I1 Z6 y9 q) D( o
  1. /**4 ]/ y- P  T7 D  ^1 g/ y$ f9 r
  2. * Добавляет новый квест.% L" K  D; a  g7 I- R% z$ R
  3. * @param quest квест для добавления
    * N/ ?7 R% I, s! `$ c$ \
  4. */) h2 s' T+ _4 b: l0 L) h& W0 k
  5. public void addQuest(Quest quest)
    0 ^) C5 V+ k6 R; L6 @
  6. {
    ' X: ~9 y# W# J, v% o
  7.     if (quest == null)1 u$ t, j2 m& t) z; ~
  8.     {
    , X: X; W) o0 }( V& o$ Y, w
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");* T+ _0 d8 ?, w" [5 I
  10.     }
    / O; P- F) ]7 O5 B8 `; q  c/ `
  11.     " ^& Q, I+ F3 o( x2 z2 ]3 ~1 s
  12.     final Quest old = _quests.put(quest.getName(), quest);
    9 z. P# v/ X- p! M# D# K
  13.     if (old != null)
    0 l, ?% X/ L" @6 a4 _5 c$ K
  14.     {' }6 }- p- ~, K( D0 U  g1 V
  15.         old.unload();8 D; T2 g5 d6 ^2 ~& T8 L7 T) R; X
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    & u0 {% q( g1 l7 q8 q0 q9 N
  17.     }
    ! H- w  o' J: V# ~1 k0 R9 \4 Q
  18.     ( B0 \. C0 o- Q2 h$ }2 u- I
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)8 D& H  o& M8 q/ x( [: v
  20.     {
    ; |- O$ H- w1 Q7 I
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();3 T! n0 D' z0 f
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");( G- r# ?$ B) Q! j
  23.     }
    ( g' j. [% m2 j0 n: L
  24. }
      s& d" q. R* l  _" ]
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
# p8 S5 o3 c8 M5 K5 r4 R6 [ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.) c6 B- |6 T3 {8 \. B
! w- ~2 j& t- n! c- ?! x# W( _

" j2 f+ V0 D; @+ e/ w" U) M  Y) A* C7 f, m- o, m





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