Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
' B: |: c' W2 k5 y: t1 F* B! P# p4 z4 O
Разбор файла QuestManager.java
- Y: ?- V3 m# Y9 |9 k& r# b% j
; x' E8 o3 L: O: \, P2 Y+ l# gЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.. P0 c: |4 J# T& w
Основные элементы. r. z, J) h5 L
  • Лицензия
    # a6 ]. a- ]* E5 B1 v! X, Z
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      8 g* \0 W5 j; ~( c4 p
  • Импорты" L8 H0 |4 _+ _) ?3 p# x0 c

& l% J$ @1 M4 b0 Q& c4 T  E# A) xQuestManager.java — управление квестами и скриптами.' K# {) v; r4 @7 [" f2 J, F
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
  {1 [! i5 h6 v  a& X8 a
! H, Q0 }1 g6 ?7 U0 B# n
5 {6 i1 Z+ C3 B& r! x
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.0 e! W; U* ?& h: @8 P) X! j2 I
1. Лицензионное соглашение4 Z$ }# t- `. `/ M/ D; t1 X/ j
  1. /*
    7 l, E8 _: ?- g# ~8 w  U0 a
  2. * Этот файл является частью проекта L2J Mobius.
    , b: a$ I$ B0 A$ a& Z' h+ C
  3. *
    4 V& S' a7 L5 Y  k; K$ H0 h
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять+ h" @; B- g$ M& W- }1 U( R5 U
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    ! R, }5 ?, d6 T4 a
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    4 }5 x& j& d7 e/ O' s% P2 r
  7. *
    9 e. S% a2 A. O: E' i5 q  o
  8. * Эта программа распространяется в надежде, что она будет полезной,( B0 e% j( p* N5 |- p% E
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии. w6 v' P: v1 o2 e% a: b. {
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    , V2 }. o# |) u0 X0 G) ]
  11. * См. GNU General Public License для получения более подробной информации.& w  P5 |0 r  f8 B
  12. * 5 A7 F9 m8 S$ ?+ g# E+ i
  13. * Вы должны были получить копию GNU General Public License
    6 [8 N8 A5 ]# u) ?" A6 i
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>." N- R" R& v% f% `
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
7 y6 @& n" T7 Z, _3 T
% d" h5 q5 v) l' _% ]! }
: @7 l  h' }1 S) ?  \2. Импортируемые библиотеки0 i* s% x5 H' ]' ]0 A1 a6 k: r3 |
# j* q& h3 `7 {0 c" f
  1. package org.l2jmobius.gameserver.instancemanager;9 h6 ?9 F" R: ?
  2. ( K# C' [2 w4 y$ t9 e1 Y0 I+ Q# w
  3. import java.util.Map;
    / c' D0 h' \  |1 E/ V$ `- U; e5 _
  4. import java.util.concurrent.ConcurrentHashMap;
    : g+ n- i9 T4 N. q
  5. import java.util.logging.Level;
    $ R. n2 v9 D* i- {" n# Q" r
  6. import java.util.logging.Logger;
    2 _" c+ U% ?# b* o. J( M& \
  7. ; |7 H7 Y8 E/ y0 M; w
  8. import org.l2jmobius.Config;
    # W% ]' E6 {2 Q3 t! M
  9. import org.l2jmobius.commons.util.CommonUtil;
    3 ?* o7 r$ ^  p! o+ K
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    + ~% C  k6 _3 _9 u
  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 — менеджер для работы с игровыми скриптами.
3 H6 j) h, P7 m8 q! N9 D
" A! p* K( P! U3. Описание класса QuestManager
8 r4 Z8 b# I2 o" j: ~& Q. u
  1. /**
    5 R* X  w' o3 S; z- A* ~
  2. * Менеджер квестов и скриптов.
    5 c3 q  l, J* h  P) o0 A' v( D
  3. * Автор: Zoey76) M! C. J4 `1 t7 M& c7 M& v
  4. */) c$ @/ O1 T8 p4 v1 j' V' G
  5. public class QuestManager& V. z' H- I* V! u
  6. {, p6 n* _. H- u- D9 V2 N+ n! Y2 E5 l: R
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    ! B) C. v: i( v" X
  8.     / G# F2 I) K4 j: ]3 n1 o/ H" I
  9.     /** Карта, содержащая все квесты. */% F" K* e8 J( B
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    , }' q* @, t  |. {6 L: @4 J
  11.     /** Карта, содержащая все скрипты. */
    & q2 {1 K& l9 \+ y5 f
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();5 h! ^: D5 H% a8 {8 N" n  x0 g
  13.     : s3 }) |6 b# \! `; X3 G
  14.     protected QuestManager()$ `/ y0 w8 F3 H& Y" T
  15.     {
    1 X4 [3 b+ n9 `: p/ K  m2 c
  16.     }
    + f9 Z; X* c' P9 Z
  17. }
