Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
1 J' a0 c0 A  r( G# A# B
+ P/ A/ |3 f! X. L3 }8 A5 nРазбор файла QuestManager.java, |/ R. h# W& }; p2 _8 f4 q1 L
( d5 E! T1 s' `, W1 G3 P9 @; h% `
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
9 g4 j1 A! u# D) B' k# [5 PОсновные элементы
; A' p2 i" `  ^) _
  • Лицензия" W0 |6 c: f, }7 y# j) H$ W
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии./ u9 r  o& L3 V0 G7 n. {+ @
  • Импорты
    5 J  a  a- n4 ]& N
, R0 @9 \3 x8 U$ [9 D
QuestManager.java — управление квестами и скриптами.
+ Q0 r5 W( H  K9 ^/ VПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
3 F( L6 G; C2 q; I! |! f* y1 A! `5 d; d% }7 T; i2 W. `
* ^- A8 A9 T3 W8 C$ T
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
  J  _2 N1 _2 Y- r1. Лицензионное соглашение
9 d! T& Y9 v1 V" f  t
  1. /*
    8 u' m* U& G! `  E( v0 O( Y+ o# ~! P
  2. * Этот файл является частью проекта L2J Mobius./ f7 o6 e2 n9 Y. @  P1 C0 u
  3. *
      ?  V  y6 e3 ]* o3 L6 j
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять2 G% d2 X1 ^( ^/ \2 J& o# D1 l7 o' j
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    & O  O) ^0 C) I+ b, b
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    " [$ A# u  r( w! h; D& \$ T1 Z
  7. * , l0 k2 M  V% t; |
  8. * Эта программа распространяется в надежде, что она будет полезной,0 |0 f" _6 z) z) T6 c4 F! @
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии' M5 b: i9 U( h5 \/ d  X* |" C
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
      e( ?8 b5 k" Z- C2 L) Q3 x0 u
  11. * См. GNU General Public License для получения более подробной информации.: @! c1 C2 ]' _9 x9 }
  12. *
    + k  T' C; v6 u3 `2 r- Y
  13. * Вы должны были получить копию GNU General Public License
    / X! D1 `* R! B: L( d
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.  `( U6 w4 K% S* H* e2 m  z9 x
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.0 T: k4 O0 Y$ q+ `* K

3 m  P7 H' R+ S/ ~+ v9 p
8 u' U5 q6 k% b& f5 O3 i2. Импортируемые библиотеки5 t4 [" ]: ~0 y- ~( r8 A

6 ^) U7 W" q7 Y9 E' B. G! S
  1. package org.l2jmobius.gameserver.instancemanager;
    % C* T; i( h% h% o- R
  2. , g1 D, v6 k& R, E! C6 K3 M
  3. import java.util.Map;
    : h+ M% }; s1 n- \$ C& H
  4. import java.util.concurrent.ConcurrentHashMap;5 r5 L: {: J4 L: K1 F4 a: F
  5. import java.util.logging.Level;9 T) F# C' |4 u3 v: O& c
  6. import java.util.logging.Logger;
    ! |. C2 r1 [2 |; c
  7. : P: N! r, r. ^- T% A" k. I& Y
  8. import org.l2jmobius.Config;; s7 T1 `: i. w4 f
  9. import org.l2jmobius.commons.util.CommonUtil;1 h5 A) o9 r! v+ S$ c- Y" H7 T
  10. import org.l2jmobius.gameserver.model.quest.Quest;) [7 G2 Q1 _/ j
  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- Q2 N9 {+ q3 U/ z- L
& ~% U1 J# l/ v1 h& o3 t3. Описание класса QuestManager8 n; l# f, v; J( J
  1. /**5 T% {! n& C+ w. S+ v
  2. * Менеджер квестов и скриптов.
    $ F$ \) ^* G2 }" v# Q; \( L- d
  3. * Автор: Zoey76
    ' b& G3 m( N' e4 P
  4. */
    8 Y, O' P- N! q" j0 Q! G; c% l
  5. public class QuestManager
    2 r+ U8 l( G; @3 |$ T8 t" p
  6. {
    : \) D% Q4 g) R  \+ w5 @$ w# a
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());2 M" }: F/ J1 W7 X# F
  8.    
    / C1 r1 O0 V6 b/ z
  9.     /** Карта, содержащая все квесты. */* J  s) t4 a. e* r- \* Z3 u6 ~. ^
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    6 p* E; a/ i: W) s% m
  11.     /** Карта, содержащая все скрипты. */
    " M) I; O. c" U5 ^5 w; _* p, L
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();% ^7 s. {2 p- N7 C7 z* u" P  {: Q
  13.    
    ! j! H7 r, L2 I% {& A/ p1 _8 w
  14.     protected QuestManager()
    . o; f: U  Y$ t/ s7 R
  15.     {6 l- o" Y0 J5 p, I
  16.     }  e/ `& v  K, B
  17. }
Скопировать код
4. Методы0 d8 e" b7 G9 X# p. Z4 g
Метод reload(String questFolder), Q/ s$ A9 ]% y$ [& R4 c
  1. public boolean reload(String questFolder)
    7 i3 K5 m/ Q; l
  2. {
    ( Y* \/ T4 K9 F& N0 R
  3.     final Quest q = getQuest(questFolder);
    8 j9 E' \6 m* t3 Q; [
  4.     if (q == null)
    " a5 [$ O9 K4 x/ T' W8 Q
  5.     {( b7 M1 H' \) S9 b& ^3 {( @* h* W
  6.         return false;* }- |5 a$ c4 T
  7.     }+ u3 `# L3 ^3 v
  8.     return q.reload();
    ! \- x" z6 W% y, e3 ]
  9. }
Скопировать код

( t9 v9 z  ^5 p7 v/ g% Y! d# w
+ M' C1 }; i& n7 G" LМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
& L0 r, Q8 H- k0 `2 x7 _Метод reload(int questId)2 x) _2 r" ?& ?$ y' A$ r

1 w) M, J. C  `9 \: A5 l3 ^
  1. /**8 s4 k' q" {2 X$ ?
  2. * Перезагружает квест по ID.; s0 V8 u5 v  U) X
  3. * @param questId ID квеста для перезагрузки
    6 w6 _6 J  u: Q1 r& A6 r
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае  S% T, D1 \3 ^$ w  P2 Z, X' U
  5. */! I' w' L9 y5 U* h
  6. public boolean reload(int questId)6 g" I% L5 c( `+ h
  7. {
    3 N3 j7 E; r6 @) X
  8.     final Quest q = getQuest(questId);
    ' }5 C# H' G# A$ Z1 k0 N9 V
  9.     if (q == null)7 t4 F5 o1 o5 y! B' [, E
  10.     {0 _* k- Y" C* \! y
  11.         return false;
    , w: n$ F! ]. H# n0 m1 r3 I' Y) `% |
  12.     }9 z, C, r* Y8 v- |6 s5 M) ~; x
  13.     return q.reload();
    , m5 s8 m* k* a1 O+ O
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID., v! h: _( b& C5 [* ?' `! K
- j, w4 J- a/ d( g
Метод reloadAllScripts(), i; P7 U7 k: G! P) A
& w% h  j* C2 A$ U7 w' W
  1. /**  e$ T- c4 p& R9 N; y5 _3 S
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    . F% I+ X8 W+ ?0 o
  3. */+ v+ |7 N% U' G
  4. public void reloadAllScripts()3 i4 v. {# M+ G8 Q5 N: T1 j
  5. {6 l, j9 ^2 W& N
  6.     unloadAllScripts();
    6 I. \% Q+ S+ t, Z. J6 b7 L
  7.     4 v) c- }, O, y% ?! n
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    " Q. |2 B- `# c
  9.     try
    & H2 M8 |  A) Q' d, |" \0 \
  10.     {/ y. T8 C9 ?$ b0 P7 z
  11.         ScriptEngineManager.getInstance().executeScriptList();& D& \: k5 d9 U" p+ r- \1 i8 X
  12.     }" q( t: C9 }5 q% U: E0 \! |
  13.     catch (Exception e)2 r8 Q. }) |9 Z% u" j( g5 L
  14.     {( T  h$ i4 n5 }9 m
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    " `$ G4 y6 ?- I4 e8 U" f
  16.     }; G" J+ B! b2 O; ~& O) h0 c
  17.     - q: C* j1 t  P4 _: x, ?' g: `( K5 |
  18.     getInstance().report();
    8 m( e+ y. q! [0 Y; V
  19. }
Скопировать код
Метод unloadAllScripts()! K! m- R, b9 g* H( U$ Q$ A* O
7 w+ {' X6 a4 @! v
  1. /**, p8 j! W6 r4 {( b; x
  2. * Выгружает все квесты и скрипты.8 ~1 i4 P0 J9 O) _3 Q
  3. */3 l4 H8 [1 S& q' a8 K% _# G! |# \
  4. public void unloadAllScripts(), S* y, c1 ^8 B! H# t  j
  5. {
    # ~$ |0 S5 ]1 ^  v; k5 S
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    . g2 e1 ?( d$ ]. ]
  7.     3 o* y/ |& {6 \( }, S
  8.     // Выгрузка квестов.$ j; @& W  n9 j: J
  9.     for (Quest quest : _quests.values())- ]8 w& ?, c9 A# F0 Z, d) z
  10.     {* K9 a! ?# Z. Q+ s# [. n
  11.         if (quest != null)6 }* [" A! k+ C
  12.         {. N0 b+ ^. R3 w" A) F
  13.             quest.unload(false);
    5 V! n5 G' K, x0 o" ]8 f
  14.         }5 ^% O1 I* P+ t( n$ s# g+ c
  15.     }
    3 t' f0 h: T2 _5 L/ q
  16.     _quests.clear();
    ) Q$ m. l1 X0 b  v
  17.     // Выгрузка скриптов.
    7 f' f. ^$ g% \- Q  c
  18.     for (Quest script : _scripts.values()): s9 e% a/ j5 V1 G0 m7 r
  19.     {" t" L7 ~" {/ D, }; ?) s
  20.         if (script != null)
    % w* Y3 q3 Y' h
  21.         {8 ]) D! S: e  |/ ~. A$ P8 }
  22.             script.unload(false);
    7 d: _0 Q, n+ n7 J' l6 G7 C) P
  23.         }! {  G3 p/ Q# f& [+ f; K# E; ]
  24.     }8 {* \$ p- U+ c8 Q( G0 R) f
  25.     _scripts.clear();
    . `0 D2 ~- W  M
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.6 l4 f7 ]7 Y" a4 Y+ p) e
3 I6 [9 n* _5 Z0 H$ ~4 P! l
Метод report()" T& o# a& p: H1 Y' r0 `

0 V; F/ R' \% t+ r7 a5 ^+ X! \
  1. /**1 r. R" {* ^) e
  2. * Логирует количество загруженных квестов и скриптов.0 {2 P$ o5 H: V% C% \: i
  3. */
    ) y7 A/ L" L( o7 D  Z) Z1 [
  4. public void report()) l) b2 P, _. c
  5. {: M: V+ {; j% X' e/ N( ^6 i
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    8 I& ?1 l2 `0 {* w
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    $ N: H% @  k- B$ w1 s4 @8 G
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.2 Y7 L" O& j) s! k# }  V

& D8 a2 J* Y8 B0 E  W/ }" U" ?Метод getQuest(String name)
7 O6 G( h1 y( S  p. }, `7 ?  Z! Z) K# \+ B: n
  1. /**/ j* U; O2 ~+ U- V6 k! y# \7 O
  2. * Получает квест по имени.! u; |1 h3 S& e. h+ a4 ~5 p
  3. * @param name имя квеста
    . c/ q! p5 _$ a3 g4 c1 d& x8 ^
  4. * @return квест
    ! z; n3 v# L/ n+ Y
  5. */5 u- I3 m9 i1 i9 ?
  6. public Quest getQuest(String name)4 M- M) |; S: P
  7. {
      F4 \: a# }2 L( ?
  8.     if (_quests.containsKey(name))
    9 B, s& }4 [( Q. p2 V+ H, n' J
  9.     {: y! L/ |* l* x! h
  10.         return _quests.get(name);
    ! Q. t2 E% o( [; j) `  |
  11.     }' D0 R# d! l& b- H) C" {4 f9 r
  12.     return _scripts.get(name);9 b' `' Z6 Q: [
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    . ]# o! n5 p* g+ \# g: H# U! I

1 {0 `9 {5 Z5 K  P! }( b. B9 [Метод getQuest(int questId)
1 b  U' t0 u/ B& G, W* M
6 M0 n, T! z; D' i' K* M$ O
  1. /**
    ; |0 E- y: e$ q2 X4 o
  2. * Получает квест по ID.5 e$ v6 L, j6 p
  3. * @param questId ID квеста
    ) J/ [0 ]: V# P. [; K
  4. * @return квест, если найден, {@code null} в противном случае
    5 ^& K# @: c9 w& }7 ?& ?6 L" o/ O
  5. */
    . U& h4 r3 ~. m
  6. public Quest getQuest(int questId)9 u8 R5 x" K' \; V3 U5 v
  7. {: _- Y, U$ ~4 T, D' _4 S% K
  8.     for (Quest q : _quests.values())
    1 v8 Y% Y' ]% e& m6 H
  9.     {
    & r# O& e0 z- B
  10.         if (q.getId() == questId); }2 N' W+ ~% [2 p( ^, C6 }+ a
  11.         {
    3 \7 t  l7 F5 ]0 _7 \( g- y- K0 t9 k
  12.             return q;
    0 D1 u' O* O6 {! u- z4 M
  13.         }+ Z/ d! n& I3 K& G5 m) H
  14.     }
    + _: y3 ]2 e; v- @" Z
  15.     return null;: {# E" r5 e6 r3 p: `" ?2 Z8 M
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.5 M4 V1 j& L+ F! N+ }* O
7 e# q0 ~9 ]5 G* R# l  j2 l4 S; S, C8 ~
Метод addQuest(Quest quest)/ S/ q$ ]7 N  u, k* O, p
# k5 {/ }6 P) H5 n/ I; D
  1. /**
    ( m8 ]* j$ s6 @' I: P
  2. * Добавляет новый квест.7 e( g( R+ W: Z3 ]
  3. * @param quest квест для добавления
    ; [" l5 V. D0 m8 X. t, h
  4. */+ c( _* V6 s. d$ U2 }
  5. public void addQuest(Quest quest)
    7 Y5 i8 d5 a6 b: K0 K( V6 D
  6. {$ c' z& a6 K% ]' C
  7.     if (quest == null)
    $ s" n8 L+ J% p7 @
  8.     {
    6 ~- Z& \$ G* n! ^& v, M, E
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");2 C% |+ L; r& N
  10.     }. z/ @$ o* Q0 z" {
  11.    
    ' T2 `- ~5 A1 H3 \, k
  12.     final Quest old = _quests.put(quest.getName(), quest);
    , E% b; p8 Q. {
  13.     if (old != null), p' K( y1 i- g1 z1 y
  14.     {
    : e! L3 R7 _7 z( d( W
  15.         old.unload();
    + Y1 p  ?0 [1 [0 z
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    - ?) X5 {+ D' m" H9 x% Q
  17.     }
    ! o) w' C0 ]+ Q+ Y: s# [
  18.     # Q- _1 ^6 T2 K. t: {/ `
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    6 h7 q4 ~7 B- N5 F/ |
  20.     {
    * W0 {& f, U6 N# L- b
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();/ B9 D2 n" D, A
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");4 O2 b: z- |# r8 ?# x
  23.     }1 V5 S( I0 H6 v: H
  24. }: {7 D* E2 a* G& R% }' V
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.% k: X3 O5 M; [4 |
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
" f9 P$ T  N! ], t; P! k/ O# p- w' p* P* ?5 ?6 \( B) i
3 l' W1 Y5 h3 e4 D. ]: K

( n+ \5 a& v3 I( X) Q$ W
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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