Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
' q* H6 Q! m7 D8 e/ h! {& c) M$ v2 p: a8 ^8 o
Разбор файла QuestManager.java; Y4 k$ p1 H; X* F! R

0 l" S9 \0 `$ A0 d, X1 v& {3 U; [Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.& X" v1 V7 o( U8 b
Основные элементы
( l3 Z- m' A' W0 f. y& U9 D' L
  • Лицензия/ k7 E- ^+ `6 g# I
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      8 n+ J( c/ v3 t* N. R& A# e+ B+ H
  • Импорты
    " x6 z8 p$ b; D$ c
( V/ @/ z) D+ D8 Y& P' b8 l
QuestManager.java — управление квестами и скриптами.
0 F% N! _/ e& Q4 e( `" O0 O( v+ lПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\+ i0 B7 t1 {( Q$ G0 i7 x+ I) l* n

1 i( V/ d- C8 ]# q
: A, e3 P' [# v) l2 ]" R
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
" i8 [' v1 [$ J! R1. Лицензионное соглашение# z6 K: g/ I1 H
  1. /*
    & t- `& ^1 z* }) J. E3 W1 S) E
  2. * Этот файл является частью проекта L2J Mobius.
      Y$ a( {* L2 B# E' ?
  3. *
    % M  a7 G% {1 Q- v( u( R
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять9 K: T4 g6 _" z% u
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    4 f9 t0 |! P" G6 {% S
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    0 a% G- e5 |* n
  7. * 2 P  V4 k7 A) N
  8. * Эта программа распространяется в надежде, что она будет полезной,( i7 V+ u# ]; y; }
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    * |& X( t0 ?9 v. A  A  w: G
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.1 l; o" e! M1 K! g0 k- v! c
  11. * См. GNU General Public License для получения более подробной информации.
    5 b; U8 z! g) g% X+ y' Y3 d9 J
  12. * " |3 V0 p. ]3 j% M( V
  13. * Вы должны были получить копию GNU General Public License
    6 B5 j% X1 e0 I1 x3 d
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.3 K  Q* C$ V' N$ D2 r7 b
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
$ @) K7 I# f) L6 @% Z( C* {! K' r% j. P0 ~6 D

9 z* x& G. i+ c' u1 }% u# w, O2. Импортируемые библиотеки
% l& C8 {% D# ^6 p8 Q7 k) A% K2 l0 X' E6 Y
  1. package org.l2jmobius.gameserver.instancemanager;
    ' M% q! N- c: X+ Z' ]

  2. # [) @( I0 |0 v* @, {; ?4 j' I/ R9 C
  3. import java.util.Map;  T1 z+ s1 }0 V3 F# V9 V3 F4 A! s
  4. import java.util.concurrent.ConcurrentHashMap;
    : p- }- R! `3 {' L7 t
  5. import java.util.logging.Level;
    7 G, ?+ v4 Z9 G- ~7 Z7 S
  6. import java.util.logging.Logger;+ d' _0 G2 U; s7 b

  7. $ j/ T, [$ J7 b/ x# c( F
  8. import org.l2jmobius.Config;& Z5 ~, p5 f" y  \
  9. import org.l2jmobius.commons.util.CommonUtil;
    ' C; X7 x% x% P7 P: M! {8 x
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    " a- j" |: A/ c5 |" n" f
  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 @5 i7 K- _: ?2 S( n$ ]
5 g4 q0 w" S6 W% J3. Описание класса QuestManager4 v# j- P! l2 [6 U  P9 q+ B; _8 Z
  1. /**
    0 R0 B0 h1 U  ?1 D' ^
  2. * Менеджер квестов и скриптов.7 s6 T- o  S' F, J
  3. * Автор: Zoey765 |, |1 t9 ~' W( V1 K$ Y
  4. */( u6 d  A5 s- ]7 Y% }$ [, u8 i* j
  5. public class QuestManager
    7 }* C# R7 b7 `- r; i1 p2 X$ {8 {
  6. {
    7 g8 H9 m! r& n! u3 o  q2 {
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());# S4 |  T5 Z) C- _
  8.       d" {; A  c! N9 _
  9.     /** Карта, содержащая все квесты. */) `* M4 ^9 k) r( M$ F  I+ k
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();* b+ `9 q/ G- M3 G
  11.     /** Карта, содержащая все скрипты. */
    ! E/ _8 }* a# h) d! u
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();" ~' @6 x5 |7 X3 y& Y+ l8 A
  13.    
    8 Y, Q+ _8 z# K5 A( n
  14.     protected QuestManager()# V+ t; M. ?* f" N3 g" J+ e+ W
  15.     {& }' s( s% j' |/ V7 G) V
  16.     }
    8 d& C, i) U- }; A% l- v' Y
  17. }
