Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius0 D# j# W5 f% w0 O* A% e
: C; l* o1 _3 H# z, Z$ S$ K; o
Разбор файла QuestManager.java# t6 {9 |( u5 e: w# ^- A. ~
/ `) S& M0 v" u# h/ |1 \+ [. g
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
& E$ S6 }6 r& \* ]Основные элементы
! Z+ L; y0 ?7 T9 b7 ]: E8 t" P
  • Лицензия5 q0 w( B: F$ ]9 o$ M
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.  M1 Y# N4 x" m
  • Импорты
    3 n1 h, P9 n$ p* B, @
6 [; y5 O; K; O
QuestManager.java — управление квестами и скриптами., p8 k" o! D) `! l: {( f, Z% G- l" j
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\- N3 u( l7 [( l& e

+ @' n( F! M! |) m; M+ \% b
6 v0 T3 ^9 @8 B6 h) B6 j( T
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов., g. b8 A/ U9 j1 E- [
1. Лицензионное соглашение
* ?8 m1 x) `, l( M4 c
  1. /*
    7 w/ o3 r! f3 q4 f7 C; s
  2. * Этот файл является частью проекта L2J Mobius.' D" |+ H4 y8 i( |( s
  3. *
    8 P' E% K, _, ~0 X, g1 N. G
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    / r# s+ q. o* J% o' z: H" d
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    # n0 w5 U7 I$ k9 W1 n
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    ' W5 y6 f( F0 |  i% v  D+ M
  7. *
    9 `3 A0 {8 V0 A6 U' n
  8. * Эта программа распространяется в надежде, что она будет полезной,
    & ?( k3 w6 [# j. V9 d
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    ( |' [3 q" K! ?6 r) ~' V; @. F
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    * ]" c! B0 `+ I- r/ y
  11. * См. GNU General Public License для получения более подробной информации.
    & z: W. G! L4 P3 l  {, {" [6 U1 `. C" y
  12. * * z' b6 `  Z* u' D! D
  13. * Вы должны были получить копию GNU General Public License6 i: G& z) M7 {. U% e5 Q' q: @
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>./ a. H% H' @" ]7 P' i7 q
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.& o2 ]8 J1 u" u5 Q
3 U2 j: n) F0 }) s3 G0 R
' l3 d) p5 U$ [" g% m* l/ c- }7 @
2. Импортируемые библиотеки* }# ]  n7 D2 H: E% K
6 g1 g5 @3 ?- I% h8 _( u7 b$ l
  1. package org.l2jmobius.gameserver.instancemanager;
    3 I# R% l4 ^9 k: c
  2. . U6 X* u' ~) f3 U% W  C, Z9 e
  3. import java.util.Map;6 U. m" A. n& D% Q3 h, p$ ^
  4. import java.util.concurrent.ConcurrentHashMap;
    1 P# V: ~. W( z& `+ z# [
  5. import java.util.logging.Level;% _  c# M, B) p5 ^" h) [' v7 Q6 m! Y* U
  6. import java.util.logging.Logger;
    1 U  G- X' E0 s* v' h# ?

  7. 4 e& n. ]: G9 W( R4 a, H; R% p
  8. import org.l2jmobius.Config;3 |6 d1 |$ t8 w: _' f8 g
  9. import org.l2jmobius.commons.util.CommonUtil;  u8 y  g+ z9 n4 z1 L1 m5 l7 X
  10. import org.l2jmobius.gameserver.model.quest.Quest;) z" p5 ^3 z/ a- ~
  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 — менеджер для работы с игровыми скриптами.
4 W/ V  Q; v6 R4 P' ?7 d4 u) i  _, ]4 U
3. Описание класса QuestManager
$ c3 g) m# s* C8 \, q& ~% B
  1. /**9 H5 p( K& V% G3 H; ^1 F
  2. * Менеджер квестов и скриптов.
    : j7 d) v( [: m- u. B3 O5 |  e# S. K8 |, b
  3. * Автор: Zoey767 m9 p# H: y. h
  4. */
    / T. n0 x) w- S. Q- Q
  5. public class QuestManager
    $ c& `# P' {7 P6 w
  6. {
    9 P" N( n, c- k9 B- s3 w6 m
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
      x8 ]4 T& [2 N
  8.    
    - L/ [9 t( ^1 d1 K0 P* B
  9.     /** Карта, содержащая все квесты. */" _! K9 u5 b/ B2 b- g
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();' d8 v0 U/ I3 `: {
  11.     /** Карта, содержащая все скрипты. */, I5 E) P4 Z( H( d, x: Z! r
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    1 p* f0 x. R. T
  13.       ^( |: {/ M2 k  I
  14.     protected QuestManager(). W' \: a* M" |9 e
  15.     {4 b" M4 `/ L- f  b
  16.     }8 ~, s- s5 c! \7 A  ^" o0 e& G  x
  17. }
Скопировать код
4. Методы
. S7 \% e; h. i# pМетод reload(String questFolder)+ G' c& K/ x/ _8 T8 [  k; \
  1. public boolean reload(String questFolder), P& P. ?3 X( l6 `3 m" a8 `% E
  2. {* d( F! H7 d0 a1 X1 i; ^
  3.     final Quest q = getQuest(questFolder);. R9 m7 E; l5 z0 Y
  4.     if (q == null)
    $ i& H; @, {) @& p6 }8 [
  5.     {  v. M2 I. }: ?
  6.         return false;; Q+ F, I$ t+ o% C3 q6 ]. e
  7.     }
    + K( |& l. b5 |5 n
  8.     return q.reload();
    . n$ h* ]! @# q2 F
  9. }
Скопировать код
# G% _! r9 p8 x# J! ^3 D
* I+ S+ m& q4 |( @7 Q  r  j" T
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
( B1 }7 [7 d5 E+ S3 F5 z8 o! [0 B2 d  oМетод reload(int questId)5 F. }5 ^& ?; v. K, L/ s% N
. R3 G$ _0 f, l/ @3 U! k3 [5 v
  1. /**
    : [" W  q$ G" |% R" Y# V5 L
  2. * Перезагружает квест по ID.
    . N  w( p8 O; q
  3. * @param questId ID квеста для перезагрузки9 n5 q  P1 I- r' N6 {( c& I, y- p: a
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае9 w  U; l! r1 F8 `" @, j( @8 Y
  5. */
    # o2 ~& H8 [/ \/ l
  6. public boolean reload(int questId)
    6 Q* y3 g" V, ~) I: u" t
  7. {
    7 T: E& \7 l- U  ]% K* a
  8.     final Quest q = getQuest(questId);* k- ~% l+ Q  P0 p. {1 t& y* J- o
  9.     if (q == null): x5 e! ]0 [( x7 g1 l' x
  10.     {* J  P' i! U# `8 p" _
  11.         return false;3 |, \* Y' l7 q/ b; I* ~5 U
  12.     }
    : V" q4 z- |2 d$ i4 F
  13.     return q.reload();
    7 l9 n- {1 ^2 [6 Y7 J' ^
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.$ i& r& C, ^( t6 v7 b
6 M5 g! V% {3 g9 |$ T+ C
Метод reloadAllScripts()% H* S( g. t' S1 Q0 K& N
$ u) X5 B# h% y' }$ o' S
  1. /**' ]7 U) d3 p) l& g
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    & u: _, g9 y) n: P
  3. */
      y9 M8 ~7 b+ @4 ^: `  T2 T. m+ j
  4. public void reloadAllScripts()! ]( ^" D9 a; g2 d( J
  5. {. V; u1 j9 O8 S
  6.     unloadAllScripts();1 k9 Y9 V$ Q* [7 J3 K
  7.    
    6 d& M" R0 J- X5 n- ~8 F8 u
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    # d9 {: L, `1 {
  9.     try
    ! Y- k* ?1 _& U& e% {  v$ i
  10.     {
    ; }0 c$ E6 n% d: h7 s
  11.         ScriptEngineManager.getInstance().executeScriptList();6 j( M- r% w) ^* @1 @' N  d6 X
  12.     }
    ! l: A! f% t+ O6 i4 g; |
  13.     catch (Exception e)
    4 d# m( ?# r! L) _
  14.     {
    - E! r7 F8 Y* S0 h0 O) r- `
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);) Z( T2 u/ W2 _# j+ a! P+ e) H
  16.     }+ K/ l  T3 Q* t* r9 L& ]
  17.    
    2 m* _0 i7 G- ]& B' l
  18.     getInstance().report();
    5 a# ~# W' S1 A, p& @# y, n
  19. }
Скопировать код
Метод unloadAllScripts()
% s6 C2 y9 ^/ S/ J0 T9 S+ Z0 g6 }8 F: I6 n
  1. /**7 ?9 R, Z8 X4 T
  2. * Выгружает все квесты и скрипты.( [& @  z/ v9 D* {
  3. */( g) k: ~6 t# q) e
  4. public void unloadAllScripts()
    % |# {) |' O, h0 |, g0 \
  5. {
    " F4 B5 I, E" _6 Q% a
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    1 S5 p0 l, n# E7 L: k
  7.     : j" T9 ^5 w7 d1 o$ K" }
  8.     // Выгрузка квестов.& t3 u) M: A  D  V2 F  p" V
  9.     for (Quest quest : _quests.values())( w& t% y1 N1 F1 \& C
  10.     {
    3 T* T" }; x$ o7 a
  11.         if (quest != null)
    0 o: |& S( f) O: l
  12.         {
    % G3 W$ F$ |/ G- x& o8 N% y
  13.             quest.unload(false);, S2 {' h8 ?7 o7 O2 W) F
  14.         }
    8 F9 N% V/ y/ h7 {
  15.     }
    ; y( G& O& P0 C6 _' b
  16.     _quests.clear();
    6 ^6 k: X1 R8 e! s+ B! Z3 h* I
  17.     // Выгрузка скриптов.
    ) p; ]3 l  A3 q0 p, `: K( u6 Q) G
  18.     for (Quest script : _scripts.values())( F- F, o; e5 g
  19.     {+ A. l6 c- t0 i; u3 R
  20.         if (script != null)
    * i$ |6 ]+ C! d3 |% F
  21.         {
    % ]6 d" Q: c% m5 y9 F+ K
  22.             script.unload(false);' v+ |: c6 k; n$ A
  23.         }1 `& x/ r; @# s. G5 r9 G$ P# Y* n
  24.     }# T  ^  c0 r' q# {1 A# }6 p' ~
  25.     _scripts.clear();3 _  W" _$ N" M9 y
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.. ^! Y6 \5 |( a' Z0 ?/ |
  s2 I% c7 V9 C3 i0 ^) L
Метод report()4 B* @+ i2 F$ l# P2 L8 T
) `& u# j& f' H4 g+ [
  1. /**6 N3 j6 h2 N7 q, V' @. U1 k4 [4 [7 o7 D
  2. * Логирует количество загруженных квестов и скриптов.2 Z8 p( s7 o. c
  3. */' ?5 f8 I% ]4 C" Y, \) U; l
  4. public void report()3 E, ~7 {- k- K2 _8 K
  5. {
    . O! S; i' J$ W5 {
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");2 k1 w7 q" {1 }. N! a7 i! Q
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    2 d0 G$ O  c# @
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
      q2 S  |3 f1 ?; u- I
2 y0 t6 ]- M* q) v% k
Метод getQuest(String name)- J9 s! ]0 v: |5 b; }1 T! T

/ P" ~+ E; j# G$ W
  1. /**) M/ `$ F. ]9 }9 G# i+ M
  2. * Получает квест по имени.# e( T' E* c, R; V
  3. * @param name имя квеста- H- n4 a% j' X+ \4 a
  4. * @return квест4 m5 O  t' u2 Y9 R/ Z( W
  5. */
    / \  t, l# {2 ^) H: h" O
  6. public Quest getQuest(String name)
    ) s. y. {/ B# x6 p
  7. {
    & k4 R# |0 }4 F8 a5 s/ [- M
  8.     if (_quests.containsKey(name))" c9 p1 T: i5 w- O. X; o
  9.     {
    " N( x" L, U- W3 ~$ C
  10.         return _quests.get(name);; R% @9 n' d3 C% Z- F' z/ @$ G# q' M
  11.     }; z0 |! c. d0 \- L! Z9 t, \
  12.     return _scripts.get(name);1 b. D7 u2 p& `
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.' a3 u3 e9 K$ f% P# v
) o2 f" Q1 j. k) o
Метод getQuest(int questId)% b& U$ L$ _0 e: O) Z) ~7 C1 P
6 Y" f$ I) n# @) p
  1. /**
    - P3 F% `6 @" G" K
  2. * Получает квест по ID.
    5 d  g) a0 X. O  R% W# y5 E: S, j
  3. * @param questId ID квеста  M# Z9 J0 e5 V: h7 [
  4. * @return квест, если найден, {@code null} в противном случае
    8 G( N, u8 b- S" v
  5. */
    ! ^/ ^  R& n1 O
  6. public Quest getQuest(int questId)
      k1 E2 ]4 ?& H
  7. {
    2 D9 Y, Z1 K" a5 I
  8.     for (Quest q : _quests.values())
    , \: _4 R1 r3 k: X, n1 G/ s' c) S
  9.     {& ?9 Z1 n* K5 r8 r+ s. J8 y+ S" N
  10.         if (q.getId() == questId)
    - k. A  j& b. v5 X0 V  x6 o* _4 q
  11.         {0 C/ n) H' r# o
  12.             return q;
    - [" b7 s$ y5 d" ^& V9 E
  13.         }
    , U( L7 E. b% \: S" `9 M0 Q' c1 i0 D
  14.     }
    ; o0 _1 n: ?1 m2 v
  15.     return null;7 Z( l/ f( }. g8 [
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    0 K9 S8 ]( T( F4 b
3 y( \0 X9 u; [1 x' |' n5 h
Метод addQuest(Quest quest)
- W5 S( v7 T9 [* R' U9 Q5 q, e# P/ ^8 y- F( n
  1. /**8 r# Q+ k3 h  j; \$ E
  2. * Добавляет новый квест.- c8 A) \# Y, [- _0 G! u
  3. * @param quest квест для добавления
    ' J2 ~6 C" P/ Z4 ]3 G! J
  4. */
    . u' e! Z+ @; W& A% C2 P2 I
  5. public void addQuest(Quest quest)
    $ Z. E* X$ \. c3 Q5 I
  6. {
    " l8 C$ c/ K5 ^0 T  f5 U
  7.     if (quest == null)5 ]/ U' y7 T) e7 L, t* V
  8.     {4 ?( g( z8 j* r; R
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    2 L2 d2 w9 w" Y# b9 l$ I' n1 L! C
  10.     }4 V4 e0 j  _3 g/ z  b( W# [
  11.     3 E1 h$ B" A- w$ T- O
  12.     final Quest old = _quests.put(quest.getName(), quest);* C9 }* r: n6 E, }9 s( A% H0 `5 H! T
  13.     if (old != null)1 U& _! m  X+ z
  14.     {  Z* U. H7 O( z# q
  15.         old.unload();) V  |1 w% ?8 b1 y/ i/ B- K" b
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");0 T$ j, `7 K6 c8 p7 T6 C
  17.     }
    ' J. K$ F: H! _# U% N8 [
  18.    
    . y. x2 G8 Q  _# T
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)+ b  H* K: _' C8 b/ p) R
  20.     {% E5 U0 h; m% U
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();$ E$ r) N' B2 Z: k/ t' l( ~& ^' F6 a# P
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");" `* K& Z9 i" v0 J" z, F
  23.     }
      K7 `0 e( ?1 j* \
  24. }
    ! V: z( g+ |! Y* L, ]
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
, B" s! v) b8 q0 F) ~3 DЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.0 o3 X0 }. F7 p) {

# \: m5 U: G0 q5 ~4 x8 }
$ f* K; z" i0 d3 |# R; A% y( ^3 L" B( F9 m
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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