Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius. @2 p  {- l9 i
# f: Z+ B# o9 K; t! ]4 c5 V/ N6 s# r/ ^
Разбор файла QuestManager.java! U. V1 {/ W) E  v: F- N4 o7 O' m! `# j
" H* `2 e7 |1 h& [1 e
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.5 |  I% [- U& W3 F* [1 j& u
Основные элементы+ `/ P9 u; T4 Q$ V
  • Лицензия
    - L8 S* Q) D4 I6 c6 ~
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.7 W9 \# W+ k2 F4 n
  • Импорты
    ! e6 @. P9 ^0 i) a3 t% y/ Y

3 o' I( @% N- S8 E& x) TQuestManager.java — управление квестами и скриптами.
% y% L" [, b$ E6 t$ \/ ?Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
' V; w' l. P" V) E% B" h9 e6 `$ p  z. g/ N( i6 ~& g
. B6 a4 B0 W! B1 b
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.% r/ L8 e9 J9 ]& Y+ m9 {7 }
1. Лицензионное соглашение% U8 ~& j# j4 f
  1. /*
    $ R  l, I/ u8 g6 H# L
  2. * Этот файл является частью проекта L2J Mobius.* X+ V! F! V/ g* T  w
  3. * : Y& G1 j) ~, r0 E4 d; }: o# ^
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять8 d0 O! f5 h$ Q9 n6 Y' k
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    ) X3 K% D' D. S" E4 j; C
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.3 w5 r" ^( l1 I% X+ n7 O
  7. * / y7 I) i5 m, L9 o
  8. * Эта программа распространяется в надежде, что она будет полезной,
    1 @/ k! C+ |1 }. a# }" l# j
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    ) |0 X: E# v- M. V8 U, f% z
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    6 S9 T/ u  S% G7 N) p, w
  11. * См. GNU General Public License для получения более подробной информации.( ?, ^8 E+ w% n! W8 L, y1 L4 D. u% s
  12. * 1 W7 s& Z$ X/ u/ K1 W
  13. * Вы должны были получить копию GNU General Public License( R: B( [/ F1 p- t0 H3 }
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.9 g5 q& _- L- _; H( P* W% [5 M
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
+ \8 _, h% d  I+ a5 I+ e$ r
* {# g. k0 s6 e
6 O" {6 j( x' m$ v2. Импортируемые библиотеки
1 ^: V6 ]3 ^/ {8 }2 G0 y
2 @$ f; V, k1 i2 V. ?* k4 Z
  1. package org.l2jmobius.gameserver.instancemanager;
    # ]# N$ w: ~% l
  2. * K5 J! r) y% g7 S- P
  3. import java.util.Map;
    3 G3 p5 y! e1 m  f* t
  4. import java.util.concurrent.ConcurrentHashMap;: W# m9 c1 A' q# z' i9 `: R
  5. import java.util.logging.Level;
    4 }0 n& z" J, Z$ A
  6. import java.util.logging.Logger;
    3 T$ [3 e/ u9 `+ W

  7. * o" A1 |$ R* i& k9 A* w
  8. import org.l2jmobius.Config;
    0 n1 D1 z4 }& y! X& L2 n* s& n
  9. import org.l2jmobius.commons.util.CommonUtil;! L  E5 P6 ?1 y) V
  10. import org.l2jmobius.gameserver.model.quest.Quest;' A- j5 y, j5 R" _, O% \- 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 — менеджер для работы с игровыми скриптами.
' ~* C7 v8 U! |2 J8 S0 B- M- F, i2 L7 S4 L, t7 K" g
3. Описание класса QuestManager3 l1 r8 o# j0 l( `- H0 x
  1. /**/ B5 }$ M& r; q6 q& J/ o$ O3 s! Z
  2. * Менеджер квестов и скриптов.
    ! u: ]8 k$ l" I+ E4 T  Y
  3. * Автор: Zoey762 ]5 z9 M5 ?; |. n: l$ z+ P
  4. */" s7 Y. J7 b7 s6 A6 y, f* X8 `
  5. public class QuestManager
    * @' ~. a& ?/ I' m7 ^
  6. {& p+ S9 d" u" K/ q7 `$ k5 L
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());0 g9 T# W! l8 Z0 t( l5 y' \. R2 A( J
  8.     3 |9 G% H3 y5 s
  9.     /** Карта, содержащая все квесты. */9 F: g" r+ G6 D. D* X7 J
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();0 b% H  l3 i) t
  11.     /** Карта, содержащая все скрипты. */
    5 M; @  y) s$ q
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    . w* `  b9 x* x; h$ H0 X+ l
  13.    
    ) l$ }+ d' o3 Q- U
  14.     protected QuestManager()
    & a0 c, G' w) J) R' D
  15.     {  M* C2 }& a/ N5 Q, k/ M
  16.     }: b" ^/ o% C9 n) w
  17. }
