Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius; |4 h! R5 V" ~' c' A" q4 g, \
7 t6 M: w, O9 w* z
Разбор файла QuestManager.java' a! O9 J+ o6 j3 N3 T2 g
3 Q4 ^9 s( r/ C; T, x/ [' j8 h5 {
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.& e& U) N4 k! `. K2 J" a6 m
Основные элементы6 E' s( @- [  R" N6 d
  • Лицензия
    . L0 C+ y5 O& m1 a" }
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      % z" W) }; Q* c# B. X
  • Импорты
    0 d; w8 n9 Y0 u4 o& S; \. [/ A3 N! y

8 k; h2 ], y9 U+ t/ [' cQuestManager.java — управление квестами и скриптами.
! j/ b( l/ n+ B$ ^; mПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\! i4 g$ d' l! l5 G1 B
0 u3 R: |4 ], l+ P- f3 b! j2 p
% k& R; w( O0 L
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.3 ]; p; K, h0 r' d, `" Q
1. Лицензионное соглашение
0 p& V3 C6 R6 x; B* d1 W& ?
  1. /*/ m/ w% L8 s4 c0 n* k0 m/ \
  2. * Этот файл является частью проекта L2J Mobius.
    6 H9 l, o) n  R
  3. * 9 I0 A& Y" ]8 s/ d8 ?2 G. p3 ?
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять6 h% m& ]7 S" x7 F* K' o! I
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    3 _6 y: c: o' x$ a
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    . i3 k- c* S- l7 B
  7. * : m# v, S! J# @& m) ]
  8. * Эта программа распространяется в надежде, что она будет полезной,
    + W8 h  x. ]* \8 `
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    % u5 w  c0 v* a! D) h5 g
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.+ x! }" m5 A  J+ V+ H1 Z5 h$ z
  11. * См. GNU General Public License для получения более подробной информации.$ ~  B4 T; V: G5 G
  12. * ' L% d0 [2 v: j+ e
  13. * Вы должны были получить копию GNU General Public License  s9 m3 ?# p1 H2 |' I3 u
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.4 [8 R+ J5 g# M0 |. i. O  U
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.4 w4 L- |% n: d3 G
. z5 b; X9 Z+ [0 |; Z0 {

/ T; Q& k* h# u9 q- C3 T2. Импортируемые библиотеки( ^" g( v! L; ~) n4 W* Q

7 j& f0 R* B; k
  1. package org.l2jmobius.gameserver.instancemanager;: b7 F8 l8 E8 l- n9 k. e# {
  2. 2 M  x. A) v0 w: O1 ?; F
  3. import java.util.Map;
    # ]' E  E  z2 R. L- J
  4. import java.util.concurrent.ConcurrentHashMap;( ?. N' K# z2 O' {8 g/ j8 h0 U
  5. import java.util.logging.Level;. `) g" a& V4 @: A$ p2 @' B; }% M
  6. import java.util.logging.Logger;
    ) I0 g5 a0 z1 H2 Q: }
  7. ) I; J. [. {( j1 R$ T; x
  8. import org.l2jmobius.Config;
    2 Q, F, K  w1 z! Z/ c
  9. import org.l2jmobius.commons.util.CommonUtil;3 d6 ?4 g! p5 F; G$ O7 v- n
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    , j; y5 k! ]$ o' }
  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 — менеджер для работы с игровыми скриптами.0 t% N) q  B, \3 U& q1 S+ {

5 e& P) m# G9 B/ M, C3. Описание класса QuestManager
( W4 `9 X8 o; F9 R; W
  1. /**
    ! i* h, C; E6 w/ s
  2. * Менеджер квестов и скриптов.
    " }7 g, Q5 R" K- a/ ^, `" T; V
  3. * Автор: Zoey768 G* b  C4 A' ]7 Q
  4. */
    , B: C, A  X! j7 i% ~3 O
  5. public class QuestManager
    9 q- h2 b+ F' ^( H# K: W
  6. {7 z/ e5 r( J6 E/ H! [0 x5 o# y
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());. y% q) r* x& i" f+ B
  8.    
    ; ?9 E+ c3 F: w
  9.     /** Карта, содержащая все квесты. *// k, f( o8 i9 d5 A; W
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    " K& ~( g8 d( Y, a& z
  11.     /** Карта, содержащая все скрипты. */
    - J% o, U% y- \8 Y
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    2 ]. E- Q) N0 z+ D, m
  13.     9 O  m! a+ ]( @4 A* l/ X- o
  14.     protected QuestManager()
    ! Z8 _9 @, c- a* M9 O5 L! g
  15.     {7 y, i9 `, [& g9 ~+ Y' ^3 ?3 r
  16.     }
    ) @+ T( H4 p. ?6 w; J# n* H
  17. }
Скопировать код
4. Методы; L% B  S% G' W1 `" Z/ M
Метод reload(String questFolder)
% H2 x  m8 n' Y7 h9 k7 k2 E* O
  1. public boolean reload(String questFolder)
    5 b" i1 C2 U7 m; Z" Y
  2. {% g5 q" o& w4 K9 c9 d
  3.     final Quest q = getQuest(questFolder);: e) v; K( m8 r, S% {
  4.     if (q == null)
    - L1 l7 r* z6 e$ b9 W
  5.     {, B4 t+ l8 }0 N  e' e
  6.         return false;" [# F0 b! _2 S
  7.     }
    1 c, P( b2 x, g: v5 u
  8.     return q.reload();9 X, U3 Q, J7 j/ c7 M- P& S
  9. }
Скопировать код
9 S2 P! n. P) n9 }/ z0 V5 z

# e+ ?/ B6 E6 W& k9 W  Q  YМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.5 F* ?- P$ w- P: L
Метод reload(int questId)! u8 |- l& w. z! \1 X0 Z
7 Z' a+ N# l$ c0 s; ?7 v) y
  1. /**& t% F# V6 w3 l& `
  2. * Перезагружает квест по ID.
    # ]- X7 ~0 x+ G: \. y* R& ^
  3. * @param questId ID квеста для перезагрузки9 b- j  ]' x$ Z. N
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    - J7 U  {6 {5 k0 E! l: T
  5. */0 O  e  U8 G+ e2 x
  6. public boolean reload(int questId)
    7 K3 k' r/ w: K/ R# w
  7. {
    3 G. @: O, T/ m$ z7 }
  8.     final Quest q = getQuest(questId);- U) B* e8 b# _$ s4 B
  9.     if (q == null)
    % C$ b3 m4 o6 z" a! s
  10.     {
    ) H1 o/ e& e9 ]# q2 V- {
  11.         return false;
    8 Q% O8 _$ B$ G& |6 @+ M$ b
  12.     }
    3 |3 z, g! h5 p6 E
  13.     return q.reload();
    . U& L4 ?% v5 l" s8 n
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.- X: u/ R5 N- V, j' k5 S

