Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
" o3 U* y: T. X1 g1 q! r6 ~$ A: T8 [( r) a, _
Разбор файла QuestManager.java# B& b! B. n" [5 i; A

/ G+ T3 d2 U8 ]/ q. V  kЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.. x" O  Y+ y5 l9 Q
Основные элементы
  Q/ S1 D5 o! Q, q% G, t9 @! k
  • Лицензия
    " g) a/ g3 ?" l
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.$ l; O. j2 O# |, v6 \4 T9 d$ }
  • Импорты
    * Y% \7 ^+ X8 v4 B
1 g* K" d% G  @' {  }
QuestManager.java — управление квестами и скриптами." ~' E. G" o  B
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\- u6 D" I% U; Y; \
. c9 g6 l& j. Y( u. j; n

+ m- ]) r. D. R& E, RДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.' g, {( c: E2 x
1. Лицензионное соглашение
# c' ]! ]- Z& N# n1 `, J$ E) a) z
  1. /*
    " F* e, P& H8 {: n4 H1 a
  2. * Этот файл является частью проекта L2J Mobius.
    ; B, P* T5 l( d+ l5 A; f2 [
  3. *
    4 b+ s* U* \. ]9 [
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    3 E( i! X+ c" A3 c
  5. * её в соответствии с условиями GNU General Public License, опубликованной: d9 F) S; a  X7 ^* t3 J2 H
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.6 F" [" B1 M3 |2 h' [
  7. *
    ! F( v9 y  q# H3 F
  8. * Эта программа распространяется в надежде, что она будет полезной,
    9 }4 y' H: \& ]$ ]" Y. I
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    % k& _' H4 G& E: B3 ]3 |1 X9 U
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.6 n8 G6 z  V5 A3 G3 ?) \
  11. * См. GNU General Public License для получения более подробной информации.
    / _: k5 o4 ^$ W* M/ {
  12. *
    * E" Z  p% w" ?  k; U& t
  13. * Вы должны были получить копию GNU General Public License7 o5 s/ U& C& B/ U" k0 z
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.$ u+ r5 V9 h5 R' n
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.* X. h8 j9 m% _6 ^( s$ B

, v. G8 u$ z3 J; }4 B6 T
* W0 c: N/ E, I& f6 _/ g. q' N, [  x" W2. Импортируемые библиотеки
  ]9 ?; g* m6 A8 T5 W1 n0 h
! I' Y: z/ Y1 u, `2 `2 \" [
  1. package org.l2jmobius.gameserver.instancemanager;
    $ T( A- b  ?2 X4 o

  2. + I* @. c  x5 t% `) O# ~/ i
  3. import java.util.Map;! o+ y# t: \6 n! x9 k  o
  4. import java.util.concurrent.ConcurrentHashMap;; E( n6 l" T. g) K$ V
  5. import java.util.logging.Level;) o! i* O8 p4 ~: P5 ~5 ~
  6. import java.util.logging.Logger;
      n6 @1 ^- L+ v. b  ~" j" U" z- c
  7. . x, S1 J2 x9 C, I0 w4 d7 ~
  8. import org.l2jmobius.Config;* {0 e- L. H( F* I# K  u, Q
  9. import org.l2jmobius.commons.util.CommonUtil;
    / \5 K! a, j" u+ q
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    3 y0 y1 `  w# `! `. U' |- I& ]* @
  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 — менеджер для работы с игровыми скриптами.
7 W! M8 t' B7 U& S$ P3 X. C% u
9 R3 X, f$ q" W. e; s3. Описание класса QuestManager
. Y/ M* }* y" {3 E
  1. /**
    0 }. d& l7 V3 ?1 `8 a0 H
  2. * Менеджер квестов и скриптов.3 Z. N3 z, W7 B9 h6 s# \
  3. * Автор: Zoey76
    8 `6 c4 A( f% k* s8 C
  4. */2 B8 J' h+ o. _$ A- _
  5. public class QuestManager" |8 ^/ @8 d3 K" S) D
  6. {
    0 d1 W& Y5 w& Y: s) `4 x
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    5 f) S' L/ n' X9 K
  8.     & C. ]) r  ^7 H
  9.     /** Карта, содержащая все квесты. */* ]7 k6 b. @% `3 t
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();3 j2 l. \& O; D6 r7 Z* F
  11.     /** Карта, содержащая все скрипты. */) `& k# \" h& T& ^- Q& v- Q5 p
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    / X# C/ V: j/ d% A
  13.    
    : U* k* C" h+ }
  14.     protected QuestManager()2 d$ a9 F* _% f; k
  15.     {
    " W) n# B, |6 ?2 K2 S
  16.     }
    7 m1 i9 C0 K* M4 }3 `
  17. }
