Top.Mail.Ru

[Руководство по Java для L2J] Гайд по основным Java-файлам ядра сервер L2J_Mobius

[Скопировать ссылку]
admin Опубликовано 2024-9-21 10:39:29 | Показать все сообщения |Режим чтения Распечатать Назад Вперед

Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!

Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
, G9 w( j5 m" ~  K* [% {# V- C) I6 S- z# N) H( W0 X
Разбор файла QuestManager.java. h! O7 t4 u6 f( G0 A0 ?
8 y1 e( t$ r3 [! m9 E4 x7 |* J
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.# m8 \) a. _, @7 R* Y+ \& R5 B
Основные элементы! a9 [# h0 J% u6 U7 K) I
  • Лицензия1 a7 @2 N( g! ~+ T1 j2 [) w0 f! V
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      4 l( n- i1 D# v8 }0 X+ X2 c( v
  • Импорты0 G6 R; f' ]. Q9 O0 n
0 A. y6 q3 W# s8 D9 Y* B, X
QuestManager.java — управление квестами и скриптами.1 Q0 J4 S: M6 T% b! g. x
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\( {9 X- S7 ~5 D6 s6 s

2 c7 t/ ?  R( m5 H
+ c. B" A( u: [
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.. q$ {2 X+ f* `
1. Лицензионное соглашение
' N& b; p3 z( b- f. F( r
  1. /*
    : C( F( [/ K  i! m
  2. * Этот файл является частью проекта L2J Mobius.
    4 m0 a- `8 u  ^& r! ?, e2 I6 D
  3. *
    3 y  j9 i3 t3 d" r
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять; o6 a1 P( `6 s; F: E$ d  g, R# B
  5. * её в соответствии с условиями GNU General Public License, опубликованной: T$ w' j" Q: f$ k- ~% q4 O! c+ t
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    0 w9 \2 r& @+ r# b9 I" R
  7. *
    " U; T. [5 W6 d7 _
  8. * Эта программа распространяется в надежде, что она будет полезной,
    - j3 n+ c, \# M9 C* X# }
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    / y2 w5 K- Y7 x, P
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.5 y7 V' T, K3 ?& i5 ?; F' Y
  11. * См. GNU General Public License для получения более подробной информации.1 i. R1 O3 ]# b, h: E) J& u- _/ ^% T/ x, c# Q
  12. *   g# H& b1 d- e0 O$ W4 j
  13. * Вы должны были получить копию GNU General Public License
    ) T+ u2 d0 ?6 Y; J+ f4 `
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.) L9 ~* }5 l# {4 w/ h% \
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
1 a) f+ O( g4 q# B& H0 b% h4 m4 c& `/ f, _2 J" a: w/ z1 p
/ y8 d2 @' h* s7 g% ]
2. Импортируемые библиотеки
, k6 T- V" [2 D$ t$ j* c
; Y$ g; ^: \, M( S, J7 R
  1. package org.l2jmobius.gameserver.instancemanager;1 V' z. e) I& Q+ @! O$ ?

  2. ( a8 t4 O4 Q% o; b, I
  3. import java.util.Map;
    ) a6 z$ @- }! s0 ~# Z0 V
  4. import java.util.concurrent.ConcurrentHashMap;
    " O: z7 V4 S% ]0 p6 X0 ^5 X
  5. import java.util.logging.Level;* V4 e4 X4 }% _0 A
  6. import java.util.logging.Logger;' i5 |4 `8 Y- g  x7 w+ c3 Z& x1 q

  7. 9 R7 v: I" n! \  U1 P
  8. import org.l2jmobius.Config;
    5 @, P0 J7 H1 j- n1 E6 n. W/ c1 }
  9. import org.l2jmobius.commons.util.CommonUtil;
    ! I% H8 `) J; Y
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    ) `. G: l1 G) A# B6 Q: B0 K
  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 — менеджер для работы с игровыми скриптами.
: g; n9 F- n+ M; P. F0 c; W# I3 V
3. Описание класса QuestManager; n  O) Z3 `( T
  1. /**" y4 Z4 b0 g7 q' |
  2. * Менеджер квестов и скриптов.
    9 q- ?% v+ c' ~: A( u
  3. * Автор: Zoey76+ a2 R, d* b: B! W! J
  4. */) F9 L4 L/ v* R, @
  5. public class QuestManager$ t# _# D0 D( M, J) s* g
  6. {
    ' M4 n$ J: Q% d* r- O
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());; y$ [8 J( d/ e# ~% ~
  8.    
    5 A( h  x/ W# [1 X
  9.     /** Карта, содержащая все квесты. */4 i! e8 X) l, E. D; d) R7 d' G$ ~+ m0 v
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    4 L, w1 R: i, ?  }. u3 C4 p
  11.     /** Карта, содержащая все скрипты. */" C6 n5 T( H: M2 I- s
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();, f: t/ B9 P% H) L* O7 @
  13.     " b1 r2 I; e1 v5 `9 k+ ?/ V
  14.     protected QuestManager()1 {3 B6 m0 |5 J. Z
  15.     {8 p: I# b/ C, r5 v' h6 w" f( u( I0 v
  16.     }
    * d5 p" z, o5 b
  17. }
Скопировать код
4. Методы
7 i; ?; ?0 a" @7 k6 Q' lМетод reload(String questFolder)
: w% H9 z# v3 l% z/ b* w/ u& g& T
  1. public boolean reload(String questFolder)
    6 e- n3 j/ v& C9 ?6 c
  2. {
    " x& I) p7 C. k
  3.     final Quest q = getQuest(questFolder);; a6 F# L0 D! X7 o+ M1 D9 z
  4.     if (q == null)
    4 a. ?5 i& n7 u& \% K* Q' r
  5.     {% |1 `4 n( T1 O: F
  6.         return false;
    4 @: m* @9 E9 h1 u, V. l
  7.     }
    . f8 u8 R+ Z; c# x# o
  8.     return q.reload();
    . J3 ?, P( X! ]) M, B6 \1 O2 S' z
  9. }
Скопировать код

4 b5 b/ c) G+ g$ k; B  z9 i' h5 u! d; @
0 Y: y! e; E% ?8 [! gМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.: G' M0 c# Q1 a! C, g: F- Y5 n8 j
Метод reload(int questId)4 g8 N: k$ M* |- Y4 ^
3 F7 R- D) Z& I
  1. /**
    # x$ v- V* R- P$ }/ H
  2. * Перезагружает квест по ID.
    7 S4 l: }- |4 g5 e- k6 q
  3. * @param questId ID квеста для перезагрузки
    3 X( j' c2 C/ A% W
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    6 w/ k/ \& z$ K+ K
  5. */
    ( ]2 b* p7 h) U/ U3 ^2 m
  6. public boolean reload(int questId)/ F6 y6 I/ |6 b, K" N
  7. {8 _8 d/ Q" [' H. U
  8.     final Quest q = getQuest(questId);' V9 B3 c/ {- `* x; x
  9.     if (q == null)/ S( a: Y3 r/ _, Z: U7 t
  10.     {+ |6 @* M. Z5 t5 e# ~% g- N* D( x
  11.         return false;
    - }) I+ T8 Y& h! _9 u5 b
  12.     }/ s% r6 e% r2 l3 X. P( t2 p
  13.     return q.reload();
    , s4 b# Z" B3 r+ U
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.% _+ l4 ~3 D. J- A1 [% o7 w
& e- A# N: L) ~; ]5 s( G
Метод reloadAllScripts()* B( j! G4 r8 X* _5 U0 q0 x: P

( R6 N" P" ]! A% h
  1. /**- e/ R$ R: d9 n
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.1 p* i0 z$ \5 i, }
  3. */
    7 t6 u% P% t3 ^$ l9 K
  4. public void reloadAllScripts()
    # A; {% j; v5 y1 R. m5 `
  5. {7 w$ M) f9 h; o8 N4 G
  6.     unloadAllScripts();' E! K* |( O+ p2 `
  7.    
    + u7 _7 e  R6 h: {' A9 E
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    / J' F  b. V4 x( {4 P& e+ D0 K% ]# W6 V5 a
  9.     try6 L8 _& J2 h2 {( k1 x7 C" q
  10.     {
    2 k' {& _3 L4 h% P6 z, b" @, e. p+ M
  11.         ScriptEngineManager.getInstance().executeScriptList();
    " `+ A* K' b. S& h7 q0 V# c! ^  A
  12.     }
    7 [6 s+ i4 a  }# b0 K6 _
  13.     catch (Exception e)
    % [- r( Q7 y1 b" r7 g7 T* E
  14.     {
    ' W5 F5 _! C' O; e
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);! m3 K; x; T) w) O, o
  16.     }
    5 V' S- d  t$ f6 n' u) }4 u
  17.    
    0 }8 t. T; L" B6 i% ~9 X; e
  18.     getInstance().report();
    , f, t5 X) m2 r1 U7 l; u
  19. }
Скопировать код
Метод unloadAllScripts()9 j( x; H  X' Z, ~5 _9 x

% a/ S+ A8 _: O" t9 r) G7 p
  1. /**
    , X0 |8 G* }+ m, L+ F
  2. * Выгружает все квесты и скрипты.6 k! X2 a3 m6 k! _( q  S
  3. */
    ; ~3 U5 ?* [  q3 r. s* J4 f# b
  4. public void unloadAllScripts()* U4 [! k6 {+ ?. m
  5. {' @) b9 |5 S, U, Z
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");& W, x  h6 ^% T: o9 Q; U! M& ]" [
  7.    
    5 B2 G7 {' h! R$ C% F# `" T& \, S
  8.     // Выгрузка квестов.
    7 Y) k: E# p& |% v6 n8 ~
  9.     for (Quest quest : _quests.values())
    2 r* U9 G; e) T
  10.     {
    ' b) ^7 y# o0 t5 l
  11.         if (quest != null)
    . |4 ~$ M, x9 A1 N) ]( ^
  12.         {
    5 v% J9 j  {4 I
  13.             quest.unload(false);
    ( o8 A' L, v( `2 N; H6 e- `
  14.         }
    9 |- }  p9 W) a- ]* c
  15.     }
    2 J0 ^, N( L9 N% y, O/ @
  16.     _quests.clear();" h4 O3 z. ]* J* ~, H
  17.     // Выгрузка скриптов.
    . w& d/ T/ S! u' v. O$ q' N
  18.     for (Quest script : _scripts.values())
    * ^* X- r$ C; h
  19.     {" X# `- @1 N% L, ~3 L
  20.         if (script != null)1 w3 }5 g' t4 L9 X  X* h3 ^
  21.         {, ]4 ^. H' l. N! i% e+ V# l" ]
  22.             script.unload(false);
    9 C9 i# T3 c+ p6 h- `
  23.         }3 V/ R+ n; L7 f9 p8 s! ?
  24.     }/ _) X. r( E' N. a/ A
  25.     _scripts.clear();2 X0 i7 y. T5 P  m' z) V; X
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    * e! V5 m0 ^: V# X2 v1 w! M
2 Q  D9 b/ V' r+ j0 N
Метод report()
$ i' V6 w/ X* l5 J& B8 h# g6 Q
+ |" J  C. U! V/ w  B* i9 y
  1. /**
    ( d, B7 U, W) v
  2. * Логирует количество загруженных квестов и скриптов.3 E) F5 U7 I. c& t3 y, z: ^
  3. */
    , O% O  m# N2 R3 [: E
  4. public void report()
    . D4 i$ ]! i* s
  5. {
    % h  M5 g' Q7 D. |6 K( H
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    * k# T* U2 T& u
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");- R; o, ^( a/ k+ P
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.8 b5 |6 [9 U& R) N# M8 m
0 {. H4 L8 ^  _: H. M
Метод getQuest(String name)/ |8 T. Y# Y9 X7 ?; v6 h. m
* t3 P# }, G5 h/ d5 B4 g" V; k, @
  1. /**, d' \9 ~" i& C
  2. * Получает квест по имени.
    % c  f( o5 ~* s6 A; H; O
  3. * @param name имя квеста
    4 p% _5 I. T$ ^4 p6 g
  4. * @return квест
    6 q& z" f2 ~' r3 p* S
  5. */
    # C$ D/ B4 n- q) W$ N; K- y
  6. public Quest getQuest(String name)) H) R, k4 v; C; P
  7. {
    * }( Z8 [  R5 q! q
  8.     if (_quests.containsKey(name))3 z. `# E* p* B
  9.     {9 P9 ]1 a! W. q9 L: a4 a
  10.         return _quests.get(name);7 s4 n" G! i8 r: r4 @" \
  11.     }7 n! q7 Y& d2 U$ p
  12.     return _scripts.get(name);
    # p: p/ B/ l- p, Z/ f! t
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    7 [, L& a- k4 O8 Y, Q: b

5 M, U: p5 k- a0 M5 V6 L) u' G2 zМетод getQuest(int questId)6 F( n! |  V1 [% h  `) r
; ?; P1 N4 z1 w# E% K$ ?: t. z
  1. /**
    7 T+ I- C% x# E
  2. * Получает квест по ID.
    8 V; Z3 n6 g4 _! W% V+ U- q
  3. * @param questId ID квеста
    * [' S0 C, I. Z/ E5 T
  4. * @return квест, если найден, {@code null} в противном случае$ Z% P2 A+ ^3 y( k: }; J9 E
  5. */
    , y& n6 u9 I) b* _+ ^
  6. public Quest getQuest(int questId)0 n+ @7 E8 j0 S# \2 M7 {
  7. {
    6 R1 p+ C, L& {1 U6 Z
  8.     for (Quest q : _quests.values())- F' s8 H, f7 `4 I2 \
  9.     {" Z# J$ O$ u& c9 q  W) V: E
  10.         if (q.getId() == questId)9 b9 [( L, ~( u: y6 M7 L0 j
  11.         {
    ' }) D; Y  G) ^- B. p/ h
  12.             return q;
    3 S6 @1 i. u% _* y5 K; A
  13.         }( i. y; z8 B  C: H" ?+ w- k  B- d
  14.     }
    9 h" }% I, y8 Z
  15.     return null;
    ; J8 G5 a/ I" w$ G9 ~1 Y+ i
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    9 i* q+ e( G- D+ b( x
: j( j" W  F$ [/ a; B
Метод addQuest(Quest quest)
% _9 ]# C: U2 Y8 E$ o6 t& M2 W+ g
# k. {( Q, c2 m) Q+ U% q% w
  1. /**
    - [* D  v5 |5 R8 D
  2. * Добавляет новый квест.' f' h- i, ?2 e  j
  3. * @param quest квест для добавления$ t3 `0 o7 o- ~. y
  4. */
    ( u( A3 [# M; R* H
  5. public void addQuest(Quest quest)
    9 N# d0 g- K0 L% {1 Z4 ~% t( H- L8 S
  6. {  @+ K/ k( u( N2 M' o! Y
  7.     if (quest == null); \/ z( L, W" b" e% _2 Z
  8.     {+ a6 f7 Q2 I+ N$ Y# b
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    ! j/ [5 I3 a7 }  A6 f$ q. o
  10.     }! [, Y% z6 P5 ~4 l
  11.    
    # i* t. H, s: S2 T1 S
  12.     final Quest old = _quests.put(quest.getName(), quest);
      M+ m$ h) ]6 o3 E5 p$ L
  13.     if (old != null)1 z4 t$ `8 V8 G5 b
  14.     {8 k# f" O% G: J' J- E3 T7 R; L
  15.         old.unload();0 ^9 x. L/ w% x+ W" h
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");' D4 z& ?( H' J/ p: U
  17.     }( n6 B7 X+ q# \5 b# r! I2 G
  18.     + V, Q5 f! X( \' |3 @; B
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    . N; }, C- X+ `" r& E3 l0 H$ K
  20.     {
    ' v9 R; G  s/ N# [0 t6 u
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();# S+ q) k( O2 [/ R; y
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");! ?1 f6 o: R4 D! J8 u
  23.     }
    " f9 y- l5 u2 _6 M
  24. }3 N% A. D" x  e) D8 c
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
) k) L9 l, D' m- F( \% I; fЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере." o0 p7 O1 q# R

$ m; c! p: m2 `4 S6 i2 U5 C! U* {$ n0 V. ]

( O; ~; J; p% k5 h/ R
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

Правил начисления баллов

Опубликовать
Сектор творческих людей
Горячая линия

638638758

С понедельника по воскресенье с 9:00 до 23:00

Обратной связь

admin@artace.ru Онлайн

QR-код

Powered by Discuz! X3.5© 2001-2021 Comsenz Inc.