Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
" w) D6 Z  n' g( z- m. Q; O
6 F, e; v/ B0 ]/ }' `: m, j" Z& F5 oРазбор файла QuestManager.java
0 a1 U/ M" E, E7 ?8 e# x, _& k
2 E1 o9 l7 K7 T4 q/ bЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов., n4 e) J7 c. @% [8 p5 R7 N( @
Основные элементы# n4 ?/ Y4 p! C) @) A- B$ ~
  • Лицензия
    6 y, S; {# ?( d8 s1 O
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      ; [& f/ q% X1 w( u' G2 y" l
  • Импорты: b( E1 \) z( y9 c$ B# d
6 w( k& {# F* K% |. O
QuestManager.java — управление квестами и скриптами.
5 }$ `" y, J1 {' tПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\0 K( t# V2 m' G1 \1 U6 Q& ?! d! @& K
" q& T# r4 n2 n/ W7 u
2 n/ a5 [0 n; i3 G6 n/ q9 a  ]
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
+ m. j. u, x, _1. Лицензионное соглашение9 k6 s  L2 x; J1 l" O, ?- m
  1. /*
    3 ?) |; n2 Y! ^
  2. * Этот файл является частью проекта L2J Mobius.
    5 h# A' I/ K+ S) U: U1 c2 @1 ]4 q
  3. * 9 U  k& t' ~2 O
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять3 S1 Q4 p3 S) j+ J
  5. * её в соответствии с условиями GNU General Public License, опубликованной" s' X7 U4 @4 G
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    . F3 N) i8 K2 R% K' d
  7. *
    7 P0 b3 v, @& {  [5 P
  8. * Эта программа распространяется в надежде, что она будет полезной,
    1 u( n2 u- C4 c3 o7 ^$ V" k
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии5 a7 c7 {7 o  f
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    8 Q& I( ^9 b- u% w& z; i: {3 y. q
  11. * См. GNU General Public License для получения более подробной информации.
    " B! s# y* K3 Y) s0 q  s
  12. *
    / Z3 n" @' D' [: E) u
  13. * Вы должны были получить копию GNU General Public License
    ( j- c" G6 D& X8 U+ c4 q$ s# C( Z
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.+ d7 _3 a' `" _6 h
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
9 W. k$ z, _2 q7 N! }7 K
- H$ B, \" k" K
' s+ o+ @# e' A2. Импортируемые библиотеки
2 E: V1 \- J+ t* a" i6 S& c/ h# \1 M+ l7 k) L
  1. package org.l2jmobius.gameserver.instancemanager;* a8 y" P5 d7 m+ ~9 J
  2. & j/ n6 E; `) s8 v
  3. import java.util.Map;" G( M) h6 U6 u2 @5 X: J" B
  4. import java.util.concurrent.ConcurrentHashMap;5 X( `0 _" [. l% i$ ^
  5. import java.util.logging.Level;' C: N: l" f- I! z2 W; ^
  6. import java.util.logging.Logger;+ t) p$ @) P  H$ D/ N* V

  7. 8 ?; z  F! F6 x0 j  g3 I! R
  8. import org.l2jmobius.Config;
    ( [  V& a6 w$ u
  9. import org.l2jmobius.commons.util.CommonUtil;
    4 N% n8 q1 `% q, V' j
  10. import org.l2jmobius.gameserver.model.quest.Quest;1 u: S0 |6 E( Z! K1 |; 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 — менеджер для работы с игровыми скриптами.. Y* u; d8 n4 W: B6 T" m+ Y3 y  s
8 o' r$ G. r" I
3. Описание класса QuestManager
  d! Z  K. b8 N- F+ s$ D+ g
  1. /**
    6 d5 }2 e9 W( ~* v! U  Z
  2. * Менеджер квестов и скриптов.
    " M3 M1 \! n, ]; ?4 |
  3. * Автор: Zoey76
    8 @- ?9 u) C; k) a; s& W7 j
  4. */
    ) I( o9 I( e; _( c/ B( o
  5. public class QuestManager
    : \- {/ u! P' W3 {5 |8 T: Q
  6. {
    8 m+ ~$ ^' T2 W8 H- B
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    4 ~. D+ {. E3 o0 M
  8.     9 w, J# [* Q3 \7 u5 G
  9.     /** Карта, содержащая все квесты. */2 }1 a& u! a5 }. F) @
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    2 m. o1 X/ Y1 ]3 a) K% C
  11.     /** Карта, содержащая все скрипты. */
    ' A+ e3 u, Z) Y1 J1 K  L
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    + o" l& l- J' p! ]: ?* C5 R  f; Z7 u
  13.     2 n0 W, e; [7 h7 o) `; C2 q
  14.     protected QuestManager()
    4 {/ h8 t7 `# n7 H- Q
  15.     {
    " ?8 n5 J0 @; d
  16.     }
    6 v5 T( `$ U) C, M
  17. }
Скопировать код
4. Методы
5 {6 E) e6 V+ w5 n8 fМетод reload(String questFolder)
9 d" y6 w0 o* c5 {
  1. public boolean reload(String questFolder)3 B8 m$ N0 t8 A1 I, w+ O( t! \. @
  2. {- I4 W) u2 O7 h% K, L6 v
  3.     final Quest q = getQuest(questFolder);1 S2 M( O( Q8 D+ S9 \: a2 A; e
  4.     if (q == null)
    , z0 C$ P$ f2 i3 Y5 o" h
  5.     {0 {7 u+ L7 _1 Z9 i# d, q; |& s( m
  6.         return false;& }  u- K0 p; X: v' I8 k
  7.     }1 L- C" V5 w7 H. O* I: D% R' i
  8.     return q.reload();
    0 Z  O$ w3 I& h% I, c0 w
  9. }
Скопировать код

, s* h# m5 E* x/ _8 a( E; L5 a6 s. W1 G! W
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.% Z+ m4 i3 {, M; l1 U& a# @2 G
Метод reload(int questId)
( x" I1 |0 l2 i
) X% h. C% e0 e) ?
  1. /**
    : s' s7 g4 k3 O! Q9 |7 q4 [
  2. * Перезагружает квест по ID./ m3 g! {# _; n4 U7 H
  3. * @param questId ID квеста для перезагрузки+ n$ `/ j! [9 f; G2 e  P
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    6 h( ~3 Y7 k) g- Z* E5 H7 W
  5. */
    * x! V! M* p4 Y; R: m
  6. public boolean reload(int questId)2 J" u, l0 E; P) y1 J' d- f
  7. {+ G( S! ]; p! j) y+ P; k0 d  s! u( y
  8.     final Quest q = getQuest(questId);
    # z2 c: O, s. G' o3 j
  9.     if (q == null)
    1 M, ^' R$ D+ e
  10.     {* w; Y2 G# L1 Z) r9 s: F
  11.         return false;/ C5 T, T; x& S3 n' f, C
  12.     }3 p* j3 q  p: i$ s4 W
  13.     return q.reload();( C3 s3 H9 R3 p7 B! V. X9 @( Z$ H
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    ' K+ y- d* l% V) t" U: S6 l7 V

! O. r% U! P4 S7 E0 f4 I% TМетод reloadAllScripts()( d/ H- P! s" O6 |+ }: F6 X9 ?' o% \

( ^2 r6 e* Y6 T- E7 `6 L# m
  1. /**3 O' C5 F/ D1 b# r3 ?7 l
  2. * Выгружает все квесты и скрипты, а затем перезагружает их." L+ H4 F; M) X
  3. */
    $ }8 d; C0 b7 C& j
  4. public void reloadAllScripts()9 l, d3 T7 b! y* X9 ]
  5. {
    " [  i9 w/ t. x1 U& A
  6.     unloadAllScripts();
    4 H9 E9 X5 N, R9 J8 e
  7.     4 J' Q# w( X- @
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");+ p+ {! ^3 }& Y+ s. R+ F2 m
  9.     try
    1 T9 I; {" O2 B7 e" w$ q" h
  10.     {8 x* \1 N0 Q$ H
  11.         ScriptEngineManager.getInstance().executeScriptList();( O4 }. H5 P0 M8 u  I
  12.     }9 H" S6 Y0 A& \& v
  13.     catch (Exception e)
    7 N; U: h5 Y8 }8 N$ E  Z2 W
  14.     {* ]' V& _- e' N
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    & \6 _1 m$ j0 U8 G1 q
  16.     }
    * M+ P8 |  I- F& o. ~+ K
  17.     " T4 `" t( {  e& |6 F
  18.     getInstance().report();- b8 N: |  k# _7 ^9 @8 w
  19. }
Скопировать код
Метод unloadAllScripts()/ x; N. D5 P" \' U$ i3 T( F
: j1 F; A+ q1 R3 {, B9 ^
  1. /**
    0 R5 @& o: B& \$ v) h5 E
  2. * Выгружает все квесты и скрипты.8 t- x- d$ _# Q6 |4 j$ _
  3. */6 N$ d2 V1 j* f8 {: `" W9 [
  4. public void unloadAllScripts()
    9 j# S; P" `; A, K
  5. {
    * j( A) \# F3 e# X/ s& G1 v9 F' n
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
      ^2 O4 i& F  `. S
  7.    
    7 v% ]3 C! O) q  P" |% n
  8.     // Выгрузка квестов.# B9 G9 F  q- e: G3 ]$ j7 @$ @6 c
  9.     for (Quest quest : _quests.values())0 {' o' n" [7 l9 X' R/ h
  10.     {/ F2 i% Z4 R5 G! h
  11.         if (quest != null)
    3 ]( \' B9 N& b3 @
  12.         {
    4 U; s# m+ ?" B7 n, ~
  13.             quest.unload(false);
    8 h. g7 p# h' f! M
  14.         }
    9 V/ @  {1 [8 ?
  15.     }
    & q; Z9 H4 t  \$ J
  16.     _quests.clear();
    0 ^  @: Q  H$ y
  17.     // Выгрузка скриптов.
    6 ^7 f1 \1 N! v7 O, f
  18.     for (Quest script : _scripts.values())
    / R7 {- Q+ F* K* j+ C
  19.     {
    7 V4 T1 h- r6 ]1 M5 D2 t
  20.         if (script != null). q6 n$ I2 ]/ `# o; Q' E
  21.         {; g/ ^- j4 s" Q0 F& J; E4 Y: z
  22.             script.unload(false);( G6 J+ j5 D# Y! E4 p0 Y1 B/ J  ^
  23.         }
    ; E: v- H1 f' _" n5 q
  24.     }
    6 V$ W9 G" I6 E  L; ?9 O
  25.     _scripts.clear();
    ) _1 u$ U4 ]& K- D1 |& j
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    / m$ q7 W# f8 I, I3 o9 W$ i+ w
: u) X  H+ {- i# g' O! `+ a
Метод report()% g  |1 N6 ^0 T

( e3 r0 ^0 Z# z  P
  1. /**& [3 s3 \, t. }( p2 r7 }; W5 v( n7 u
  2. * Логирует количество загруженных квестов и скриптов.5 b! G, K+ Y# t$ k
  3. */
    % h% T0 u3 E! N  B0 f
  4. public void report()/ Q0 C! z2 y. n
  5. {& X. c5 c7 g' W' U% R
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    + h7 ^7 P' L+ ^4 y. K) {) h4 G
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");  m+ m8 V+ `: w4 a/ v. v
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.+ t3 V5 }5 D: u+ H! w- i- y
" b# M* T5 D; x- ^! B
Метод getQuest(String name)" N0 r. p" `3 C( n3 ~

4 s3 _0 r# b( L- v. w+ t6 }' A
  1. /**4 g0 s8 a0 g  x3 q* V& T/ T
  2. * Получает квест по имени.4 ~9 b# h" v* t# U2 B. {9 ]
  3. * @param name имя квеста7 s4 M9 M! a5 F$ J
  4. * @return квест
    ( q+ W) u3 m$ w# C4 u8 X' E
  5. */6 M7 E" [3 [& @  T
  6. public Quest getQuest(String name)
    + r+ I  p# R2 @$ w: ]
  7. {
    ! t' E7 }4 L& ~' o
  8.     if (_quests.containsKey(name))
    ) ~1 h* K" [0 @  n6 S  ?* |
  9.     {
    . I/ L9 w" A. e2 M' c- W
  10.         return _quests.get(name);% D  q3 L* w. g* B, U2 d
  11.     }
    2 c7 x" e7 N) g+ J8 }/ Z
  12.     return _scripts.get(name);" q; }3 {# m- n+ d7 q
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    3 X- e; i' J$ a2 |

0 {# J+ i$ E6 w0 h+ ^8 xМетод getQuest(int questId)
6 }) I6 w7 c$ x% L  w/ H# F9 M6 [& v6 s0 w: w2 ~& E8 ^
  1. /**4 P! q; q+ ^0 {5 q1 Q% H* \. p
  2. * Получает квест по ID.
    9 T7 R# Z; ?& \8 \" ?! ~; T  Q  ~
  3. * @param questId ID квеста' R) `9 q# X) C2 t: V
  4. * @return квест, если найден, {@code null} в противном случае
    : @  n) `3 |2 W* o6 Q" q
  5. */
    - M# [) ]6 W4 ^$ _, m
  6. public Quest getQuest(int questId)9 @  S! E, ]& T& @' w
  7. {$ R! N$ }& [4 L. Q8 D! Q! B
  8.     for (Quest q : _quests.values())
    ; z* j0 }8 r! l" j. v
  9.     {3 u* [% Q0 W: `& I5 ^6 Y0 i4 x+ l
  10.         if (q.getId() == questId)
      c7 Y. R( d# E6 f/ F$ Q
  11.         {
    - @+ s" |0 D' k: y
  12.             return q;
    * }/ Q! J) P$ h
  13.         }
    " g- I# R- i3 k1 ?  m
  14.     }
    - l3 d$ y' W; h8 b! \
  15.     return null;
    . W. k9 I& M& |2 `
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    ) S6 @2 F; w& K1 ?7 j/ x
6 @6 Q1 W/ a2 {
Метод addQuest(Quest quest)
! f* J* F6 B! C% T: n9 S. Y
# N3 x' N6 E+ u9 U5 I6 l$ q
  1. /**
    8 F6 ?* e0 y4 f2 }% H
  2. * Добавляет новый квест.
    , ~% T, V0 H7 k# D
  3. * @param quest квест для добавления
    : h3 i8 s; D, X! Y
  4. */
    - ?1 U7 y% V0 E4 k8 v, n" U/ T
  5. public void addQuest(Quest quest)
    1 W# |% P# o) E& S  Z% C& A4 |
  6. {
    7 }' ~4 V0 p- a! c  V+ X
  7.     if (quest == null)( A  O1 c4 X2 {
  8.     {
    9 m4 T3 U4 E& r) E
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    / j1 s) D9 w) l, S. h
  10.     }# o  r* \6 u& U+ D, w* s
  11.    
    1 p; p: p9 @3 M6 m( i
  12.     final Quest old = _quests.put(quest.getName(), quest);
    0 J, W: |" B) R0 z4 u
  13.     if (old != null)6 z+ W( L' g* o% V4 p8 S
  14.     {
    " q3 U, `8 L7 u; j5 \$ g& u% H( x
  15.         old.unload();
    ( s; L$ F$ p+ X% A: W8 t+ C
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");; \1 u3 o6 P4 k8 g
  17.     }
    4 O1 a9 m, F. F
  18.     & ~/ k' a: m1 e6 ~
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    : J- |% N& }* T. n; }# Z
  20.     {
    ; V9 [0 B3 _7 D0 s7 y/ `' P
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();- b% v' E$ b+ A
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");+ ]; W/ o3 G& ~  f1 O  Y
  23.     }
    2 f& C- e! O( S6 M
  24. }
    $ O6 T$ _7 m. O; M& e0 ^+ r
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
( [$ P# o' b5 xЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
8 N: D; c  Y& r
+ X& q; {! F9 N: i$ v4 O
. W5 e  o; \! x  [3 ^; t, n; B8 ~  g/ ?2 x: q
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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