Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius. S5 u+ n( T  j4 G, ^/ l

! M8 j9 [6 f  z) t% CРазбор файла QuestManager.java& @- `* [  \3 X- g& d* x

/ V8 N' F8 x% O2 A! FЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
: t4 y1 E! ], \8 [' BОсновные элементы
% o; O, Z$ i8 x
  • Лицензия
    " L" ^. F& s6 s4 W) T. B
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.' k8 a: S$ s1 c
  • Импорты: z3 W# @7 [% C5 B6 ]2 i
8 q, L5 N+ ^- p4 K% f5 N
QuestManager.java — управление квестами и скриптами.' g9 C6 m' J8 h3 F5 L" O
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
# W) ~8 @' c/ i4 @* Y" c7 s5 ]7 s9 c+ C% D& W; i

- c5 U( z- F" G& c3 A; T, b1 }Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
5 J% j8 z  f, I  i* \5 ~- X" q; c1. Лицензионное соглашение
) ^* e8 [0 e% _$ E
  1. /*3 t7 i; C0 U, _: q* ?9 J( Z- h3 I
  2. * Этот файл является частью проекта L2J Mobius.
    4 L! V8 f* x  F* v" J8 `" s! |" Y- r% X
  3. *
    . O  H. i, m+ e+ t7 R" \
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять) V) L3 c: T  n  ~9 T& ^2 j! Z
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    - v  J( F2 A: f& q" y! s9 ^+ `6 _
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.2 J( {# ~0 p* U# z4 {8 C
  7. *
    : r; P% ~  M3 F$ H2 V" O9 I
  8. * Эта программа распространяется в надежде, что она будет полезной,
    2 h5 ~& i- M* @: l; M( x/ x
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    : E4 f/ g/ P, F4 N
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    . s# u2 r, [, L8 f7 o2 d& w
  11. * См. GNU General Public License для получения более подробной информации.
      s/ w, e- D) ~% h% k. g) J
  12. *
    0 e5 t. M. Z) F, [
  13. * Вы должны были получить копию GNU General Public License& i2 k: Y* T2 e% A  y# w; S, h8 f8 c
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    9 M. n' U' Z% s" U: ~" Y% z
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
* i2 @2 f9 F0 C. U! s4 a- U9 p( H2 M5 |1 @# c

, U5 D' z- u& o; ?! f2. Импортируемые библиотеки
1 r4 t/ W! F& p& Q! w9 g
, `* q7 p: l9 Z5 b8 w  p2 Q
  1. package org.l2jmobius.gameserver.instancemanager;' v8 K& f$ z# ?& a6 H/ x! e7 c

  2. 3 h" N, S2 R" p. `6 C$ ?
  3. import java.util.Map;
    ' @8 m% M/ Q$ c' ^7 z' h$ Z
  4. import java.util.concurrent.ConcurrentHashMap;7 t; U+ O( Z: S& a4 x
  5. import java.util.logging.Level;: }! o  y& A) S5 q0 a' Q
  6. import java.util.logging.Logger;
    5 g* O3 h; U2 p; g- j1 W, n
  7. 4 z4 ?9 d2 p  s
  8. import org.l2jmobius.Config;
    + M* D9 Q7 ^) ^% u+ `; s
  9. import org.l2jmobius.commons.util.CommonUtil;5 R2 X9 [* D! c- m! Z
  10. import org.l2jmobius.gameserver.model.quest.Quest;, s  H3 Q" ]. K! p& f9 ]
  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 — менеджер для работы с игровыми скриптами.! d) f. g: W% V) M1 C+ o

* x  f+ J0 q2 P& N+ V$ M6 |) P, L# Q) r3. Описание класса QuestManager
& y) @* P0 m7 }
  1. /**
    2 l2 Y* R1 t- \2 n9 C( f8 r
  2. * Менеджер квестов и скриптов.
    ' l% M8 X. o4 {) W! M7 a9 h, C
  3. * Автор: Zoey76( M( Q7 `7 q( b
  4. *// c% k% R4 [$ C3 B% |2 w
  5. public class QuestManager( I) M2 f& {' E7 S
  6. {
    0 X% F0 N' {2 R
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());- l, q# D9 H2 e, w% @- i2 z# T
  8.    
    ( s. X$ S6 k. B# e5 x
  9.     /** Карта, содержащая все квесты. */
    ! O1 }2 s$ S  I  ]! p
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    ( z' ?+ o  _9 l, t
  11.     /** Карта, содержащая все скрипты. */# ^! {+ [7 m7 T7 a
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();( N9 C; X! v6 O4 O; e
  13.     ( c+ a2 H6 R3 N" L6 V
  14.     protected QuestManager()& h& j- U- v! R! k! J) Z; g/ m( ]
  15.     {( z2 _! M! D' A0 K1 v
  16.     }
    9 a* P$ q8 W7 ^! Z" \
  17. }
Скопировать код
4. Методы+ ~3 w0 u. x" Z- {/ P/ E' O
Метод reload(String questFolder). v; v; @4 C  j) ?
  1. public boolean reload(String questFolder)
    " B1 s5 ?' `# V
  2. {
    4 Y& v: k+ N  S' v: V
  3.     final Quest q = getQuest(questFolder);7 |; f9 E, Q- v$ C0 D! ?) ]
  4.     if (q == null), e+ _9 I, i: Q/ L: M, y
  5.     {
    & w' t9 _4 V' }4 F9 S
  6.         return false;
    2 G- q; K0 `  }) X) c: C+ U' ]
  7.     }
    6 [# T- t1 y9 I, O
  8.     return q.reload();- I7 r, c! t: k2 C/ I* p! J, |
  9. }
Скопировать код

0 {, G6 h( t3 A$ Y% i; k" i
+ j3 D/ t7 N2 U6 i4 sМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
% d; O7 i0 Q+ s# OМетод reload(int questId)" a+ V0 I1 E, R# Z5 D

" f* N# m9 m# m( P
  1. /**5 @$ R8 N5 c6 H: X% o
  2. * Перезагружает квест по ID.
    % P, g# L) ~6 w. X
  3. * @param questId ID квеста для перезагрузки) G) g" Z2 J' k1 h9 F' p
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае" p% Z: Y4 l% P+ l* F, |; D$ z8 O6 m
  5. */
    4 e, Z- W1 g! m5 |2 T1 j4 E% v
  6. public boolean reload(int questId)3 @# A# t; Y5 {- o. i  ?
  7. {
    ; i8 `) T) Q, c' b9 H
  8.     final Quest q = getQuest(questId);1 J; D( Q$ ~2 ?* \
  9.     if (q == null)& w9 W$ \5 X7 ~# ^% e* [# f
  10.     {, n+ L. Y) g% K2 Q, W# y
  11.         return false;
    0 v( u% F, z6 e+ [/ c$ S
  12.     }% G2 r& f* o# `. P2 b# J( x
  13.     return q.reload();. ]" _+ F8 }, P$ O, m! g3 {. L. m) V# B
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.2 M: k; i, U/ T2 }& f( G
" c7 w* T  b) D8 `( r' e
Метод reloadAllScripts()
( L( I* y( ~% {# L5 ~: ~/ S, C; _4 w, i9 n+ O$ T
  1. /**1 t, F0 Q6 _* P% ~: z/ V6 G
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.* q* _$ a: R3 j
  3. */% V) t) g& h/ }1 O! B
  4. public void reloadAllScripts()8 t" M* Q0 N6 l; w, D% s
  5. {# b; F7 |" M+ N! F3 }
  6.     unloadAllScripts();. Y5 S( p( @/ g5 o7 ]
  7.    
    7 [3 O: ]5 J3 o$ w6 X8 Z: f! H
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");* D, z7 d4 [! t5 Z2 h9 `' Z
  9.     try2 x3 |2 `# L. e, T! g9 G3 D; @& }- \: C
  10.     {
    9 Q+ N5 B; Q7 k4 l: ]
  11.         ScriptEngineManager.getInstance().executeScriptList();
    ) j% n& ?4 X+ p; y0 V
  12.     }9 F" N, O0 x, R+ ^& x( t# A
  13.     catch (Exception e)* b7 }& v- {" r
  14.     {3 c' g3 f8 o* v5 X. G
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);4 e, c4 }* L/ h# f" s( h
  16.     }& u9 {; e1 t4 o1 p& I
  17.     * K9 K; s$ U3 w" g  }3 y
  18.     getInstance().report();  Z# M7 O7 r9 O) f9 y0 ]* d
  19. }
Скопировать код
Метод unloadAllScripts()
2 Z0 Y, X  ]7 k. V' Y( n% I( b! _+ w  L) L* ^  o9 A2 S% Z- b( _
  1. /**: [; X7 }% |. w* \  v$ n7 @) }8 w5 _- \
  2. * Выгружает все квесты и скрипты.
    8 |- ?1 ]! b2 h1 ~
  3. */
    0 j% n$ `+ E+ o- e0 Z- I
  4. public void unloadAllScripts()
    ( k, A# S- x# F' _  {8 @- @
  5. {) S; C5 a( k# z- [
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    ; h3 z* ]" ]9 _$ R
  7.    
    . j) [1 ~7 m- K; I/ A# g
  8.     // Выгрузка квестов.  F* V/ K" f, [% S5 |# I
  9.     for (Quest quest : _quests.values())
    ! i% _7 V, H; O
  10.     {
    - G; Z9 {2 e* F0 X
  11.         if (quest != null)" s1 x; c5 S0 Z( O1 z* p+ s
  12.         {
    1 J* @! \0 U6 J; P! L! U& S/ C9 H8 A
  13.             quest.unload(false);
    % _2 F3 c+ F0 {& J7 e' a: {
  14.         }( [4 D+ T5 {; i' ^) ^( d
  15.     }
    ; [+ D( w; C7 i& y( H0 W2 i; \/ _) ^, o
  16.     _quests.clear();
    $ {+ x5 ^, s& F. l+ |8 \- u
  17.     // Выгрузка скриптов.
    / D: w+ X, }0 G3 r+ s
  18.     for (Quest script : _scripts.values())8 ?% q5 E* n4 R
  19.     {
    . D* v- a  p- X, o. x
  20.         if (script != null)
    . o0 u; x1 Y: m& H  f0 a
  21.         {
    ; z" [$ m  {; C" U/ Z. b
  22.             script.unload(false);
    ) m: O5 q$ P4 h- v" P5 m
  23.         }
    : r7 j1 h$ g+ L  X- p& {6 J
  24.     }+ H) A1 r! q3 p: Q8 |
  25.     _scripts.clear();
    4 W9 V0 Y# n& g: z% u0 j9 _6 w
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts." X  N3 ?0 R) a' a3 N( }0 s7 x

- _1 g) h1 X  N% uМетод report()" b" L) B2 R( }$ I4 W3 [: L9 a8 b
; _* A0 a* i. D% ]5 E4 {
  1. /**1 D9 K" h; F: K8 M! p* g# u# d8 A, I
  2. * Логирует количество загруженных квестов и скриптов.
    1 u  H) `: A5 @9 p2 p8 B6 L
  3. */
      P( e1 _1 T0 i% r1 f( O
  4. public void report()+ `9 q1 _& a" ?; S( {
  5. {* O; K# a! A! |
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");5 d: p) [; s6 s
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");* F* S: F2 |+ s- e
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    ! M0 r; a! ?5 y5 o* ^$ K( U
% Q2 D2 t+ T5 n9 Y( _
Метод getQuest(String name)+ D3 D* e5 ]3 f3 v# V% N: q( _
3 q/ D2 T9 H! I: _
  1. /**
    1 ]/ y* ~: b5 S) Q
  2. * Получает квест по имени.4 I3 I, C( i9 }7 N
  3. * @param name имя квеста. o9 U4 Y; ]. w3 {. Y. o" R
  4. * @return квест
    + s8 b8 g* E1 D) h
  5. */, j- a: i7 A0 F4 ^) ?
  6. public Quest getQuest(String name)
    : L+ e- u4 V* i1 l- I0 B
  7. {# n! \. V$ @+ B, R4 v* O& V1 N6 s
  8.     if (_quests.containsKey(name))
    ; p  D  M$ I% ^5 S& `) ~5 ^7 i
  9.     {
    , ?" h! @9 {- }$ G$ m: a$ C
  10.         return _quests.get(name);, Y; j( N. L/ |$ `* l$ x
  11.     }
    4 K) q6 ?5 G: e7 I
  12.     return _scripts.get(name);7 v4 i1 @/ E" c! Y! k; _1 B- g
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.1 u) }: G8 Z; f8 O# q* N

! p) d. V( H6 x! P% m) [; \2 q2 Y+ gМетод getQuest(int questId)- U8 q" k3 `' D. e
2 U$ G( G( w' j1 t5 |5 |
  1. /**
    + v4 W, x9 ]$ o% ]/ r8 `: }
  2. * Получает квест по ID.
    " B* j) O- R/ P1 p, `; Z1 U; I7 V% e
  3. * @param questId ID квеста
    3 e+ i( f( W7 o$ E$ M, p0 w
  4. * @return квест, если найден, {@code null} в противном случае+ o& Q1 n$ P# e5 T4 x' i
  5. */+ v8 B  ]) ?; d4 P( K
  6. public Quest getQuest(int questId)0 s' G5 F/ h% p( A4 {3 U4 I/ o
  7. {9 D* S& L( C! E% r
  8.     for (Quest q : _quests.values())
    4 p! S6 T3 w4 w- m- U) p1 A6 Z
  9.     {
    2 h- }2 u/ |3 H! U1 B% h
  10.         if (q.getId() == questId), {' |- \$ }' a
  11.         {, h; @- r# P8 l# L, c
  12.             return q;* p: r& @. ]* i( P" g
  13.         }' b9 c0 ~& c  v& `+ S/ m# X+ q
  14.     }! J. m: C8 a" G9 t
  15.     return null;9 M$ O0 j, w, k0 l, _, K/ X
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.! K" D( r& X4 r1 Q

" a  C+ |) o1 L0 ~7 [) N: wМетод addQuest(Quest quest)8 s5 G! g4 f. _$ a' `+ c

5 O5 ?6 K  s5 }
  1. /**- V9 c( U' @4 M$ i
  2. * Добавляет новый квест.
    5 z# n8 L; F. Z4 ^
  3. * @param quest квест для добавления# _5 S  m4 N, n. J1 Z
  4. */
    2 K& F. g$ q8 i$ T6 v
  5. public void addQuest(Quest quest)
    0 A# u# x4 k% C% T# g) r
  6. {
    # y' j& v3 _/ ?7 d6 {2 l# S
  7.     if (quest == null)4 Q" w4 ~& N7 U
  8.     {% E! w4 u* V1 h; C
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    7 }3 m- n# y& R# R' U9 V' ]3 u
  10.     }# h' b0 b/ D1 t7 {( ?
  11.    
    ; H  p8 z" S( e6 r! s. @% g
  12.     final Quest old = _quests.put(quest.getName(), quest);# n. |; w6 W7 Y/ u9 `/ D& @
  13.     if (old != null)8 t# J  d/ z) A" A) E2 j
  14.     {  @8 j; }8 B# |3 \! [$ S
  15.         old.unload();
    " ]* c3 K8 Y5 D
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    0 K# C1 Z' \! f. a0 N
  17.     }
    : K0 o5 r7 F2 u$ [7 K. F4 a
  18.    
    & j( I( S: H" D8 x8 q( I
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    0 I) C3 O+ j' I4 [- `* [
  20.     {
    ! v( ?0 m( u; y$ ]7 C0 O
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();5 g- `, m! D/ N- k  c' V! E8 Z
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");8 M1 R9 G! w8 J
  23.     }1 r: e  w. y$ n4 n9 U
  24. }
    7 L# L, r; x( g$ [" L( Y
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
% @/ D# M; ~0 HЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
  ~# Z. j& d' d( P8 Y) s  h7 {8 g+ u. z$ N2 _7 h( j7 e7 q

5 `! @+ I! l2 W5 \' i& Q2 P# G* M% R6 b4 U' |( c$ [
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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