Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius6 j" b4 K/ q; P6 p$ @  W
. k3 [, U7 l' A
Разбор файла QuestManager.java9 [: ]5 X  ^9 v/ b0 q
. U& P( @( h! I) u5 V
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
0 T: t! w" ~) x8 M( ]1 \Основные элементы
" B; V& Y! ?9 g" F# c6 [
  • Лицензия
    9 d" N: n% U/ U! b
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      5 |( {4 {( |$ q+ y* f  T" R
  • Импорты* T5 J3 ?* e" E) P
2 v; \, N! N, t( `
QuestManager.java — управление квестами и скриптами.
& z$ e& |- I8 v3 N8 g0 N. [Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\5 c- f! ~0 v6 j/ @

5 x$ h4 p: Q2 B6 Y1 R

' R; [6 X8 G& k5 I, P' v/ _7 }; JДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.2 ^7 W" j; z* ?4 K3 e) S
1. Лицензионное соглашение
4 g+ h6 d' a. E7 O
  1. /*2 @7 g0 C# R* G. @
  2. * Этот файл является частью проекта L2J Mobius.- }/ k/ `8 [# _& ^& n& G
  3. * $ ^, @9 p9 Y, u$ r/ O% ~
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    , u* T( _0 @- q3 `/ I! @
  5. * её в соответствии с условиями GNU General Public License, опубликованной
      a& a' I( U* I3 n/ W2 S: k. L
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    7 F) d+ V- L. U6 n3 }- ~+ b# e
  7. * 1 F/ ~4 S7 C9 [, O2 _5 _8 N
  8. * Эта программа распространяется в надежде, что она будет полезной,  c  y0 z; X+ m# I5 w) M, L
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии+ S& K$ _3 S* U- k$ d8 q' Q3 F
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    6 T( j0 k! F4 T& w4 U4 z
  11. * См. GNU General Public License для получения более подробной информации.
    - x$ s: J2 H! @9 r
  12. * + T" P6 n/ V5 A+ |9 R
  13. * Вы должны были получить копию GNU General Public License( }3 p4 W/ K/ ~% w. H4 d& L
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    9 x4 o7 i, o$ S9 p  p8 m. k# _
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3." U! y& R/ K; b7 _& [# w
  K$ ?# e0 K- R7 e8 Z
, s  ~- T; U3 @& O; q9 C$ W0 [
2. Импортируемые библиотеки
* {; C& g( T6 R& B, D4 E( t# _- J
  1. package org.l2jmobius.gameserver.instancemanager;
    ! C7 t3 t0 x* b: B2 E$ ~5 }) [

  2. ; @9 m' v8 u* N! V" S/ L' t" z
  3. import java.util.Map;1 D, c3 c  W: U
  4. import java.util.concurrent.ConcurrentHashMap;! P, N% Q3 `; l( J
  5. import java.util.logging.Level;
    0 E- h; t5 J7 y( _, K6 h/ A7 u
  6. import java.util.logging.Logger;$ N/ @* z% P  W5 O
  7. . W! q; F8 N/ |# T* X, F# |( G
  8. import org.l2jmobius.Config;5 u4 N8 q7 O7 u1 |& x
  9. import org.l2jmobius.commons.util.CommonUtil;  [4 ]1 R) }- d- R4 b" b  ?
  10. import org.l2jmobius.gameserver.model.quest.Quest;$ h; f6 G( a8 z$ u# B
  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 ~# c( Y9 @0 b
( v5 d( x$ E2 [& [0 B+ k  P7 s3. Описание класса QuestManager. R+ z+ x0 \( p$ S
  1. /**
    - j1 ], X$ C# I9 f+ s( x# Y% K
  2. * Менеджер квестов и скриптов.9 }; m. |+ q1 d7 c, b% R( M' Y/ a; [
  3. * Автор: Zoey76
    8 v, A8 d/ M: n6 ~
  4. */
    $ t9 B' [( m3 j% n+ }8 V; O
  5. public class QuestManager: w8 F! z7 |" ~* Z& Y
  6. {/ c0 c( \" @% X
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());3 A+ }7 h* z+ L$ e
  8.     2 S, v2 _! }* E
  9.     /** Карта, содержащая все квесты. */
    9 J+ @! F- r+ ]( B! ?
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    % O  ^! y1 y0 c& [& f: }
  11.     /** Карта, содержащая все скрипты. */
    - e% j9 L+ \9 W3 h, m
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();( A; ^7 c* T1 O2 ^1 u) Q, [! B( l% `3 I' D8 [
  13.     3 P* _1 ]+ o3 j0 S. M2 j  r- p
  14.     protected QuestManager()
    7 T1 ~3 [+ y4 |
  15.     {# k& I# {( A& P" S# ~  U) e4 U
  16.     }% s7 q! U% c% q5 F$ t$ }" D! |
  17. }
Скопировать код
4. Методы
& w* r" a  d: I$ j' h, UМетод reload(String questFolder)
$ i( g0 S; ~$ ~+ S* D+ I2 o
  1. public boolean reload(String questFolder)/ ~$ T8 v0 U# T+ @: u9 J
  2. {
    : Q1 [0 G# X2 v! c
  3.     final Quest q = getQuest(questFolder);
    $ P5 Y6 R% E9 W+ d
  4.     if (q == null): E% a/ x5 D3 E1 n( M) g
  5.     {+ X( ~# u+ H5 [2 N
  6.         return false;
    2 g5 G. G5 Y, [- s  X
  7.     }5 S& A: M- U5 \6 `9 o" i' U( Y
  8.     return q.reload();% `$ P" ~9 s2 D0 N- @
  9. }
Скопировать код
/ v6 p/ p& a. d' p( p  @
5 r( \( ^2 n4 c; `2 n2 m* n
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
& y4 K: |8 H- a4 f6 @. AМетод reload(int questId)
3 X3 Z! H+ K7 C0 Z# `* x, v3 Q  F: a* T! |* J2 I7 u
  1. /**
      v4 u" I7 i0 t# [* [
  2. * Перезагружает квест по ID.% V: ^/ Z5 n* o$ h8 `+ y
  3. * @param questId ID квеста для перезагрузки
    8 U! Z. ?; v# p/ S6 v
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    " H( j5 r: [. u
  5. */% T7 @0 K$ e& e
  6. public boolean reload(int questId)6 ]* T+ ~/ I8 f, {) v& N2 M8 _1 S* J
  7. {
    $ m! x. l0 s4 o$ a  d+ V' V# g
  8.     final Quest q = getQuest(questId);
      E4 H: g9 z4 L8 n9 k- A
  9.     if (q == null)
    , v5 \6 D  f" ]( Y, j
  10.     {
    / \! u$ G0 v, H9 F8 |$ m; Y7 ~
  11.         return false;
    ) [, q1 b- ^5 z
  12.     }' U5 ~! P6 o. B' y4 s, O
  13.     return q.reload();, j. g* V, \1 I9 e* {+ _3 F
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.9 t2 J& R# K# O3 S: J
# W4 K) z% ]5 P# }
Метод reloadAllScripts()$ X' f- R- T1 K+ e) o2 e9 C# N% k: K7 T
) x+ b. ^/ z4 Q/ Y, d* ?
  1. /**
    7 f! o9 r6 i/ \) g0 K
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    . H2 \& t0 r4 ]1 ^2 z/ J+ ~1 y* P$ V
  3. */- M+ m4 ?2 h' X: Y) u& X
  4. public void reloadAllScripts()( o3 M8 O7 |" [1 S0 Y8 n7 R: T
  5. {
    2 w: h9 c. ?) q- e
  6.     unloadAllScripts();
    $ c5 p& D4 |1 z  D
  7.    
    , e& H# ~) e& d
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");) l# K$ E1 F6 J6 v' g$ J
  9.     try
    7 o4 }: r% E( j
  10.     {  z  Z& U1 Y5 J' c
  11.         ScriptEngineManager.getInstance().executeScriptList();1 ], Q2 Q. b: m! p& p$ X
  12.     }! }4 X' ?* E  c3 X8 K
  13.     catch (Exception e)  g! q2 {1 E: W; N3 A$ l2 b
  14.     {/ S3 Z7 b( ^) K- X  b# X' G; Y
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);! @& ~5 ]: S+ d" n* b& N
  16.     }, @0 Z# `$ H* |3 ]4 X. X$ O
  17.    
    # D  x( {- N$ u
  18.     getInstance().report();
    ' C" Q3 I  ]: S- V
  19. }
Скопировать код
Метод unloadAllScripts()
! j) V- o; T8 F1 U, z5 T
% J7 G" G8 N+ L* j1 Z, ]9 H/ z
  1. /**! b5 X# w" L+ x% y1 W
  2. * Выгружает все квесты и скрипты.
    4 Q: i) n! G: N. C: F
  3. */
    0 E  z' a7 I1 Z1 E
  4. public void unloadAllScripts(). V4 `  \  F% V* F
  5. {
    / A7 g3 c  A3 }7 L7 Y' R
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");+ ]- j) L+ t* |; m
  7.    
    " H/ @- y2 ?5 z2 `: m8 i
  8.     // Выгрузка квестов.) f, z5 v5 c: P( G* D1 I
  9.     for (Quest quest : _quests.values())! H/ P1 I2 O7 o0 c& z" D/ y
  10.     {
    7 P: r* t$ U; V/ D/ K- l$ |% v
  11.         if (quest != null)' Z7 L; D5 X# Z
  12.         {
    8 y* `' Z9 p+ y) b' d3 y' o
  13.             quest.unload(false);+ h1 K) a/ S' o" I
  14.         }
    ! b/ w& r! P1 r( |+ S3 l1 S
  15.     }
    - A+ `! K" W# p
  16.     _quests.clear();
    0 K- K: u) E/ g, m( S
  17.     // Выгрузка скриптов.
    % ~/ Y1 i# l/ R" ?2 T
  18.     for (Quest script : _scripts.values())$ p' q4 T( D! F# V% O* j
  19.     {0 n% d$ k3 Z8 O; A1 ?" R% g. g% s
  20.         if (script != null)
    + E& u3 ~. t+ a4 {  T, F, }3 N, A7 l
  21.         {
    3 g) |5 Y; ~/ X! M, C4 j  n1 B
  22.             script.unload(false);
    4 f- X5 r% i5 D8 W* L. e4 j
  23.         }0 C. E- y3 r% R6 p: o4 i
  24.     }
    2 o' p+ o6 m* \/ R
  25.     _scripts.clear();( X5 |+ R; D" I4 ]3 L6 @
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.# |) O- h/ {5 c9 J
* x$ A: \' `0 u  s0 E/ t& N
Метод report()
* O# P* Z+ b7 k
! x  F  k. Q$ |8 L0 y
  1. /**
    0 \% p9 s. y2 @8 H4 o
  2. * Логирует количество загруженных квестов и скриптов.
    7 V: i% C! }' x0 o
  3. */
    4 W* ~! w$ z1 n2 n! r0 @8 D  C
  4. public void report()' i# c/ b2 B+ f* k
  5. {
    % W5 U0 N. z& f& [! F
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");5 Y) W& N* X1 j4 Z/ t
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");$ Y+ E# G8 _3 ?! y% j3 a
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.0 A' M; s4 W' y

& o; v1 b! R& e* K! G2 N8 rМетод getQuest(String name)
! ~# q* w  T# F8 d1 |- w+ S: {) A3 m; A/ Q- x
  1. /**' X6 F7 ~1 K' {4 W7 I- K: ]4 @
  2. * Получает квест по имени.! Z. \( C- L/ y( A) \7 g- Y
  3. * @param name имя квеста: m1 S2 K) b8 a1 |7 m
  4. * @return квест
    ) ^, p( x$ N( u( g8 p
  5. */
    9 l1 n* T& {  \1 w4 u+ C
  6. public Quest getQuest(String name)5 a( u2 l3 k  r
  7. {
    # W1 K, g: e) p, V; O1 y
  8.     if (_quests.containsKey(name))5 {: Y" i  o# a/ _/ Y! J7 O. c
  9.     {/ s" X; z. c+ I# r) X
  10.         return _quests.get(name);! G9 d' ]! x4 [# E8 M$ V
  11.     }* h6 p; m! g$ l/ X5 f: {- f4 p
  12.     return _scripts.get(name);
    ) E2 z! q- k7 ^  N& x
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    / m! u. E9 a  q9 b+ j

2 y/ v$ B2 O/ f# w: N3 {Метод getQuest(int questId)
+ x" N, m, x4 y5 w" q# _6 ^6 X, r/ n$ g) ]% |! r+ J6 }( B
  1. /**" |, N! v  f3 p+ F( j  W
  2. * Получает квест по ID.. [% N) O# p2 S6 s- z. f( _, X
  3. * @param questId ID квеста
    # P8 e. Z, U# n3 g7 q
  4. * @return квест, если найден, {@code null} в противном случае
    8 X1 D: U/ h' c8 o
  5. */
    - f9 v, D: f% [1 c" U9 S  C5 v
  6. public Quest getQuest(int questId)
    ! ~  {' {# D& f
  7. {
    $ b$ T+ O" g2 l
  8.     for (Quest q : _quests.values())0 t, x5 l( _1 K; O, B9 U. ^
  9.     {
    % X6 B0 a& t6 D0 t, w! `5 ~
  10.         if (q.getId() == questId)
    ; x, l: M) Z, C5 g
  11.         {8 }% B% A" A7 j2 R( u5 o
  12.             return q;( c# A% p- X) Z  w6 b( Y! h
  13.         }
    : N: P- ~$ |- A5 A5 L- `
  14.     }
    6 R& Y  W8 Q4 [" D7 v! q
  15.     return null;
    . [' w" C1 U& S  \6 e" C7 n
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.# m/ x0 w" K: ]7 U! ]4 F
8 R/ m: W8 B6 O% B; f, r* |
Метод addQuest(Quest quest)  ^1 A: y/ L1 x6 D. \. V% }' }
& M" ?4 O. G/ h1 Y
  1. /**- a9 x0 V# F' g) \2 D* V
  2. * Добавляет новый квест.
    3 Q! \9 L4 z' ]4 Z# H
  3. * @param quest квест для добавления
    / C' C# {$ Z. @, `3 o
  4. */( N7 y- x. t, m- I- g1 r
  5. public void addQuest(Quest quest)
    8 u1 J! t; |4 F  r! {
  6. {) D$ {: t" X2 ?- X
  7.     if (quest == null)  ]: E$ D+ X' i7 O
  8.     {
    + {" z% k0 R& |$ n
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    1 h* Y! B# y) V$ a4 J/ z
  10.     }
    " P- g1 ]8 c8 i7 e2 G
  11.    
    3 ~% H% p: y3 O+ U! j8 J
  12.     final Quest old = _quests.put(quest.getName(), quest);) O9 @+ ?( A0 Y9 N8 ]# o
  13.     if (old != null); T! Q5 D" {# v/ r! R* I1 u
  14.     {
    % S+ n* X( u& f2 C
  15.         old.unload();
    9 E" b5 c# G3 f: u8 Z: m3 Z0 j
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");% k( F+ ]4 y. k$ t' C) ]
  17.     }2 _( r$ e: k' s1 Q. U7 f' s8 T) b
  18.     ' E- Y/ D! B( q7 u8 J2 c, H% ~& [
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)# @% ?4 l- J- g/ D; e
  20.     {& p' h" ~* S* S* Z
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();" n" {% S' o2 g, f8 q4 q* }, H' l
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");3 T$ q0 q6 c  C
  23.     }
    0 L4 d$ \% Z% ~
  24. }, K2 s8 Q. x; r' K4 O' ?
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
0 F- y9 F  ^4 E4 R) t2 ?ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
3 W1 j0 h' h6 D- H+ B/ h, P+ r* f* u' Q  w' O

, R7 b$ S1 Q3 j  R9 k
0 c4 Q1 T! N! ]5 Y& O  ^3 b/ E
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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