Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius- o8 k% d' N3 S/ q5 U  Z8 L

, Y0 W8 Z  W6 v* W4 S- uРазбор файла QuestManager.java# m( ]) t& p, s  V% u, ?: P. t9 H

: \+ _7 ?5 E& L; q5 ZЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
3 f) Y- z/ M" `- B  Q5 H2 `# UОсновные элементы
' H8 M1 I9 U2 w6 \! C
  • Лицензия
    # O6 T7 P3 p5 P3 T1 @
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.$ Q1 f# o, a7 v3 Y& n
  • Импорты
    ( Z3 @9 h! {; z7 b

# O4 w" F5 C' J; F  _- A1 RQuestManager.java — управление квестами и скриптами.
, Q/ j6 p5 X$ r8 V$ P& Z. tПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\( S& [7 A0 z2 s' a" d  K8 F
" }+ q5 P  n6 z+ T: D0 @2 s

3 J% X1 M2 ^7 q# s3 PДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов./ b8 g! \9 y4 g/ u3 e4 c9 ]+ D
1. Лицензионное соглашение
( v6 N1 D# R1 x$ B2 p( H
  1. /*
    $ H6 B! c' D2 N: _
  2. * Этот файл является частью проекта L2J Mobius.
    * [. M- e, h4 a) l' c4 i& B$ s
  3. *
    6 B0 Z. c- D2 C1 q6 J7 O2 o7 t
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять# R5 n8 {! P8 v: Z0 n& _
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    " g/ ~% `' y& m# U1 @
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии., X7 K7 y8 q( t  P% `
  7. *
    4 m3 J! @9 t% n! _9 e9 `
  8. * Эта программа распространяется в надежде, что она будет полезной,
      p; z2 ^' {; c' M
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    ) {9 m: |3 i/ o$ b) X
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.2 \# i3 d6 r( a7 ?! D
  11. * См. GNU General Public License для получения более подробной информации.
    ' s6 I& n, I/ j. i0 r8 w  e) A7 B! [! L
  12. *
    / b+ I; ^5 L! X9 Q2 S' ]8 f
  13. * Вы должны были получить копию GNU General Public License: L7 g- G+ t' ]; m0 @6 P
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.1 }' N# f$ ?+ {* b
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.# @2 O0 Q: g0 ]
, W* y# x1 @) A4 V
( ?3 W# j5 c& r5 F; x
2. Импортируемые библиотеки( O* a: A  M1 r" K' l- X. n' t8 s
$ O9 D- a  l0 j, T' e- c
  1. package org.l2jmobius.gameserver.instancemanager;* H3 Z9 \% H: G# r5 i8 J; E8 E

  2.   Y6 Q) n. \, V& ?9 K! {
  3. import java.util.Map;
    4 q% O1 d! I7 l) m
  4. import java.util.concurrent.ConcurrentHashMap;
    / t1 O1 F: W6 z5 A4 q0 R! e
  5. import java.util.logging.Level;
    $ }# q- N/ W; [
  6. import java.util.logging.Logger;# }) p9 F& _) Y

  7. ' a  G$ m/ C0 i: H- B' I, z% w
  8. import org.l2jmobius.Config;
    ( a5 P! D4 y1 _
  9. import org.l2jmobius.commons.util.CommonUtil;
    1 C  n3 M1 j  V
  10. import org.l2jmobius.gameserver.model.quest.Quest;0 L8 e; q) n: b1 u! @' g: {, P
  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 — менеджер для работы с игровыми скриптами.
+ B$ n& W; Y2 |5 U- y$ S/ @  p, i  m# G  E+ A" Q/ v) d
3. Описание класса QuestManager, _- z' P- e9 v, X
  1. /**
    # i6 ~" d$ N+ I" a$ p
  2. * Менеджер квестов и скриптов.
    7 Z4 f/ {, K* V- [" n  ]& t
  3. * Автор: Zoey76
    - [) K0 w, v! m9 Q  y
  4. */
    # I4 Z* g* g2 Q* {9 Z
  5. public class QuestManager/ o0 _6 w/ w" A
  6. {
      H$ ^: @7 y/ r1 ^9 ^) n& P- O
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());0 m0 ]& l% r! z9 V% b( q8 f  Z
  8.    
    : D: S$ m7 l/ `. d( ?
  9.     /** Карта, содержащая все квесты. */! Z2 w6 ?; c9 v  P
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    " o4 ^; V" n2 J5 Q& z/ U) U+ _1 a& F
  11.     /** Карта, содержащая все скрипты. */* S  c2 g4 ]) r  V& S
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    " Y# e* w- y5 N2 v0 B' Y
  13.     , V1 f5 s+ M: C$ ~: l0 A- N
  14.     protected QuestManager()9 D9 m7 t% T6 c4 _5 w3 U2 ~  M
  15.     {
    # b' T) u+ `/ ^' D& R1 }
  16.     }4 w* h# Y% d1 ?+ }
  17. }
Скопировать код
4. Методы: i" s: V( j  r/ d0 Y
Метод reload(String questFolder)
0 `2 E) j0 W) F1 }9 e$ q
  1. public boolean reload(String questFolder)# L8 i9 U& ]$ g7 j6 T! p
  2. {) d* J  ~1 c0 K) t. Q) D
  3.     final Quest q = getQuest(questFolder);+ P" ~7 X0 N9 c' z$ z  i
  4.     if (q == null)
    # w3 g5 J' Q8 ^
  5.     {
    : S+ W3 Z" u7 O  b4 l
  6.         return false;
    2 k* Q' x; A( p) I, P8 |
  7.     }
    / ~8 S$ B( L" ]$ \5 L+ H# @
  8.     return q.reload();! T/ c8 _( ~$ \6 d8 v5 S
  9. }
Скопировать код

- w+ W4 C9 O- b1 `7 `/ M9 Q$ Z
. l7 t- a+ H3 q+ R, qМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
4 [8 y- I% b0 _) C3 m* GМетод reload(int questId)
) k+ B$ A& A7 H; X4 I
. s+ `8 }6 p: I# H
  1. /**
    5 j6 U: V3 j( G5 I# q; f+ `
  2. * Перезагружает квест по ID.: ?5 Q/ X. x& Y" J
  3. * @param questId ID квеста для перезагрузки/ j* a3 B0 O- A# v
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    ( y- O+ n# y5 s. F( k$ U  O2 u9 m
  5. */8 U/ A' L8 D& S
  6. public boolean reload(int questId)
    - I/ m  L8 ~$ M' x& t2 ?
  7. {
    - G: e2 m2 [  W0 k+ V. N8 l
  8.     final Quest q = getQuest(questId);. [2 i$ ^8 W! S8 h  l- i5 x# C
  9.     if (q == null)' p) J9 @: w; D1 h
  10.     {
    ( X) i+ V3 Z: F  S8 S; l5 b
  11.         return false;/ U: H' u+ h8 Q- A; y6 v: B; v
  12.     }4 f$ G4 U" }0 `( K
  13.     return q.reload();7 U& K2 ?" V/ G$ w
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    % n8 X, ]' Z/ b( q- F7 O% g

2 ~2 g: R3 B( H5 K6 ^/ B% Y1 X! T. KМетод reloadAllScripts()
5 n; \4 ^5 t5 [' f9 D7 [
5 G- ?  n: b" ^6 n
  1. /**
    / y. B) U- J- J, B
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    7 Q) G" X8 N+ v9 ^& g2 R
  3. */0 U, ?/ _: |# j2 \3 B( ]
  4. public void reloadAllScripts()
    # d, H  K( I, {
  5. {
    " Q0 W- Q( y4 t6 v5 Y- M
  6.     unloadAllScripts();
    8 {$ c, E1 u/ \4 T3 i
  7.    
    ' \2 ?0 }& c3 i' M' r* G" W
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    7 F3 f- p6 s2 [) q" e0 S
  9.     try0 o% z, B; t) j" u! j0 j* G7 J
  10.     {) u! e- D! C( J4 b
  11.         ScriptEngineManager.getInstance().executeScriptList();
    9 T/ [. Z$ Q8 U$ V
  12.     }1 |- v: k1 Z6 G9 d( q0 d
  13.     catch (Exception e)7 ]( z" X) l* P* \+ ?
  14.     {- r2 @7 J' v" {, E, [$ }( U# F+ L
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    1 M! ~8 Y! H0 F0 d
  16.     }
    3 T7 j. Q- N' W( z" T8 b
  17.    
    * Y, L; T: H0 K/ k$ u& e
  18.     getInstance().report();
      J8 W+ L0 G$ L1 H* l5 V
  19. }
Скопировать код
Метод unloadAllScripts()4 c" f& d" q# a! K+ u
  _$ h8 }0 j, ?' B2 k/ Q1 ^
  1. /**; E' J( R/ ?) T! J8 G8 t/ b
  2. * Выгружает все квесты и скрипты.5 I7 f, ~, Z+ V. L( V( l
  3. */% G- r) t; ?, _0 m% c& w4 I
  4. public void unloadAllScripts()
    , v( `/ W; a5 t7 A. _
  5. {8 O/ J0 ^: f! @0 [# d8 L$ ]3 B
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    ) h' K; E  V* M7 [
  7.     - q+ ]1 d. n9 |  }4 r# M* O# \
  8.     // Выгрузка квестов.' h: v& A8 n" Q+ B& L/ S
  9.     for (Quest quest : _quests.values())& \# u1 g& q4 \. k: W# l
  10.     {9 T4 N) n( ~& S+ M- b+ B
  11.         if (quest != null)% b2 ?; P9 y# h7 v: m! r
  12.         {9 d  u2 h- Y+ z' t
  13.             quest.unload(false);
    * J" E) P9 j/ t) G  V5 l. f
  14.         }
    * X. U/ Z- }$ f* U: B
  15.     }8 K' A% l1 g) F& R: \5 _/ N
  16.     _quests.clear();
    . G% M$ b7 ^; ]* X" f
  17.     // Выгрузка скриптов.8 s: Y3 k2 j+ C
  18.     for (Quest script : _scripts.values())* f: |' l. @) J
  19.     {
    ( q" }: z# _9 A/ I+ z0 A
  20.         if (script != null)! Y- p9 @+ K2 Z4 ~
  21.         {% B$ s4 ^! w( \$ v& q) w
  22.             script.unload(false);/ D/ J+ \" q9 k
  23.         }
    : D" z; j! O0 t, ]7 X
  24.     }5 t4 T8 V/ ^, ]# E$ ~
  25.     _scripts.clear();$ L/ s  {+ ]. ]* X5 [
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    1 ?1 z( X0 z/ ~: l

2 j; M1 z, }0 MМетод report()
' k3 U% m! R) h6 I8 \& n0 z+ e" l0 A2 s0 u: P% G& \
  1. /**
    6 T* ]" g. ^2 x
  2. * Логирует количество загруженных квестов и скриптов.
    . e! }. ^4 s5 _( @& K5 L
  3. */8 y" g6 \! _$ z+ K6 I
  4. public void report()" U7 n! U* y, {
  5. {
    0 J/ \, C/ J" \& O% ?
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    ' g3 k- E* i( l1 ?
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");$ {2 J% i& S  S* Q" C; ]- N" {5 M
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    3 p% t1 p: P$ _1 s' l6 B' L

5 [' x" V$ r; E" J& z+ i7 Y' ]Метод getQuest(String name)
* R/ e2 [3 [  L. _$ Y( J1 o
. x/ M: d  |& e* [& n) S
  1. /**' S' @0 U* t% o, n2 ~( ^3 t
  2. * Получает квест по имени.
    ; `+ z2 m9 q: J5 L, c, Y3 X
  3. * @param name имя квеста2 X) x: t0 z! N  ~4 I. q( ~
  4. * @return квест0 c; M6 ]" [2 D6 I- G# [
  5. */
    8 \% q  ~  v7 p0 @
  6. public Quest getQuest(String name)
    . m2 k9 C' ~* {, k) O, P0 C
  7. {
    " ^3 H$ L& G# H$ `: I/ m5 C
  8.     if (_quests.containsKey(name))
    ! e) o2 _: z3 s) p
  9.     {) z0 P# f; |" q3 L7 M
  10.         return _quests.get(name);
      M! @( j( G* f0 M5 p; ?
  11.     }$ ~* ^7 g. n8 K! ?: G
  12.     return _scripts.get(name);
      H6 R& g  e8 f7 J. Y
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    ; u  R' i: C& J2 A/ q! B2 A
4 u* H0 b  n8 e4 v! g. Q, b
Метод getQuest(int questId)
! N6 G8 U- \3 t5 [  e% i
" O7 M9 R' P" i3 c) S+ J. W
  1. /**% Y5 ^: ?* o3 k8 d  ?* `
  2. * Получает квест по ID.
    3 h6 f$ v" H, M/ p2 Z& A
  3. * @param questId ID квеста
    ; r9 f: y/ b9 ^& u
  4. * @return квест, если найден, {@code null} в противном случае- d9 z# M+ X/ _2 l
  5. */: Z# [' T/ w% P; n  c5 M$ o+ K4 q
  6. public Quest getQuest(int questId)! T+ ?3 }/ C& F
  7. {$ P" T& J( l9 A; x8 O
  8.     for (Quest q : _quests.values())
    7 V  f: t! H! y3 @) V+ D+ {: |- _
  9.     {
    * S- z4 R: l: z- w& O
  10.         if (q.getId() == questId)
    6 Q3 K2 }" n: c( I
  11.         {
    * ~8 @% D; h6 r) O; X
  12.             return q;2 Q9 W% L6 b  Q6 J( A
  13.         }. j; F( S# n6 w0 q( g. ?
  14.     }7 E# |, O9 |9 z
  15.     return null;
    # W7 @  K, ]' [, u% e% D4 w7 s, T
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору." W" H8 A5 a! D9 a- |$ P6 a; V

2 R& T% f2 l6 u: n% IМетод addQuest(Quest quest)# P3 v" a: Z: T! p; x

0 R( j0 X1 |8 e3 ^4 ^
  1. /**
    $ e( F" _5 q9 U- a- N( d
  2. * Добавляет новый квест.
    & t: c6 Y: h5 V) ^9 F
  3. * @param quest квест для добавления: z2 a1 C6 \0 K5 F* [4 s$ V
  4. */
    : ~# @; A) T0 P8 N: G7 r
  5. public void addQuest(Quest quest)
    0 O& S. U8 K6 X* \5 e6 Q
  6. {
    3 [0 ?% q) C: F4 ]. j
  7.     if (quest == null)
    $ m3 r& Y9 P+ y8 ~# P' T' l
  8.     {" [5 {2 {/ x3 R
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");! H. e+ R0 ^/ [; X6 a- s
  10.     }! g$ F' H# K1 m% T. c
  11.    
    8 x* ^% r3 D* }5 i( c/ a- `7 M5 g1 j
  12.     final Quest old = _quests.put(quest.getName(), quest);, e6 P6 L, D' G- F7 ]7 v' |
  13.     if (old != null)" P% m7 P5 F2 Z/ M" F7 L, b7 y
  14.     {
    # R3 d' W( |9 D1 q6 C- k% J6 w# W4 D
  15.         old.unload();
    3 j1 N; L3 E; u, P  ]$ s- B
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    : q6 K  @% @% K7 a- _6 ^
  17.     }
    ' V1 F' Z, y! |7 l1 D
  18.    
    . T" ~( e! ]# Q& n) s( W
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS), ~5 x+ n- _. x1 k+ v
  20.     {4 v+ x% w1 F/ _( z3 F5 y
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    3 ]: `9 q% t9 d8 r
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    : T8 }2 m; B- ]& s
  23.     }: O0 }9 n5 [: O$ u' ~( M/ F
  24. }5 ~4 Y$ c; l5 C5 e
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.8 ?+ C* b4 G: Q7 c! T  T  g8 n
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
+ ?" ?+ b$ F4 z3 M& E
1 }% y7 o% D4 _: t+ L. d
; |! W5 I0 D) \: `5 O
2 H4 x8 G- |! U- K% Q
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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