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

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

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius
6 T# o; z! L2 }* B# D9 a8 ?; s3 n# D7 B8 B
Разбор файла QuestManager.java
& ~" h/ T9 k  J) U; O9 A: [' `9 X
; ~3 t7 N8 H- `: B2 G) M8 \Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.7 r  |2 d$ [- ]2 W: ]* D
Основные элементы! ?, `; I5 }0 U

/ T" g5 D! E5 j5 G4 `QuestManager.java — управление квестами и скриптами.
3 o/ y- u2 F* Z) x: y% H$ CПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\9 R. B6 }7 n4 M! e# t4 @
- _6 J7 f" k0 u* b$ H/ y8 z( X

; I" W" H; s# cДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов., f$ X% S2 B; V7 w
1. Лицензионное соглашение
+ N2 \8 S% N& @& w# i) ?
  1. /*. F- U* d- w* x8 K4 C
  2. * Этот файл является частью проекта L2J Mobius.$ H' M& i- D) \1 N
  3. * : z+ k: M$ a3 N. }' c5 e
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять( e' H1 z# i5 ]2 B8 s1 r6 }
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    9 |: ]5 _% Y; ]% v' u8 G
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    0 S: H) m0 j4 a$ k8 s- s0 b( u
  7. *
    0 {  V4 x$ P* z& h
  8. * Эта программа распространяется в надежде, что она будет полезной,
    ' ?! B/ {0 @5 }. Z. C7 n9 }; E
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    5 W1 c: m/ o5 G
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ." h* P2 G5 C$ u# M0 l* U
  11. * См. GNU General Public License для получения более подробной информации.7 w, [$ u4 i# ^/ w* X+ w' H
  12. *
    & i% n7 D# [4 r- s6 f# \& r, [
  13. * Вы должны были получить копию GNU General Public License( @% o" i9 O" d1 V- \# o1 h
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.1 @$ ?0 y+ x8 T4 Y" @" @+ p6 \
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.5 D  n  V0 t! Z
+ g  [# E; P3 _5 u1 u
- }# z1 e2 h5 m7 b5 ]
2. Импортируемые библиотеки
8 S1 w% R; {$ z* l- G2 I" o: [' ^: C7 [/ y2 E5 v, w, m* J/ H
  1. package org.l2jmobius.gameserver.instancemanager;" `1 c! i# b* |
  2. + I1 J& V+ V" M( Z8 c
  3. import java.util.Map;
    / j" D! X1 J) z) C7 |" |0 l- {
  4. import java.util.concurrent.ConcurrentHashMap;
    ! g( M9 D- x# z9 Y5 e* q
  5. import java.util.logging.Level;* x) N* F; H9 Z! e
  6. import java.util.logging.Logger;# r5 \0 C1 c. n( ]. F

  7. * W! T1 A( t+ ]+ X& n
  8. import org.l2jmobius.Config;
    ' A8 V5 z! I$ z
  9. import org.l2jmobius.commons.util.CommonUtil;
    5 `/ ^: {% ?+ y
  10. import org.l2jmobius.gameserver.model.quest.Quest;0 i7 K/ r* L7 s# {
  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 — менеджер для работы с игровыми скриптами.8 a" X$ [! y8 J2 M  A

* V( [. }( k6 U* ~7 i! B3. Описание класса QuestManager3 \/ V& s8 M; E! V
  1. /**, i* Q2 f# e  m% O# T& w
  2. * Менеджер квестов и скриптов.
    ) h$ x6 [, c+ w" [  p
  3. * Автор: Zoey76/ h; C! [2 _0 H1 y) W" q
  4. */8 o4 R7 q* Q( q5 C
  5. public class QuestManager
    ; X" g# i$ E. c9 x* t; V
  6. {# i  e* V: l3 r2 s& b  Y
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    $ f# v5 [3 w- }; h# E$ f% g- q
  8.    
    ( R3 |* j- z0 ^6 I2 ~- J% V. `
  9.     /** Карта, содержащая все квесты. */
    / Q3 [& r1 r; t
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    $ P1 S/ i% d# i, B/ C2 R+ t
  11.     /** Карта, содержащая все скрипты. */# H; d, Y* `# [3 t5 P, K
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    6 v. L$ S! X, C6 q2 |! u
  13.     # O# ~  R  w* K
  14.     protected QuestManager(); I0 A' }; h. q; @
  15.     {
    5 K& n6 L( Z9 {
  16.     }; @6 }7 P# D, R" u  S
  17. }
Скопировать код
4. Методы
- @) p7 I% y2 G3 Q- B! RМетод reload(String questFolder)2 ^5 h3 l0 Y% _. R
  1. public boolean reload(String questFolder)/ N5 p) Z/ m- d2 u
  2. {# f8 Y+ W- i, b# e1 |
  3.     final Quest q = getQuest(questFolder);( U) G; Z, `5 s
  4.     if (q == null)
    + A! N1 [% L6 Q" O
  5.     {
    3 d. E4 R( S; W# x9 b
  6.         return false;& M3 u( I" d1 U0 c
  7.     }7 ~0 L$ I6 n  a. y- F
  8.     return q.reload();
    5 }, l8 q& s) j) N7 X
  9. }
Скопировать код

  x. ~4 E- x0 x/ c8 ^) q% C% N1 b/ ~7 Q+ x: U3 h9 l( u
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
0 U5 @& |6 O6 ~/ e7 r; IМетод reload(int questId)
0 Q( M9 ?/ D# v2 q  e! f) m- H# K
1 q- A4 _8 }$ w8 _# t% C
  1. /**
    ) I9 ?0 h* X0 B. M2 l+ ?6 g3 p
  2. * Перезагружает квест по ID.
    0 `) a. O- [: H" y, D- r& r
  3. * @param questId ID квеста для перезагрузки' D5 R9 @6 B# G1 J6 R, Q7 j
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае$ n) ]" n* R0 E/ w8 @
  5. */$ E; a& |: H9 P# p: s0 U3 m
  6. public boolean reload(int questId)
    8 e% t; q9 U" b7 i  S
  7. {9 T  [9 R( C. L7 }9 ^0 W' M
  8.     final Quest q = getQuest(questId);2 ?' P4 ?& c% b
  9.     if (q == null)
    ( R0 ^' p# Y, I
  10.     {
    , Y7 p) y( n8 c/ Z- V  g$ @
  11.         return false;
    2 N  {* `& ?2 c" W4 c8 R
  12.     }
    ; b0 Q- I% T, O: I" V
  13.     return q.reload();
    & n" k  N- e% C& ~9 H* y4 J* r
  14. }
Скопировать код
$ e% C5 a8 r+ Z5 s
Метод reloadAllScripts()3 b  R) L4 \9 `$ g( d# a4 h

( }- `5 M, S% }' ]/ B5 L7 m
  1. /**
    ' b# w; I  n5 D7 \1 A
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    ! }) e* _& a# c1 f
  3. */
    " a# f7 Z6 l( u% d: `: X
  4. public void reloadAllScripts()$ d3 Z- y" g6 h' W* X. I' R
  5. {
    1 Q9 E- m& e( D& _" i( B
  6.     unloadAllScripts();
    $ E: r* o" Z, O6 j/ q, l" G/ L
  7.     + Z/ g9 C+ d0 t1 w
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    / J6 V! I0 G5 K$ P" ]6 L
  9.     try( v, A* u; t/ U) s7 a
  10.     {
    : d* R. b* E0 `* M" i1 U
  11.         ScriptEngineManager.getInstance().executeScriptList();& x7 P; w+ C+ Q$ ~# g* V5 z
  12.     }. r8 t+ L6 c4 P7 ~- o9 w
  13.     catch (Exception e)
    # V" Z! ?- _( \
  14.     {" K) W. I) K0 P4 q& C
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    + I' G. U9 H; U3 r
  16.     }
    ! V, \2 y! }: `# P
  17.    
    + a9 n5 w9 n! m3 Y  G3 \. J& |
  18.     getInstance().report();3 z" }/ J' A$ A& O5 D. J" H/ D% C
  19. }
Скопировать код
Метод unloadAllScripts()8 u- `/ x2 j# N& l; b. x
0 c+ G( }- F- R
  1. /**
    2 Y7 T; e" t/ N% g  Z
  2. * Выгружает все квесты и скрипты.& k& Z/ e) j9 p4 p( Z
  3. */
    ' z& o0 L0 S3 a9 i6 o3 X
  4. public void unloadAllScripts()( _  P/ h/ J3 P  z5 X
  5. {8 L. ]( L. ~* ^- ]( T4 C8 V
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    3 z5 s; q7 O) ~  C$ [5 ]
  7.    
    ( ^8 {. V8 v) a) K7 R+ }' j4 _) l2 I
  8.     // Выгрузка квестов.& p8 g1 G: D) i/ E. A' i
  9.     for (Quest quest : _quests.values())
    # H5 ^2 O; Q9 ~
  10.     {3 r. n$ b# t2 G+ d( p
  11.         if (quest != null)
    . [; o0 q7 V6 M: [* G
  12.         {9 b9 {; F9 k. w
  13.             quest.unload(false);
    6 Z! y5 f3 t9 x, _
  14.         }
    6 {+ F4 d, l' l, H7 t* M2 X, x. F
  15.     }/ [% ]* L. U$ n+ U% ?$ }
  16.     _quests.clear();
    / \. E$ y! o# C
  17.     // Выгрузка скриптов.& N& }1 M! r+ [: {1 \
  18.     for (Quest script : _scripts.values())% i& b) w! I& D( e
  19.     {
    3 ~3 ~' O: b. U$ V
  20.         if (script != null)8 U' E# x6 U; k8 H& L+ x
  21.         {% M, p) Q/ _7 s1 Y& N
  22.             script.unload(false);
    ( A6 @' B9 m7 r( I$ M" Z* H; Y
  23.         }' P0 x6 |2 d9 t$ a1 f5 t
  24.     }
    & b; H/ h! k' B8 \
  25.     _scripts.clear();
    . {& t+ F$ Z7 J: J- b' P
  26. }
Скопировать код
3 _; b* K5 n; A* h; M1 i
Метод report()
' D" e% s. j* X: D$ Y/ x; H9 c% y" p
  1. /**$ ~; g' i1 y  }" N
  2. * Логирует количество загруженных квестов и скриптов.3 a& R" V& p: S
  3. */; W% p. I! i% m$ w
  4. public void report()
    9 S% X% S8 c: V& T3 c! {; G
  5. {
    3 ]8 I- U& S  t0 I4 p
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");, M0 o7 q6 G) U) ^: p+ Y! q" T
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");- p: L- r5 o, s+ C3 t. n
  8. }
Скопировать код

& t) N+ L+ s0 M- |) ?8 l5 X9 oМетод getQuest(String name)
. h! [' v# ~2 R0 U; H: H
$ F" L7 m& f7 ?7 ]) S" K% S3 a
  1. /**
    : i- a" I% g3 A# C
  2. * Получает квест по имени.# I$ I' \& O/ s/ F
  3. * @param name имя квеста# X0 Y) a2 f+ y, w7 _, f' N3 Q
  4. * @return квест
    % |- v, Y3 O3 q' R8 V3 N
  5. */3 @. n& g. F  O* b2 a0 h
  6. public Quest getQuest(String name)! T' m- t' x) ~6 ^& p" Q+ f% \" [
  7. {, |% m% R1 i/ F  a/ r
  8.     if (_quests.containsKey(name)): g5 T$ \5 k! ]' I/ J: ]
  9.     {
    2 \! V) q, V9 I, b2 F2 j
  10.         return _quests.get(name);
    . S) ?3 j" \* r2 [
  11.     }2 s  T5 k6 {9 O! C( \
  12.     return _scripts.get(name);0 l: [( P( _( d$ e0 u( o8 l3 j
  13. }
Скопировать код

- F" k2 v. L6 n5 {5 e/ j5 ZМетод getQuest(int questId)
: h/ v* S% S+ \6 @
& I* @+ E4 T/ n! X  g. j
  1. /**; u" O- q1 t4 L1 y5 r+ u0 Z+ r, ]
  2. * Получает квест по ID.
    8 f) a9 [; r- E
  3. * @param questId ID квеста
    + V$ r6 N. t4 T4 i5 O0 X
  4. * @return квест, если найден, {@code null} в противном случае+ I& M& m* J: X- W3 C% Z
  5. */1 J& }8 [& W5 K( X6 q/ Q6 t
  6. public Quest getQuest(int questId)
    2 A1 r- Y' x* x
  7. {
    + @, s+ G5 r- _* |; u5 D2 {4 ?; F
  8.     for (Quest q : _quests.values())! |5 S* W/ v7 u+ f% p: |* U
  9.     {' }$ y- Q7 S) i4 r5 X
  10.         if (q.getId() == questId)
    $ d  v: }7 e& m# E4 D
  11.         {9 F; X( Y- {* S  N1 i& N
  12.             return q;% ^: x- Z  Q$ X) l2 `0 e" V
  13.         }$ \4 T9 U1 t8 D2 C+ B0 `
  14.     }
    / i( R$ {1 }/ W) T. _
  15.     return null;
    , t; o3 M5 _1 u) s
  16. }
Скопировать код
' F8 Y0 I7 ^3 `  S. K6 @
Метод addQuest(Quest quest)
5 j4 [/ e9 v+ b2 c1 b/ N! }  U* W! X) C
  1. /**
    7 V7 B2 {+ _) z
  2. * Добавляет новый квест.
    - D- c  X8 }0 S) [1 H# }  L! W
  3. * @param quest квест для добавления1 A- x6 F: j% ]! J
  4. */( `7 Z+ Y* r3 k5 v
  5. public void addQuest(Quest quest)
    4 u! w. G$ H3 E: V" T
  6. {4 I5 l0 s" V1 y- G
  7.     if (quest == null)& ~! Q( c5 ?0 v  g9 t8 f6 p
  8.     {
    $ q5 T2 D7 Z" f' S0 j
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");0 t7 D: W0 N5 ]8 q. `" Z2 D
  10.     }
    - i1 u0 J4 _- Y7 W) S
  11.    
    , t  u* m& l; y- D0 x8 E8 t& g$ b
  12.     final Quest old = _quests.put(quest.getName(), quest);
    , ~* D( T0 Z9 [
  13.     if (old != null)2 m3 s, _& G8 H0 z
  14.     {' h* P/ q7 N/ [% U1 w. V
  15.         old.unload();# o' N/ b; k" O8 L
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    / E/ V1 C# |( z( f; e9 |  P! c# d
  17.     }( @* E, y8 L, ~/ v1 i
  18.     $ t! h: M3 v6 z- p4 W; |
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    7 A2 _4 n3 H0 h, W
  20.     {
    2 E+ A0 Y! n) o/ N4 t
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();/ m) X8 A9 P( H2 G- \4 ~
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");+ C9 z) A% f. z* p% t$ v
  23.     }
    3 V# X2 v) K' f2 ^$ C) I/ q
  24. }$ w& F8 ^1 w+ N# S) ]
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
( l( Z6 Z; C' G( @* g4 w# |/ WЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
! c* E$ ^3 Z1 {& B5 j; u/ N
# t8 I' }) H6 O+ G) ]( c
% T8 X8 G+ H/ Y' M
2 z8 X/ X8 A, G  E; C




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