Скопировать код
4. Методы2 k, R1 p1 M; Z5 D+ C/ s
Метод reload(String questFolder)3 E. M0 D. A4 b, v) ^
  1. public boolean reload(String questFolder)8 g& _( V7 B+ Q
  2. {
    * S7 v, _, N& y2 A0 d
  3.     final Quest q = getQuest(questFolder);
    2 ]9 E4 t; A1 u4 `
  4.     if (q == null)
    . w3 t# Z3 I  Q( S# L
  5.     {
    ) l6 o  S9 Q5 z' w, @) Q
  6.         return false;" I. ]; H: @5 V) E* {* k$ p+ N# ~; {
  7.     }
    ! u) S/ f0 {: {
  8.     return q.reload();8 D  o6 v$ u/ a% C- L( c7 F5 S
  9. }
Скопировать код
- w% g4 z$ H& z0 }6 P

+ _# U9 C' t( J0 H; C4 sМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.3 `) c5 d& o) F7 g
Метод reload(int questId)0 ~0 V+ U$ @% G( Q' w% B2 ]

% K2 x" J# q+ b6 a
  1. /**$ P& ]5 u. p% @8 d7 ]
  2. * Перезагружает квест по ID.$ C. \$ `+ D. U- s9 p
  3. * @param questId ID квеста для перезагрузки
    & X. K$ i& T1 C% U! z
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    2 c( C) [# J# \$ \
  5. */
    ' W& S* [  ]; S9 ]# Z. t! X0 I7 T; ~
  6. public boolean reload(int questId)( i+ [. T1 y1 K7 c% A7 Q
  7. {
    2 H" N1 m. C2 S  [1 ?! W- c  ]' W5 T
  8.     final Quest q = getQuest(questId);: E( e- A# q; q6 Q9 q" x$ b
  9.     if (q == null)0 j) A5 ?5 D, w. ~2 Y5 l
  10.     {0 _$ j; l" |; c. D4 T2 k/ n/ P* U
  11.         return false;! v( b6 h( ]; P) t
  12.     }
    8 \' V+ C/ O# K1 ?7 H" c) K# N1 A) d- o
  13.     return q.reload();
    . j* ], v8 B  D/ G+ @- O. a7 d* h
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    " G6 S! N) `% ~8 q
# t. i4 |- Y; y# f! w8 h% n+ i. k
Метод reloadAllScripts()/ _* ]8 W+ j" o, A& H* j
3 G6 e2 @% d7 W6 |/ A( A
  1. /**
    2 E5 q2 b$ C7 i
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    ) O6 u" l2 F# g* ?! C6 r- L
  3. */# L$ W6 q  p( O" |
  4. public void reloadAllScripts()
    1 @' q( y( C* X. F& O/ ]4 M
  5. {, p% e( G# t; z; ~# \  _4 u1 L, i
  6.     unloadAllScripts();
    5 W9 J+ Y2 k) e: ]( F5 y
  7.     ! l! L+ \$ _6 }* j8 B3 A/ h2 `; ]5 M
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");4 v) [8 Z0 b7 ~
  9.     try, w: |# L. R$ T' q% t+ x
  10.     {
      W+ W' ]- t: K9 u/ i% S
  11.         ScriptEngineManager.getInstance().executeScriptList();+ E9 U, C+ O& s/ t, R( ^
  12.     }3 O. v; y. c- I$ [5 c
  13.     catch (Exception e)
    ( l6 O2 ~* _+ M/ Q: \. ~
  14.     {9 L  W5 L1 k1 u1 y; q; }2 i! A
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);* a2 a7 m  O6 k9 P" M
  16.     }. V3 G: h% m* c
  17.    
    , n# N8 T, Y' u% n" D
  18.     getInstance().report();
    8 p9 K5 O5 i% H0 U7 e1 U% Q" z# \8 G
  19. }
Скопировать код
Метод unloadAllScripts()3 }. y/ V; V+ a5 T
- ]2 Z( X- I, f+ X
  1. /**
    # s2 K4 _* h% e6 r* a! L8 d& h9 ~
  2. * Выгружает все квесты и скрипты.3 }4 i4 G7 e$ o
  3. */
    + s* A: e% d' A+ H" W1 f# \
  4. public void unloadAllScripts()
    . G4 B# x- t$ d) u' ?5 E
  5. {
    1 U& ?0 M0 s8 p2 P! F* j$ V8 W3 d
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    . B: F& w. l8 `
  7.    
    / N5 D0 B. g; D
  8.     // Выгрузка квестов.9 I: B1 g" a- K) P  d
  9.     for (Quest quest : _quests.values())
    8 ~. o7 v& M5 J; |% F" d
  10.     {/ H% x9 `6 ?8 Z  a% K
  11.         if (quest != null)/ Z1 ]/ a; p' T/ ^# g9 o& H
  12.         {
    4 F+ w6 x) s3 Q4 M
  13.             quest.unload(false);
    7 A; h9 }# F* L1 A* i4 S
  14.         }! R% Q6 i* R+ y
  15.     }5 v$ o  d- Y7 V" @! J
  16.     _quests.clear();7 Z' T! z; L7 F& I1 l' z: S$ N# g# }
  17.     // Выгрузка скриптов.
      r4 K3 s4 O+ \( j9 O9 i1 y! X
  18.     for (Quest script : _scripts.values())4 i* }( I' @1 l, ~
  19.     {
      B5 l' `- G: ~( q
  20.         if (script != null). j& l. I, b2 d8 b
  21.         {
    2 g, q% a# u5 J  }. Z' J
  22.             script.unload(false);
    ( V  |. d( j7 q- [3 ]
  23.         }! b! }4 M+ }* O1 l& h
  24.     }6 F4 Z+ C" v& K1 U3 q2 x
  25.     _scripts.clear();
    , M% M3 [) h! X+ t9 ]6 b! A: Z9 z
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    ' U4 }# n$ z4 j" |

' z/ Z$ h5 f) Q: D4 E7 Q% @! w) CМетод report()
. e& Y% `6 G/ \% f
6 W- z3 S! a3 u: c$ e% N
  1. /**
    8 @4 C: ^* C7 P/ x* i1 W4 @* l
  2. * Логирует количество загруженных квестов и скриптов.: G1 f9 O- M/ s! Q& ^( J- g
  3. */
    % d6 S3 B& m2 V
  4. public void report()0 Z) g6 [* H2 G+ S2 I* b
  5. {; f) ^% _! Z3 U
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    % B8 s$ @& M! H2 _3 r8 z; n% N
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    ; Y5 Q1 w+ A* ~8 B. A' s* x% C" R
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    # B% M& V" @6 O) Y1 Z
4 o2 j% x6 D& ]8 v9 A
Метод getQuest(String name)  [5 x: p$ e; c4 c1 p+ `
3 V8 S; \8 H$ J
  1. /**; I' f' C, r2 Y' P3 e7 E
  2. * Получает квест по имени.
      K/ L6 Y5 g) z4 h
  3. * @param name имя квеста
    , T" k) ^! u8 `
  4. * @return квест/ E/ r2 g: }5 @8 z" ?5 F6 |
  5. */
      g4 T6 [/ C7 C- ?$ C3 e! m
  6. public Quest getQuest(String name)  U2 B0 Q; N- y, i9 V1 A/ ]$ y" `* X2 n
  7. {
    7 B: ?1 w0 y7 f" p1 o8 Y( m4 v
  8.     if (_quests.containsKey(name))
    " V, h0 x  d5 e$ Z1 ?5 ], X
  9.     {
    ! W( }+ J0 t' H+ i) y
  10.         return _quests.get(name);' K; X) _9 [% Z2 N# d# X" U( W  z
  11.     }
    6 |" }" m* ]% P! m3 p5 S
  12.     return _scripts.get(name);! r2 `* [3 n! C5 T$ {. e
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.5 b1 w9 ?  T0 _" a

) t1 I! M7 ^' r# e1 aМетод getQuest(int questId)' I5 J' y* Y. e4 q1 ~
% m% Q: h4 y$ P, j
  1. /**
    & Q2 Z1 c. L& w: h+ B" n
  2. * Получает квест по ID.
    9 o3 k3 t) B) C
  3. * @param questId ID квеста% d2 e  \; Q( G, A  ]: R& e
  4. * @return квест, если найден, {@code null} в противном случае% R* {  Y- _$ Q. q$ U  V
  5. */8 R/ P- v4 I, e: z
  6. public Quest getQuest(int questId)* K, R) R5 Z$ w  }3 Z
  7. {' n1 `  M4 M/ Z3 F/ h  R
  8.     for (Quest q : _quests.values())* Q) u' T. ?3 L3 k3 `( d
  9.     {! ^/ ?* w( L0 g) a
  10.         if (q.getId() == questId)( I5 e" i4 C7 a3 a* Z0 D: H4 }
  11.         {4 J, g- a2 L9 m+ Q
  12.             return q;% x/ W& q( v% a
  13.         }
    4 M) J6 P/ q# S" {+ P/ N' N3 U
  14.     }
    " i" V9 u9 N) L  P. v# ?' l" `
  15.     return null;. T: R# z$ `* [4 k9 F. x1 p$ D
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.% b4 v" ?3 H/ b% V

' C6 m3 }0 W, x% E6 r! LМетод addQuest(Quest quest)' t" d) m+ [6 C# J5 ~' X; W' A
0 ]5 m& c3 S- `
  1. /**  H" t7 p/ ]& X- S2 x, E( l
  2. * Добавляет новый квест.
    $ w4 f! u1 g" Q. ]# V3 F
  3. * @param quest квест для добавления
    & i1 _# f! m+ t) d
  4. */
    " b  k; u+ f  q: P9 T6 k
  5. public void addQuest(Quest quest)% @( Y) _& d% k6 f: R0 ]
  6. {
    2 d$ H& t( A4 m0 v1 c( {  j# U  s
  7.     if (quest == null)2 l% j. d; y+ y
  8.     {3 f; S( W( ~  U0 B
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    . f8 l4 J! o+ {- v8 w
  10.     }
    % E, M6 f, Z* R6 l% v4 _
  11.    
    5 |& P( h  J; D/ f, ^6 ]" m* J% b
  12.     final Quest old = _quests.put(quest.getName(), quest);( Z1 j- a, n  X: _5 t
  13.     if (old != null)
    ; V; U! s& w3 y5 e
  14.     {
    1 N. v% X$ c) m. i
  15.         old.unload();
    2 r! f% T# b7 ^
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
      z; W5 V; v" h4 M1 ]6 m  u9 |
  17.     }
    + J/ u4 Z  R. _, A
  18.    
      `6 R5 y' ?# d
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)  D+ G. H4 }% N
  20.     {- M' F  [8 y; a' H! h3 M" J8 P
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    $ ^" X/ j3 E: Z3 Z
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");* l" e4 T$ Y! e2 D! a
  23.     }0 V6 f$ @8 J6 H! B8 N$ G
  24. }( V+ ?& y% j& z& K( w
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.& _- V/ a4 n) n3 L! f. S. H) Z
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере., `8 N' N& e( l3 G. H+ P
5 H$ b  D8 O9 W& m$ s

( j7 h# o! ]8 X! C% P5 Y  ^4 p; o/ y$ y6 w1 K4 J
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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