Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius4 B. C9 Y6 Y9 \
* x9 Q- j8 [. i
Разбор файла QuestManager.java, B9 O6 u' R5 Q. P$ a$ s( _

) c$ K% _' O: w3 i+ d: sЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
7 f; H6 O" Z7 ]+ y) g2 \$ iОсновные элементы; |% g+ o- k- T. g; y  p# @
  • Лицензия
    8 H+ [+ u- D7 V
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии./ ]2 U9 }, v2 x
  • Импорты
    1 `" ~! v! d4 x6 e  a5 K

# b6 ?+ f% z% y9 H2 F; k( G* R5 NQuestManager.java — управление квестами и скриптами.
8 n$ n9 \  [6 F, n% P* FПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
, U8 a# W* p) B1 F' r& r- ?: `  A+ e* W
& G7 _" c9 [0 Q; n! F# H

5 I3 W0 j% L  A+ jДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.4 s5 F% m4 `8 ]/ |) c9 ]- q
1. Лицензионное соглашение
, I' u- R4 T3 A, J$ m( V! V
  1. /*
    4 s, I" h" p* ^( Y
  2. * Этот файл является частью проекта L2J Mobius.
    $ R, R  F! A* c
  3. * & X; v( X( ]/ v. S( g  @+ O
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    $ S2 @  D. b" W/ Q, ]
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    " B- d' d$ Y6 m/ `% O- N) Z# b9 N! H8 R
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.2 X6 x# `9 _! X5 @$ W
  7. * ! Y" B0 c& f* P$ j
  8. * Эта программа распространяется в надежде, что она будет полезной,) F8 [! c, b' ^8 f* S
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    1 l. A0 B5 A0 i+ \- e+ q" g2 Q
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.. S, e7 h; e- Q3 K5 i: s
  11. * См. GNU General Public License для получения более подробной информации.2 ~+ c' Z+ }, G  E7 j0 ^9 H
  12. * + f" k0 C- ]( v" ~: U  F+ b
  13. * Вы должны были получить копию GNU General Public License- \+ v) X$ j# M* B
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    & S3 E2 w2 F2 A6 g$ M
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.' E: s% g" t! A8 s. n5 ^0 i% ~
5 A3 T6 k, w9 b8 S: d- e
! Z# q4 @# Z9 W* O  i. n
2. Импортируемые библиотеки7 v: Z/ ~. M  G3 P( c0 Q6 U: p9 U
7 @5 Y/ R  \6 w: ?3 r; V5 v% W
  1. package org.l2jmobius.gameserver.instancemanager;
    ( B/ ?' Z+ P9 O5 v4 A
  2. # w. F5 S: F9 j2 m& G* y3 O' U6 d
  3. import java.util.Map;
    ; i! \* ^6 t% E6 G* J
  4. import java.util.concurrent.ConcurrentHashMap;
    . P! J: U+ F* U
  5. import java.util.logging.Level;
    $ Y* V; [& s) g/ y% A
  6. import java.util.logging.Logger;. O( f2 Z1 |. v( }0 p

  7. ; q. X! K& G7 P
  8. import org.l2jmobius.Config;
    ( L! ^* q# F3 r
  9. import org.l2jmobius.commons.util.CommonUtil;7 @- g. M4 @% Q5 V0 `: G% b& e2 @8 @
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    , J* f: R0 }9 X" {" r  q9 I
  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 — менеджер для работы с игровыми скриптами.+ |% J9 @% l. \! h. ^* z
2 ]' s5 O/ |3 v
3. Описание класса QuestManager
" z8 j6 Q9 @% Z2 N! o" J; o; f2 n
  1. /**
    % ~( I- u- W0 l7 u
  2. * Менеджер квестов и скриптов.2 H, G8 i6 M+ y, \" a) m& C. u: ~
  3. * Автор: Zoey76: U( Q3 K" Q; o) |: r. o4 ]
  4. *// `/ j7 ?3 D! Z" `
  5. public class QuestManager
    2 W% _6 B( s" C6 y( e: @( q
  6. {( U# g* I" D+ }
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    6 `+ S# J6 N: W' ]9 L# @1 v
  8.    
    " k1 u4 [" V0 p' \0 ~# i! z+ t
  9.     /** Карта, содержащая все квесты. */  }2 j. t* k8 g+ ?7 X2 Z
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    ( h5 n( r+ a  O1 o- _
  11.     /** Карта, содержащая все скрипты. */
    $ d/ K9 V2 r; c% f
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();; {' u1 j5 q, x! n/ U3 ]4 M
  13.     + }* w4 a3 {: A5 m4 h0 b* x, K
  14.     protected QuestManager()
    9 e! y; X# A+ }9 Z6 v6 C
  15.     {$ M: h. \% i. Y4 ^# v) e5 s
  16.     }
    ! m! Q; C2 E: }8 i
  17. }
Скопировать код
4. Методы) ?+ ?/ ?& g( u  h
Метод reload(String questFolder)8 ^8 a+ ~8 g# {+ V
  1. public boolean reload(String questFolder)
    0 Q: O/ W3 S( d/ o9 c- t% C
  2. {& S7 ]# l3 C8 y+ ]
  3.     final Quest q = getQuest(questFolder);
    7 W4 o3 W4 a: @* O1 ^( @9 }
  4.     if (q == null)0 B6 @# I: b; X
  5.     {
    7 @' M2 s4 b+ s! x
  6.         return false;
    . {( p$ D/ h0 R$ I: R" R7 s
  7.     }
    - P8 w" v' G7 Y$ t2 [5 m, @
  8.     return q.reload();
    , P+ o. N$ X9 K6 u3 e
  9. }
Скопировать код

$ ^& s: A# Z! X6 q8 n3 I: i6 E  s" ?; Q# G: J( ?' e
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.( |: H2 W; ^7 r+ o
Метод reload(int questId)
9 D* d8 l6 h  I) N+ P' Z" a
8 ^0 b/ p; S; T. r7 i* U; ~3 Y
  1. /**
    0 R4 G0 l+ D% ?* J- Y( }  p7 p0 D8 i2 Y- _
  2. * Перезагружает квест по ID./ t% X( I" d% I" j3 f
  3. * @param questId ID квеста для перезагрузки; o% P7 B/ P# K: k' r( V
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае# A5 b+ b) i& @0 x4 q, c0 g
  5. */
    " j0 Q$ M( M' i( j! _" m: y& K
  6. public boolean reload(int questId)
    ( P: k: y# U' }& L
  7. {
    5 l# O3 c' b" k2 ?) n3 H7 Q: |8 w
  8.     final Quest q = getQuest(questId);
    # T/ e: _& j+ g, E5 j& O' l  r6 h
  9.     if (q == null)
    # D1 z. N6 ^* k% c$ I! q( |
  10.     {* E0 X# T" i7 b) F0 w
  11.         return false;; p1 @# r% R( ~$ w7 a
  12.     }
    2 K' Q, G% W' M8 X% b0 D$ w
  13.     return q.reload();3 }6 K" I" j4 \* s
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.  g. P9 j& K! E+ [* B* y, Z; g5 R- V

6 R1 v8 S4 k* f; wМетод reloadAllScripts()
4 I5 ^9 Y( a; {. W8 F" p# _$ v" S- w- U9 l  y! i, J! |, C8 @
  1. /**( n9 U1 N+ M" O: w* Z' l
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    . U  e$ }( W: M! R1 @! ?
  3. */
    3 u! e0 m# o" @0 p* ~% b$ L
  4. public void reloadAllScripts()
    & v# D" v) F0 w: Q6 G7 }' k$ s
  5. {
    ) u/ ^" m- T: Z: u  |) U3 E
  6.     unloadAllScripts();
      o% k2 x$ \5 o1 S3 U
  7.    
      c7 s5 Q4 i. y
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    ! k4 E- s5 ~( r$ x3 X( K# V5 I
  9.     try
    5 }2 j" W- S. M5 N3 _) v4 b
  10.     {: W9 V& F: y1 w. C6 e) C: n. G3 h
  11.         ScriptEngineManager.getInstance().executeScriptList();
    * p9 a7 I3 @# d, F7 L5 `0 @4 n9 ^4 h
  12.     }9 Y/ A/ N: l: L7 G7 r& R
  13.     catch (Exception e)6 @% J7 v# S/ X8 x
  14.     {( F* g% Z3 I% Y/ u1 s: y
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    8 F* C$ p* h' O: `! h
  16.     }
    " g. @0 {1 ?) e  C& E
  17.    
    + ~6 e0 j4 n/ |( D& s/ F
  18.     getInstance().report();
    - L) J( M* I1 ^. M4 M$ f& ^0 o- }( J: I
  19. }
Скопировать код
Метод unloadAllScripts()
+ y; r; T# U/ F: @( V- o
4 c" y, L$ K( h. u- w$ \
  1. /**
    4 N4 M% K3 G, [3 h. n* g$ [
  2. * Выгружает все квесты и скрипты.
    1 P4 l' V+ n6 r" ]7 `9 X
  3. */
    - W* y5 D+ {( S; ~
  4. public void unloadAllScripts()- {4 D7 B: r0 a8 I' g
  5. {, u) ]9 A# b0 c
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    3 N% \) F# F9 t8 i' Y4 X
  7.    
    5 `% x5 f; \5 b, {! c6 _
  8.     // Выгрузка квестов.
    % f' K  Y$ c& F/ P( u1 n2 z' j
  9.     for (Quest quest : _quests.values())/ }4 s3 x4 {' x( m- e; b& R( [9 S
  10.     {
    + c3 O$ v+ j. T# U: e. g
  11.         if (quest != null)
    3 S3 v) p: s: T& m( A) Y. V0 ^
  12.         {: B* h4 F0 ^5 v* q( v
  13.             quest.unload(false);
    6 p, ~8 ~5 s$ L* o" f( E; N3 V% U
  14.         }$ Q' b( p2 R$ J" i
  15.     }
    " N2 u* e9 b  q4 ~
  16.     _quests.clear();8 k" I+ y, Q; ^# F
  17.     // Выгрузка скриптов.
    0 Z% v3 p' z$ t& I, f' K. S1 A
  18.     for (Quest script : _scripts.values())
    1 P& j) I, z3 e0 z
  19.     {
    % j5 e# G5 g+ o1 u* z+ {, N: l- C! u
  20.         if (script != null)
    " H6 N0 l+ p( H3 t: N9 }
  21.         {
    " y! n. S3 a& V! e. e* S
  22.             script.unload(false);
    + }7 X9 U5 I( O' B8 @
  23.         }0 w( |. u- a/ ]: C9 g7 y
  24.     }
    8 p* }- J% J' ?2 Q( c+ U+ G
  25.     _scripts.clear();9 ?& P: e; F. n, s& M* j: X
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    ' }. `8 l6 k0 ?. z: l) G0 I* _4 M

! `4 g+ t3 R( `4 JМетод report(); y9 o* W+ u7 ^, u# G" }

( G' ?  C& N  p
  1. /**0 D2 F0 q% ~1 e2 D3 `- N+ ]0 [* T* d
  2. * Логирует количество загруженных квестов и скриптов.9 \& f. U4 {( s8 w. S. g
  3. */
    $ f2 Y* ^! f4 n7 V( w- p
  4. public void report()' a# g# j( ]' f; Y2 w
  5. {9 i1 B+ v4 t) }5 Q
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    7 g4 b; k& X5 n' a, n
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");1 P4 T& r# g6 t1 Q
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.$ X  @" Z' ]9 |8 W7 c. S2 K' ?
- w, v4 Z8 ?" e% ]* B; \
Метод getQuest(String name): j( m6 v. {4 G3 _# u, v- d

9 k. H) K  S/ }- }2 X6 P
  1. /**4 f% [" B* t  e; w
  2. * Получает квест по имени.
      y; @, e- J. A4 s0 {6 ]4 K
  3. * @param name имя квеста
    4 S4 E; a2 N, {+ ~$ }( y$ K
  4. * @return квест' f5 _7 Z$ F& p
  5. */- Q( @, W: k, ~8 N, ^5 [) I" h
  6. public Quest getQuest(String name)+ z; i7 e9 n( Q; H, p
  7. {1 J- j5 K' R1 K5 h: u2 d) z- J
  8.     if (_quests.containsKey(name))
    8 v) V+ F: F3 }$ O* ?$ L6 @/ L
  9.     {# o# G: j2 U9 ^8 o* ^$ p% o
  10.         return _quests.get(name);9 i2 L! X, q" ]" q
  11.     }3 p, `+ o( S! v& F9 o: W
  12.     return _scripts.get(name);: x/ c+ P# A6 O9 d: _
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    ) b% ]" v( N" J' T5 C2 a9 r8 Y
1 T: M9 U9 U7 w: t* \0 ]9 Y
Метод getQuest(int questId)
, I7 [2 d( a; `) ?
1 l* o6 K: T- \' r' F, K; P7 @! w0 B
  1. /**
    ! i2 j4 t' i7 I5 _" p1 r+ |
  2. * Получает квест по ID.  l  K5 O9 S( o- A5 T
  3. * @param questId ID квеста7 Y& Z# @1 ~' t' J* @* U
  4. * @return квест, если найден, {@code null} в противном случае, D9 n, Q9 r2 n6 d6 C$ A
  5. */
    5 `1 H9 r5 N, ?6 ]5 e6 ^/ G- o
  6. public Quest getQuest(int questId)) T( y, X0 m2 I* E; L( [; W9 u1 i7 P( I) H. \
  7. {) E+ |7 _. C' t8 K
  8.     for (Quest q : _quests.values())( p$ ]/ ?5 ]2 N: R
  9.     {: ?! t: C2 N: F( k; {
  10.         if (q.getId() == questId)* {. H6 q1 q' [& Z3 n
  11.         {% N2 N/ y- E. p1 q' g6 y& a
  12.             return q;# w& l, D/ t, Z9 x) C5 Z% K  w
  13.         }
    ! j. `7 e# O; r
  14.     }4 @0 {) z+ m0 i' [8 Y8 m* ]+ Z
  15.     return null;
    ! t$ c1 j  N) m9 @* X3 \
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    4 O# b' I& a) h" X2 ^

: I( u7 L5 n( y0 `/ f7 w* ?$ `Метод addQuest(Quest quest)
) M. Z3 f1 }- ?. s4 C4 B$ r9 D6 [) k0 m  B' ?5 c, A  \1 H
  1. /**  w: A( O2 r' q  [2 U" t
  2. * Добавляет новый квест.
    " K' Z$ g6 z8 \- P: J% t
  3. * @param quest квест для добавления
    & D% U% _# @) S: g0 h# j
  4. *// X3 ]8 c, Y1 Z+ ]6 B3 P
  5. public void addQuest(Quest quest)
    ' u" W) ?  P+ a8 `+ s: b
  6. {. L: U6 |  @" U  H8 O
  7.     if (quest == null)  q& J& Z% G( D! n8 {+ o
  8.     {
    : t% J' j; v. `
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");7 ^& _% k5 G1 Z: j* {
  10.     }
    6 U5 Q9 F$ i! c3 ^
  11.     8 `) c4 C+ B3 y* b9 T6 @0 @
  12.     final Quest old = _quests.put(quest.getName(), quest);
    7 }' z' F+ u# i  h( a- c
  13.     if (old != null)4 B- ^9 L3 ~  ~' N
  14.     {0 p4 @) I3 y/ F) Z- w
  15.         old.unload();# k  _1 F1 J0 r+ y7 K- ~5 E3 h1 \
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");6 n7 k2 G+ \5 B2 J( m8 {' X$ ]9 s( Z
  17.     }
    & V( G% [9 K* v7 `* a
  18.    
    " D# ^: T" k/ x; `: K# q+ S
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    # B) S; D: m9 t. d
  20.     {
    1 a) s' Y0 K; o0 b. q; p+ s
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    & ^6 G" o, Y9 d7 M7 h; C) Q
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    ! y/ j, H' y& o- ^* y
  23.     }
    9 E& X4 q# ^( J# Q3 [1 j" ^
  24. }% r% q0 R/ ]1 h; s6 o. t4 f
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.  r* r  b0 q" O- C  J0 ?% I1 x; {
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
; h  L: k  y/ \' b2 n
' Q# ~8 |& u% b9 k# _) C
/ n& t% E) Y( \" O5 L4 |
) Y/ _2 ]4 k0 t  n+ H  y
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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