3 p4 W  [: q, O, @$ |Метод reloadAllScripts()
0 ]4 \- W9 a. T4 w# c
: s  G9 P' _7 b0 j& X* N( ]
  1. /**
    8 k7 H  ~1 G! H7 a# S, s
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.& c  a0 \3 M6 k( T1 c3 E
  3. */, r  \, w6 ~, c9 V" g, I3 D
  4. public void reloadAllScripts()0 u* F8 [2 p  \9 p9 A2 r  E
  5. {
    1 j1 G. f3 w' e+ r4 r
  6.     unloadAllScripts();: G( M; ^; V' H, s" u( a
  7.    
    - ?1 x6 j2 D( C" d+ @
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    7 q. p1 S3 W, v" x' W. B2 w
  9.     try
    ! l; ^  w% \  j0 F8 \/ ?
  10.     {! V: u/ y6 D3 c
  11.         ScriptEngineManager.getInstance().executeScriptList();4 Z* Q; C4 r0 Q
  12.     }
    / D$ R0 p, s; K& G9 G" b5 v! b& |; w
  13.     catch (Exception e)6 c8 J' C. x3 ~1 ^6 T
  14.     {+ O. [; h2 i! ]+ _$ F" {
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    . O# v3 I3 J( [. O
  16.     }
    + f. k$ m  y0 p7 [+ M- r
  17.    
    % E5 u$ E8 ^% f0 E, P! z" b( J
  18.     getInstance().report();
    ' a+ U. ~0 H! O; D$ q$ a
  19. }
Скопировать код
Метод unloadAllScripts()
8 j8 _$ @) d' U. C0 O3 H+ g% ?2 _. E8 k. r
  1. /**3 o" |$ ~1 r# X& o$ B" b, ]
  2. * Выгружает все квесты и скрипты.
      o$ b5 s" z3 x  \1 z% @) n
  3. */& f' b2 E  K2 z# ^9 d; U
  4. public void unloadAllScripts()- {1 @3 Q9 Z6 B1 W; i# S1 E2 q
  5. {: k  I; s& R9 E  O
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");) V3 ~- V, t- d6 ^* Z" }( ]9 N4 R
  7.    
    5 L% v5 z" g  h# S! @7 q' z
  8.     // Выгрузка квестов.8 J) H' p; m4 F
  9.     for (Quest quest : _quests.values())- p- |3 w6 r9 Z4 b
  10.     {
    * u$ ]/ L  U$ b2 y
  11.         if (quest != null)3 S6 ?0 o2 ?6 z6 E
  12.         {; s5 f  Y& O0 [2 f. T! @
  13.             quest.unload(false);! M+ t8 G% D0 h0 Z3 g: t! n
  14.         }
    2 K* [$ [- _; K3 i6 V
  15.     }
    & |. Q) o4 u, Y7 {
  16.     _quests.clear();
    5 S* }1 r9 l+ S$ ]% E; {8 k
  17.     // Выгрузка скриптов.; z$ d- J( O% u3 w' E. h( Z
  18.     for (Quest script : _scripts.values())7 X) r$ K1 t0 ~' j- G$ W; E
  19.     {8 ~4 e: N9 O+ @7 o" t  D
  20.         if (script != null)
    8 m. `6 k8 ~$ H
  21.         {( `$ b/ u$ p1 H) u  F5 Y- g' [. n
  22.             script.unload(false);+ S2 _. B* N- i
  23.         }: B8 ]: M$ e' N8 T8 E
  24.     }
    # g5 a* h) O+ {3 o
  25.     _scripts.clear();
    " z% y* z6 `# H. |9 ?+ w
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    1 ^" F4 b3 {+ S( @# y6 o9 R
, Y; V+ l9 X- O7 a! @) N# h% k
Метод report()( Y! x6 S2 j' T. i9 [9 {3 s

. B$ T' x: W* I3 \, {
  1. /**" n1 R# j' p% {! U: [/ i  [/ D
  2. * Логирует количество загруженных квестов и скриптов.
    , L2 \- s) m8 b  c3 i
  3. */) t  |4 l! \# [! ~) t0 D: x; R
  4. public void report()
    , l+ D" f. @; B; ~, c* K: |
  5. {
    ! A8 a& o0 s/ b; V" Y" }1 E
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    0 P" r  ^, x# j  I. b
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");) n$ E3 L- Y; [0 n' y5 M) J$ I0 e
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.5 u3 D3 ]2 G$ ^" Z2 r7 y