Скопировать код
4. Методы
9 n$ Y2 `. j  z3 q2 F/ S2 z! YМетод reload(String questFolder)5 |: W1 S3 F% H. F8 S- Q) G. l
  1. public boolean reload(String questFolder)
      ~' H' S( K# p% G! j
  2. {
    + E. [7 H5 B4 ?+ n$ A
  3.     final Quest q = getQuest(questFolder);/ ?! c/ W0 O" g) z! N" }$ H
  4.     if (q == null)
    ; t# m" l8 b& k7 o3 L- [+ ?
  5.     {6 o8 J: }1 V5 B4 G) l. E$ x8 F  w
  6.         return false;- K, ?1 ^; A$ V
  7.     }
    " P& {: x, d, }8 j/ g5 W1 [
  8.     return q.reload();
    ' g$ v. u" Q* h
  9. }
Скопировать код

% z% ]" c! X( n2 z- P9 u3 L) H# \! a& }# L& l  ^# n
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
3 E4 ^# m5 M0 c  p0 C* S& x: o9 I7 vМетод reload(int questId)
+ W7 E, `# K% H- a7 b
$ }! u/ n3 k' r. _, L' E
  1. /**6 B6 X6 p! @& N
  2. * Перезагружает квест по ID.3 R- C8 J& C) k- w8 {# B, c4 z
  3. * @param questId ID квеста для перезагрузки
    : o) {5 W5 G* Y- V3 F/ q3 e
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    9 r# t( `, c& N1 B
  5. */
    & k" o4 ~, W6 T. Y8 v
  6. public boolean reload(int questId)% ^' [' V# _3 n
  7. {
    1 ~+ v8 S: @2 g5 S
  8.     final Quest q = getQuest(questId);
    & l# h, l/ i8 _* {7 v
  9.     if (q == null); m" {9 s$ `$ k: i0 ~$ Y
  10.     {9 z9 G8 V5 h' J
  11.         return false;& e9 }8 u: j0 E1 J
  12.     }
    , Z: j+ v" Q$ x$ D
  13.     return q.reload();
    * v: a* j, x: _% G
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID." Y4 ~: {( V: j- w# ]
5 i0 ?! M; R) w' i/ \
Метод reloadAllScripts()4 f$ b; h7 K0 j

