Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius- O$ z& f; l. p% g% u

: P  z4 h5 E. n# v5 X0 tРазбор файла QuestManager.java
! _" W9 v0 r+ p) k: `
& P' A2 e2 X  {$ D, ~Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.( O( c3 o/ Q3 V6 l, c; `4 i
Основные элементы9 ^' \1 C; L7 j8 y
  • Лицензия
    ) M) t; {' K5 r6 A8 p/ d
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.! q. x9 ~. {, ^1 y) v
  • Импорты
    . U" D8 N% A0 x1 L% r

4 Y/ r8 ^3 Y, e3 m$ ?2 xQuestManager.java — управление квестами и скриптами.
. \3 ^0 @8 u5 D7 d7 L1 U" \* \Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
( ]' I8 w1 j. J0 B  J
% F) B; Y: H, Z; [

5 V+ ]: S  r- x% r# GДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
& O5 r! M& g2 p% `& Y1. Лицензионное соглашение( [3 G% z9 M4 u7 c4 w
  1. /*/ H2 w) K2 I& f* ^" ?8 F& M1 E; M6 ~) J- D
  2. * Этот файл является частью проекта L2J Mobius.  D3 w! N  R  Y% `
  3. *
    ) b: B7 C8 v( I1 i% `7 D3 ?
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    ( R5 G) i& F- p" H8 z. \
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    8 ~& U( \: G. U2 Z: o: |
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    , {1 F& l2 d% W& `  {8 y2 A4 f9 J
  7. *
    6 U" ~* W) L& P' i, Q0 X0 c
  8. * Эта программа распространяется в надежде, что она будет полезной,8 t. m0 f$ x, }) a: n( |
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии4 \& w  c1 p; a3 W; L1 @
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    . V' |6 Z# b8 M/ H4 P
  11. * См. GNU General Public License для получения более подробной информации.$ V% {4 }( r, ?& E/ y6 J. B! J2 u. C
  12. * - G# f$ [* q. A9 r
  13. * Вы должны были получить копию GNU General Public License9 M' c$ M6 L; D, J+ }
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.: s8 q1 N8 ]  y  r* d% a
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.1 d) X) S" P- c0 F; X
+ P) Q5 ~/ K* p# r
, ~3 j% ]) B6 W
2. Импортируемые библиотеки0 S. N( D) A6 d; j2 `! o

3 L0 R2 q+ m9 c- T( K# e  h
  1. package org.l2jmobius.gameserver.instancemanager;" {2 c8 N) Z0 |- `" w. b. Z

  2. # ~' {" Z: O9 F; r
  3. import java.util.Map;
    & r( A( g2 f! p2 x1 W2 z
  4. import java.util.concurrent.ConcurrentHashMap;
    ) Q, \, ~/ l* `8 g  s& P
  5. import java.util.logging.Level;
    ; z$ D( {/ e. U3 f5 {; T( e
  6. import java.util.logging.Logger;
    % Y4 n; V! F; q
  7. 5 X7 j' ?; _& T2 s$ J
  8. import org.l2jmobius.Config;
    5 i6 }2 W; \! s7 x5 _/ r( Y4 t
  9. import org.l2jmobius.commons.util.CommonUtil;
    ' c1 R% k- q$ v) U) U, j4 {
  10. import org.l2jmobius.gameserver.model.quest.Quest;1 s) H6 y& w: @. T$ N$ ^8 K7 p0 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 — менеджер для работы с игровыми скриптами.
* q/ O( j+ E) Y8 P: d
2 A4 I" P2 w" N# N+ a3. Описание класса QuestManager
2 w- _) d! G0 D' [5 D$ ?+ `7 V8 G
  1. /**5 W' H4 ~2 U. b/ x9 y7 X1 O: s5 u
  2. * Менеджер квестов и скриптов.: M7 R! y$ I7 [$ i9 U
  3. * Автор: Zoey76. m$ Y2 u" p8 A
  4. */$ P: ]3 d4 i, _3 L
  5. public class QuestManager
    5 E' L' {2 ~% l" c8 ]  m
  6. {1 W8 s- w5 w  y7 V+ u+ R  i. b
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());  O  o0 J7 h0 ^  ~
  8.     ; l" Y4 ]. |2 v* A$ e2 Z
  9.     /** Карта, содержащая все квесты. */1 u: _/ Q( d$ m6 x" ]8 K, \
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    . w: l) l" ]) [& L, v, g8 U
  11.     /** Карта, содержащая все скрипты. */7 k% D+ p, X" C! ~+ }. e( S" H
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    ! a; @% R) a9 {; \
  13.     + |7 |6 f- Z+ o! J/ A4 d1 X
  14.     protected QuestManager()
    & |& h! H4 Z! l* p
  15.     {* D/ m; m% d/ G, B# y$ D1 z
  16.     }. Y' ]5 `' M6 a# a8 |
  17. }