Скопировать код
4. Методы
) r: i1 u: F4 k* P2 QМетод reload(String questFolder)/ A7 O9 ?* X* o4 P6 B! N5 E8 W
  1. public boolean reload(String questFolder)( M1 x- d2 @7 u8 F" w$ M8 C( B
  2. {6 t; _4 \# F- ?2 X
  3.     final Quest q = getQuest(questFolder);  I) }: M6 L4 n1 G! ~* F
  4.     if (q == null)
    0 [9 Z2 @6 _' n) ]) L
  5.     {: F* D# l9 b+ M! e/ e
  6.         return false;0 s" v1 N* d3 G/ J$ D
  7.     }
    ) \) K/ ]; G+ G  R
  8.     return q.reload();
      y. m0 m9 |2 D" a
  9. }
Скопировать код

* P9 y. j" I0 p* W
( D" ^8 @8 f! vМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
! n$ j5 h% b: IМетод reload(int questId): }7 p2 E3 H- S4 I' r% C
) s" a) k. Q* c; s
  1. /**
    # ~% A5 u& u; `0 Q
  2. * Перезагружает квест по ID.
    4 O' y: G( K( @- C( ^
  3. * @param questId ID квеста для перезагрузки
    , Y7 h' ?& _: M0 @9 j+ D  V2 Y
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае; g; Y2 [8 F" h3 f% K  P& Q! V
  5. */5 o3 c4 p. W) S# [
  6. public boolean reload(int questId)
    - U. `2 E; P: l5 D# ?8 O0 o& ]
  7. {% {2 t$ z% d* r, }) ^7 I  Z8 ?
  8.     final Quest q = getQuest(questId);
    * B8 J) L( r. j3 H4 |" E5 d; K& q
  9.     if (q == null)
    $ d' @; x; z# ]% U6 t' q2 H
  10.     {* z  C0 M" m% w6 ^+ a2 s* a- S
  11.         return false;
    4 B1 t1 v1 E5 w9 D5 T
  12.     }: _) N7 Y2 b) r  g/ t2 X
  13.     return q.reload();
    - V; t4 o6 @/ L5 Z% K* j
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    . W; s* _1 b6 {) g$ B% [6 h

/ g& }/ ~* S. ~7 r% _4 [; _Метод reloadAllScripts()
* e. x5 z4 x) G+ |3 c) p& a3 I0 i# O: q
$ S# K+ V# E: [7 h) E# Y; N0 h
  1. /**: m2 ^) @' c. h6 b
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.& w. x2 n5 N8 z) W  V
  3. */
    * U  p# f3 q$ b' r0 w5 D7 T
  4. public void reloadAllScripts()
    0 L% o2 G( b2 K! Z2 T
  5. {! x! Y& @9 e! n0 G' r2 d
  6.     unloadAllScripts();' Y; W- ~8 Z* i& n
  7.     ' S+ V( }# p/ M/ d' z
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    + i6 J1 b9 M. A" b
  9.     try
    & R) M+ t+ A) y: L- G, p1 q# m
  10.     {
    2 k7 A8 I6 ~  V; J" z7 m5 [
  11.         ScriptEngineManager.getInstance().executeScriptList();
    $ \3 b8 B( j: I* i
  12.     }2 A' h1 G1 h8 t0 X" b. g
  13.     catch (Exception e)
    " G# x+ I. a- ]" D* ^: o
  14.     {. Y; f4 Y# l8 W& L( i$ a
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);8 I* W! U- }  Z9 J& O
  16.     }# y7 o. V" |7 z/ v" a; e
  17.    
    ' T" k; R) k9 Y! Y  o
  18.     getInstance().report();
    : N2 C+ k" [$ T% k0 N4 o) a1 f4 s
  19. }
Скопировать код
Метод unloadAllScripts()% }( a/ l* K0 m6 a/ l( F6 t. `
2 O8 c% c+ N' E" z. s! C3 j
  1. /**
    - W3 q8 j) j0 }# i- i% b; }
  2. * Выгружает все квесты и скрипты.
    - J# B  Y* Y$ a# u$ o5 v& Z+ q
  3. */0 X6 K' X5 g' M% Y% D- n
  4. public void unloadAllScripts()
    - [* M2 I/ c# B3 |& D% r( ~
  5. {
    % w" M. ~- s# R% k8 t) e
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    / r( k: ?9 k3 A2 E) ]* @
  7.     6 w0 W) P, l. i" q7 D
  8.     // Выгрузка квестов.$ j, Q2 O$ A5 }8 b* @
  9.     for (Quest quest : _quests.values())! P# k9 d  u4 f/ |. D: P1 P8 y; U
  10.     {2 A, j8 W# g5 `9 o) o# g. h
  11.         if (quest != null)
    . o7 e1 f6 E" w
  12.         {1 E! J2 l! }2 @! v( h9 L" A' {
  13.             quest.unload(false);
    ) B0 R0 t# Y/ x" h. k% D
  14.         }- }8 d3 G! N; ^: ~" z5 B/ z. `- E
  15.     }
    / t! b: y+ {) S/ m
  16.     _quests.clear();( t5 [( i  W/ G. E+ W* x  ^
  17.     // Выгрузка скриптов.; C- H" S( O" g6 c+ `' P3 Z7 v
  18.     for (Quest script : _scripts.values())# s. e9 c; |5 S  V' t0 M
  19.     {( `$ `+ A0 z0 L4 _
  20.         if (script != null)
    * S& y- b8 Q/ a3 |2 ~  F
  21.         {
    : O! ^) Y/ N7 }3 r' |( f9 I& y
  22.             script.unload(false);& v8 t; R+ \- V8 o1 Z: _
  23.         }% q6 E( Y* U; ~) I% V
  24.     }* O) Z" t) ?. v* `; ?: m8 v% s' f
  25.     _scripts.clear();
      H$ W% l' _9 H- b2 K% H" L/ L
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    5 d- |. H) z1 K/ q
1 z. T' ^+ d" P4 ?3 a
Метод report()
* m5 L# ^& f9 t0 a1 I
- f/ Y6 ~# n( }% Z, {
  1. /**
    + p  }7 _! n" A
  2. * Логирует количество загруженных квестов и скриптов.
    * v% i7 a' Z7 G& V$ E! ?
  3. */. W( P! q6 n* ]' ~
  4. public void report()
    0 F  h' q5 w( n7 L" X% c/ j: M
  5. {
    / y% P4 [1 M3 [4 Q2 `0 ]5 t
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");7 g. N+ I3 {1 Y& N0 |' h+ _: i3 x' O
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");# ~; k4 p# ]" {2 x, P* z
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    : X7 B/ c7 o1 g( Q. E; K( g

7 D2 b$ {% A/ t7 [# D5 ~Метод getQuest(String name)+ H! c- N& C- }8 K: s  c9 {5 ^! I

. }6 G: p7 S, K( f
  1. /**
    / y! Q7 }6 L# O- K& \8 t
  2. * Получает квест по имени.
    8 D! B' \7 w0 G. |
  3. * @param name имя квеста: X/ Q" f, y: Y$ p" r
  4. * @return квест% \: {6 G. u" x" p
  5. */
    1 D2 `# q$ s1 g, G; e
  6. public Quest getQuest(String name)% a6 P7 |; p% x! I/ G/ b
  7. {
    2 J, Z! d" c6 [
  8.     if (_quests.containsKey(name)), T2 d, Y2 t# f; H3 J
  9.     {
      b! y" _$ n* Z: d6 B3 P) q
  10.         return _quests.get(name);
    ' o5 S# V* y  V
  11.     }0 O# B, i. h' r: P
  12.     return _scripts.get(name);6 Q& a; S0 E0 r# G/ A6 x" g6 r! ^: c
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.% H& @# b5 c6 O0 e3 H

1 `9 I0 _1 b3 C+ ^( EМетод getQuest(int questId)
1 Z; W2 h  ]6 {3 a+ i
8 W- r1 ?4 O0 b; Q6 J. j4 A
  1. /**  U* w$ p' ^; @( Y
  2. * Получает квест по ID.1 r# C/ Y, Q3 L' T" h3 Y
  3. * @param questId ID квеста% X) \4 X9 ^/ `+ q( ~' i% p' a
  4. * @return квест, если найден, {@code null} в противном случае
    3 V  X7 I% d1 j
  5. */, o' e2 U% R8 s+ Z
  6. public Quest getQuest(int questId)- p. [! q2 T2 c  w+ d# s$ ^% Z
  7. {
    * f) o) L" m4 g& V. b: P
  8.     for (Quest q : _quests.values())5 s- s! [; {2 B6 X
  9.     {6 b: ?) T7 h$ [3 }# ^5 ^. P
  10.         if (q.getId() == questId)  c1 Z/ L6 \1 V2 g: F2 w2 w
  11.         {
    * t9 C* N" J$ _+ G. N9 I0 i
  12.             return q;
    + q* t7 W# @" {) l! `7 W
  13.         }8 F. i& S( f$ g# K4 {0 k/ ]: }3 l  M3 ]  H3 u
  14.     }0 ?9 Q0 y+ D; U7 q9 b7 ~% s, @6 x
  15.     return null;3 O: n9 x5 v9 `2 r
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    * |' C9 V2 V& i& z! ?1 `2 x9 R

' J6 G- Z* n# {& h7 b" qМетод addQuest(Quest quest)8 K8 z/ c) x- D6 p* i
2 p5 a$ ?. [% O  Q
  1. /**
    / p5 M: b% N$ l' ?
  2. * Добавляет новый квест.
    * y* R8 M  M  p; |' V
  3. * @param quest квест для добавления
    0 Z: F& v/ \8 f( Y: N- I2 G. Q
  4. */
    & {0 r& E* S# e2 ?/ J
  5. public void addQuest(Quest quest)1 n2 d7 p. j+ M; P
  6. {
    9 H7 o& O$ E8 T: R* R
  7.     if (quest == null)" c" W8 P) r) R
  8.     {
    ( K) M7 L3 G* f, @5 g: `
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");5 H/ Y2 u. m, h0 E4 y$ X
  10.     }
    8 f/ d  {/ Y8 A
  11.     9 M- W% f+ O" p$ W9 w2 Q$ _7 e
  12.     final Quest old = _quests.put(quest.getName(), quest);2 T# ?6 l* v" R4 g( B' U
  13.     if (old != null)  x$ o. c4 C0 d" h  f; i$ j
  14.     {9 B# h" e3 H7 A* e0 @) b+ r9 W
  15.         old.unload();
    ! A$ B& T5 D; W% n% z5 u6 {% U
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    $ q% f( K6 o3 c1 w- H
  17.     }
    * O# @/ L0 r' i- I  L- M7 u7 ]3 h
  18.    
    ! O" Q+ `$ i2 u2 ], N# e
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)# H2 ~5 J$ B' s" z9 O) A- }5 R7 k- D
  20.     {, Q% g! t, k- B
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    9 T8 R1 P. j, u1 r
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    % U8 P$ m" F8 E) W
  23.     }
    - t+ N6 B" X6 z/ `. G
  24. }: F* ]. x, q" [1 l2 u. ]
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.- y" H9 A" H4 h, G7 v* Z
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.4 ^, M4 C  u7 }9 R

( e1 }: {- W7 w3 V. p1 o7 }
% t7 s$ A! X1 i8 i5 @' m
  q3 @; s6 D. s! u: {4 W( T- t
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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