$ V% Q1 f, @4 S4 k, E
  1. /**0 Q1 l: t1 p# f8 U! D: {# p
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.( d! P5 b1 ^" s0 x) _
  3. */
    3 N/ b9 A8 M3 U& Z: e8 f
  4. public void reloadAllScripts()+ P5 M% P" r( H" d6 q$ y
  5. {/ z( L/ V. i  U
  6.     unloadAllScripts();% f: g5 \) \% I& x  S0 J  I# F5 J
  7.    
    ( x2 v" S2 T4 D. r8 Y
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");7 O& x. y% `6 ?
  9.     try5 l; n& m$ G7 J, p8 Q9 I$ H& ?
  10.     {
    % n' [- ?' Y* M1 `7 R
  11.         ScriptEngineManager.getInstance().executeScriptList();# R) ]9 s& v- g$ p2 U7 b) g
  12.     }
    6 G" G3 L: D% E: a" U" ^
  13.     catch (Exception e)5 V: \* c5 j* i6 F
  14.     {+ O- Z( ]( o. X9 M
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    ' l* b0 y; L$ b+ l
  16.     }
    % Q* Y% X- F; ]+ g
  17.     7 p9 I( l4 x) }0 h+ \! Y
  18.     getInstance().report();
    * b" a6 d+ `& q/ J
  19. }
Скопировать код
Метод unloadAllScripts()1 g( s8 o( x( D7 o. r" x) h
1 V% C1 g& E9 p  p
  1. /**4 k# l" h& e  _4 I# I' Q
  2. * Выгружает все квесты и скрипты.
    4 V1 e4 L7 u# v- G# h) r$ ~
  3. */
    + B2 p1 z: c/ E8 i
  4. public void unloadAllScripts()" E# k2 u% l9 f
  5. {
    ; ?, l# y, u/ n$ c9 V' A( I% M
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    " s, m# G" Z6 L9 E* E" V9 V* s0 r
  7.    
    , _2 `" u1 S, y2 I! q. r9 ^" g6 _
  8.     // Выгрузка квестов.
    4 Q  b7 S1 @( k4 q' O( O% L
  9.     for (Quest quest : _quests.values())
    - K+ o( e& o" R: a/ [2 H
  10.     {
    ) p( x' u5 U- @. a) l" o2 g( d
  11.         if (quest != null)* o) m0 s/ l; S$ N& L
  12.         {- V; v8 W' [( m3 d& d& X
  13.             quest.unload(false);
    9 T7 h2 j# a; \% L9 S
  14.         }
    , I7 q! j+ j' Y1 l
  15.     }( C* O% M$ T- T
  16.     _quests.clear();* b/ J  K* U- j; O, n- w  a" n! J
  17.     // Выгрузка скриптов.0 l+ [2 l0 Y8 m$ x: O$ ~
  18.     for (Quest script : _scripts.values())
    , N8 O/ w4 s! G* R  s
  19.     {7 u- \( i: y, h4 ]
  20.         if (script != null)" U8 j  ~+ L  `0 O! n5 E$ t: {2 {
  21.         {# a5 _9 z6 J, ]+ P
  22.             script.unload(false);
    0 U9 t' y3 u8 x( c" P* y
  23.         }( _/ ^! u" A. x7 s* O
  24.     }
    & h) k. ?4 |! @! ]" i( C
  25.     _scripts.clear();
    " s! f. ?5 q1 o7 [4 O
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    2 D; F- g. a/ b* V; p$ Y

' P$ v6 F' y0 t  tМетод report()  }0 _3 w6 v, n4 i+ f6 l# U

, r6 i' R5 @- J# s  h
  1. /**
    % {7 g) D' t; u3 x& o, F. K
  2. * Логирует количество загруженных квестов и скриптов.
    / K2 A  u- Z, g: i+ ~& e, J. J
  3. */- ^- e! M; N% W
  4. public void report()$ H& }! W- g8 M8 M' v* ]. z+ ?& Q
  5. {
    8 r% ]7 M, I2 {4 n2 ^
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");% w! O+ t/ n( d% B' ^7 H1 k, x
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    4 w3 D3 H; z, C0 [9 L* ~) d- a
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    9 k! C; |& k( f& _5 u

& H* e& c* E4 M# L4 J+ {7 O, h% eМетод getQuest(String name)3 y: Q6 {. r! j5 I. Y2 `8 S: v1 X
: k& E9 |& Q1 ]6 _- {
  1. /**5 }6 Z  l. ?# I  ^1 S6 p
  2. * Получает квест по имени.
    , y1 w  y/ d: b5 N8 s1 \
  3. * @param name имя квеста
    7 E! G5 T( W/ i) x3 J$ M
  4. * @return квест+ J5 e, x5 e# a6 v+ h, \
  5. */
    * [% J4 [1 [! }' ]; {2 I
  6. public Quest getQuest(String name)
    + v9 k9 B( J. d* I3 P0 D' g
  7. {
    / k/ w, R' V* p; \6 I
  8.     if (_quests.containsKey(name))
    2 X# P; c9 A% M5 |# F
  9.     {% j5 ~1 E7 @0 F& Y9 C. Y& U
  10.         return _quests.get(name);4 a* C' t, |( g2 {7 \
  11.     }
    7 F' r" E+ r4 S  ~, \, V
  12.     return _scripts.get(name);0 D, f2 a1 D, m, M1 d) H
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.( n( X2 y& p0 ^: B9 G' s

  d: C; O: @* L$ {+ U* kМетод getQuest(int questId)& }# w$ p$ w8 @  M6 Y2 H

' U$ v8 C" N% Z( K3 m
  1. /**
    7 W; p  X0 ~% K5 d7 m% s
  2. * Получает квест по ID.% ?- V4 s$ F" m  d+ k
  3. * @param questId ID квеста
    % e& k3 c& E! {
  4. * @return квест, если найден, {@code null} в противном случае2 l/ @5 \! l0 O$ g$ F
  5. */
    1 d! V5 {4 e& c7 L7 [, p
  6. public Quest getQuest(int questId)
    6 o0 C4 F4 Y, y) v
  7. {
    4 d5 q1 n% i& p8 y, x
  8.     for (Quest q : _quests.values())
    8 L; a6 `1 T! l6 I9 [0 n
  9.     {
    - _4 k! n9 o, `6 U3 _5 j
  10.         if (q.getId() == questId)" ]) r- A3 w; R* m' C) w; [
  11.         {% i# f$ |$ X, e
  12.             return q;
    % g$ m" N* z0 l( p6 [0 I
  13.         }" t6 z! \/ X; J: W+ L
  14.     }, F; r* Z7 i; j9 o0 ^7 m
  15.     return null;$ U, y& F8 z# ?0 ~8 }
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    ! n# ?* ?2 e* f
; [, m" q3 O3 G: n/ {' |
Метод addQuest(Quest quest)4 ~/ L* V1 a- N4 C, U
8 d% d$ b# k0 G* L9 y
  1. /**
    / ~! t% \2 S! ?. o$ t0 j' a
  2. * Добавляет новый квест.  s+ v1 y# r' t# a5 u' z8 P
  3. * @param quest квест для добавления6 m4 B5 N, Q" S; Y
  4. */6 f  T7 J% m7 G+ N/ P
  5. public void addQuest(Quest quest). A9 G) J4 y( x! w" w7 ^
  6. {
    ' \4 {$ R  F" g8 L( B  C6 F
  7.     if (quest == null)
    % h$ D2 r% ~/ F# y! _0 H
  8.     {
    1 o1 H& J9 ?) m  z4 F8 N1 p! @" z
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    4 v; @$ k) t9 s/ j
  10.     }
    : _2 X: Z8 W4 l, e8 P& O
  11.     ) a7 u; e3 E5 Y8 E
  12.     final Quest old = _quests.put(quest.getName(), quest);0 i/ v3 ~5 s. _) e5 O; v( m
  13.     if (old != null); |0 \; C  L- [  z3 }4 w
  14.     {
    2 O, T1 W, f1 u* j; Q
  15.         old.unload();
    $ P7 T* X& Z9 E7 r+ n
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");9 Q8 w4 L, f0 j; ^  X
  17.     }
    # m9 }: K6 _, P0 ^) H
  18.    
    * z2 g: g2 R- `) c2 u0 |) Y" O
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)/ t  Z4 p& h' e: l1 g  I! t: v
  20.     {+ y0 \: V; D$ p% T; _
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    ' B5 ?  g- d; M& L/ `
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
      I8 j  M8 ?1 s' e3 O5 a9 C. p
  23.     }
    ' a4 Q: Y3 H9 k: W9 o0 R& [/ ~
  24. }& n+ U" L5 z! [& \: m
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
0 k; r) q( B6 L4 B4 `5 d" w3 fЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
8 J9 B2 u% `$ J8 y- Y
9 _. X7 v# Y/ W6 |: K
, D( u+ {4 g. B1 Z, j2 I( U
2 |$ X$ s. p3 {* e( W, y1 S
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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