Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius+ |4 |- [* G. s0 R  L1 j3 Q

& Y. @- ~1 B2 J) c" u- U3 i- O5 B; @Разбор файла QuestManager.java
* A$ w/ U6 w* w9 n% _+ [  s' l$ P; W( {. G
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.: p& ~' s) r$ q8 H- w9 v# x/ t/ W! ~
Основные элементы
$ o2 R% j8 k: d! v7 r9 Q/ t
  • Лицензия3 n! N4 y/ U. {* {  M
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии., G+ z9 j9 r( p% ~; x: L2 G
  • Импорты9 P. M' w9 |* H

6 H4 W6 n& c( k1 B- ^4 v) gQuestManager.java — управление квестами и скриптами.% ~; G: }5 i- @% [0 u( }- C0 B
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
  b; _$ G0 P, ?) j$ Z7 a  s7 v1 q: u9 C' p1 D! W
5 h' a' r- D  h% M
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.* O8 v% |* `" ?- C( n5 B/ r
1. Лицензионное соглашение
# c6 |) a/ k; D# V
  1. /*# `* u; Q3 y  w6 m  m6 y3 C
  2. * Этот файл является частью проекта L2J Mobius.
    7 r6 d$ d3 ^9 O: W% l2 X
  3. * 2 D9 S* I5 m, t, w4 W  @4 T/ H& {
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    ' ^5 `% n, V5 G: k' }1 `- |) k
  5. * её в соответствии с условиями GNU General Public License, опубликованной2 N2 q) i" X6 e; b: }
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.* g: f+ _5 R5 i( f
  7. *
    0 n* g- l% ~& v% Q, a9 ?
  8. * Эта программа распространяется в надежде, что она будет полезной,
    - O! N* H5 j& r, `
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    8 o" x. r/ \. R2 W! i& ^
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    $ O0 J  b4 y, T+ \2 M* w" X; k
  11. * См. GNU General Public License для получения более подробной информации.
    , M: N7 t/ w  [* f$ D
  12. * 0 s  f. y. G* K9 S4 y$ W* D4 A4 {
  13. * Вы должны были получить копию GNU General Public License
    8 w6 J# h% `/ V- E2 [! R) Q) U% F/ [
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.- p1 o' e1 R; H: d
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
0 W; F; i, S5 @% q5 ^4 A
' E' P' c% ~8 o& Q2 n! t$ `
5 T: x4 f4 ]; F1 V2. Импортируемые библиотеки
9 B/ r$ q' b+ p! m2 ~( i0 A( F) u7 k3 V7 w
  1. package org.l2jmobius.gameserver.instancemanager;  V/ c; d& _; Y9 b& y- N

  2. 7 d  J1 T4 B/ s* @7 `% N
  3. import java.util.Map;: G" Q+ S# |# }' W
  4. import java.util.concurrent.ConcurrentHashMap;
    0 o( K$ W" m$ n4 v! @" T
  5. import java.util.logging.Level;" m4 \4 k3 |7 t  N
  6. import java.util.logging.Logger;
    3 }2 I$ K: p. I* {! C, u

  7. + L5 ^" L+ |5 M# d9 V- d) I
  8. import org.l2jmobius.Config;
    , m3 |' E/ E; z
  9. import org.l2jmobius.commons.util.CommonUtil;" M# P7 P, A6 n0 h, Q! N
  10. import org.l2jmobius.gameserver.model.quest.Quest;8 v! S. s' u3 V. N
  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# _2 |. h. }
% e; w% V% a( A4 Z. Y' X
3. Описание класса QuestManager. o% P6 n5 C4 x( ~; O* p6 [: q
  1. /**; g0 H3 s+ h) M) e
  2. * Менеджер квестов и скриптов.
    + W( L6 f) ]3 M3 W0 k$ H3 N  l" R% T2 Y
  3. * Автор: Zoey76. J8 Q' P5 A+ }  g' P
  4. */9 y! x3 N+ w2 I
  5. public class QuestManager
    # l  c, _; G9 r4 U. O4 [
  6. {
    9 Z- Y4 }1 @8 N( ~
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());5 g% p" V# ~/ V) W* }4 R9 O& r
  8.    
    $ n, W7 @- g$ _. @4 _
  9.     /** Карта, содержащая все квесты. */# c7 j7 e; k, L5 `. u
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    ! J; ^' k1 R2 y6 l. X; O! M
  11.     /** Карта, содержащая все скрипты. */* R. o8 i8 i! a  \" y4 c
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    2 U* i+ O" o+ g) L. h* Q& T- }  E
  13.     / g1 ~1 K+ M+ |* B; w% ^7 w
  14.     protected QuestManager()3 ]$ B% x8 u& U3 h% C
  15.     {5 z9 U1 J8 B: o
  16.     }
    & F# d6 S+ ?: \8 z# e: _: x
  17. }
Скопировать код
4. Методы
1 E9 f8 w  J6 f- l7 uМетод reload(String questFolder)
2 o) x% x* W) w9 @( a! N
  1. public boolean reload(String questFolder). P. a$ e) q9 x5 c, j
  2. {
    4 Y" l: B/ X) Q9 ^9 O. ]
  3.     final Quest q = getQuest(questFolder);
    ! v' g* c4 E4 R0 o! o* v( n
  4.     if (q == null)! V- r! ~0 r% W
  5.     {
    3 b+ R) C6 S4 u' _9 S4 q# |
  6.         return false;
    8 `& P. j) w7 l: N$ U. S1 J
  7.     }9 ^* ?6 L& D) N5 {
  8.     return q.reload();% j* L0 q5 s6 N+ J  }
  9. }
Скопировать код

8 x7 z( H% e1 j# H* ?3 ^- O, ]+ _4 R  L7 h
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
7 T% C4 a, E* K, EМетод reload(int questId)- C( |, r& \8 e  w* Q& x- Q& g
! k; l' G8 E, h- A- Z( b" x% b
  1. /**% {# x0 B0 ~& \3 L$ ^& c  r+ O" e
  2. * Перезагружает квест по ID.
    1 y$ z  k! x$ M( ]( d. N7 y
  3. * @param questId ID квеста для перезагрузки
    8 ]( t# L- e% `9 ~- H  d5 ^
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае: X6 s- ?' l" i8 M' X/ H
  5. */
    / V9 }+ M( P1 l3 M6 }7 ~% W
  6. public boolean reload(int questId)
    3 `& K9 [8 W" T; H( F) O' ?; Z4 `* [+ x
  7. {6 p. }% A& A$ ]9 i
  8.     final Quest q = getQuest(questId);
    4 |- H! t4 O3 ~  x  m/ u' H8 j
  9.     if (q == null)# V* K: D: @9 j6 R. q4 ^
  10.     {
    # V- z. }& E+ d) o
  11.         return false;/ C% d* m/ O9 k) ]9 G. h& |, G
  12.     }
    4 v$ N! @% k- G# h% [+ s
  13.     return q.reload();( {* O# G. w2 {7 G2 D
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.  O/ X& |1 x9 Y8 q* h( p3 X

$ a3 k% ~: ?- T( k9 P9 o* VМетод reloadAllScripts()
1 G7 ~, h4 m* y  M) @0 @' ^$ \, b
  1. /**
    1 P- k8 L7 ^, X. ~4 B- N- C
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    . n9 Q4 v9 |; r; h! W3 b( }
  3. */' w0 w0 \7 D: U+ x' X
  4. public void reloadAllScripts()
    3 ~9 N- a: y; ?) i- W
  5. {
      i' E6 W/ J" O
  6.     unloadAllScripts();
    3 a* g, v- k2 \5 V/ q
  7.     2 ~# \, a+ p, h1 i4 D
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");0 Z  ~" _; j" B& ?/ j  ?
  9.     try
    - i  m+ Q% ]2 @
  10.     {/ E- r8 m( ^# b6 T( A* J8 A
  11.         ScriptEngineManager.getInstance().executeScriptList();/ v; S8 Y, a$ E
  12.     }! X4 ~# @' s% C: z, Z
  13.     catch (Exception e)5 \7 A5 |1 G1 @- A# {
  14.     {
    ' K3 g$ H: S9 v& V6 G
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    8 x1 m% t6 X4 F. t" e- U
  16.     }# t4 T0 s+ f8 A4 P
  17.     / W6 y) f* i7 @
  18.     getInstance().report();
    0 F. Q; d( K" e/ m; P
  19. }
Скопировать код
Метод unloadAllScripts()
9 Q0 A" W  _( \) c7 q3 b+ J# j  A. B: H# ]' l: z5 e) J
  1. /**
    5 u2 S# K1 y( o* g
  2. * Выгружает все квесты и скрипты." b& E" o8 }/ D/ }
  3. */
    1 n. D& u4 u0 o* h2 j0 i4 |% F, U8 c
  4. public void unloadAllScripts()
    % S8 U8 @3 }. ?3 k# r) I+ e( T& ]3 M
  5. {
    $ O' _/ Q  D* ]
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");) H; N9 e! h- _- \) ?
  7.    
    ) ]& R) L4 n8 h+ N) }4 C
  8.     // Выгрузка квестов.4 r2 o. \+ C. d+ i# l
  9.     for (Quest quest : _quests.values())! @' l& |$ b" e/ i. Z; U5 F
  10.     {9 D* S+ W1 G" r) h) Q# Q# j3 r0 V2 d
  11.         if (quest != null)
    0 L( o" M& J3 W. p4 c
  12.         {
    & H% J$ {/ \$ `; _
  13.             quest.unload(false);; Y/ C- p7 K! I* T
  14.         }
    / {/ W) b6 N5 l( N4 J" P% h
  15.     }
    4 R& r2 s  D% y# d5 ~/ E1 q! F
  16.     _quests.clear();) r) w* r+ i6 E4 F" n' D0 V% W% m
  17.     // Выгрузка скриптов.
    ) D2 b. _& ^! \# y
  18.     for (Quest script : _scripts.values()), Q# @0 I3 }0 ~3 q4 o2 ?2 J
  19.     {7 u1 T. w# f( x3 @. P! j
  20.         if (script != null)/ W3 s' y; V( ~# M1 A
  21.         {
    0 Y! O% V5 W% J2 j2 ^
  22.             script.unload(false);
    / ?8 N( q  \0 _0 e/ z7 ~" `
  23.         }
    ' _8 d' _6 ^1 u- o" G
  24.     }9 n0 t2 t8 }: Q; c# ]5 N
  25.     _scripts.clear();! x& m9 t6 C& m+ W0 U* D
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.4 ^* ^) ^/ }* S8 |1 v9 V

