Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
- B2 ?( D! p/ V, h7 V
( P! j8 c* r1 v( C' U2 A+ _/ e2 ]* q: YРазбор файла QuestManager.java1 \" u* {- m! f+ u
& v, u" j" a! Y# x) V4 Z
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
+ h  J( X# U1 l) cОсновные элементы
8 j" `% J6 |) C+ ]3 W7 }, V
  • Лицензия( D7 F* X7 v; r$ ]! r/ g0 r5 B  S: S/ `
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      ! p! n# ]! U5 d
  • Импорты: S9 ?, e& c0 x. i8 `
0 ?# R) ~2 o6 i- ]( h
QuestManager.java — управление квестами и скриптами.
+ _7 K, }/ a) {) W. L. k5 eПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\2 x4 a- g8 I( l+ K' K0 E

+ W* z7 O- ~  J% u$ |, v0 Y/ t

7 q, N& d  a+ p" t. p% a% V7 `Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
2 u, U+ Y+ Y. _+ |# y; ^0 z. L8 \+ H1. Лицензионное соглашение
) q) Z% F$ Q4 w  z
  1. /*0 r9 l5 t. [6 @2 t9 N8 v6 N, Z
  2. * Этот файл является частью проекта L2J Mobius.
    . ~: o% [2 m* X1 L+ q( \+ H. Z
  3. *
    " q( o$ S9 G  A( J3 C+ z7 [, _3 X) E0 ?
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    % n7 E; U" z% M! Y. ?
  5. * её в соответствии с условиями GNU General Public License, опубликованной5 H, V2 [7 N7 [* v4 z  J' ]
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    : r% J, [3 ?( `: K4 w
  7. * / o" W" t* N: ^8 @- `
  8. * Эта программа распространяется в надежде, что она будет полезной,6 R# F$ r# S3 s( [) f4 P, W0 h! q
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    $ l6 g4 J7 ]5 ^5 I& j% t, @* m
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
      t6 t# n1 ]+ r* a0 Y" W: {3 W' f
  11. * См. GNU General Public License для получения более подробной информации.
    + b8 Z0 ?$ s. f% e
  12. * . }/ F- p6 {" l' K+ f. J
  13. * Вы должны были получить копию GNU General Public License
    5 x9 [" {' D, o( Z2 K( H
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    7 X, e: Q: i/ K* o( i8 ?
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.1 g  F, z$ F  x3 R
3 q% o5 `* a# }6 `. `% n: V
* J* F- K3 |% M4 R
2. Импортируемые библиотеки4 n. L( H* I+ k9 G

0 @5 U- U# W8 ]
  1. package org.l2jmobius.gameserver.instancemanager;
    & u; e! _* |4 Z2 d% \, C2 x5 E# _7 u' A
  2. 5 e. F( `: a) n. o2 _
  3. import java.util.Map;; K* M8 C& L0 B. f* d9 G- U7 P2 B
  4. import java.util.concurrent.ConcurrentHashMap;
    : M4 t4 V1 y/ g$ }3 b
  5. import java.util.logging.Level;3 G6 O3 j- n- G
  6. import java.util.logging.Logger;* b& d1 z2 X% t0 B0 V4 |- T: f
  7. 8 k% {8 V: X4 Y: P5 g* i$ f1 z) j
  8. import org.l2jmobius.Config;
    6 Q3 R) I8 U5 J
  9. import org.l2jmobius.commons.util.CommonUtil;
    4 O, h& l% s/ o% {' H0 h& P  w
  10. import org.l2jmobius.gameserver.model.quest.Quest;* E; ~' `  }1 h/ g; o. x
  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 — менеджер для работы с игровыми скриптами.3 B: \5 o& c: s$ p

# o7 |* ^( G8 D* j/ S9 q# N3. Описание класса QuestManager( M8 @0 b, B' `% `
  1. /**
    7 x& g. B0 c$ L! i  r. U
  2. * Менеджер квестов и скриптов.5 G; Y& Z/ M- e, r3 l7 s
  3. * Автор: Zoey76
    : y" h' @! W! H2 Q. N1 a8 i
  4. */" b9 I& Z! g' y& C- c7 w
  5. public class QuestManager& \* f- E4 b  b' o% B1 o; F
  6. {
    8 W/ b4 g: M  Z( t4 X
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    $ h& n% {6 H8 p# I  |, ?
  8.    
    4 ~. ^( ]" Z3 C; g
  9.     /** Карта, содержащая все квесты. */- x* Z3 C, t4 v# S
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();- ?, t6 y) M: T% z3 D
  11.     /** Карта, содержащая все скрипты. */
    % M; U1 @% j. p5 h% W& S# N" O  N
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    $ s( e3 ], E& [$ q- W
  13.     * z* _3 E' L6 {5 T5 f
  14.     protected QuestManager()! K% ~% ^6 \# h1 ]" x6 J
  15.     {$ x# W+ v. [% G  c6 b# B0 ?
  16.     }6 Z8 _9 @% a  H8 `" X
  17. }
Скопировать код
4. Методы/ q  D" x8 S+ d' g5 E
Метод reload(String questFolder); C4 h) T; P( D. r
  1. public boolean reload(String questFolder). e  w, `1 p  d. w% U  \: o
  2. {* Z1 {" E' d! s) h
  3.     final Quest q = getQuest(questFolder);$ y# G6 p9 ]( H* ]- H' j/ O
  4.     if (q == null)
    " v, L6 G" U  Y& x$ q; M4 P- R
  5.     {2 D0 N1 I# V! ]4 Y+ P0 W6 @2 T7 v
  6.         return false;0 f) |4 Z7 ^  X  u! ~2 y  F7 F
  7.     }2 w  E2 Z1 ~0 j( c6 H* Z
  8.     return q.reload();
    , U( Y# u* X- T$ j- P2 S' T
  9. }
Скопировать код
0 L  M. m0 S" |( _* e/ o

3 ]( m% g1 R* l) ~8 SМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.% |4 o3 \( w4 h
Метод reload(int questId). V4 g: O& `' B: ]
: J- x% j! }0 L% O0 D2 s
  1. /**5 W" u) y# D/ S
  2. * Перезагружает квест по ID.
    4 @5 n  L: N5 k) K: y6 V9 y
  3. * @param questId ID квеста для перезагрузки# l# V+ _+ i) q9 l7 ]# C9 c/ z
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    ! ]3 a! `& K( J2 ]$ W3 \- U
  5. *// C9 \! i" B; G! p, q
  6. public boolean reload(int questId)% }4 q# w# c  G7 A
  7. {+ Z7 v* b2 K! [# J/ k  z; h
  8.     final Quest q = getQuest(questId);: c, D& x; f" f; }+ o7 ~
  9.     if (q == null)
    + v8 s, _$ O3 d6 o3 R) _! r- q7 ?
  10.     {6 H# y% h+ @7 L
  11.         return false;
    3 G, y/ v$ L9 x* c6 V! Q
  12.     }' P% ^# ]4 l  J- w- c6 V. t: J
  13.     return q.reload();
    8 {. d; I3 O; ]. @# ^1 _( u4 R8 {1 M
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    + |7 _8 h2 b% i- g! M

. c- F& j* W' R( B* x9 T) QМетод reloadAllScripts()
; F* K$ [' @! Q; ]1 u3 Y4 h3 t0 N. O+ i+ \9 V! ]: ]
  1. /**' B3 Y! Y. k4 q" k# D4 L
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.. R1 ~1 x  V8 K5 s1 B7 g
  3. */
    " P3 M# m, X$ E; y
  4. public void reloadAllScripts()- f0 g% m! d% }! J
  5. {4 f7 |+ p$ \6 i
  6.     unloadAllScripts();
    : X( M6 o  P/ ]  ]
  7.     + J1 O; P4 ^9 h, I, ]8 F4 G5 s
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");( R& A. {( s0 v7 [7 L
  9.     try
    9 h+ m- G* i: t& e) N
  10.     {# c. B, y6 R; Q3 W7 B' N" @
  11.         ScriptEngineManager.getInstance().executeScriptList();# F3 u! @. c; i0 _; W' ]  C
  12.     }# C' A% _- I3 s( A
  13.     catch (Exception e)9 v! s1 L9 c/ L. d
  14.     {
    7 U2 H# {0 W! U3 \- K* W
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    , M" ~6 S3 z# D/ n% s& M% b! ~
  16.     }
    # y5 V. z# M% i. b0 y: o
  17.     6 K2 C) `1 S! d- I
  18.     getInstance().report();
    2 r, ~) N3 }! X" i- J3 @7 ]
  19. }
Скопировать код
Метод unloadAllScripts()
# Y' k! ^; Z  `, ?7 R' o
7 y1 S1 D$ W/ m8 G: }: `* }* N
  1. /**
    ; D  \% L! `7 ?9 z- Q2 ?. z
  2. * Выгружает все квесты и скрипты.
    $ d! z9 y- S" x' [6 I& e
  3. */
    ; u/ z, i" n8 r2 @3 k
  4. public void unloadAllScripts(), |2 l# ~9 k& s' \
  5. {: v/ M$ H5 Q, X& o
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");  ?) s7 z8 S+ ]
  7.    
    ( ]( x2 n1 q- H$ l7 s9 Y
  8.     // Выгрузка квестов.
    4 M8 f0 \$ i9 s, X0 o1 }
  9.     for (Quest quest : _quests.values())( E4 a/ [- r: m" ?! ^
  10.     {
    3 e% O+ _. S! y# B) r
  11.         if (quest != null)2 Q& ~# d$ r6 B! K$ @9 K# g" Y
  12.         {. m; }6 q* G$ V; V* `2 a! S
  13.             quest.unload(false);
    $ K% u" B( M6 b# z; |+ K
  14.         }6 z1 o2 z3 Q3 q6 u: S/ w1 @4 Q8 J
  15.     }* n9 ~+ `  a8 b: J( L4 t2 l9 d
  16.     _quests.clear();) i% I  A4 B  p0 x3 S8 v! q
  17.     // Выгрузка скриптов.
    7 k+ A3 s( ]4 d7 ~1 x
  18.     for (Quest script : _scripts.values())
    + `# u7 F5 F6 n4 S) R: g
  19.     {
    5 T$ Q0 f  y! ~$ m+ f
  20.         if (script != null)
    : J( z# K) e8 h- i. g
  21.         {' c# T* m- ^  W7 i: v: l7 F
  22.             script.unload(false);
    & N% C4 q+ Y7 X7 h! U6 R
  23.         }- D' \5 ^4 k' A- k1 ]( _0 r
  24.     }
    " _- i) o. x' B+ I- c4 x
  25.     _scripts.clear();
    ' B% E% d( \9 v1 E
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.) w5 f" c1 i  d8 }# I$ x! n
$ E% G* b- `% a( z! K7 ]8 x8 u! f
Метод report()
+ e, W6 U- O/ G% F1 M- }' k/ d. a0 o5 ]$ B. l+ w
  1. /**3 i' Q' D' I7 [' v- F( d! ~
  2. * Логирует количество загруженных квестов и скриптов.
    7 a: Q: m4 J" T6 d! f8 v
  3. */% d; w! y+ x7 w: Y7 s
  4. public void report()
    / O0 P2 n7 e( u3 c& P
  5. {5 q: p4 V" y6 r5 ?3 s
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    & @* a+ c; k2 W* {! w& P) R  U6 i
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");+ C  ~2 B1 {' o- i
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    9 k) m7 t$ z$ G& q  i+ z
1 [& ~/ j" H- M! ?# l- _% H1 B9 z/ b
Метод getQuest(String name)" ?( z& \5 l( i% _, ]0 w* u+ Y2 g

" R6 h; K9 u8 V
  1. /**
    . [0 `6 ?6 c& O. E. E
  2. * Получает квест по имени.
    ' ]1 R& n2 B9 L: m1 y8 _. Q% t
  3. * @param name имя квеста
    ! t$ f% l$ u. E8 u
  4. * @return квест
    7 @2 o& ^9 o! E
  5. */, u" ^. Y! Z, q( G8 U6 V# U
  6. public Quest getQuest(String name)
    2 r$ Q3 e5 d7 A3 x: p5 z
  7. {
    3 ^' d- N' \4 d1 p
  8.     if (_quests.containsKey(name))
    3 E1 a- ^. l; w. l
  9.     {
    7 R1 `  Z% g: m1 ~" t1 C# W2 v
  10.         return _quests.get(name);
    ; L0 u. {8 b* ]7 W
  11.     }/ P* n# Z- u4 d7 C# p! T3 n
  12.     return _scripts.get(name);
    % w5 U( Z& `5 }. [& I
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    / j3 x; v4 ?( f
1 z5 V% s: ?% ?7 F- q+ b: C% U
Метод getQuest(int questId)! F% L5 o$ \; F; X" y% w- R) S

' g) H. U; y: O* R. H+ Z: T
  1. /**
    , e1 M6 T4 y9 X3 y
  2. * Получает квест по ID.8 @" v) a; i, G6 W
  3. * @param questId ID квеста
    - ?4 W. m  H4 h( i! z+ Z
  4. * @return квест, если найден, {@code null} в противном случае3 X& w) B7 [( ~% |( F* V
  5. */& C" i- O4 i5 W# Y$ q  B
  6. public Quest getQuest(int questId)
    - ]3 y/ b! N( S
  7. {) M! A: e, `  p# u" P( j
  8.     for (Quest q : _quests.values())
    1 D, d4 |$ L5 K8 v8 C% W! p
  9.     {
    ! l5 g4 ~/ L. r) [3 J
  10.         if (q.getId() == questId)/ g1 q! U: [& b: r8 [( m
  11.         {
    $ S5 A$ B2 M9 Z# K7 _
  12.             return q;
    * a  d( [$ g' j/ C
  13.         }) o( }& i! p: y0 J- c  l
  14.     }
    ! `6 p& [5 w9 D) C: K, ^0 K( E: Q
  15.     return null;8 a, P' z$ _* a1 W8 E
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    6 ?# F* ~  o% Z1 r0 `4 `
" P1 a2 X" n  Q" H
Метод addQuest(Quest quest)
1 G- ~7 x: Z- N# l# ?& Z0 s
0 _* r  m+ ^0 M+ i4 R# D5 M
  1. /**
    * D0 P( }1 _5 P6 T0 U
  2. * Добавляет новый квест.
    $ A/ I3 K! m. r, k2 e! V
  3. * @param quest квест для добавления
    2 l$ U6 _( `- C# H3 d2 o
  4. */7 e5 W3 z) ^. R/ X! y; F
  5. public void addQuest(Quest quest)( ]  P- y* W' n% S# W
  6. {
    - W8 G* k5 Z' L
  7.     if (quest == null)3 a6 v! @4 _7 ?2 C8 j; O
  8.     {+ _. ~- p, X: {4 X4 c3 S" Q
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    & K) z; T4 r% b4 [
  10.     }
    : C( [$ J8 p7 r% z9 l4 l# ?5 G
  11.    
    ! K" a6 G$ }+ }! K! K. I
  12.     final Quest old = _quests.put(quest.getName(), quest);$ R: n4 j. W8 r! q
  13.     if (old != null)9 {+ \& B6 c: s5 U7 {& I) F
  14.     {
    5 y6 L- E6 {1 F
  15.         old.unload();% B8 D0 p0 w, u9 C1 T; B
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");1 w5 [8 P6 P9 |$ {0 D9 F7 \
  17.     }
    ; q& S( q$ B, @/ E
  18.     5 ?1 Z" l3 _; z" b1 {+ s
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    % g! A" b, p/ N9 d5 A$ @
  20.     {
      @5 m" L% h4 D3 J. W0 i
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();7 O- U! m; Z( Q! ?" o7 g* o1 {
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    # S$ w1 V- R" R6 d$ W
  23.     }8 l2 R7 ?- c0 o& l
  24. }9 r/ N# f. K2 x+ H) `" j& f0 i
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
. U  Q# x+ R7 q! F- h5 m$ \ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.: ?* X( R" k6 G0 n

5 B7 t; [$ Q$ N  G5 w. _& r, K8 Y! a9 D
0 t* y7 Q% i) [
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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