Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius( n9 G0 T# {7 ~) l1 T

7 ]# |( m5 N4 j' [) E. pРазбор файла QuestManager.java% G/ [9 ?" R# @. w* q9 u
' q  P9 v' ]5 k% h3 X3 z
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.$ R. X. F9 X# c. j! Q. B3 L, f
Основные элементы1 X, c+ Y/ o9 }5 F
  • Лицензия
    8 o  M2 S9 x3 [9 Q( A8 J5 \& G, s, J  \
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.( p, c1 H- T& E, K% a6 k: C
  • Импорты1 @/ @( n- F+ y5 S" _) i+ i% D
) G. l# R6 I3 ]' i" I& {
QuestManager.java — управление квестами и скриптами.% O9 o4 r3 H3 J# C7 ^
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
  c. B, [  ], J3 j
! A8 q7 g/ H, `0 V- @. T
' J. A# O* ?# o; e( x9 A
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
$ T  Y% o% y) _$ r) m1. Лицензионное соглашение
5 e& x: \2 e8 @' o/ H3 T3 a
  1. /*
    . K; ^, t: t& z& s2 \1 S8 U
  2. * Этот файл является частью проекта L2J Mobius.( p- S/ ^0 r2 [5 B0 t
  3. *   j$ E+ }$ a7 P* Z3 g. x$ T& G9 g
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    9 ~* j$ ^+ q& O
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    : [7 H' X4 x' t1 _8 }1 s- C
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    ! c4 j( l1 ?% s: h& v$ C
  7. *
    ( H9 ?6 _# O- P. _  t
  8. * Эта программа распространяется в надежде, что она будет полезной,, c- e$ m1 S1 \* m  [- y4 G
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    - S1 K: G8 R' V6 R
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
      F+ b$ \& P$ X2 L
  11. * См. GNU General Public License для получения более подробной информации.
    / J1 s% S' ?& q0 h7 w+ v/ i5 I
  12. * 3 c9 I! ?% V) ], s  `2 [! h" i
  13. * Вы должны были получить копию GNU General Public License/ _: c( F0 @- F# c
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    : G: q; u2 t( J) l% c
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.8 c- u" T2 L4 ^- x; s

) e8 E6 d8 h" w3 c4 N0 Z8 a4 ?6 S7 z3 |' `4 z0 J
2. Импортируемые библиотеки4 ^$ P3 a+ E6 l

% L0 P  l/ k3 r! p
  1. package org.l2jmobius.gameserver.instancemanager;
    ; V! r* h1 t* \! ?2 B; M5 O

  2. % C8 v/ k8 S) u& E3 h4 L( ?3 a4 E
  3. import java.util.Map;! {* b6 }) e; r$ o7 @6 G# I
  4. import java.util.concurrent.ConcurrentHashMap;
    # t2 R" N) z3 d: Y& T' [
  5. import java.util.logging.Level;7 e5 ^/ ?3 `' s  |8 {
  6. import java.util.logging.Logger;
    + E+ @& r8 j4 e) B

  7. 8 r4 i  i2 d9 M" n/ a
  8. import org.l2jmobius.Config;
    , J) M9 w# z4 S: l/ `- w8 W
  9. import org.l2jmobius.commons.util.CommonUtil;
    . u& D5 }  I6 f
  10. import org.l2jmobius.gameserver.model.quest.Quest;; F3 a7 A" T: ~5 O! 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 — менеджер для работы с игровыми скриптами.
/ \: w- H& B) z) g: I  x4 _$ P4 ~% A: @/ K
3. Описание класса QuestManager
$ L6 ^! e- X( ~0 b: \
  1. /**
    ' p& }8 f" F+ Y, }
  2. * Менеджер квестов и скриптов.2 M3 l2 S* t# r3 P! T! t
  3. * Автор: Zoey76% s6 M! c! j: u6 l5 D4 B
  4. */& B& N3 _+ D- U$ ?6 o9 \* y
  5. public class QuestManager
    7 }- g0 p: E" S
  6. {
    7 r$ o" S. E' {8 Y5 x" l
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    ; q. J0 `' }& F! R- j: e- a6 Z
  8.     0 |, z% C# U2 m7 B
  9.     /** Карта, содержащая все квесты. */
      j/ f) {% g! f: j: D4 k( C$ x
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    3 Z1 _3 F3 o+ ?2 ^% g/ g* D
  11.     /** Карта, содержащая все скрипты. */
    / G% T) ~( P" Y+ w
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();* H9 h% I: L6 K: P% _: K& f
  13.     3 ~. P. V4 M# n& Q
  14.     protected QuestManager()
    + [  x6 a0 H2 @/ ]
  15.     {8 b" o" E4 F, s  N: G1 o
  16.     }
    9 p) L% V6 ]5 ~2 o( j$ Y& x
  17. }
Скопировать код
4. Методы
5 O+ p! ?! K7 C) j* aМетод reload(String questFolder)4 M2 K4 _$ S3 F! a
  1. public boolean reload(String questFolder)
    ( H& B6 w, x/ l
  2. {+ c% v+ E$ B* \/ G# W/ Q
  3.     final Quest q = getQuest(questFolder);
    6 T% J( k9 G: t# X1 j! W& m
  4.     if (q == null)  X. v( o3 R- r+ [+ `
  5.     {
    4 i; c' u4 n1 f) Q4 ?: [+ U+ D
  6.         return false;
    ) R1 ?# b: {( X7 S% d
  7.     }
    4 T7 I* f2 c( }5 O9 h, @
  8.     return q.reload();
    ( I) n! c  f; p: o  l9 }
  9. }