$ ~& q- d* H* {9 Q0 \: QМетод report()# F4 n, N: O6 t( q
: `0 K8 {7 h8 q5 e- r: Y
  1. /**' G* u  A( M# G& a  C$ E* N
  2. * Логирует количество загруженных квестов и скриптов.
    * }1 |" z( R9 e+ \: c" W' Z
  3. */
    ' V6 ?1 l$ X+ q4 U+ X9 T& M
  4. public void report()/ v7 S4 h/ S: Y; F% M' H
  5. {
    , v% c1 Z8 C# B, l% \$ {8 {
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    ' z2 ]- L: `* ~- c+ R7 ]: U
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    . j# z: n8 @9 P/ j7 M, _
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    - k; m2 c2 ]: f# M9 E

& N, U) D4 E  x. A/ yМетод getQuest(String name)
; k# h3 v' J3 i+ F' D( @
5 G% F; i" u4 K# g' g5 ^
  1. /**
    8 J, {& d( Z+ A: q; C: r
  2. * Получает квест по имени.+ n$ |& {) K- M9 T4 w% A% I1 j5 T
  3. * @param name имя квеста
    " s9 S" T& Q+ j* o
  4. * @return квест- [+ n6 ~' Q1 s' s
  5. */
    ; q5 k: D/ L; S1 u. J
  6. public Quest getQuest(String name)
    5 z& h; h- L% c: e- K5 A
  7. {
    3 J: C4 p0 u* V/ j& ~3 B  }$ j
  8.     if (_quests.containsKey(name))
    : C' J( J) b* u
  9.     {
    . u% p! y: t4 ^* C
  10.         return _quests.get(name);# y- e* o7 j  R# Y. n
  11.     }* b5 I/ D5 b/ {6 v
  12.     return _scripts.get(name);
      h1 J9 Z( h9 z4 ?# M
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    ! n3 J4 @5 U* u: v0 n
3 h: l9 h9 Q) L" q/ J
Метод getQuest(int questId)+ C/ N1 L6 I3 K- U4 ]1 `
* }7 T+ W4 ?! C4 y5 U8 V' L
  1. /**
    ( b9 m# _! l6 ^; _- R
  2. * Получает квест по ID.% `* {; }( A; o" |; c) N4 m
  3. * @param questId ID квеста
    ) S& F& v% U% i1 N7 N7 D. s1 T
  4. * @return квест, если найден, {@code null} в противном случае! T) y; ~4 D6 t' t' C8 f9 |2 O
  5. */  U0 k6 K0 r0 r) H1 c
  6. public Quest getQuest(int questId)
    6 u8 H' w9 I' K
  7. {: i2 c" {8 `, C1 O7 D8 J
  8.     for (Quest q : _quests.values())
    + c5 `2 Y) {( @& K- |5 U
  9.     {8 g* ^5 P1 h! q& c  e2 o
  10.         if (q.getId() == questId)9 K4 z$ o) x0 Z: `1 X: U; P" ]
  11.         {! N8 Z' J0 h+ f$ Z5 ^
  12.             return q;# Z8 X9 D( y. D% ?1 d
  13.         }7 v3 l) E  o7 x0 h" @4 w6 P
  14.     }
    5 l% X5 ]8 d/ E0 ^1 J
  15.     return null;
    & g9 @0 `7 R3 b* x7 \. S
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    , m# v" L- g. E0 W0 a  Z) t
. Y$ Z; `% T  I& {2 Q
Метод addQuest(Quest quest)
8 R$ y% n0 [# k4 {! t. y+ T2 H! \5 A
2 d/ ?- S" e, a8 R
  1. /**! |9 W0 `# m& {
  2. * Добавляет новый квест.  w, h% z& K7 N, v% E
  3. * @param quest квест для добавления: A* j/ `& l" S% p* h: A
  4. */# E4 t8 g8 t; r$ ?
  5. public void addQuest(Quest quest)
    9 a5 H2 g3 S3 @8 M+ _
  6. {
    - u- F/ `8 j6 k( ^2 f* T
  7.     if (quest == null)' \3 k+ j, [  \2 u# D. `9 V
  8.     {6 ~) P4 g$ @7 W- Z/ ?8 r. O# q
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
      N& Y# [1 z) ?# |; `  \+ X7 {" v2 S
  10.     }
    1 M! G' {% B6 V; Z: h( Q
  11.    
    3 ^* {6 G4 ?, V2 [1 w# C# s
  12.     final Quest old = _quests.put(quest.getName(), quest);0 `- q. B! Q& J/ K9 Z( v3 }( b
  13.     if (old != null)
    3 I9 G5 F$ j' y# ~  l
  14.     {: Q1 B) l5 \) N
  15.         old.unload();' W3 m0 f4 s0 E% i4 _
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    8 j3 I! O) h* R4 z1 G
  17.     }
    : P% }2 [% Z" ^  Z+ J- N4 `
  18.    
    2 n0 d* d7 L/ X
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)' U1 ^+ L. m& U: g) ]
  20.     {5 C9 f2 D) r% t  N5 ^' D
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    ; D7 Z( P3 }. r" ^
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");+ w% ?* Z! c. j/ B9 u' ~
  23.     }
    8 [2 H9 I/ g1 J. O+ E$ v) O3 j: I3 j
  24. }
    5 g# q2 h# z5 F, C* Y6 e: X. E5 m
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
7 J$ u) P. D: m: nЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.- b- J% C! ^3 Q
  E+ \7 O/ H5 Q; k

9 J* L  O8 l5 m7 u+ C4 {! l" H# d: g- x& j9 {! D0 B
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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