Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
5 U3 b3 f! [% U3 T8 H3 y$ m& u8 Y" h) D# m
Разбор файла QuestManager.java
% z& H: [& {" n) ]% m. {' p( t/ G% I6 F9 `  M3 T
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов., Z6 o2 S/ m, ^
Основные элементы
' Z, l4 t; j  N- T% X2 ~
  • Лицензия: y% w; o& v* ?5 `
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      ; E) G# n5 W9 I" U2 c2 }2 S. E, E2 {
  • Импорты
    : X* s+ x& a6 _! R1 z( E0 L0 d& i

+ e1 M( g: k1 VQuestManager.java — управление квестами и скриптами.
& a& @4 I2 C5 ^# y" E+ M+ F: \( H/ l8 IПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\8 `! Y2 A9 O/ B- f$ O
: F1 W0 Y" r* {2 q

( V: ]# m( }, _Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
6 m+ x# @! `! I; f1. Лицензионное соглашение. u% R" O, v4 @
  1. /*
    ) d, a# x+ y7 d
  2. * Этот файл является частью проекта L2J Mobius.
    7 h/ [' s3 T" ]) ~2 e! R# x
  3. * " x, N% n2 c" F$ x2 U. |
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять- |9 D! m1 m1 j- d) Y- p
  5. * её в соответствии с условиями GNU General Public License, опубликованной4 V6 \8 F: {' k  K" G( Y  j; }* `
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    ) L' L8 p) i7 X8 ^1 p
  7. *
    . O% N6 D* }' u4 I
  8. * Эта программа распространяется в надежде, что она будет полезной,- K( z  Z* ^2 Q% Y
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии' z4 t& G$ m" i+ m7 J3 S
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.& y$ r0 K) V, `2 c7 }
  11. * См. GNU General Public License для получения более подробной информации.9 J+ q( j$ A/ A( ]( u
  12. * , T" o6 Y6 v3 D& A. e" Q
  13. * Вы должны были получить копию GNU General Public License- L) k+ c) T- y7 [, v  M
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    6 |: u$ E' O3 z' b. ]
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.( G) W2 o0 ?) c/ G# b- o1 ]7 r7 L/ U
  [4 n  L8 |3 h
& Z/ c( @2 S! B
2. Импортируемые библиотеки) u$ f# U8 E, ~; t- T( }
1 z1 s+ j3 Q3 T  {
  1. package org.l2jmobius.gameserver.instancemanager;
    : {9 w$ t( \% s1 C. E
  2. ( Z# M3 G3 N: {, H$ b) x5 ~2 p8 _& c& m
  3. import java.util.Map;$ G. g5 N; B! I, l+ c. h' [# P' Q
  4. import java.util.concurrent.ConcurrentHashMap;0 r' y; |5 i! P- K  ?. Y) m: `
  5. import java.util.logging.Level;" u' M! @& J' _, _6 a  R9 @) @/ |
  6. import java.util.logging.Logger;1 i, x2 B" ~  U

  7. : v# E3 ]- @% r" I1 o1 I
  8. import org.l2jmobius.Config;% ], u' ?3 b% I( C
  9. import org.l2jmobius.commons.util.CommonUtil;+ R1 _: n* [' i5 o2 h/ y4 D
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    4 _% j6 o- F1 l% [% e0 z. k) h
  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 — менеджер для работы с игровыми скриптами.5 `9 g% v" ^( N2 R

1 u( d4 ], j5 z# h  ?+ y3. Описание класса QuestManager
5 C! \' I" I6 U6 U
  1. /**/ S& a; Y* ?5 d: O+ Z; s3 G1 q
  2. * Менеджер квестов и скриптов.
    * F1 h, C5 p$ _& @
  3. * Автор: Zoey76
    8 M3 k3 j2 f9 f6 b  C4 Z' x
  4. */
      h$ T5 J/ K3 R
  5. public class QuestManager! q4 s& C( l  f  K; ~) k
  6. {9 k- _: V: E* d0 g- g; X
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());7 g% l9 [$ A! C% }, p
  8.    
    ! b. L4 K9 k! a4 j5 R$ J( m
  9.     /** Карта, содержащая все квесты. */) v) w$ T  p" F6 G5 I
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    # F" E8 O) A3 o+ r  w! r
  11.     /** Карта, содержащая все скрипты. */3 @2 o% I& R6 u# J6 Q: b9 P$ q
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();4 B, }0 _" F( [% L1 U: g; b
  13.     6 I) Z' ^9 Y: F
  14.     protected QuestManager()" ^- U0 F' \: p. Z
  15.     {
    ; l9 T+ o- t# }- E7 l5 l. F
  16.     }
    ' o$ |2 E8 O+ s! x6 T3 ^6 F6 @
  17. }