Скопировать код
4. Методы
4 H% A6 ?3 G1 t8 |7 D9 MМетод reload(String questFolder)8 D" Y) S+ D* m# L  \
  1. public boolean reload(String questFolder)
    # F3 H; B4 S: B# q
  2. {
    1 j3 y# E% M3 k/ N5 o
  3.     final Quest q = getQuest(questFolder);
    ' A$ g6 {3 t9 [! \8 Y6 R9 M
  4.     if (q == null)
    2 _/ ^9 @& U- n  T( r4 C) P' I
  5.     {1 H! K( G& ?: d# x: N8 W& k
  6.         return false;" ~( n: H- M  X* \* U" j
  7.     }% k3 @2 H. ]' t$ d) u
  8.     return q.reload();; n: `" Q' r& p
  9. }
Скопировать код
* a' A# |9 I- H( {/ n

" u/ L5 x) k4 U8 q/ ZМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.2 x  b" u: o- r
Метод reload(int questId)
5 i4 s8 O2 O6 ^: }' S1 R$ v+ p' Y8 ]# T9 `
  1. /**
    + q0 s, t  |0 R( O% d# k  A. r
  2. * Перезагружает квест по ID.
    " v8 q* ^) L/ O0 ]9 o4 t
  3. * @param questId ID квеста для перезагрузки
    % g0 R3 _& `1 Q7 C) {7 ~
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае# V2 r7 W% p& q7 Q# D
  5. */7 g; v7 |( y) P  y% ?. k5 q% v
  6. public boolean reload(int questId)5 _3 O3 a) ?4 b2 c" {
  7. {
    ! I- Q! G' a/ L& U! C
  8.     final Quest q = getQuest(questId);
    # x: Q8 w) W6 E
  9.     if (q == null)- g/ U/ v! T! P% S$ ~+ p
  10.     {6 n5 L: H8 U. J1 z: M; z8 P
  11.         return false;
    % l9 L1 A0 ^, a- c; M, y# N1 B
  12.     }
    ! Q  C/ V+ P* E, U- e
  13.     return q.reload();0 P* ~6 }( K- `% {
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.2 O0 ?: J2 g" E6 e% H' H# Z: b, |
6 u, N$ u; q) h8 f; n2 T# P
Метод reloadAllScripts()
8 I" a8 Y- B$ o0 h1 H! P8 d1 |2 V2 p7 X4 _9 V, x+ r
  1. /**
    1 Y& z" X: G/ o
  2. * Выгружает все квесты и скрипты, а затем перезагружает их., z6 {% x/ ]" d: T6 R
  3. */
    % j+ F* W2 R- ?, Q% U& z2 g
  4. public void reloadAllScripts()
    % A4 U: q2 e+ Y/ j! j" _8 v( L
  5. {
    1 t/ b# k8 ^' G% A* |; j6 C
  6.     unloadAllScripts();' y6 C9 p! Q7 ^/ k% Y
  7.    
    : w! ^3 g8 X0 }7 x/ C8 M, g* c8 K+ m
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");+ k9 A- ]2 l( }* h9 A6 F: F
  9.     try  k6 [  ]  ]. ^& f
  10.     {$ a% K/ v$ N8 e( D; j' P
  11.         ScriptEngineManager.getInstance().executeScriptList();) v/ R1 E( N0 P. s
  12.     }! |* M! R6 u& b1 d
  13.     catch (Exception e), E: i8 B: W9 m6 s; m. c; R
  14.     {1 ?3 D: Z5 d" m# ~$ q" `: t+ l
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);/ P) c/ e- h2 d+ s
  16.     }3 ~/ H' I6 u1 c' o
  17.     + k) [/ v1 R& J/ y9 d
  18.     getInstance().report();
    , Z$ \6 V, x! ?! p& `4 F
  19. }
Скопировать код
Метод unloadAllScripts()
/ ?5 C! _. M2 b/ p! l. ^$ `( g
9 N* z/ o% m9 H- L3 _4 D' \$ p
  1. /**
    ! W0 r2 {6 ]: t
  2. * Выгружает все квесты и скрипты.8 _" w/ \% Q, B8 P
  3. */# A( [! l) C, k* \+ \
  4. public void unloadAllScripts()
    5 p+ B5 a# S  i0 _# f% r
  5. {" y8 B/ D; |+ R: a# a
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");1 O: Y- w# S# R' ?! [  y5 ~% C# j
  7.     3 P  G( |0 L& a& w: o
  8.     // Выгрузка квестов.' W- [. N" Z% K
  9.     for (Quest quest : _quests.values())9 X  O2 [& B! e1 s3 W( \
  10.     {
    * x7 ~8 A8 X6 S7 @# ^7 j) N2 \
  11.         if (quest != null)% _9 ?2 e7 O. U. `
  12.         {
    5 W+ G6 Y1 f( Y* z5 _# Z
  13.             quest.unload(false);8 h* F/ m1 g& C3 L. P5 V
  14.         }
    6 [9 u/ |& ]' I  N5 l
  15.     }& s, v. }( \0 P7 H9 n6 z
  16.     _quests.clear();
    ( j& W8 y. @6 K. W
  17.     // Выгрузка скриптов.
    , M" ~+ @/ H! d9 \4 l# u8 G
  18.     for (Quest script : _scripts.values()), p; ^% j+ _6 O, ^- W4 M& z$ Y
  19.     {3 \6 m: }) o# I: Y# e4 J$ @$ O, L
  20.         if (script != null)
    / Z! }# x7 ?5 U5 g8 H/ X. R+ Z% |
  21.         {
    ) J( N7 K/ \8 v2 C+ M- d5 y
  22.             script.unload(false);" L8 \, {# A& f, ?
  23.         }+ V) f, F/ O. O3 W( M1 \7 y
  24.     }
    : t- c) d6 N# C2 k. G2 x7 }& `, A3 B
  25.     _scripts.clear();. {& e3 k+ {, M, o( [# }
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.7 }6 R6 L& r( M; C  Y$ o
0 H; W. O0 L4 W$ Y, M9 S
Метод report()
3 ]. _- y( U% g" W2 Q3 d! T9 L9 \# [! p$ A! z! y) j
  1. /**+ \# [) g: ^3 i1 ]
  2. * Логирует количество загруженных квестов и скриптов.
    4 `8 y; R: F0 O! }, [
  3. */; h( J# R1 k" V. h& e
  4. public void report()- z" ?, f. M6 M# \( `
  5. {
    & `6 j) K6 Z8 P: w! Y4 V; K
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");& s+ p$ T' Z/ `9 b1 [$ n; W, V1 @
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");" n9 U/ @, {7 r3 N0 S3 }# v  s
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    9 t5 l8 N9 G# N0 y
0 i) z$ ^  ]3 Z' |1 F" `
Метод getQuest(String name)% c* o/ S$ E9 P+ T

0 B3 ?8 U4 u2 R% ^1 \2 P
  1. /**
    ; U  r8 o) c+ C9 w( Q
  2. * Получает квест по имени.
    $ H: K) `5 \9 G" A4 X* f
  3. * @param name имя квеста
      l/ v3 k& d" M; d3 M( C5 @
  4. * @return квест% Q3 w; @% {2 U- W3 ~. g
  5. *// |$ o' \$ w+ [! w) l
  6. public Quest getQuest(String name)% I3 |9 E, S: u* C2 M. G5 y) n
  7. {
    & Y2 _3 x( `, O
  8.     if (_quests.containsKey(name))
    7 Y  C% V+ f% m( ?# `" S% B5 R
  9.     {2 x. W6 P3 J( d  s1 N# w
  10.         return _quests.get(name);
    ) f+ @% d& e3 m; w1 i% y
  11.     }. B8 B+ J) s0 s$ I
  12.     return _scripts.get(name);" D+ z3 K/ V& u: T* E. C* J( z
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    & ~( R4 T, [' g% i

9 R  A8 F1 Y7 y7 O. A; vМетод getQuest(int questId). k! R- k+ j% g+ F' W" f8 F% H
2 [! j! O* o6 a
  1. /**$ f, F  [, ^7 @, C% t$ [$ n
  2. * Получает квест по ID.
    . L! Z1 L, G5 ]4 l
  3. * @param questId ID квеста
    ( P4 \* D3 \3 Y. N
  4. * @return квест, если найден, {@code null} в противном случае3 V0 f7 g. G& w' D* ]
  5. */
    , M& M$ C! X) d$ W0 P+ |4 u& Y
  6. public Quest getQuest(int questId)9 i8 G3 u$ ^4 I" B4 q
  7. {
    " Q  _4 e/ ~) [# \9 Z2 E
  8.     for (Quest q : _quests.values()): |- m& J; D. i  c
  9.     {/ L0 t, z' x% a4 O! f0 O& w0 O! ^
  10.         if (q.getId() == questId): A% z/ }( j# T( o  b* ^: |0 c: _
  11.         {
    " h; @5 ?! F7 n2 O
  12.             return q;
    ) n6 ?$ r4 u7 w1 X& Q
  13.         }
    2 L5 _# X) Z  r4 C
  14.     }
    # C; Y: \, P% T- |9 u" U# b
  15.     return null;
    5 w9 F. J, [( F5 u% P) f: b
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    1 f/ o% O1 Z; S$ \7 M/ _5 `1 O3 p
; R: ^, @; T2 J! k
Метод addQuest(Quest quest)
4 q- C* J) E  i6 j- ~
8 E/ t5 A0 W& G3 L6 v6 `( v
  1. /**! N8 k: T  o( ]8 |* S1 M# K8 |
  2. * Добавляет новый квест.
    4 P4 A% ]9 z$ g: F# f
  3. * @param quest квест для добавления; |; @$ c4 P3 Y% P- K4 V
  4. */
    & w/ Q' |* n9 Y
  5. public void addQuest(Quest quest)6 W' e$ u8 j% U) E7 A8 Z" N4 y
  6. {$ e5 @, H1 f" t6 H. u! e( S
  7.     if (quest == null)' F! \  a* A* D0 f
  8.     {
    8 a" i& {9 @6 O
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    + b& k! |" {" }% E! M5 w
  10.     }
      c+ v4 e8 I4 X# Y- z5 D" x0 y
  11.     / b5 W6 k. S$ N( I
  12.     final Quest old = _quests.put(quest.getName(), quest);
    8 i4 \' K4 g8 A) n
  13.     if (old != null)/ X6 F; a9 L- M+ K! Z2 d0 d
  14.     {( C+ i5 N  E& `. e) _* t6 k2 B
  15.         old.unload();' ]+ W/ }; z2 b8 l+ O# `
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");  W) f( h& \8 @) V' A; h9 f
  17.     }
    5 {- O" }' d6 k+ x, n% ~
  18.     / l# q$ L- D$ S/ _  O# n
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)$ l, p  D/ o% r; S' D& v+ k
  20.     {
    : P5 r0 j- [6 l. f; z5 ]
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();, z" I6 V6 d: y: ?; o9 ^0 a! W& Z/ y  u7 O
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    0 ~* X+ E$ B  h( v: B) D5 k
  23.     }1 n& Q1 O& r0 `3 b
  24. }2 A. E3 O) U/ p4 c+ `/ s% F* C2 z
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.. ^( {$ ?: }# \  k# \
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
) q  `; n; r! y1 ], h: J  P, a
% ]) _! ~/ b5 o2 t5 b; I9 _4 I1 z! Z. e; W8 p/ u% ~. l
. b& z! O" C. R& A) `6 G
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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