Скопировать код
4. Методы; k/ z5 V& C8 h9 Q- w
Метод reload(String questFolder)
# \3 \0 G+ T( O0 i0 X
  1. public boolean reload(String questFolder)& r+ a! j; M' O2 k$ P) }
  2. {
    / j  {$ k) n/ _# G) Y0 w, s
  3.     final Quest q = getQuest(questFolder);
    8 X  ]2 E3 ~' c  p
  4.     if (q == null)
    . {; f7 Y0 C% a6 n
  5.     {* P' u5 n2 m$ `2 O6 j2 t
  6.         return false;
    - ]+ Q, M- Q6 d, ~7 o
  7.     }
    % }$ A$ ]5 _" _1 k0 Y
  8.     return q.reload();0 a. [, G8 y9 O5 b
  9. }
Скопировать код
% y# Z$ t5 e; r  w! R2 x# s8 g
# ]& q' u- L8 o: F) C7 j7 W
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
7 g: h* N8 ~% q- ?' R! iМетод reload(int questId)5 U6 f9 g5 C* s) ~/ v" V
) o4 N5 {) {/ O, Q. ]( a
  1. /**
    2 q+ b  Q: O& u5 ]4 _/ y
  2. * Перезагружает квест по ID." P! q! p* i2 M* `" W
  3. * @param questId ID квеста для перезагрузки
    8 a: \7 x3 P% m7 Z, K
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае/ q5 D; p4 n' x6 K' P+ R
  5. */# X3 j8 Y. M# A+ Y* b
  6. public boolean reload(int questId)0 ?1 G6 w* q; q/ E- p+ r
  7. {9 D& N! w8 M! M. B
  8.     final Quest q = getQuest(questId);' Y& Q* z4 y+ W
  9.     if (q == null)
    ( e) X: B( g& `3 r
  10.     {
    4 m; `7 n! n& w. q* ~
  11.         return false;
    % {8 n% ]- t7 T- L. M
  12.     }
    5 o1 f- q: G$ G6 w' L7 P4 I
  13.     return q.reload();; ~* ^1 {' f6 s5 [$ U% K
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    ! I) {8 a1 Q, d7 W  ]' J* S

3 c1 e- ?( U4 y0 @" hМетод reloadAllScripts()
& _0 z  {3 \# M' E" o% |  G4 X( J; m! n, D& m
  1. /**+ W" W% Y% N- o% T
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    # L- n% I1 _7 q1 x
  3. */5 B0 v8 y7 ~. a  `5 r' g
  4. public void reloadAllScripts(); _+ z8 ^2 ~. i  T4 c
  5. {$ B/ ]# u% q' W% O
  6.     unloadAllScripts();0 o5 i! y" [. B: i6 A* V3 w5 `, [9 R
  7.     / D4 I' x, i- W2 T: `3 t
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");4 @6 V$ a( r" w5 A9 f$ @) ^
  9.     try
    + Q1 l: y, k! a+ m5 W
  10.     {& ~% j1 j5 ^/ [
  11.         ScriptEngineManager.getInstance().executeScriptList();
    ) [/ \8 ~- Z* ?9 L/ n% E
  12.     }1 ~& m6 Q- U3 _( J7 }
  13.     catch (Exception e)/ f1 M% H; J( X  J7 M1 M: @
  14.     {, b; b4 q0 c8 G; }9 q
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);1 w4 X- t) Y1 S9 M: I  B$ g6 h/ [
  16.     }7 Q( m. J) L: r8 `0 x
  17.    
    ! A% B- r8 Q; g1 E* y
  18.     getInstance().report();
    % p7 ^- T% m/ Y4 e
  19. }
Скопировать код
Метод unloadAllScripts()( A5 T9 X7 q; P- z7 n6 ~

6 d; D4 i' b6 w1 D% T" p
  1. /**
      Y$ q8 D8 H" f) j2 P0 ^
  2. * Выгружает все квесты и скрипты.
    ! z  z* a; Q2 s* R" B& z9 ]
  3. */4 x! G- K  K9 s. @
  4. public void unloadAllScripts()0 e% J+ v9 Z0 ^" y& Y& ~; D
  5. {; ]& q; C* S. X+ C& L! K, M+ j4 ~
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");! d" g  S' D+ a
  7.     $ F+ y6 W+ h4 j& c) L. \) v) s
  8.     // Выгрузка квестов.
    8 Y: K! l1 b- \/ l- F! a
  9.     for (Quest quest : _quests.values())
    5 M) s  W# g( k6 p2 j
  10.     {
    ) [3 l: Q0 K+ \9 i* H+ d0 p
  11.         if (quest != null)+ L3 I4 y" ]8 w
  12.         {
    4 j. M/ W4 Y0 }0 o5 e- s
  13.             quest.unload(false);
    * Z+ f3 c& \2 z- S6 m, Y
  14.         }
    & m+ L& t$ v" w7 x' I
  15.     }3 c, H! p" W' {4 \, {, c. t9 P7 E
  16.     _quests.clear();
    # g: H3 ~. o5 a2 H- B) ~% q
  17.     // Выгрузка скриптов.
    ; A% I+ @2 ]% b7 Y, k
  18.     for (Quest script : _scripts.values())
    ' r: ?/ a% y" Z5 t3 ]
  19.     {  X, j9 F6 x6 p
  20.         if (script != null)* ^, [# a8 \4 n; W
  21.         {
    8 z/ u3 e: O7 {
  22.             script.unload(false);7 a8 v: x6 h+ g$ ~: g' p$ d
  23.         }
    9 h6 [4 g" b2 _- A$ J8 A' f
  24.     }% E! s2 W, j+ V& u0 D1 X
  25.     _scripts.clear();
    & z9 i% Q: s4 h% L* v
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    ) O  \* i  U" s3 x. n0 i

2 {7 E! A. h" R; EМетод report()! ~4 r3 |- q) M+ P, B

( Y! ^1 W- L+ f. P# I* p
  1. /**5 Y+ F% F: o$ n
  2. * Логирует количество загруженных квестов и скриптов.
    $ X9 s) @8 E8 x+ k) y% c: u
  3. */
    . O" w! V: w0 E* a% g3 t1 I( u; _
  4. public void report()
    ' g! `+ I3 G4 N7 U4 v
  5. {+ @- [0 \- l5 y& r
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    ; a: F0 X. {: r, Q3 z+ e0 M$ ^
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
      I. ?  A4 J+ @, X6 S
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    0 D2 \5 J, @% D# w4 n

0 ~0 U! v7 \- D' z! d7 [/ _/ t/ I2 nМетод getQuest(String name)
7 I8 C. B1 |. F* u8 V
4 W, e; F" r7 W4 P6 f$ o
  1. /**4 d$ M' L' {- \: g6 {3 e% c) N
  2. * Получает квест по имени.# w$ p( R1 J4 O5 J. c6 i9 z* W9 a# z
  3. * @param name имя квеста8 J" A3 V1 A7 e
  4. * @return квест# W$ H( \8 B  h4 d
  5. */1 W/ _4 r- p3 G; a
  6. public Quest getQuest(String name)# ~3 A/ M# [; C
  7. {, ]( c2 g$ B  M+ X
  8.     if (_quests.containsKey(name))! [6 ]) [2 X) e) w$ d
  9.     {2 y8 t4 q9 M: D
  10.         return _quests.get(name);
    1 U' J% n) |' [7 Y
  11.     }8 T5 }" ]5 d- v: C- V) ]0 F' n
  12.     return _scripts.get(name);
    % B1 c  d0 H2 O+ Z* V
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.2 }, f" G' O8 ^" H% I# H
. N$ s+ t* d" B
Метод getQuest(int questId)7 X- G5 g1 \  m+ K+ q8 }) |

& ~8 a' u1 y) ^& a9 Z
  1. /**
    , {9 z& W: U# r+ Q; n) _
  2. * Получает квест по ID.
    . y* v, z6 x5 L  Z; Q, ^
  3. * @param questId ID квеста1 C. F* U" \/ P$ d2 g
  4. * @return квест, если найден, {@code null} в противном случае# u" @1 L- Y* {* M' v1 d
  5. */
    4 n2 U: m0 Y, N% R% b
  6. public Quest getQuest(int questId)
    . I2 \3 K! o# W
  7. {  i. H- A: I6 W; r
  8.     for (Quest q : _quests.values())
    . n2 z& \1 `; w2 |' H0 w. S' E
  9.     {  K# [) |& G% v! F+ _
  10.         if (q.getId() == questId)
    $ u5 @8 R1 Z- k. {
  11.         {' g9 b* d1 S5 i: Z- c
  12.             return q;
    9 e; `+ G; F  g7 K/ k5 N% T! ]7 S3 f
  13.         }+ s; v( v. w7 K- H) y1 t
  14.     }
    : L% B! k7 s2 ]7 D9 b7 U
  15.     return null;4 P* }7 x$ u4 K- |  g! ~  x
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.7 ^! ~) k; q9 F/ x& f4 ~
5 Q2 v& _" @0 P$ B0 `$ B" H
Метод addQuest(Quest quest)9 `4 d, I$ Q9 S2 h  m# P
4 F. Z/ S! c- n" N% r
  1. /**% [3 m3 i1 r2 q) ]! }8 D8 u
  2. * Добавляет новый квест.
    " W$ q1 z) F- ]" h9 k7 f" B
  3. * @param quest квест для добавления
    6 Y# j* k9 r  n
  4. */
    / ~+ q( k' Q" o
  5. public void addQuest(Quest quest)* e  D' c8 @: z1 c, C6 s
  6. {
    5 s0 r1 ~/ U6 w
  7.     if (quest == null)
      ]. p% w8 ]/ U
  8.     {# {% \: w# X& z" M
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    - M) O* l* S0 y" q( s$ ?7 F0 R
  10.     }
    9 b% D/ `6 l1 _3 J, G2 K3 H8 u
  11.    
    7 l; q" L/ }3 _( X
  12.     final Quest old = _quests.put(quest.getName(), quest);4 n& M: h0 V7 c% c2 q
  13.     if (old != null)
    - D' Q$ D2 z5 B4 D
  14.     {
    2 H1 Z; n; g/ o% `+ C* e, Y
  15.         old.unload();- O4 \* C2 y- J* B9 f
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    ( a+ B! D7 o5 h+ j
  17.     }
    + V* A$ @5 c  }% U+ j
  18.    
    - t; H- H  @; @
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)# f' D  b" s, o0 O2 W
  20.     {$ E" {4 m6 g  v4 F% C
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    2 u9 Y  L) o* z2 z4 O" G
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    ; C. _5 H& V5 @0 F% ^1 A
  23.     }
    : ^0 D9 A- f/ T) \
  24. }$ q# |' Q9 ^4 _+ `( {2 Y4 I
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
2 I) U4 U3 q+ M* cЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере., H" L' r1 |+ @) U! d8 A: T- [
) t/ a7 t7 e2 X! I, v: E- g

: X4 ]' v3 @" N7 B7 ]+ G1 e3 w& i, ~: \
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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