Скопировать код
4. Методы
5 D9 Z: F/ f. x8 D5 ?4 ZМетод reload(String questFolder)8 F, I) S$ a! A8 B# c  N! \$ [
  1. public boolean reload(String questFolder)
    - p. q% n4 @  H4 h9 c, L
  2. {
    8 i) W& d; c. ~8 A
  3.     final Quest q = getQuest(questFolder);4 `1 I0 |( Q3 \5 R7 \3 o
  4.     if (q == null)
    : ^/ g' I- D) `% I7 ]: d6 w
  5.     {
    # B3 B* h6 j/ b3 ~5 Q! p  F4 c4 U
  6.         return false;
      d3 `3 f- i2 b, l) @: L/ G1 D* M
  7.     }
    ( }: q# l+ ~# M0 l/ v4 G8 \
  8.     return q.reload();4 J$ d, f+ ^( V/ P
  9. }
Скопировать код
3 Z2 ?4 o4 l; g: Y

: B2 u2 p0 b+ k/ c7 DМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.7 b: s3 |! a- Y- v/ n
Метод reload(int questId)
' A+ ?) l7 B: t. u
$ G0 t5 t& A5 d- u9 W
  1. /**
    7 D6 |4 M; [. ?/ m. s
  2. * Перезагружает квест по ID.
      {8 P" s* I) {1 v  m8 ]0 G* b
  3. * @param questId ID квеста для перезагрузки
    , X4 m/ @- x- X$ U; y5 i  F' P& ^
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    8 w1 h" P3 u9 [8 E" r
  5. */% ?7 n6 S- }; F( w/ D0 {' R( y- V
  6. public boolean reload(int questId)
    1 G, h' l# z" O( o! E
  7. {9 G6 V8 ]% I8 \: t
  8.     final Quest q = getQuest(questId);4 J- b  Y) L3 p" ]9 i1 d
  9.     if (q == null). |9 z7 c5 f2 y% X9 R2 q8 V
  10.     {
    6 L9 l. @: T6 I# }' z( M( H0 j
  11.         return false;: y, d2 u- j. \( T/ Z4 H
  12.     }
    0 A) [3 e. q( V  k$ h% A
  13.     return q.reload();
    ( t; T5 u) ?- V2 {- @# H6 u$ h% r8 a. Y
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.- f9 [" c0 P5 L4 Y% X1 [

% [$ u2 T2 k1 WМетод reloadAllScripts()5 O0 b: r% T  ^" o- ?
' p! ^+ z0 i5 t% B  O! z" L8 w; I2 V
  1. /**
    4 M" N8 l- x& T) S
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    ' ^& ~& Y1 N1 l2 c1 _
  3. */  S  d6 |8 V* l% |- i
  4. public void reloadAllScripts()$ y6 Q6 ]  d& S% a$ b. n. L
  5. {
    ' @/ c/ z' [7 I9 @3 ]4 M
  6.     unloadAllScripts();7 b$ I8 M% Y  ]) g# z
  7.    
    % Q7 f% K; k. R9 U1 `# T! d( \' s. h& N
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    " u) X7 q" A9 p4 b, m
  9.     try
    % ]3 l. B% x  Z# ?" m
  10.     {6 ?$ z* X* V: M* h: E: T+ {
  11.         ScriptEngineManager.getInstance().executeScriptList();
    ' K! S; @$ T4 [0 i' c" C" H
  12.     }* g% v: r3 _7 t8 w4 R. i
  13.     catch (Exception e)
    ) p% V+ c+ l2 B
  14.     {
    # G4 R  V+ i3 G* w: t2 n$ i0 c& q
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    . ~, G5 U% ]( x: H+ {) H5 a9 |: d2 @
  16.     }
    ' x7 B4 b; H* O
  17.     * z+ E; v! y( O# O
  18.     getInstance().report();5 }+ n3 p! t1 Y6 K9 H
  19. }
