Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
. G* M4 a+ m' ]; F. J9 e. K
: N" q& T3 _6 g6 {Разбор файла QuestManager.java
8 }' g" _9 N. [. l2 k( J  I. q& R: e- K  s! x( i) a
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
& i9 Q* n1 D  I+ e& Z. bОсновные элементы
+ T6 x! Y3 E6 p/ A
  • Лицензия
    8 ^9 q! v' k, W; j+ E) u4 |
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.& z+ L3 u/ ]8 Z; N" T1 f& y8 Z
  • Импорты
    2 b! c0 C+ U( r* U0 L9 ^3 O
. P7 `0 }6 ^7 k4 A1 a9 r. Z# o
QuestManager.java — управление квестами и скриптами.% r6 K9 w4 \( T7 \  o
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\" j0 F$ e/ _: Q1 z% T5 N
* |3 F) c( Y/ s$ y+ c' A
" d& Z1 g! C5 h6 N6 b
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
( J* I) Q" E* h1. Лицензионное соглашение$ T' B4 `6 v; q$ o3 O9 }
  1. /*
    - g  E8 T7 X1 ?" w
  2. * Этот файл является частью проекта L2J Mobius.( V! {" f1 d3 ?" Q9 A
  3. * ) Z- Y: {1 e- [# Q2 N; U' j5 @4 E! e
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять4 ^2 L5 @" Z& R8 S) y9 x
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    - P5 [: [0 i8 K3 g) Z( G5 O! P3 F' \: D
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.1 \' x% G) T: |( g+ P- e
  7. * 9 L6 I+ |* e9 z( N; G& G6 o2 G0 U
  8. * Эта программа распространяется в надежде, что она будет полезной,* `8 K; p, k5 ^! w; w8 \* P
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    8 f& ]+ c$ O5 B& ^
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.8 n: q  q( {0 ]' d* n9 ?
  11. * См. GNU General Public License для получения более подробной информации.
    6 \  B! S" E" v0 M  }  x
  12. *
    ( `$ @; r+ ^( ?) Z9 D: k
  13. * Вы должны были получить копию GNU General Public License
    3 Q2 d$ f, t) b) N
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.+ A) v! Q' f9 [# \' ^& w
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
( L& i5 S1 k: h$ e- z. G
) B6 A8 n- l" u4 f$ [' ]. i1 d1 M8 o  m: W/ u8 X+ e: J
2. Импортируемые библиотеки
7 ]2 w$ s/ }7 }- l- X. d% d+ \2 c% ?1 y
  1. package org.l2jmobius.gameserver.instancemanager;
    ( \. {4 i, d/ c2 R6 i; R1 F* S/ x
  2. 7 H4 ]0 s- A6 |* x
  3. import java.util.Map;
    ; L( k( O' s0 u" i+ u
  4. import java.util.concurrent.ConcurrentHashMap;
    * Y- i. V  }1 z3 E0 A6 ]
  5. import java.util.logging.Level;
    $ E( ?; S+ A/ i4 m9 n  S# b
  6. import java.util.logging.Logger;. C5 Z% M! `! j2 u7 U, W" S; z
  7. $ G! @, |1 c2 |/ W5 V+ @
  8. import org.l2jmobius.Config;
    ' |3 u& Q9 }( F4 u2 R* y
  9. import org.l2jmobius.commons.util.CommonUtil;! l, Y" G2 J8 L/ g
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    7 z' o1 a+ o+ Z0 z" s! M9 z% i4 V
  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 — менеджер для работы с игровыми скриптами.
8 p! i% E" O7 w! C' O/ L, t. H$ X- {
3. Описание класса QuestManager/ Q& Z+ ?) t2 o$ C1 U! \9 @
  1. /**2 H0 ^8 F# T: h3 m0 c6 H
  2. * Менеджер квестов и скриптов.% s4 y- c+ W1 s, w: L
  3. * Автор: Zoey76* @9 q2 y' U/ Q% _
  4. */
    2 f. K# C8 S3 N
  5. public class QuestManager- r% f# Z4 w# p% m" j1 E
  6. {' V4 {, n8 J7 S/ a) |. u; W# ?
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());) l: j  h. ~# b! v) c5 ^
  8.     ' C6 r; M5 G( M2 g7 T6 J6 @: `3 s" T
  9.     /** Карта, содержащая все квесты. */6 Q, P7 B: k9 S
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();' I/ s! m, }( e
  11.     /** Карта, содержащая все скрипты. */8 J5 n+ o0 d: M  U2 r$ R3 O
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    $ _% l2 M( n6 ^' t+ e+ T1 T& o
  13.    
    6 m+ U7 T9 c) Q9 S( N- ~9 j6 g6 @
  14.     protected QuestManager()& s( p$ r' }& M6 R
  15.     {
    6 Y3 j. T: p6 S
  16.     }
      G1 w+ j" G3 t  p6 n) ?0 |
  17. }
Скопировать код
4. Методы( n! K. ?9 m1 i5 F( T( g
Метод reload(String questFolder)
0 q/ _% e0 W! y& P+ h/ O- U
  1. public boolean reload(String questFolder)
    5 H- e# z3 O  J& i8 }0 }3 K, W
  2. {
    / }' P# [+ Q: L
  3.     final Quest q = getQuest(questFolder);
    5 {; Z$ I/ _: ]7 N
  4.     if (q == null)
    4 p9 K$ e" G# D& Q- g6 P: u4 ^
  5.     {
    , G; S" b  V# B8 }1 y
  6.         return false;
    * ?& O4 c8 O, s- d
  7.     }
    1 \8 }0 S% K: t
  8.     return q.reload();
    . o; Z, J. `1 g
  9. }
Скопировать код

, Q8 F8 Q% ^4 N1 h) @: [$ _* n; y  R! w( M( V9 r
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.0 L. n5 K8 F$ o
Метод reload(int questId)2 R5 t4 }% Q4 z$ K6 o" d$ L1 b- D
: p! G3 T/ J* ^6 l* ]- c
  1. /**0 l9 H0 q% s; }- k$ ]6 C
  2. * Перезагружает квест по ID.
    / g+ c, b! S$ R. K3 N% V' r3 T
  3. * @param questId ID квеста для перезагрузки
    5 {. q7 W2 b" w. O
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае1 a1 f: l( z8 a
  5. */3 t4 V9 J3 _7 C- |6 L* W  t3 C
  6. public boolean reload(int questId)5 F- l/ \& ~- v: [/ s
  7. {
    & a$ y2 o/ p2 O7 V) o, f! _
  8.     final Quest q = getQuest(questId);
    9 k0 J& D& B5 j2 V. h6 v
  9.     if (q == null)6 O" z/ x3 t" {5 h4 e
  10.     {9 ]; J9 I$ j& u+ I1 B6 R/ A0 [+ ?8 n
  11.         return false;
    3 A1 B& P2 U' `$ Z! q7 z& X
  12.     }
    * e% E$ C8 f/ E8 ~6 t4 d. Z. M
  13.     return q.reload();
    9 w* T+ i9 t. D. h+ R! {& g7 H
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.1 W1 p! _5 I6 |3 o

: s' b* G9 E; z% i# R5 R2 z" xМетод reloadAllScripts()5 R% k" m) c4 L  B% f: i
! D" R. H/ N  t4 P
  1. /**) @0 [! n! P- f1 ~
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.4 C$ C' u7 q* a9 S/ ?
  3. */1 C5 G3 h2 t* w- ?1 O
  4. public void reloadAllScripts()
      t, r1 _/ W4 x4 b+ U; f: I
  5. {
    7 L' {! C& m8 q# t5 G0 O) e" d$ A
  6.     unloadAllScripts();& J. F8 K% X7 O8 r# H
  7.    
    # A9 V& j" D- R, _1 }4 b* s' j
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");8 \% O3 l7 J2 ]" p
  9.     try
    0 m, f6 G5 L! @' v. G) `
  10.     {
    . x. Q3 I& Z0 [  X
  11.         ScriptEngineManager.getInstance().executeScriptList();
    ! I% X2 u( [7 O
  12.     }
    . ]2 {  W; _3 G, }" F/ N& k
  13.     catch (Exception e)4 C! Z. J0 `+ M
  14.     {
    & r" C4 B. v1 i. E1 u# D/ r% A+ b6 J
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    7 i2 V) v0 ^4 @$ C1 {: k
  16.     }& A9 U9 h7 B* v. {5 k; T, w; X
  17.    
    6 m" a0 a1 a$ a
  18.     getInstance().report();
    0 m2 r; u7 }. \8 z: y
  19. }
Скопировать код
Метод unloadAllScripts()" ~9 j0 D+ q' i/ _8 S# @& Y. l3 h

$ _4 g+ R# z* B& `0 y& Z' v
  1. /**
    $ B7 [! N* I7 D, I3 x
  2. * Выгружает все квесты и скрипты.* Q7 H. z5 }8 A: u
  3. */6 o, Y8 N, ~. U) U* o
  4. public void unloadAllScripts()
    / @  _& x! E" b2 v  {8 }
  5. {
    ; D. |$ m5 F( [5 K( d2 h4 v) ?8 E& Q
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    ) C: M0 O# _3 E" O: }' V
  7.     * j- n6 v& J/ k
  8.     // Выгрузка квестов.
    2 E) s' F, L$ }: B3 k9 A' y' [
  9.     for (Quest quest : _quests.values())- |' T& N, ~! x$ _- y+ r" h
  10.     {* H. \- K0 |* O% i% Q: B$ A
  11.         if (quest != null)
    ; o) V& y( p9 V& ^' U) ~' c
  12.         {9 ^: e- K1 C2 c$ e) }: T
  13.             quest.unload(false);; P. f$ c! W, b
  14.         }
    + \/ B6 u* ]$ M
  15.     }
    / F6 N1 x; U$ C2 X6 H2 L/ E$ g$ j
  16.     _quests.clear();
      }* j7 c3 g$ p5 q
  17.     // Выгрузка скриптов.
    4 N. w/ o$ c* _9 r: I" ~& g' Z
  18.     for (Quest script : _scripts.values())- ~3 {. @) C) Q
  19.     {) U) \) v8 V3 y- ^- a
  20.         if (script != null)( |. d0 g& `( O  K# ^: Y3 T1 Y
  21.         {
    ! L/ N( _' k& h2 r% F! j
  22.             script.unload(false);5 w0 e2 k! `& \# e' d
  23.         }3 z# q( U- w& k
  24.     }! Y7 F/ Y. G9 c2 {& {
  25.     _scripts.clear();' O, K% |8 B& r4 E+ A# T$ ^  T
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.  S% D4 x- M5 U) U

- t. [8 ?9 Z! Y/ [- e) uМетод report()  r( N- {( H, H  j* t
; _- v  r( I; x/ W; \" o6 f
  1. /**
    # q7 W* ?9 G+ z) j9 j
  2. * Логирует количество загруженных квестов и скриптов.8 a% m5 X& L& P% h' k( b  {
  3. */
    " P9 \* b+ i2 g, H
  4. public void report()
    0 I0 t+ L2 U/ s9 u, I
  5. {+ v. M* T$ p- g. z2 u" \  Z& W( V
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");3 p, I1 o# w. K5 Z; l
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    & z7 c  {6 y( W" T! |
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    . B8 k- N& |0 O* p7 i

# E  \* r9 y0 ], dМетод getQuest(String name)
* D- ^8 v, ]& l% e* U6 w
# X7 U: w$ E8 a% m
  1. /**
    9 U2 m! v( \# E3 k3 A) u4 ]
  2. * Получает квест по имени.3 A' T, N' d3 C1 D7 X* z$ T
  3. * @param name имя квеста
    9 t0 }) F7 t4 h9 @+ j7 h/ M) ?
  4. * @return квест
    / W. ]9 W+ z, \' j' U  S
  5. */$ }" F. p+ h; y4 Z8 v6 H9 \
  6. public Quest getQuest(String name)0 E# j, j' x' x0 u: `. ]
  7. {! p; o% \4 p8 p' x5 I
  8.     if (_quests.containsKey(name))& f2 g" }6 e1 f/ h. P: ?9 ~% t
  9.     {
    " O9 F5 d- }% ?
  10.         return _quests.get(name);  c1 X  i4 s2 f% M
  11.     }
    " ~( J0 b7 z1 e! w7 D3 c$ r
  12.     return _scripts.get(name);
    ! ^* M" G$ m' Z! z( z3 `
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.& B4 J1 C" g( N! _: W7 |2 U& R) L
$ |5 i+ z6 S. b
Метод getQuest(int questId): _! j# ~0 [* ], c- E& q

- [) {- d2 H3 ], s" I
  1. /**
    $ t0 l9 D7 E, x8 J
  2. * Получает квест по ID.0 a! J4 t4 N, I! s- a1 T
  3. * @param questId ID квеста: T  j- D5 b9 H6 [5 {9 Q: i
  4. * @return квест, если найден, {@code null} в противном случае. A1 ?7 ^) ^* r4 ?- n1 R) R
  5. */
    0 h; e1 \+ C2 q
  6. public Quest getQuest(int questId)
      s4 D# A! e& U( ?+ @$ f
  7. {2 j7 z  F/ }, d6 l& }+ [4 D. B3 w2 L
  8.     for (Quest q : _quests.values()), i1 i) C8 ~* I5 R) ~
  9.     {
    9 x4 O3 a& c% L" r/ f. G  C
  10.         if (q.getId() == questId)
    $ B) k/ y, p& T
  11.         {7 N" K1 V+ X# B
  12.             return q;: K. T& j" Z; A
  13.         }
    , M$ |; ~1 f/ J1 f4 N7 W# q
  14.     }, V. Z8 A3 Z5 L9 i: _& A4 i
  15.     return null;7 S7 Q, |7 m" S5 h. Z
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.% o$ R7 j" M: Y2 x1 Q
* A, u" a4 i' r9 h. @( F' N+ Q
Метод addQuest(Quest quest)
- N6 E2 R# ]$ R' p8 p2 f. H; I  W" H0 O, t* W
  1. /**
    6 l" w! `+ Q, P; ~) Q' [2 V
  2. * Добавляет новый квест.% u) i" X/ u0 A: d: r3 u
  3. * @param quest квест для добавления
    3 K8 @2 N! s! ~# l5 }! e! L$ s
  4. */
    8 l; E* a6 q0 q- [7 z6 k1 V7 ^
  5. public void addQuest(Quest quest)
    5 w& g9 |9 }. i$ L
  6. {: q- P- W8 O1 N4 n
  7.     if (quest == null). {& E/ \1 H* K
  8.     {
    7 p; j2 n: o9 V, Y! e# d
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    ) i2 C5 \( b$ g# O, @; X. j. G
  10.     }
    - w5 u& G$ ]2 P
  11.     ; m% Z4 M9 I. M$ r
  12.     final Quest old = _quests.put(quest.getName(), quest);
    0 E* _0 v* S/ e
  13.     if (old != null)
    - ]- j$ g; L' C" X, p0 v
  14.     {  ^5 K4 i$ m' m* U* C! k9 E
  15.         old.unload();
    $ ]- A( _( ~- z2 O4 i
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");; V; O3 X# s/ i; |: L3 j) P' M
  17.     }  S4 x  F) Y- Z) e* ^
  18.     - X, V  L) p. y/ l3 l
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)$ ~. m& C; @* {
  20.     {; j! p: |# P9 K& @1 D) B1 ?7 k% V
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();+ B1 x5 }* A; o; T* y1 ~
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    2 f  v) o- t! p; E+ y  k1 ~
  23.     }
    ' o. H$ l1 _4 b. U6 ]+ ~4 c6 J
  24. }+ F( V* w* y4 Q* B* _  _2 P
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
0 k7 K, R8 a5 R! T* v: g9 z" Q/ r9 TЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.6 P8 U& G+ u. u* {0 G

& l4 U# o; _4 o; x* V  X5 {( ^
( P2 }! u$ D. O' D* c+ N! t2 Y9 H+ \- f
3 ?9 x4 Q1 G9 _& I
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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