Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
* l" ^0 s' m2 _& u8 [2 _1 v; y
: i8 n9 i0 {( P$ x/ x; }3 d8 VРазбор файла QuestManager.java1 _8 _9 q6 E$ w4 V& ?1 E: p: P
9 b* K. q& F( _1 I: F
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
! }- m' r% [: Z( r- w9 J9 g5 H: x4 mОсновные элементы
) F) X' f" T- [- B
  • Лицензия+ ?. g* ~+ l3 O' f& w  k" ^
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      5 a2 B% N4 }; t* G! [9 Q
  • Импорты0 L' J) [- A& Z" U

/ K( L$ ?3 B% F- d+ iQuestManager.java — управление квестами и скриптами.
* s5 x: W* a7 u5 k( L! oПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\0 s+ t6 G5 f# x. x: p
  \% T6 _8 e1 m& h% y9 x) b

8 |/ h8 m# c/ S5 Z$ ]; _' j+ SДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.7 C6 l& v4 Z2 }
1. Лицензионное соглашение
+ t( Q5 Y) C4 x9 {  J6 [
  1. /*; Q6 T4 g! H9 w2 W  j
  2. * Этот файл является частью проекта L2J Mobius.
    % ?5 v0 }! H6 L$ m/ C9 N/ N
  3. *
    - H0 s2 A7 k7 r% O
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять& Q/ Q2 W5 b: l# r
  5. * её в соответствии с условиями GNU General Public License, опубликованной+ I7 j8 g' c4 u/ r$ a; l
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.3 B* `2 r  F9 o
  7. * 5 ]( W5 \4 F( l! s" i$ K8 u
  8. * Эта программа распространяется в надежде, что она будет полезной,
    4 v( l! ^* ?# ^' g
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    5 Y; u7 W5 ^, ^/ q0 x) ]+ Z+ g
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    % P, T, }5 T% i3 m1 f' f
  11. * См. GNU General Public License для получения более подробной информации.
    % @1 ~* H+ v& n) v6 v2 L3 `2 u
  12. *
    & U  D6 n/ L0 ^- _- U  G5 v) K9 `
  13. * Вы должны были получить копию GNU General Public License
    , [/ {* i9 {* |% H" M
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.# ]# ]/ I# @/ b2 X; j
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
+ f! }- u$ l, y* @6 \+ [3 j$ Y! P7 G0 \% H/ ?
8 s( S8 h' w/ p8 G) a( d3 j
2. Импортируемые библиотеки& E: l9 v. F7 ~) W
1 i- M9 ^; _  e& r4 m; |" ~
  1. package org.l2jmobius.gameserver.instancemanager;
    * f) V, M, M9 |" }% Y7 f

  2. # d% F4 U) A, G8 [" D) k
  3. import java.util.Map;
    " c, K; ?9 n6 F8 u# L3 o
  4. import java.util.concurrent.ConcurrentHashMap;/ i/ G4 g' _! J6 K) i5 ~2 M
  5. import java.util.logging.Level;
    & c9 V% J3 D0 `( x: \
  6. import java.util.logging.Logger;
    + y6 {- i8 G& F9 g1 m
  7.   x. a+ h" B& s8 f+ y
  8. import org.l2jmobius.Config;
    4 k+ X1 t% a0 ~+ P- s2 }
  9. import org.l2jmobius.commons.util.CommonUtil;
    $ }% {( S: C* V% A0 j, I. {/ k; Q
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    $ E* a+ H, f0 y0 J  h+ |8 N
  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 — менеджер для работы с игровыми скриптами.7 e# C% J: z7 ~

3 ?0 S- q: n/ E6 h3. Описание класса QuestManager8 l  s& Y# ^; b% B+ ~
  1. /**) ?) d5 Z5 X" f) ?) k. ~
  2. * Менеджер квестов и скриптов./ F/ H; O" O8 ]& p4 x; P
  3. * Автор: Zoey76) F. o/ P; E% v
  4. */. n- H! j% h- D6 O, D. C& B
  5. public class QuestManager
    7 |: j; ?- R# }& Z
  6. {
    / v! r5 L% J, G! j
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());3 Q9 G  M/ ~; v, e
  8.     1 l) J5 Y9 x' A
  9.     /** Карта, содержащая все квесты. */6 k3 o5 B6 W0 `" I8 O3 W
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();$ l( V! ~) L- L3 F% t0 l
  11.     /** Карта, содержащая все скрипты. */
    ; J& q7 S- `3 i* i/ S
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();, m6 p3 F0 p9 r  R( F* v8 E
  13.     / r& a' j) O% \) r
  14.     protected QuestManager()  t4 K; J5 j' ]) ]
  15.     {
    3 n" ~9 }, ~: ]8 a
  16.     }
    # i" x8 D! b% @% s7 z
  17. }
Скопировать код
4. Методы
; H* v& s, K7 l5 [. B2 l2 HМетод reload(String questFolder)1 F7 s" k: O/ ~  k3 O( R$ r- Z
  1. public boolean reload(String questFolder)# K, ~& X+ L( T5 [
  2. {/ c+ M. o/ O9 n% H4 G& h2 r
  3.     final Quest q = getQuest(questFolder);
    / r* @' V4 x8 p8 f! |" H
  4.     if (q == null)  C# x' x" U8 ^4 _( Z
  5.     {
    6 }& V$ w: R# W# E* u+ v
  6.         return false;
    - b, G. u6 }. _* {/ ?$ o
  7.     }& B( w8 n: [, n
  8.     return q.reload();
    . v- y' H  @1 a" @4 [' p
  9. }
Скопировать код
# _1 a2 t" G3 `
- C' f2 g: H* e
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.' f, {8 Z- m- }
Метод reload(int questId)
# p" q9 p6 C& {3 B' H. n* s) C: K
  1. /**
    % F) f1 M2 ?7 M( W. O
  2. * Перезагружает квест по ID.
    . Q6 K' c. c+ x+ _
  3. * @param questId ID квеста для перезагрузки
    ' ^' I5 J$ \9 b( b$ [8 P% \) D
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    , s# Q- {( f3 l1 K; F* S
  5. *// s1 G( i+ m2 V( s3 C
  6. public boolean reload(int questId)
    1 x: w& u8 L2 @1 j
  7. {0 y  a3 u' m" [! T  k' O
  8.     final Quest q = getQuest(questId);% f3 ^* Y, X7 S$ G
  9.     if (q == null)
    4 c5 @9 o. V% a, u! v# T
  10.     {
    6 H% ^% v0 ?$ d% q" [
  11.         return false;5 j7 v$ C- T2 F$ ^
  12.     }$ q" S9 D4 T/ G) q
  13.     return q.reload();% l# D0 N! Y; k  s; S- O5 Q8 x
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.' j" J/ D( C3 W( C: O
) ~% e0 u2 ]! b; G! o, N# N
Метод reloadAllScripts()% N8 n" t# S2 E" J. U
, w5 s) A8 D6 l; t7 {7 s3 }2 @
  1. /**$ p% L, v/ ~- i% D% |% X" L6 r6 c
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    + F6 u1 _1 e3 b/ T" V
  3. */# b: R: M9 S5 {& p2 [' I: e
  4. public void reloadAllScripts()3 r. h' [$ D* n" G. k
  5. {6 q' ^2 s+ j6 g" m3 r
  6.     unloadAllScripts();
    9 Q  m, R8 A0 x! I
  7.    
    % y1 L+ R) [& V0 |: f
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    * u. c2 G9 o( u" P6 l7 I2 p$ V
  9.     try
    " ~& P- G7 f4 o9 p1 ^/ ^, R( K
  10.     {
    - H5 ~9 s7 F. K
  11.         ScriptEngineManager.getInstance().executeScriptList();6 B/ F- t4 E' z  `
  12.     }3 D7 k' Y  p) V  B9 B
  13.     catch (Exception e)( b+ a1 _4 A( H+ v
  14.     {4 A" D3 q5 d& r: a" d; K6 T
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    $ t2 }  Z: D+ w3 }; P0 F( H
  16.     }
    6 d( z: Z- }0 r
  17.    
    9 q- A& T6 P7 u$ z
  18.     getInstance().report();
    + M4 I! L, V' ~* B; t+ t: w& A* Z
  19. }
Скопировать код
Метод unloadAllScripts()) N& h& ]& _0 _, ^( i

" c2 C+ g2 V7 O$ F( m$ x
  1. /**  ^9 E4 l5 N  V3 i1 ^5 f! I0 p5 ~
  2. * Выгружает все квесты и скрипты.2 M# g# L9 q+ s; w
  3. */
    : Z/ k0 T& G) g
  4. public void unloadAllScripts()/ X: V; S% t! X+ v+ R4 n; \
  5. {
    2 X  A* j, `/ d9 @1 P. N% k
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    7 U4 D, W5 j, H6 w
  7.    
    ; m" ^- B: t& i+ v6 q
  8.     // Выгрузка квестов.
    ( z/ u/ o4 w0 N3 J9 J' N
  9.     for (Quest quest : _quests.values()): m2 {( K- `/ A/ a( f; d6 p
  10.     {) f$ d" q8 _% @; c; m* w7 ^4 y
  11.         if (quest != null); r0 V- _6 d0 _1 t4 x; ~
  12.         {
    ( [& ?. b9 p2 O
  13.             quest.unload(false);6 t: U  A7 L( g1 V6 k
  14.         }
    ' ?/ h  h& X! ~6 s
  15.     }
    ' y5 p% B$ d* n8 E; R! K0 P7 B
  16.     _quests.clear();. u7 C! c: [. E# P! K, B# s
  17.     // Выгрузка скриптов./ q3 N! A; m0 i! }% Y
  18.     for (Quest script : _scripts.values())
      D+ U( g; l2 Y+ I1 P! p
  19.     {4 {  L1 S5 X- K( b' A
  20.         if (script != null)/ D+ b5 m/ z" q7 {8 @. |" d
  21.         {9 V8 Y; i' [3 ~- X8 |
  22.             script.unload(false);- @' P% C& F+ a. y
  23.         }+ c2 M  m+ C: G* n) T8 }# M
  24.     }
    ) i) n9 z* @6 V! ]" k4 l0 Q
  25.     _scripts.clear();6 t0 o/ J" |3 v! `
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.; O/ m" G! p; i2 b" b" ^$ Q! f6 I& K
; K1 ^% O: o4 N6 W; V0 `
Метод report()# ]6 H+ b! S% V( p" X

8 B" y- s* h  {' |7 t1 v+ V& g
  1. /**: T( D! v  t) `: `6 Y9 P
  2. * Логирует количество загруженных квестов и скриптов.
    & r8 P) L2 }4 Q, f' Z; |, O
  3. */
    ; g1 K! v! r# p3 o6 u# M
  4. public void report()0 x, `$ L6 V) [
  5. {
    * a3 G+ x: p, Q' ?- c
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");0 f% s; Y3 D: ?* U6 ~
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    . \+ G( A. V9 n; U/ k
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    2 K% O# z) E3 M5 |1 g, y, V
# @/ U+ Z8 O% S1 q. I; o( U( B: L
Метод getQuest(String name)# o0 L( A$ b1 `% I

8 s2 M7 S# ?* j; z  E
  1. /**! t  M5 L# M+ F2 g3 i' W# F$ a/ n
  2. * Получает квест по имени.* q+ }/ A6 N4 I$ S+ u4 S3 F
  3. * @param name имя квеста7 p. n4 l7 j0 i" x
  4. * @return квест( m; L2 ?' K) t3 W: ~3 Y7 V
  5. */
    # o+ I) Z3 r. v
  6. public Quest getQuest(String name)6 M+ n  P- o7 w1 q5 K% r" S( a
  7. {
    & y5 a1 u8 S  h% N8 X/ B  `
  8.     if (_quests.containsKey(name)). T: J  \( i- ~9 y
  9.     {; K& v+ R) k$ f7 i
  10.         return _quests.get(name);
    , s* i9 }+ R, t5 \1 c
  11.     }
    2 m" k6 E4 U% A" H3 {; \0 b" R
  12.     return _scripts.get(name);, w7 h+ o% f" `# F7 {4 X
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе." A9 d, C3 b% E4 Q% `
. {3 @& g! F+ d& D3 G: m9 y
Метод getQuest(int questId)
. l. {( A) V/ ^7 G
( Q$ [4 q# R  a) n) R0 s: u1 e
  1. /**
    # [2 Z. p) n4 _* U6 P4 m1 E
  2. * Получает квест по ID.
    # Q7 _& w0 y% w6 ?- ~. r0 J
  3. * @param questId ID квеста2 g2 h- g( e% E: ]4 Q
  4. * @return квест, если найден, {@code null} в противном случае( L+ z8 @* R/ g1 j$ C
  5. */
    2 W; k6 }4 L( r' i  ?
  6. public Quest getQuest(int questId)# |, P/ X6 ]& C& B% G
  7. {0 j# `* H! f) {& M$ k
  8.     for (Quest q : _quests.values())
    . `3 a! L/ O7 X2 Z& ^$ M8 j6 f
  9.     {) h# D! y/ @1 a6 z4 V, a
  10.         if (q.getId() == questId)
    * k' H8 P3 y  H& g6 H& S
  11.         {
    * d8 o( ^1 E4 C; L
  12.             return q;
    9 s  P7 E- r8 Y
  13.         }5 U5 g* j% _; r9 f" d; o
  14.     }3 z7 K" J& @7 d# w6 o% r; H
  15.     return null;3 I; @: \/ D" a
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    3 p) q+ m: Z3 [5 M$ V( [
- K8 I/ R. r0 m
Метод addQuest(Quest quest)/ j* W+ k! [' M5 r& W
. q/ x7 [3 i# o* }
  1. /**
    + s. r/ A3 w6 y5 p% L2 u
  2. * Добавляет новый квест.: p: }2 j8 K( w4 F( z4 N
  3. * @param quest квест для добавления* \# W' S+ s" t* `
  4. */  `4 B: Z( T" i
  5. public void addQuest(Quest quest)* @% G% S/ a, j9 X- H1 ]
  6. {: `; ]1 R* V* [$ R/ F) y$ c4 S
  7.     if (quest == null)
    8 w% C& H: q+ m2 G2 @2 I) e- H
  8.     {$ i2 Y0 |0 B- }2 r0 q
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");% t* C) x, b9 @7 o- d9 O" y
  10.     }
    , u% m4 N) [7 _1 ]( u- y; I7 P  F7 {
  11.       M0 [9 z2 e" l/ z% s
  12.     final Quest old = _quests.put(quest.getName(), quest);) h* j0 w1 V  ~( P
  13.     if (old != null)
    ' [; [2 G4 \" U3 H
  14.     {
    7 D; t" y& N7 x5 \0 ^
  15.         old.unload();
      G% G  C  k) f! l: V
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    * q6 Q7 C$ C, F9 m
  17.     }2 K" |4 A: y# ^' N2 K: D0 C7 k
  18.     3 c+ v2 |* n3 B2 V+ `4 v
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS): V9 K; U+ w9 h$ N6 P
  20.     {
    # p- K" h+ j0 g$ b7 s1 Q
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();" U! X( p$ ?1 d
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    7 F5 l2 v0 j# m2 j$ v4 A2 x
  23.     }! e6 `1 \- S% V/ ~' m# C
  24. }! e  t/ Z/ K+ G$ T3 y$ {# A
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.' |. ^* P$ ?: Q# l$ `- w
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
) K( I  l% X. m, \/ N" N0 f4 S  E( `+ A/ h2 P, w& n- ^2 m. l
( L. i% x# _2 a$ S9 l
: q( r7 i/ y2 [- X& J
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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