Скопировать код
Метод unloadAllScripts()
. r+ R% x# T, a4 [/ D
! u$ N  r& B" e& J: m# M
  1. /**
    3 W7 w2 V4 P+ w% u% E
  2. * Выгружает все квесты и скрипты.# d, f) }0 }/ X4 O( c& P
  3. */
    % q7 x+ p8 S  Y9 O1 Q; a0 [$ o: e
  4. public void unloadAllScripts()
    * G6 P8 P1 y+ K; ?% E) b. K
  5. {* s% ^# f+ J' k7 L. _6 {
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    " y6 o- W7 ~5 ?. a8 w
  7.    
    : X; j1 r0 L) s' h
  8.     // Выгрузка квестов.
    $ \. A& Z: b6 }$ J
  9.     for (Quest quest : _quests.values())
    ' z6 z6 B; [/ Q! g9 X
  10.     {
    . I7 B- K) _/ Y  J' B3 [1 X
  11.         if (quest != null)
    4 o" q5 O5 ?9 Q
  12.         {
    ! ]- A% I0 r1 h7 C9 a; k- L
  13.             quest.unload(false);4 R. u: O$ t7 Z0 I  l! |
  14.         }
    5 B- w& r; D1 ~% ~: U* i0 G
  15.     }7 ^7 q; `. T; i& K2 i
  16.     _quests.clear();
    * \- a7 T) k6 Y9 T% s
  17.     // Выгрузка скриптов.
    : L0 x* I3 e6 {8 B
  18.     for (Quest script : _scripts.values())
    6 s8 E9 s) F6 S, A( }( `8 T8 q
  19.     {" \, v; F8 l  X1 n& R- Y$ d
  20.         if (script != null)
    & j  j! @0 ^8 x# r. O! Y! R9 ~, p
  21.         {, k: k9 i5 f! o9 |! T' D! j8 R
  22.             script.unload(false);" S, Q' n: P/ M8 }5 p
  23.         }
    5 i6 w' S$ {( u) W' }$ g- w
  24.     }
    ( [( }$ q( a, w" y' i% B* V
  25.     _scripts.clear();* e& F( A: ?) D& M
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.8 R0 u* c  Q7 H; J8 X
" X$ R" p1 P! R$ Q' _
Метод report()
0 X( a1 K$ K  B; N
! O- G) u+ p) n5 a6 y* f3 ~+ l
  1. /**
    # F& z, t* q' R3 R; |
  2. * Логирует количество загруженных квестов и скриптов.
    $ j+ H' b3 B! b2 e
  3. */
    " [8 ]: t) j. m3 X' F7 I
  4. public void report()0 P$ \, J  D4 k2 o
  5. {
    - C' B2 o4 s& L0 P0 O: Q8 X4 L
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    6 D# J5 p+ s' E) M: R
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");: N, O* e' T1 G3 t2 s4 ~
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.3 ]$ i5 w" ~( A6 K

; b3 n5 m/ U4 x  W4 _- PМетод getQuest(String name)
" ]; G: z, Z; Z% y# r
  }# U3 _$ @9 N9 |
  1. /**
    2 N" O3 c1 h, l/ {) h; e
  2. * Получает квест по имени.: m0 w5 l6 G$ V' W% A& r- R
  3. * @param name имя квеста6 g1 k8 t8 [& y
  4. * @return квест
    7 R# z4 L& F% L1 _
  5. */
    % K! I7 _) J6 a6 o% q% W/ l
  6. public Quest getQuest(String name)7 d, y; c9 B: A. c
  7. {
    ' g8 J0 N# t- v$ c* U, V. J
  8.     if (_quests.containsKey(name))
    ' s# W1 i& I& R" ~2 m2 r% K
  9.     {
    ' f9 q, y4 f4 X% k
  10.         return _quests.get(name);8 @& w- C3 A, J/ M* a* X0 l, n
  11.     }( H& n# G) p& M
  12.     return _scripts.get(name);, p* @# J; _5 o/ H$ A8 [
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.0 Z6 L/ m3 f4 Q$ K8 T9 j

4 M: C' r; {5 |$ w5 @  n6 hМетод getQuest(int questId)
3 w3 \, J/ ]; A) c) J# ?+ d- {& c( C6 G/ L, G
  1. /**9 N% @7 V7 H+ R2 t- u4 W: B
  2. * Получает квест по ID.
    - v" m" B4 R* \# a/ c& _
  3. * @param questId ID квеста
    & ^: [1 Q) X6 @  w9 _( k) \
  4. * @return квест, если найден, {@code null} в противном случае" Q, A/ F) R$ J1 j$ n7 I
  5. */9 H9 E$ W$ p+ V9 q8 f, N4 O3 |
  6. public Quest getQuest(int questId)' @! d# L  B6 B! q- z( k
  7. {: b  t2 k, l" F& b: t) A5 C
  8.     for (Quest q : _quests.values())
    7 t$ H$ s0 g3 _" M! |0 N0 E
  9.     {, j1 ?! H. L; D2 k7 N9 k' z
  10.         if (q.getId() == questId)" L8 P- t0 n2 {
  11.         {
    / H, {" u+ v) V0 ?6 e
  12.             return q;4 ^$ C4 r9 G9 s0 B% n4 U! E
  13.         }; G9 B/ g: v: t& n0 z
  14.     }9 E+ ?9 B7 y( y0 p" W( ~
  15.     return null;. h" x% y3 Y+ [3 k4 o
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору./ [: Q5 k. c' q1 A
$ w0 [% I. Y& h' u, |1 J6 j; \
Метод addQuest(Quest quest), d3 l4 c% `* v$ d$ j

5 L' x5 W, k) Q1 Q
  1. /**, s1 N& ]* ~; |4 k8 e) H2 W* `
  2. * Добавляет новый квест.
    4 R) J0 |! R4 z  b# E+ y# ?
  3. * @param quest квест для добавления1 C$ K* O5 D& N; O/ d
  4. */
    1 K% K& K' R+ e2 |
  5. public void addQuest(Quest quest)
    / H4 o! s! ^1 W
  6. {( A6 Y$ y+ R$ |7 I1 P
  7.     if (quest == null)
    7 t' a: r# t( X7 m
  8.     {! D9 z$ K3 ^/ a! Q' a; y5 k
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");' B$ A0 W+ e" E. ^. O3 L3 o$ s
  10.     }1 b; Q8 b, ?  l% W. k$ g
  11.     6 |. n4 y  Y, j: `" L
  12.     final Quest old = _quests.put(quest.getName(), quest);/ U6 {4 T* X4 `$ i) s3 t
  13.     if (old != null)
    % @( Y$ V) o/ [" F7 ?1 z
  14.     {4 J8 L8 j: r3 v
  15.         old.unload();
    ; ?  w! l6 X" o2 D
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");/ J0 r  X' R& [' W, O% F) _
  17.     }
    % b6 _/ J6 F( i8 y5 I. ~
  18.     5 Y- C1 R! Z/ x0 H; [+ J
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    0 x) a- S; A6 O5 P, T8 c
  20.     {9 U1 g1 D: D& V2 c9 b
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    ( y' z6 J% i3 \0 z6 P
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");2 Z0 Y" U6 L! @! u2 I0 i4 `
  23.     }
    ( o* M5 ~; T8 x
  24. }
    # H' w, m4 n* [$ ~: Y% [+ m+ j
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
& z% R, |( I& Z" tЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.1 F' h0 }  \4 k4 B, X( N

; a' i9 S) O( d  @* U/ T: A$ t( |- ]/ a, o% J

% S; R  ~4 i; `! w! C% b0 Y( ?
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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