Скопировать код

  t7 R+ i/ [8 Q) C4 a, P+ P8 ]* L- l2 i4 w( _/ E5 _. c4 |! g
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.& c" V- X; X& I1 V* T5 \% U
Метод reload(int questId)
" D0 e. h5 d% h% T) {$ A, P7 k+ P) T
4 l; V3 p. O- ^6 n7 i0 F' w
  1. /**1 h1 W" p- o9 R0 E5 s' f
  2. * Перезагружает квест по ID.  k3 }& l7 P, n: Y2 K
  3. * @param questId ID квеста для перезагрузки  A6 d: M- h# h" Q3 H7 F7 |
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае, E; `! @# h# O, M
  5. */* G" I8 U! U0 T
  6. public boolean reload(int questId)
    ' D3 u% N; z% T+ H) p4 j
  7. {
    " j& ]3 [4 i- r5 M3 w' [
  8.     final Quest q = getQuest(questId);
    & M. q% X9 W1 `1 n6 ^
  9.     if (q == null)( |) L' X' c4 }. J4 w9 v
  10.     {
    7 N; q- H# o2 G1 H" c
  11.         return false;
    ) X# H4 E) V- ?: v% M* B+ K1 [
  12.     }. V) b6 l$ N* \% Z# X% L8 `3 d
  13.     return q.reload();7 V& O5 y' m* b; h2 n
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    , ~, n4 ]' }5 e. u1 C2 b  G2 @* t, w
$ N1 Y( i/ X) n% v
Метод reloadAllScripts()+ |( s1 _! T# v; X' {, h7 x
9 }5 R) o8 q! K' i" n+ U# h
  1. /**" X! G  c( N1 v( G
  2. * Выгружает все квесты и скрипты, а затем перезагружает их./ L8 _$ \: w/ S- t
  3. */) t- h! q, N: G6 }& Z! V
  4. public void reloadAllScripts()2 Q- S+ A+ A$ C8 S- O
  5. {
    + N' f8 ]' T' c' a( F7 m% ~
  6.     unloadAllScripts();
    0 {) ~$ W, s/ N( N8 O
  7.     + C5 S( {% a" g5 @
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    2 G6 i" K1 @3 b! ^, x
  9.     try
    % q, Y% ~4 K6 g7 y2 Y5 G; a
  10.     {
    ; t7 I" r0 b3 I
  11.         ScriptEngineManager.getInstance().executeScriptList();
    9 U* F! T. c$ @6 H/ |8 _+ B
  12.     }6 c5 s" D( F. L& p/ I; X
  13.     catch (Exception e)0 {% C# n$ D4 _" ~$ Z& ?
  14.     {
    ! G- [" B" g+ c4 E
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);1 p% s. s- c$ z: `
  16.     }- d  T3 F; v* G8 F# a) l* j
  17.    
    : f, O  [) v5 a4 @. d
  18.     getInstance().report();
    , j" p6 {. j$ `" s1 Z  x8 x
  19. }
Скопировать код
Метод unloadAllScripts()5 p( ~  j0 [) t! A, c* P2 B
/ \* e2 T0 |8 d' s& o
  1. /**( V& t, x* `+ B/ o
  2. * Выгружает все квесты и скрипты.. T; i4 b8 z( v  V% q
  3. */
    . K; }  u) V$ S3 q- E: u# {
  4. public void unloadAllScripts()
    + R0 [% L3 V: w! u9 O
  5. {
    ) c" @$ ]: V8 j' c5 {
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    7 B& y/ v" r# U5 T+ x. w; O
  7.    
    1 k$ d$ c  A! W% N
  8.     // Выгрузка квестов.
    / b7 g0 P1 q& H3 F- F+ l4 i
  9.     for (Quest quest : _quests.values())% m: |; Y& k, M  c
  10.     {$ D5 b# z" X) b0 k9 O7 r
  11.         if (quest != null)
    2 }+ A; o$ N" V0 p6 S
  12.         {, x" J8 q" q7 J: Z9 y) f# l
  13.             quest.unload(false);) _7 }4 g+ P' K! J5 n: w
  14.         }
    6 o4 [, J5 O0 d, a
  15.     }
    ! q6 X+ u* d9 D
  16.     _quests.clear();
    # h8 Y+ R: ?  M; |' T7 H( Y" \
  17.     // Выгрузка скриптов.
    + X$ R2 H$ D: U. ]& X
  18.     for (Quest script : _scripts.values())
    / b" b6 H  E7 ?( h
  19.     {
    ! _* p( n% X' p: G( d& T
  20.         if (script != null)7 n1 ^& C$ e4 z7 J% {& b& G, I: M
  21.         {
    ; c2 S9 l3 i( {; t) n) j
  22.             script.unload(false);
    + u" @. g, E1 D
  23.         }' Y9 }1 b; [# Y* b
  24.     }6 A5 C6 y+ M/ a4 F
  25.     _scripts.clear();/ P/ w& l8 R+ Z7 r3 M* v2 U
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    2 e" c( b: @* z

! [4 T* X. T5 y- k5 d- cМетод report()
- M: |/ `7 X2 W& B; N5 f& n, `; a6 E" L+ R8 ~
  1. /**
    + B% b0 V  e/ D
  2. * Логирует количество загруженных квестов и скриптов.
    ' J& r/ g+ J1 I* o/ g9 b( c# D/ H2 S
  3. */# x! w5 R6 A) e. `- ~
  4. public void report()5 T0 n- _: {, g
  5. {8 k; {$ N4 Y, d6 v7 c1 q
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
      y1 {' _$ B8 B; Y. s% P
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    # q7 T. j3 H  N) T) T
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.* W( V6 u- K0 V9 V, D/ P$ e
9 c: U" w: v2 V2 B
Метод getQuest(String name)
9 K* v9 p. S2 ?8 |1 w+ d. g+ w% W( r. i' |9 S0 m+ |  C
  1. /**# q5 ~8 A7 p! M7 l4 M: f5 }8 g
  2. * Получает квест по имени.
    * I- H# R, c0 P0 n% S4 m! l
  3. * @param name имя квеста
    * X0 ?) b  L0 k  K2 m' j: \
  4. * @return квест
    : i% P7 k+ D# l% p4 H" w! d
  5. */
    , J2 v# g7 P7 y9 m' E% h* k9 b1 a
  6. public Quest getQuest(String name)0 j5 I+ _4 C3 e% E
  7. {
    2 p7 q, ^: K4 \8 ]
  8.     if (_quests.containsKey(name))- R; V# L; r2 K, M
  9.     {
    & @1 S  @9 e4 K6 b1 O4 t& y6 A
  10.         return _quests.get(name);: \$ ~' x$ p, E$ D! ^4 ^
  11.     }9 D; R  w' w$ s+ x! z+ f
  12.     return _scripts.get(name);0 U. @* q& H( @6 B
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    % @( |" ]" r# q$ ]+ `+ ~' k  S
8 F) \5 P( W7 P5 n5 B' V' |
Метод getQuest(int questId)
) ?' P$ z- Z! O4 P8 _6 r& b7 l, X( V/ Q, L4 c3 X, G+ B
  1. /**  L2 `0 s+ H% a+ e; p
  2. * Получает квест по ID.
    9 \. N; }$ u4 J% s8 Y; I
  3. * @param questId ID квеста
    % K; t& e" a6 z' L; o
  4. * @return квест, если найден, {@code null} в противном случае
    . I' f& ^" ]; y; U
  5. */6 N5 w7 j! A) X3 S8 l
  6. public Quest getQuest(int questId)
    5 J6 s0 P. c3 X4 k8 Y+ A  u
  7. {  P  e2 ?4 K: n! V5 H  i' f. {1 w  B
  8.     for (Quest q : _quests.values())
    # k/ i* y$ ~; R$ z
  9.     {
    1 w* o* u. F6 K& |
  10.         if (q.getId() == questId)3 C* a3 j5 o) L9 h9 _+ `
  11.         {
    4 T. p( a$ ~& p5 C
  12.             return q;' Z2 v* Z! Q; Q* K
  13.         }8 D5 R" [! X* G# s# l4 Y
  14.     }# D' z; I+ S$ \1 P  ?2 n2 c
  15.     return null;
    " D& t" g9 U9 G, a
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.: {2 _  @: o. Z) f6 ~- U+ I

5 a) V1 A- K( O' k! S$ g/ QМетод addQuest(Quest quest)
5 y" Z9 r% Y( U& Q" v7 B
3 y: i; [9 n) q1 `0 P$ S1 m
  1. /**' {/ h; r0 O- {" j0 u/ p$ A
  2. * Добавляет новый квест.
    ! V  Q  E5 l1 t( N! E0 Z0 }
  3. * @param quest квест для добавления! v5 D) Q5 \( `& Q0 u
  4. */$ p6 M5 F3 i4 D* o6 O5 h1 f' Y
  5. public void addQuest(Quest quest)# e% r2 S' G- s' b1 y  M& u8 G
  6. {
    5 @: ~/ z7 A8 S% x, E
  7.     if (quest == null)
      g7 Q9 ^" u: C" V9 G" S$ [
  8.     {
      y$ X' r% a: g# r  C4 V; v1 c
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    4 h! ?; U/ I+ A! A
  10.     }
    8 K! \4 {$ c1 V/ \( _
  11.     % y, T6 y$ e4 L& p* u+ @4 a9 k% G
  12.     final Quest old = _quests.put(quest.getName(), quest);; k* U* J: q8 ]/ J+ C! ^! [
  13.     if (old != null)' i* o$ D; P9 g: {
  14.     {
    8 \' o# Y) n0 n5 T
  15.         old.unload();' d  p- M2 t: g1 h" g
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    & X+ m: t2 |7 |5 Z+ ~8 `7 k
  17.     }) I" H7 z8 _+ m5 h
  18.     0 d. ^0 I- a5 _( W. {' H
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)# O7 X; k5 ]0 q( K" u, T
  20.     {
    ; f$ g! Q% @' o* ~+ f  F
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    " q5 W" I! P% l6 ?
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");  b  I1 D9 I( C- _& U- z, x
  23.     }' P; B, K  ]6 T3 k
  24. }
    , I2 H  ~6 f$ |, N5 n
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
; V6 X- A! G; kЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.; T, _8 R2 N/ F# v, V3 L. r
2 I" M4 b6 w: o( T& d  d# b, D

. O( c. ^  w1 L2 E. u/ I0 V8 S: u& m! P
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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