Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius8 v$ G) S/ A, B2 `

! M/ t8 Q+ c/ V8 ?, i/ b3 q" oРазбор файла QuestManager.java
$ E: o% t/ S, b- B, ~5 l' C# ]1 [( a6 }/ i7 Q6 O
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.. z- A0 \5 U7 }( G% j
Основные элементы
7 Y1 E  C& n, e: Q" F9 l6 V1 D
  • Лицензия
    . d8 A- L1 o. ?- {! s- `! g6 t
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      ) F* g4 w/ ~& I0 b( }  f
  • Импорты0 P2 G; X( _5 _8 ?$ C& h

! A; n; R; R$ b5 y' Y& ]- EQuestManager.java — управление квестами и скриптами.
. U! S8 b. ?9 W+ \. e. lПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\% t2 g0 x" P! G7 w* `* H( W, L

* X6 r- l& E& }. C4 _" j

5 C3 i' o  D, R3 O) qДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.4 N; X: a% s# R8 U; y, D$ [: ~; z6 p
1. Лицензионное соглашение6 A1 L, h5 e  `4 L. `" G
  1. /*" L1 h, O+ r. t* J) ^
  2. * Этот файл является частью проекта L2J Mobius.
    0 V2 c) h2 H; @: n( i" t" r4 Y
  3. *
    : ]$ Y# c$ H6 b6 i; \( n
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    - c. Y3 [) H1 v
  5. * её в соответствии с условиями GNU General Public License, опубликованной+ X4 O4 R, s$ w7 C8 H4 T& }# D
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    8 i* ]7 w3 ]6 v8 S% E. n1 t( B
  7. * - B9 X5 k/ \, A- G+ p0 X
  8. * Эта программа распространяется в надежде, что она будет полезной,
    ) v0 ]& F. K5 F2 U5 w3 G
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    2 o8 N* X4 p5 P  p$ D* n# i# ^
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    4 ^% w* k1 y! i, ?, u- v
  11. * См. GNU General Public License для получения более подробной информации.% ?3 ?7 d% G& f5 A( c3 `
  12. *
    . i( F  N; B; d% s7 G4 x
  13. * Вы должны были получить копию GNU General Public License
    ! T: t4 V$ m, c
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.' y* W* O1 x2 a5 `" Q
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.: t! [. u6 `7 M; x6 f5 L4 h
2 j* F, }. j$ \9 x& ~4 R

9 k4 m5 v& z- a6 T& ]! b+ D! D: p2. Импортируемые библиотеки
9 E3 a/ _1 F3 i) {% I& `
* C' b+ e6 l: h$ I4 F$ U* f' `
  1. package org.l2jmobius.gameserver.instancemanager;' k4 s" T( A5 h7 |+ {  A! b

  2. ! y1 `. H4 y# g, `/ `0 Z
  3. import java.util.Map;% L2 |3 M! a' p% J! b; u" O
  4. import java.util.concurrent.ConcurrentHashMap;
    . Y% c/ \4 Z- r( q, o
  5. import java.util.logging.Level;" A4 O) [1 g" a/ P2 b
  6. import java.util.logging.Logger;
    ( S1 o- P* Q' @* ]5 d1 w  `, @
  7. - g( s$ h0 k/ o( ]: P$ d& Y, \
  8. import org.l2jmobius.Config;
    ' J9 ~4 S) Y7 ?: L; g* v6 P
  9. import org.l2jmobius.commons.util.CommonUtil;  {6 d4 |; I5 }" E  L5 }
  10. import org.l2jmobius.gameserver.model.quest.Quest;# z3 [. s& v. b$ S. `
  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 — менеджер для работы с игровыми скриптами.0 ^  L: ]! E& Y
: s( e7 V# @  C5 Q4 O; N, r
3. Описание класса QuestManager( E4 j: T" z3 l: u/ C) B
  1. /**, x/ S9 U$ Y& U8 ?: x
  2. * Менеджер квестов и скриптов.
    ) H  W- M- p0 E
  3. * Автор: Zoey76
    ' S. P7 _3 |% Y" h
  4. *// Z/ O9 A2 V  E
  5. public class QuestManager
    0 r: p5 W- @# S$ B2 O. M8 c
  6. {
    2 ^+ w4 D8 V3 I, l9 v8 n, T% g
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    : y1 `: m: j7 Z( J5 w# X
  8.     $ x& `* }( R5 s9 x) e3 |2 x
  9.     /** Карта, содержащая все квесты. */  `, g; D$ V/ w1 R% j. S1 d
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    ( V; z( f" y) `3 _. T& o$ z) E7 |
  11.     /** Карта, содержащая все скрипты. */
    ) @5 R  E0 m2 I) N
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    + ^2 I; V1 s. I7 U( j  |
  13.     9 E0 C0 i( F& Q( l2 h8 H% i
  14.     protected QuestManager()
    - j: `& S5 m' c; h( z1 L8 B
  15.     {* B) s  d" R+ p+ w0 X, \; y/ P
  16.     }1 e1 {0 ~, C- C/ B  G  L
  17. }
Скопировать код
4. Методы; f0 c& I8 w/ d, y" K5 I6 S
Метод reload(String questFolder)& O% N1 r- D( q6 ~
  1. public boolean reload(String questFolder)
    , g4 }4 R4 P1 ~$ {) v
  2. {$ D3 k, \. E( h+ V6 _
  3.     final Quest q = getQuest(questFolder);/ [' r5 [1 _) k7 b
  4.     if (q == null). ]" T* s+ K1 m6 a9 x- x- O$ Z
  5.     {
    % z* r" B. G4 X$ I6 a
  6.         return false;; U# v: b+ Q. o6 \$ d
  7.     }
    # W% k( v- c1 o. M( J& R
  8.     return q.reload();
    6 c7 G4 n$ S- c$ v
  9. }
Скопировать код

* M' H$ b  ^8 ~3 x2 g
" {$ h! h! z6 O; a: K$ w/ g5 cМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.( J& `+ ?, q6 U6 O. N- X9 X
Метод reload(int questId)
+ u3 J3 Z: B! B( t! r; h7 I2 {  j* |: t4 ?* L) ?! R5 L7 P4 e
  1. /**$ r" G3 m4 {+ i) f  Q! ]* P8 D
  2. * Перезагружает квест по ID.) S* Y8 |- J2 L" E: P
  3. * @param questId ID квеста для перезагрузки
    ! e* y1 c, B% G$ T
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    6 z7 k0 d' o2 u) L+ G# s- i
  5. */" G) l; B* J# c
  6. public boolean reload(int questId)! q: q- ?: e7 ~! l
  7. {
    % W* j; t, _) ^; A4 ~* Q1 z" b
  8.     final Quest q = getQuest(questId);
    : S' T: j5 Q& [3 Y$ @3 n3 B
  9.     if (q == null)
    * w- A( c7 l7 K+ n4 t% K
  10.     {( c" Z( U- n7 U/ P& S6 T; {
  11.         return false;+ c5 c# |6 y* B/ N$ d# J1 q, v
  12.     }3 k3 R2 u% V7 _! `
  13.     return q.reload();
    8 |) k& u0 c' |5 Y
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    / ^  B7 v' w! p3 I

/ l' G% ?9 l9 [4 f/ o$ rМетод reloadAllScripts()( t. c( [( Y- L3 R0 M
, z$ b+ z6 l, z
  1. /**
    $ h8 |2 ^) D! x! H& q
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.' j1 K/ B! B% R" d
  3. */4 T8 F9 `8 d2 Y5 z2 k1 b+ J9 H6 R
  4. public void reloadAllScripts()
    , G1 t1 k+ a3 q
  5. {
    ! O  g# V6 n; W2 @5 z
  6.     unloadAllScripts();* n7 P/ o6 P  S* N& x' k( I
  7.    
    , Z$ H3 W  {* s3 K; x/ B2 @# k
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");5 w6 O& F- i& Z6 h) F. Q6 A; }
  9.     try
    ! n8 [& a9 [3 i; G. h
  10.     {
    ; A4 y: J( ]1 j3 F$ n
  11.         ScriptEngineManager.getInstance().executeScriptList();
    ( p' c+ S" h) i& X9 B
  12.     }! n, G, M( I7 M7 }5 E+ z. b# A6 \
  13.     catch (Exception e)! r) G/ F" K; i6 m
  14.     {& L7 B4 l6 y8 h
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);2 ~' }8 C& D* e5 e; j7 C- X
  16.     }8 Q, `( B! ?8 c% Q5 o
  17.     9 U2 J( h9 J0 A
  18.     getInstance().report();
    & @, v- Y/ u) u' F
  19. }
Скопировать код
Метод unloadAllScripts()
& H% e* K. u% F4 `( z( m: X# d5 z/ q1 H& z5 H% [6 h! ~0 L
  1. /**) O  y0 H7 R. a9 |3 ]6 v1 g
  2. * Выгружает все квесты и скрипты.( V4 }" P7 h; ~# d: l& ]3 u7 V
  3. */0 l' ?, ^3 {& T& N, r" s+ q
  4. public void unloadAllScripts()7 S2 l2 {" D+ G: p
  5. {5 V, Q9 l, _, ]% k
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    8 L( V8 e* {) V! F
  7.     6 V4 l0 T; P- b7 b& z
  8.     // Выгрузка квестов.
    $ Q! u. r+ v1 ]; \! O/ ^
  9.     for (Quest quest : _quests.values())  r1 J" M& M* b- y1 y& V
  10.     {& I9 G( f) U, D
  11.         if (quest != null)
    8 F" _, g6 J! u4 k' K
  12.         {
    5 ^/ M- B# _+ F2 r# E, p1 D2 S
  13.             quest.unload(false);
    * ^( }% N3 I; N& {6 A% Q
  14.         }
    1 {3 H: V" Z4 W7 L* Q  C7 V8 g# x; {8 s
  15.     }: o! J$ ?6 Z8 c' D, Q3 I7 X
  16.     _quests.clear();+ \# L  I  c4 z, k1 [0 G
  17.     // Выгрузка скриптов.
    7 C$ T: F$ Q% s1 N: E( p6 r
  18.     for (Quest script : _scripts.values())' C% x' C4 |! E  [8 K3 w
  19.     {
    $ v' M5 Y/ R( r. g8 Y0 b3 R: j
  20.         if (script != null). \9 P5 W  G$ n1 Z
  21.         {
    2 h8 v1 \0 N& s8 Z2 B/ _
  22.             script.unload(false);
    7 a; C* S& [) C( {0 ?
  23.         }
    4 j4 n: b% y( S# y
  24.     }: @& J) v% T( h+ M- ^  f# L& i
  25.     _scripts.clear();; S0 H( g+ m. L8 f$ x
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.4 Y1 }. L5 T9 h. G. I
5 Z% _0 z2 R' ?$ H% k. `1 \
Метод report()
6 \/ O8 b  ?' o4 |9 X0 K  A% W+ `
3 U6 L' j- s6 y! U0 j' @( I8 P
  1. /**7 G. j  h- T& ]2 C3 r/ c' J3 j
  2. * Логирует количество загруженных квестов и скриптов.9 q9 U+ O* Y# s$ M! ?5 R  E' ^- @. i
  3. */2 C/ A1 ^) H3 g3 F: X% l+ r
  4. public void report()- b. [% k. V; A0 w0 v; \6 H
  5. {+ D4 |. P& a8 _6 Z' ^: \! s' d7 J
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");+ o/ q1 V/ O1 U, x) t0 d4 x  c
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    1 h) f* z4 H3 _0 ]  l6 }, A
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.& c7 J- U7 i) X6 n9 ^0 I

' ^. l& p8 d* A4 CМетод getQuest(String name)
8 D$ U, F7 f/ z6 b: R7 E$ k7 @6 s* T- A! B. z1 X. _) g
  1. /**
    - H9 S: L6 \# K! E! {
  2. * Получает квест по имени.! L0 C( g2 E% H  ^' |) j6 ?" H
  3. * @param name имя квеста/ T: E4 r% u9 m$ G1 O5 V0 ~
  4. * @return квест- Y. V& B! ]7 I8 N$ [9 s2 Q+ M
  5. */
    * x; A- J( O* X' H
  6. public Quest getQuest(String name)
    + ~- a" @3 N4 P# }
  7. {
    , V: l9 X7 H+ l
  8.     if (_quests.containsKey(name))8 l1 z) J7 l0 K& C3 x
  9.     {7 N$ z: \  _3 q( H; y
  10.         return _quests.get(name);5 ]$ Q( q0 N5 o( U: V$ _, s
  11.     }
    7 |7 W- ^$ m; A$ s5 T% T
  12.     return _scripts.get(name);" v2 U& W) c. Y2 v. e; w. f/ A7 ~( ^
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    , j3 r; C; _' S+ L: {" F* K+ i
5 f9 N4 s0 u8 K7 a; V9 ?1 Y
Метод getQuest(int questId)& k- v+ R6 F; a: h- ~; h2 l  D% X) Q

$ O3 k; r' l; ~1 {
  1. /**7 }5 `7 u2 X9 k4 U  Q
  2. * Получает квест по ID.
    $ }8 f5 n2 J7 }1 o' _! G
  3. * @param questId ID квеста0 i' f% \4 g& M% d4 d) s
  4. * @return квест, если найден, {@code null} в противном случае
    + V4 ^" D- I3 ^& {
  5. */0 |$ O  p4 I  u
  6. public Quest getQuest(int questId)- Q3 `4 s) u# s
  7. {
    7 u+ ^) I0 H4 r! R! B2 V% f
  8.     for (Quest q : _quests.values())0 w# a8 ~0 o# o- ^/ Z
  9.     {
      I! ^4 v' R3 D6 q& c
  10.         if (q.getId() == questId)
    0 M  n% A8 y: o) }- [; E3 Q1 {
  11.         {
    / H- G9 c* g! `7 R' X% l  q! _
  12.             return q;
    # V; f' A# B0 U1 m& B1 \6 ]+ A$ E
  13.         }
      d+ T+ Q, x+ @' l, i
  14.     }
    ! W( {* H% ]3 R6 _
  15.     return null;
    ! j! q3 N0 U+ A( x1 Q
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.+ M2 H; ~+ Z8 x# p  m

' y& e7 q; q3 g& wМетод addQuest(Quest quest)
0 L8 S) ]! O* A" ^# |
) o3 M/ t) L, v, L
  1. /**3 J: {- `2 B+ P0 D! Y3 M: ?) O
  2. * Добавляет новый квест.
    # e  b  {/ z  c. C% H
  3. * @param quest квест для добавления
    ( O  N) P% h9 ]* X6 l9 o( I, o
  4. */* S. I) x! Q  t4 c9 ^0 w
  5. public void addQuest(Quest quest)) r$ g& `3 r- t1 O: Z' A& |
  6. {
    9 k0 @' P! G8 B* a$ D# {7 b6 L
  7.     if (quest == null)
    4 f! m( D& ]1 v0 h; P4 V
  8.     {, r( I% G0 ~& y
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");$ i0 x5 J3 h( i; ~1 e) u
  10.     }
    4 x' o1 i5 N; N9 i/ V& j/ r
  11.    
    ! A& Z0 G. L! j+ ]/ u& v
  12.     final Quest old = _quests.put(quest.getName(), quest);
    3 D7 i% n. ~3 V. C3 q( p8 F
  13.     if (old != null)$ `7 Z3 X& C* y+ M  y
  14.     {$ X) G' h' o  {* H! p9 B$ a
  15.         old.unload();
    8 B$ Y! ~  k7 s" ^, c% M
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    & s- D# v+ W  P. h9 S
  17.     }: L3 R) o! P: s! F. i
  18.    
    4 U/ Y' c9 s4 H, ?0 C: H# u! N
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    - O7 i8 L. T4 M1 M
  20.     {
    % q% I. v3 H/ T( b5 `- Y% b- A
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();% B: Y9 o% s& W/ m# x( b8 [
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    ) T7 p( g, R) Y  I
  23.     }# m+ h1 b( r& M6 }$ R" ]9 b
  24. }1 l, _9 e9 ]' [* Y3 @7 w
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
' I# l1 ^0 K$ X5 }ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.& X2 W; y% @- m/ [  r3 V6 U
+ \. ]& r% d- Q# x, w+ A" R3 `
6 m+ i& B7 t4 f& ]# y% {* R
$ Q% F  @6 d" \2 ?. ~% e
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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