Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius0 @: l2 h8 L0 ?, s9 F
5 M) h# N) Y% |7 W$ \$ [
Разбор файла QuestManager.java
- K3 V- k) B& `& M* ?5 V! j
, d  {1 \6 ?& f: r1 WЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
" {4 c6 w5 i' j. Y0 d, nОсновные элементы8 u. T1 B, a% Z6 i+ [* e( _
  • Лицензия1 i0 T% A5 z" R* m2 Z
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
        \! i5 P  f4 _% `# S9 |% [
  • Импорты
    6 t. [5 a% N/ ^4 |- U9 g) b% U
: g# @/ f/ E6 v3 G: G* M
QuestManager.java — управление квестами и скриптами.
, }- k  v% i: Q4 i" KПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\" h* Y1 v. A. r: v' R- M( X

- e* _9 x0 U7 x. Y( T7 A/ t
. T! n1 a3 T6 Q7 C$ j4 F% z& w
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.( G$ s  [- o# V0 X; ~
1. Лицензионное соглашение0 E) i, V* X- K, E
  1. /*8 L9 H9 T" v% C$ E
  2. * Этот файл является частью проекта L2J Mobius./ p7 h+ o6 e. Q4 \/ L1 ~
  3. *
    / \, r7 c5 Q# ]2 d
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    $ @/ I& c, T  F! q  z9 `5 V
  5. * её в соответствии с условиями GNU General Public License, опубликованной6 A7 V+ p; a# b
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    . v9 ~: _$ b8 b. Y5 G; a- J4 A
  7. * 6 d; h! c' @. \6 [
  8. * Эта программа распространяется в надежде, что она будет полезной,, L6 v9 z6 I2 b
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии5 J1 \. U# N. L/ T. N6 h  \9 i2 n
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    # j  o) \9 p6 ~, N/ f
  11. * См. GNU General Public License для получения более подробной информации.& T- R; A$ j% ~# x# D1 ^( t" ~
  12. *
    " c/ U* P8 L# z+ v0 u# p; ]$ |1 y
  13. * Вы должны были получить копию GNU General Public License
    8 j' d( Z% a& q: v# P
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.3 m* ^" }/ |+ y' X' T# a  x
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
/ u* L2 s; L3 q8 d% }
5 R' x: h% ^) D( P1 Q) ~/ D# D  L. C) n# d5 ], v+ |
2. Импортируемые библиотеки
0 n9 q7 r  u" C1 x8 x' q  }3 Q8 L3 i/ E* Z/ ?5 t+ P
  1. package org.l2jmobius.gameserver.instancemanager;
    ) z6 V7 \! h! L3 F: G& r" n
  2. * F* k. N7 s; x$ }+ l  \7 P
  3. import java.util.Map;
    ) K* C4 H) Z& c1 K! o9 X
  4. import java.util.concurrent.ConcurrentHashMap;
    4 }5 b  `2 }+ F/ k$ T) ?# ?
  5. import java.util.logging.Level;
    6 E! c/ `& t/ O8 {
  6. import java.util.logging.Logger;" D- y$ c5 e& ]. `: g- O* v- R- S

  7. ; ]" t: l: H: i
  8. import org.l2jmobius.Config;" ?! ?/ B* @* u1 ?% ?5 S: p5 [
  9. import org.l2jmobius.commons.util.CommonUtil;
    ! `% B+ q2 q. W% R+ h9 f% L# t
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    : M5 F- q! i. C) 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 — менеджер для работы с игровыми скриптами.
+ v' E6 M, m. Z" p7 I: g7 A) d" \- }
2 }+ w/ w' o1 o1 V3. Описание класса QuestManager
- {9 B, u( A; I- W+ D( Q
  1. /**
    & S. m4 U5 g- i9 L' j
  2. * Менеджер квестов и скриптов.
    ' M6 f7 ~' O; j# w; L5 y
  3. * Автор: Zoey764 z' _+ p/ U$ h) y9 a
  4. */2 k: ?/ x1 k  [
  5. public class QuestManager
    ' B4 r# C. C* `/ r! |
  6. {
    : P# y  }* d* A6 }8 z, L% u: p6 y2 K! m( X
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    ; p% o  C, Y4 J# A' @# l
  8.     ' [% g  I+ m6 L4 d
  9.     /** Карта, содержащая все квесты. */8 _6 B0 t3 o6 z/ @3 X
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();" [. ~5 J1 e' E0 X9 }' c
  11.     /** Карта, содержащая все скрипты. */
    1 }8 y( n' W  N3 `9 p2 H
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();% n1 t% |5 i; ], y' S! E+ L  _
  13.    
      ]  }) J7 L2 @* n/ K* a$ P% w
  14.     protected QuestManager()) @  M6 @7 `; E, i0 }
  15.     {/ `/ u) w  q, T- {$ m; W7 L
  16.     }
    - |% N6 |. I( G( U+ x+ y
  17. }
Скопировать код
4. Методы! {# ?4 y# y! M' a8 a+ \
Метод reload(String questFolder)
7 O/ `1 ?7 a" W3 L+ v, g/ Z- d
  1. public boolean reload(String questFolder)
    ; M# G7 ?4 }3 `
  2. {2 T4 c5 U/ {4 J" _9 z4 j1 M
  3.     final Quest q = getQuest(questFolder);" E# m, f9 E3 T0 |
  4.     if (q == null): `: p' l/ A1 ?. U( U( E5 g% f8 U- U
  5.     {, V5 n3 e  G+ P& `4 y3 N  K
  6.         return false;
    * r4 i; g, l# s  B# {0 C
  7.     }
    2 w6 n. L0 u- _8 }0 Q" R
  8.     return q.reload();+ Y* F1 m3 Q* |0 T7 _9 t. g% ?
  9. }
Скопировать код

5 L$ n% q. K) M1 o3 W, Y' H$ e* a$ y' V) v
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
* I8 Q2 u4 W1 B+ p0 i# @/ ^) X3 E( c, QМетод reload(int questId)- R" F4 x& z& y8 r4 C7 w
& Y* r% @& K: }8 C, g% F
  1. /**
    6 U0 l5 q$ z* f
  2. * Перезагружает квест по ID.
    : \4 z$ j. `" B
  3. * @param questId ID квеста для перезагрузки3 I+ O- a; W- z) I; s2 C
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае! e5 f) u" V5 v! a" d8 ]
  5. */
    " r% Q4 `; s% M4 o1 K0 _1 W4 q
  6. public boolean reload(int questId)
    7 [, }; t& ^: }
  7. {
    4 o: K5 s: i: J6 Q
  8.     final Quest q = getQuest(questId);
    + A5 o: B: L& G" I9 {- Z- c8 w
  9.     if (q == null)5 M: C8 X$ w: O+ M& i2 q! o- D: M
  10.     {+ {: U2 z6 `% n/ I3 c
  11.         return false;5 J( z* Y" Z% o! L+ K
  12.     }$ S9 t5 k; z; a9 y. ?
  13.     return q.reload();
    1 `, U2 y2 G0 a& m4 ]% g3 }; E
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.. Z$ E; O& b" h% ], l4 O7 I7 x% q

( i) H3 y1 e/ a0 ]Метод reloadAllScripts()0 r( ~5 E+ w% i% e3 w

- H& A# R9 Z7 G1 z
  1. /**0 p. K: b, E( D
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.  g2 b# l) R) [* z( w
  3. *// H1 ~9 H4 z3 X7 z  S+ b
  4. public void reloadAllScripts()( B. T) r$ ~2 [2 b  F; b& L
  5. {" A% F# u& X5 S
  6.     unloadAllScripts();) \; `3 b0 c4 G4 k
  7.    
    & ^: ^' [) L8 s: G" L5 {
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    6 t; f3 x% n, ~. q2 R$ n
  9.     try
    ' N0 O! c/ b4 C! a( E% g" f4 f; {
  10.     {
    ; ]; T6 H2 R! ^
  11.         ScriptEngineManager.getInstance().executeScriptList();7 w* {8 }" M$ ]  G. w3 h
  12.     }
    3 [9 j( x+ B) i) N6 L9 y
  13.     catch (Exception e)
    $ u" o) g: s3 n# P. H$ A- ^
  14.     {% N$ j! J1 f6 w" a& y
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);; j* b% z; L1 Q7 o! q' w2 |
  16.     }
    3 ~: @" k9 T5 g+ }/ R
  17.     8 _9 W( t9 z' ^/ {0 m* S" N1 \; z
  18.     getInstance().report();0 K$ ^' ?! B% u* L4 f
  19. }
Скопировать код
Метод unloadAllScripts()7 p4 ^* ~( P% v% n2 N
& p3 S' D2 c: {' u; w3 Y# Y
  1. /**
    ) m: o3 n" [; A) W' y
  2. * Выгружает все квесты и скрипты.
    8 r, u& }/ L+ P- y9 y
  3. */& s- d$ i- p1 @0 c
  4. public void unloadAllScripts(), v9 `' r' R" h+ o3 b
  5. {9 s& }9 }9 `) r6 j
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");8 m" r. r1 y8 i9 K
  7.    
    - S4 J7 G) m& P1 ]# X7 F7 q9 c
  8.     // Выгрузка квестов.
    % |' M* R! f& [* R4 ?8 h0 @
  9.     for (Quest quest : _quests.values())
    , W# B& x/ B; q" P- D
  10.     {% B6 N' u1 z7 T- P" `
  11.         if (quest != null)
    # Z) H8 c! z2 |3 S/ b
  12.         {9 W  _+ M5 c( I9 D7 \1 c3 r. U8 ?9 @( Z
  13.             quest.unload(false);0 G3 U+ Y' N& P) C) p1 z) k+ L& F
  14.         }9 d/ x( e: }) K9 }* {6 O) w& ^
  15.     }
    + Y5 l7 G6 P; Y4 D2 I$ O! F5 J
  16.     _quests.clear();
    8 g& o( z* O  z. H1 q7 S4 H4 X% V4 L
  17.     // Выгрузка скриптов.
    1 a( T# T8 ^/ {4 k) Y1 \* i
  18.     for (Quest script : _scripts.values())- x! Y0 x, r  ?3 T- _0 _
  19.     {. h+ H# K9 b5 i5 K2 E" B( F* W
  20.         if (script != null)
    5 n+ `$ z' M- Z% i
  21.         {
    : ^: P' W- R$ u' v) L
  22.             script.unload(false);* N8 a( |6 C$ T. _
  23.         }
    4 n) u$ i7 ]' l- l. I  L2 U
  24.     }: N9 z$ S4 Z: r' n0 i% J% G$ ]2 Q
  25.     _scripts.clear();+ [0 N8 p& d& v
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.  |/ ~% x7 u# `9 J6 S
( V9 L7 }' c1 z2 G% c# e
Метод report()& t- N7 G( T1 Z. g5 z

; j+ }1 ~: ]+ I! M5 z
  1. /**: B* H# B1 ~% @0 c
  2. * Логирует количество загруженных квестов и скриптов.+ r9 z: @& G2 I8 f3 P# R1 M
  3. */* F$ P/ x* @( y* g. _
  4. public void report()% i6 O1 ?* ~( w5 N: W2 Y
  5. {" U) t# h) g( X
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    4 G3 A9 m6 ~1 g- u* B1 P2 Y
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");$ P. l# `( [  U) l
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.5 M7 E: a8 u6 M0 G, e% q1 f, {4 [

# a  i: m' z- T9 ?( LМетод getQuest(String name)7 Z# @; G1 X6 A

( S" `  \4 Q, G4 t7 @
  1. /**6 Q$ o2 y7 B4 t9 R8 a1 ~
  2. * Получает квест по имени.
    3 a0 C' J$ m" a4 q9 u# c
  3. * @param name имя квеста
    8 P9 V. B; p3 s& L
  4. * @return квест
    ; y; f8 h5 z) W  y8 H- e6 x
  5. */; L4 ]- O# v0 j& N- a! l
  6. public Quest getQuest(String name)
    0 w- t& I  ~; q4 p4 l
  7. {
    8 r/ Q9 f  V- g$ s/ k% }; i9 f
  8.     if (_quests.containsKey(name))5 n9 j1 a( J' o$ \
  9.     {
    7 A/ ~, l) I* B& h7 J
  10.         return _quests.get(name);8 @4 J) n7 N# v! W7 {, ~
  11.     }- M, C$ g5 G9 y2 v+ L
  12.     return _scripts.get(name);  c" X3 w' `& L8 o/ z
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    - I; ]- s# |2 V( ~6 ?

& I& f# z7 }( L$ P8 p6 `' f! ZМетод getQuest(int questId)
1 h3 H- |2 s+ n' ^/ u# s* j# M& w* M. L1 d& q
  1. /**9 M2 s4 v8 r' |% P$ ^4 _: z$ [
  2. * Получает квест по ID.
    2 f$ O6 q" K! _; q* \
  3. * @param questId ID квеста, o$ j( a2 h$ j) O
  4. * @return квест, если найден, {@code null} в противном случае, V2 w1 y2 _( {+ h( S
  5. */; K6 n6 D& w3 M
  6. public Quest getQuest(int questId)
    ) T3 N6 u* L6 i1 R+ X; _- T' y: w5 I
  7. {
    ( }: F9 i6 t' q- q  @
  8.     for (Quest q : _quests.values())
    ( n6 ~5 Z" T8 p9 m
  9.     {
    2 ?' e  U2 e# L
  10.         if (q.getId() == questId)6 f+ [# l+ L2 L! i9 K
  11.         {
      s: C  p. y; V. x3 b
  12.             return q;
    , u- S4 k. z5 b3 R5 M6 ]
  13.         }! z; U1 W6 [7 H+ g! K& q
  14.     }
    * C/ S9 H+ X9 E7 |
  15.     return null;. W+ {# q, R+ h: U) C
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.* h% ~( L! O% ~# g, }! g
8 N: `" ?0 R. S( L& s, \
Метод addQuest(Quest quest)7 t- G4 K8 ?0 m! k
: E& c+ l- L) T& A! d
  1. /**
    ( Q0 p$ x+ X7 X# q
  2. * Добавляет новый квест./ T" \  Z+ `0 Q" m" ~2 ?
  3. * @param quest квест для добавления% e5 H1 r1 b5 K: J0 t* H/ I: `
  4. */: X* ~. L1 y$ M0 ~- A0 s
  5. public void addQuest(Quest quest)9 o1 n& D7 i6 p
  6. {  D( o5 S( {2 A: q: K) T
  7.     if (quest == null)
    * k! P/ I, ~% x$ ?' G# ^) D
  8.     {+ |8 R0 P* x6 o7 s
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");9 }# C+ h& N+ j
  10.     }
    ! s9 p! p$ }; W% w5 i% a0 G
  11.    
    4 n5 h, ]7 w+ w/ Q1 S& x" l
  12.     final Quest old = _quests.put(quest.getName(), quest);& e9 P% P3 Q( b. ]' ?+ _
  13.     if (old != null)3 Y0 b4 W9 G5 G0 c. ^
  14.     {
    0 A1 B; J5 F. Y- {- j) E% {8 C& e
  15.         old.unload();
    0 A- M2 T3 X" W7 R8 V$ ]
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    8 k4 K6 U% E8 L" [- u+ o
  17.     }
    ) \  W! e; Q+ v9 A
  18.    
    1 b+ Z/ K$ F8 f) ^- N. I8 U
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    / Y8 v' V, o3 u5 }& I: Y* }. H2 \3 ]$ e
  20.     {- R/ p, x% c- L9 |& p) p- P- b
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    ; O( X# m, ?. y
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");* j; [3 x$ P8 _! K# r
  23.     }: @# }& a( r$ O+ K$ a0 T/ ]
  24. }  G, J7 C  c* V, d9 H# N
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.8 B2 G+ I1 e( J
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
9 g3 d8 N$ A8 u9 D  }% w, H; @, P: s& `1 j, H% Z9 H* x

: A7 C# ~+ L3 K
) S" U; y6 p  C& l
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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