Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius# A- h. D5 e1 L7 w
# B' D- D# u* m( E
Разбор файла QuestManager.java
( R" e" i! H& \4 o% u' y
/ @' t. D# m% rЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
9 R8 V" j" m+ b9 ]Основные элементы
6 ^) s3 y4 {1 ^4 X% z, L9 V
  • Лицензия
    , p  v( U0 n6 E. |! g
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      5 o# Z8 U) h9 Y/ ?
  • Импорты
    6 B9 C& v( L8 L7 l9 D- w* h$ e

7 o+ h  G9 m3 i+ j( F8 q! IQuestManager.java — управление квестами и скриптами.
2 `7 t9 j* }: B( ]Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\/ V9 P' ]# ^, m; c5 Z! a

7 l2 t  ~9 s2 G: m7 |
8 R  U  v* [1 c1 ~0 i5 \( `. \
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.# R5 V- L1 a. H* c8 d3 D
1. Лицензионное соглашение/ M0 e. {2 I5 R5 n) v
  1. /*! `$ d' u" f0 T9 e
  2. * Этот файл является частью проекта L2J Mobius." F7 y  }8 S/ L- D! U4 s
  3. *
    2 N- d2 X. B4 g
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    7 {$ M$ J3 L0 _) R7 Q
  5. * её в соответствии с условиями GNU General Public License, опубликованной& ~0 n# C) R6 R' P+ T( o) q8 k0 v/ I" U
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
      X$ V, w# d% \6 S
  7. * 1 p* n6 Y; x) o
  8. * Эта программа распространяется в надежде, что она будет полезной,
    ; R! X5 O' R  [  H3 E
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    ; p" }3 Q% k& e' z$ v8 o
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    3 ?2 d  i0 n, h% j; U
  11. * См. GNU General Public License для получения более подробной информации.
    ' {$ O: ~9 \. ~! A2 B
  12. *
    # g( q# g/ o; H2 W. g0 d' x1 {
  13. * Вы должны были получить копию GNU General Public License
    + c& Q. T" m; ?" N
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    6 z7 U% r- r) f4 ~
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3., |: J1 U2 W" z  h0 A) d( m2 k
# A3 e7 U, }7 K0 b9 p' \

* c2 [, u% t# F) m2. Импортируемые библиотеки( \: q: c- w" H. R
; v1 g: P' l3 E# d
  1. package org.l2jmobius.gameserver.instancemanager;, a0 R1 O: J, k" r# q( Q' B. L2 z
  2. : c! X. C' q2 J
  3. import java.util.Map;" j- m7 W; y6 ]
  4. import java.util.concurrent.ConcurrentHashMap;
    ; S  @. v* ~. m1 {) S- {
  5. import java.util.logging.Level;8 Z5 i4 n* @' n2 t
  6. import java.util.logging.Logger;
    # {. m8 C# F( ?- E" r
  7. # i! D/ S& w, c: V
  8. import org.l2jmobius.Config;
    9 ~3 e! T4 R2 H$ t& @/ B$ Z
  9. import org.l2jmobius.commons.util.CommonUtil;3 P1 D+ w/ I: i' O% i
  10. import org.l2jmobius.gameserver.model.quest.Quest;# s: Q/ B1 D% ^  i" M, g
  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 — менеджер для работы с игровыми скриптами.8 e& v& g* U' n8 v9 i! ~' k

8 t5 d4 N- j) j- w9 [8 N" m3. Описание класса QuestManager5 z+ Y4 F! m# _* ?
  1. /**
    : c9 c; C; i2 e/ S
  2. * Менеджер квестов и скриптов.6 S. {: t3 r$ h/ d
  3. * Автор: Zoey76
    3 |$ s+ A  H; j2 d0 y, N- a9 J
  4. */% `: j2 n8 f- }" C4 U+ Q8 d& K3 k
  5. public class QuestManager
    5 q# c7 s, b, E$ V
  6. {
    7 L* t$ B# y5 h% @6 e  Q% G  u- @
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());1 l4 n  H9 J6 a: e
  8.     * Y4 }; C6 t- ~' c
  9.     /** Карта, содержащая все квесты. */0 G) B* Z; i- I4 E) I- Z% @
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    ) Y6 r/ ~3 z" N
  11.     /** Карта, содержащая все скрипты. */4 w8 }$ E1 s0 L$ q, S0 P' k/ V
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();1 N; N3 N1 C" f0 i9 d
  13.     % O( k2 K7 [+ l! ^% ~
  14.     protected QuestManager()
    1 q* X7 m# ^0 `& k4 O. P! N
  15.     {3 S( x# H9 f! [+ |- D6 F
  16.     }
    % J, o9 U8 E$ M: \$ P
  17. }
Скопировать код
4. Методы
3 z( }8 H8 ]7 T& q* rМетод reload(String questFolder)0 k4 v$ o9 H. D$ X7 O' h0 e; ?0 W# n
  1. public boolean reload(String questFolder)
    * G7 l& d( G" T/ L/ Z- w4 T  S
  2. {. x" k% |1 b* ~) Z  J7 ]% z
  3.     final Quest q = getQuest(questFolder);/ c+ u' y+ }8 b1 S9 g# T# U$ V
  4.     if (q == null)' |  \' A4 r! Y; i+ z* ]( V( E+ B" o
  5.     {$ A  U! w( F( f( V, w% T. Y! [$ [
  6.         return false;3 p4 M& I' O: J; u
  7.     }
    / Q) c# Y7 u4 y& U! J
  8.     return q.reload();3 R& T7 ^1 X, C( Y7 R# d& }# q* m7 K# O6 M
  9. }
Скопировать код
! w/ X2 [. Z6 G0 [' F/ M7 v0 b. S

+ b$ G9 M" X$ uМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.( t! g9 t2 q/ w# [3 L0 c# p
Метод reload(int questId)
* ?' n0 ]4 L( p  t8 x# {/ W0 G  E
6 R( N+ J$ N( B- C/ k6 p
  1. /**% P4 R; C, j9 @. u- `; o: G
  2. * Перезагружает квест по ID.0 h3 n3 W; i5 Z/ h$ [
  3. * @param questId ID квеста для перезагрузки
    - c' f9 i' C) v, H2 q. I* f7 m
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    $ l( x* H# c9 i7 g& v7 o/ s
  5. */5 ~0 B; K% Z* V, W1 M: R5 o
  6. public boolean reload(int questId)
    3 s" t% m% V- d/ x
  7. {
    2 ^/ O  Z) X6 c6 s; X
  8.     final Quest q = getQuest(questId);) \3 b- I! N! _6 Z2 @, s5 Z
  9.     if (q == null); |8 h& z3 l: i
  10.     {- I9 U: Q0 E' [% Q5 e" L
  11.         return false;
    2 F; }2 K& _$ |3 ~# }4 H8 ~
  12.     }) H+ t- G  Y% C+ n1 C4 x5 B9 L
  13.     return q.reload();
    8 i3 [. h2 `  r& a2 D( o
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    0 [3 Q1 H* D+ `. u+ [4 L

* v& g- R! `- J) Y: T5 A+ aМетод reloadAllScripts()6 [9 A5 G3 U; J8 H$ F9 O

( s( L2 y9 h( ]( x2 Y- n& g
  1. /**+ G- X6 u" K& D# s# @+ H* U
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.' v' {9 `+ m( C- u
  3. */
    , p' I- i1 B: L% ]6 Z& o0 ?
  4. public void reloadAllScripts()% P8 i- S. [3 p1 ~6 o: H8 W
  5. {+ h$ `* H' D& d+ v3 q% ?; U0 v
  6.     unloadAllScripts();
    4 }. V2 v, J% }8 R9 F& Y
  7.     5 Q  x) }' Q% e5 b1 `* V9 C6 S
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    , n( ?, _; A! e8 y* Q5 U" R
  9.     try$ U6 D+ t% W$ Z' ~6 ]
  10.     {
    ) E) M( g. P" u6 b; C$ f7 j
  11.         ScriptEngineManager.getInstance().executeScriptList();$ p+ i! i$ v1 Q$ l
  12.     }
    % q" f, }$ ~! {; Q+ ^; j
  13.     catch (Exception e)  u; x* H4 |" {, b1 `- P: n
  14.     {
    5 V# g* d1 k6 R3 Q) w" U6 }
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    " T" {0 ?. S5 z8 Z& `
  16.     }3 ~' B" Z3 l2 Q1 t$ Z; g. Z
  17.    
    2 h8 H& h+ _- K; ?0 F2 }0 p7 ^, k
  18.     getInstance().report();
    0 ]4 A/ I" @, {0 ]; C% j6 M1 z7 b
  19. }
Скопировать код
Метод unloadAllScripts()
7 e$ Q( L4 G  G0 U" h) S( y' N0 j; R: O$ g. e* W/ i: q
  1. /**
    9 J( g- u+ y# S4 E5 E* I- \
  2. * Выгружает все квесты и скрипты.2 G: ^1 h7 x, m" J: h
  3. */
    ( Y5 z+ H1 s' T0 M& {; l
  4. public void unloadAllScripts()9 a( _5 E; I- Z3 W+ y) R# L
  5. {0 x$ i9 \7 P, c4 n
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");5 G% h; ]6 X3 n6 M
  7.    
    0 [4 o2 p7 o; [& U7 p- P
  8.     // Выгрузка квестов.1 i9 N: T3 _4 a2 R6 ~" `3 @
  9.     for (Quest quest : _quests.values())/ m7 _5 S. Q/ u( `
  10.     {
    4 c) f# z% ?  _- K: J
  11.         if (quest != null)" {' J, V& _% [# B
  12.         {
    % ?6 n! e/ D* L& h) n
  13.             quest.unload(false);
    5 R) m; u# c% f- c% R' m
  14.         }
    % g' i, K/ e/ c- L2 V- V2 n
  15.     }
    $ p" _' Y$ S' |
  16.     _quests.clear();
    + ?; |; q* r+ O! y4 G: ]  ], i# N( ?
  17.     // Выгрузка скриптов.1 f, b: c+ J0 ?+ F# O
  18.     for (Quest script : _scripts.values())' f+ m. f5 x+ V4 w! s3 B3 }- v
  19.     {# m$ X& z  r! m" S, b
  20.         if (script != null)/ i' o8 K+ L+ O$ }: U9 b# u! u5 A
  21.         {+ C7 S8 ?, ]; Y; c
  22.             script.unload(false);' u* w4 m2 _2 B* e
  23.         }
    1 i9 w; W6 p' I; s' E8 }: u8 \. {
  24.     }
    , t% v' S; O! I; X; ^( o, G
  25.     _scripts.clear();& q  Z5 t0 I1 T* P& ~1 r5 O
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    . `7 B% E# q5 ]8 X

! A5 K. R0 w1 P- s+ I' z2 uМетод report()5 Z9 D6 ^' U7 |, t6 P/ t* m* _# r

1 q$ U: }, m+ X; B$ l
  1. /**
    " `* {0 Y* N+ S5 e( s
  2. * Логирует количество загруженных квестов и скриптов.
    0 ^3 U/ `; l2 |, p, Q
  3. */
    3 v1 c) U& V8 S4 ~8 x+ l6 Q. X) Z
  4. public void report()
    7 g) b% Q9 s5 l( f; h, ~0 N
  5. {
    3 `. i3 p) l5 X3 t1 ]
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    $ e9 `/ D' z7 o# M- D- P# D
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    3 O$ V4 n  j' |* n$ k1 L4 X
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    % i+ I- Q4 l. \9 K' Y( k2 E. W
0 I7 p) n) s& U4 {. x9 V
Метод getQuest(String name)/ r. b$ |, S, j; m2 P

  X0 }6 x/ \9 [) D3 _/ a
  1. /**
    ; b7 {3 o: L" a. g( R+ Z% b
  2. * Получает квест по имени.
      t8 i) M: W6 \4 O9 q
  3. * @param name имя квеста
    & S# @- o5 H. T6 s7 b
  4. * @return квест* J. m4 @$ [7 @( ~  C) H
  5. */
    0 v& M" m' Q( W# V: M* ^
  6. public Quest getQuest(String name)
    / R- J2 Q* j" y5 X% R
  7. {0 n% ~/ g5 X/ V* K
  8.     if (_quests.containsKey(name))) R. X+ d$ n: H9 [. Y
  9.     {
    7 P6 G# f/ B) |  u. p2 Z
  10.         return _quests.get(name);9 a5 X; g' O# ?/ W% {
  11.     }$ ~) e/ ^3 J, D+ Z( a( a
  12.     return _scripts.get(name);, Y. X9 P9 Z3 X
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    ( u0 `( a' v0 p4 Z  N4 b

4 G6 g5 c6 ~* J( o  k. JМетод getQuest(int questId)
, z9 ~: r  {' V( }8 d
) R  M$ O( p5 g1 y
  1. /**& L0 h! k2 T0 o
  2. * Получает квест по ID.
    ; o# l' ?$ I6 S: L- S
  3. * @param questId ID квеста
    7 M/ K1 V0 v, B% s
  4. * @return квест, если найден, {@code null} в противном случае) P$ |0 A3 M" c# y& a9 O& I; S. s
  5. */
    $ r9 }' i: }/ y3 f7 ]* t/ p# w
  6. public Quest getQuest(int questId)
    " R4 g4 t; ?7 R- z
  7. {. ]: G1 S. _' p% G1 p) \; y
  8.     for (Quest q : _quests.values())6 C& X: Y7 Z, L; @* z
  9.     {
    3 h3 k9 _+ q; p
  10.         if (q.getId() == questId)
    ! {3 j3 t5 Y6 w+ p4 ]' G  S! v
  11.         {
    7 f$ a, l! k$ }
  12.             return q;
    / ^4 [; L) F3 }3 t0 k  z' w& S
  13.         }
    * ]& F5 @5 q4 W8 t
  14.     }
    & f. q% I3 J! ?. L& u, C. H  Z( |
  15.     return null;
    : _- n) [* F: S1 h1 b
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.* |- Z; @* k8 h

) ], N: M; k& s1 ]- g( y# r0 vМетод addQuest(Quest quest)
2 W7 N" D- m- M; a1 j& v
* S# v5 V" J- i
  1. /**5 I2 D6 H; ?  m5 E$ L0 @* P1 y% h0 f
  2. * Добавляет новый квест.9 M# s1 s0 ?$ D0 Q, y8 {4 ]9 F9 I
  3. * @param quest квест для добавления+ Z6 d5 K2 D4 `4 ~
  4. */# U3 J# U4 ^3 ~8 u5 [, ?! I8 @
  5. public void addQuest(Quest quest). L' R$ e7 _- _- e- j
  6. {1 L: z. E: q: t: l+ S- B
  7.     if (quest == null)
    $ g+ ?4 d* M  \7 T
  8.     {
    ( v" l5 A9 c3 [
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");2 O( G* Z: u9 N, M% E
  10.     }' f3 G; J. z4 l/ C8 p% L  f% r& x
  11.    
    7 u% H/ d: e, k
  12.     final Quest old = _quests.put(quest.getName(), quest);
    4 `2 g7 N) h+ S
  13.     if (old != null)
    ! N* r1 U) e3 H- ~
  14.     {
    5 k; |  ?; d5 \% q( L- l& q
  15.         old.unload();
    & l* q: q* I6 p- V5 F( v/ F! ^
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    ! `1 P( R6 O6 H$ D
  17.     }
    3 Z9 ~6 f& S8 L+ ~0 y/ `
  18.    
    ' t" f) j+ Q; O. ?8 ~
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    7 n) b3 r8 y6 o2 R2 `6 Z
  20.     {
    - Q8 W; t/ h8 O3 t# n  ^
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    3 o2 V) [! _* |7 f1 D; G
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    9 x8 q( F1 r! J) N, l  ?+ q, K
  23.     }+ L4 z0 L1 v( `+ B' N+ o; U  o
  24. }
    9 [( c8 s% `) ]( ~" Z
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера./ l- @9 f: W( p0 _0 j! d; D
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.- W  N0 v3 _" C! ]/ f4 h9 t

( [0 K8 J, R, L8 J- f( R  R& U
/ v2 e5 N, B, b  s+ j( O; h3 c9 G$ i: B  u
2 o0 S, h# r( o% j! n7 C3 }  R: s
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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