( B* z, @0 b* IМетод getQuest(String name)
8 ]. Y0 U$ I; G: O  c1 v
9 T7 x2 r+ ^& ?& k
  1. /**
    3 p, U: n! }* n  |( M" \
  2. * Получает квест по имени.# f: Z" `; u% w  Z, a0 U) N3 q
  3. * @param name имя квеста
    & a5 U, E. V. j# m  D5 T
  4. * @return квест* U7 Q* n# o( V3 q3 `8 q6 m
  5. */
    " K  x8 P; L. u- G( v
  6. public Quest getQuest(String name)8 S5 b# b7 D# Q+ C- |- y) S
  7. {/ E/ Q6 D- Q4 E! p8 b7 A5 H1 ]
  8.     if (_quests.containsKey(name))
    - T1 y$ Y* m/ k+ Z% B% U) @
  9.     {$ [9 K+ M) r: T% ]
  10.         return _quests.get(name);
    ! g8 A1 D$ s) }% l
  11.     }2 d. S5 R# i( X
  12.     return _scripts.get(name);
    & b' }3 |+ Z0 l6 m
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.- h$ ?0 C" u2 C% J$ M- F7 ]
9 b8 S, b9 h4 [/ N8 L8 R
Метод getQuest(int questId): `: T& h$ d) @9 H/ V/ f
/ e3 {2 }  z: T& P
  1. /**2 ^: T% q. d+ b& W; u2 q
  2. * Получает квест по ID.
    # ~( |) H3 P, M# l; z
  3. * @param questId ID квеста
    / ^4 B1 O1 f7 H/ O  g( F
  4. * @return квест, если найден, {@code null} в противном случае
    " }" d5 K' q2 n8 a5 \: \! y# @
  5. */
    - P: n6 s+ H( T1 w7 P
  6. public Quest getQuest(int questId)- y$ _. F# V1 U% ^1 d6 a
  7. {! B0 {! C" f# K7 m) b9 m3 l
  8.     for (Quest q : _quests.values()): @' _* n; x* W) o, a- |8 m
  9.     {
    ) }$ d' f$ a/ i' M0 f8 |) ?0 ]
  10.         if (q.getId() == questId)' v! |9 J4 k9 ~# s
  11.         {* A1 t7 H1 i: n8 ?0 c3 M
  12.             return q;+ U, t7 m# J9 B# m9 [9 [
  13.         }: R, X! G4 ?( B3 x0 ?
  14.     }( x9 ]# u/ o7 Z) C3 X
  15.     return null;1 |- D0 N1 S! v
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    ; U; S- B" f7 \" L7 n

+ L& i8 ~$ N' iМетод addQuest(Quest quest)& w3 i3 D( D. Y1 T
% A$ P+ E# v4 y. r8 J. _
  1. /**
    1 d$ @7 z. B! p
  2. * Добавляет новый квест.
    8 E  o( }) N, M8 n, _& K3 T
  3. * @param quest квест для добавления
    % y9 W3 i9 c. l6 _$ m, @& H
  4. */
    1 w: s9 x+ C2 L$ H& w
  5. public void addQuest(Quest quest)' i% X! U$ K- |$ y+ W0 d% i# ^
  6. {4 D) ?* A6 \  i4 w! C
  7.     if (quest == null)5 m+ e+ w+ R3 P  J  P2 B6 P
  8.     {" t" }# P4 V) ?
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");0 O! R8 T" N3 P0 o0 r0 E
  10.     }
    8 q( C+ ]8 o" N
  11.    
    # C7 A( n& @: D! E7 p
  12.     final Quest old = _quests.put(quest.getName(), quest);
    - e* b2 U9 {4 L7 e6 Q. ~5 K
  13.     if (old != null)
    5 M2 i+ ^5 [& |2 U( O0 C- R, }
  14.     {* R- Z, A: s& ^/ w5 i2 E8 A
  15.         old.unload();
    0 x: Y6 ^. Z0 s7 E$ t: U
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    + Q& h( j1 A6 c4 N# j: C% z
  17.     }& a7 U2 F+ Q. [$ r
  18.    
    ; X* o9 _7 D* S- N
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    % p! Q+ O/ ?/ e$ c" f6 N& v9 z1 K
  20.     {# e$ s0 y3 h, s1 p% l5 X. U* R4 N# m
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    9 i: n" a5 {$ W, o
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
      {$ O, s0 |' F$ k- `. h
  23.     }
    * z; J& [7 ]4 x* x
  24. }
    , O) ^( V4 ]* M/ r! b. {% ^( G
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.8 g% w: b+ n0 `7 ~
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
% H8 b: [" M! y+ r/ m; Z' q4 |; Z: ?$ o! H
9 y' u3 l; `( P$ m3 W0 B) ?1 B, x

! H( u7 ~  e* c
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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