Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius, M5 }, v/ i7 C  f" E. g/ ]

0 S% L% O. ]  b9 c3 c" UРазбор файла QuestManager.java; ^& p- m; t. K" A

1 l% b  i3 _" s9 {5 K: rЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.3 D% s3 B- P* Q  D4 J
Основные элементы
6 h$ e3 o( h$ n" Y) X. A/ v/ i( ^6 T+ i
  • Лицензия
      @% b# x, y0 `
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.( ^2 e9 D' @7 m: d  b7 w) P8 n
  • Импорты0 x7 F) d5 Q& j+ J

/ g  p+ b& [+ i) DQuestManager.java — управление квестами и скриптами.
! ~$ T& x8 G4 W; z/ n" MПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\' \  \  P- g) H; J' [; x

# w# s6 W1 c  v6 J
& x, C4 `/ b1 {* b# V; F" C
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
+ _8 k% m$ w" o5 V* I7 f  b1. Лицензионное соглашение' Q- L8 Q6 _1 M9 t/ O  }
  1. /*7 _3 S4 i: G* ?( q* x$ |4 O
  2. * Этот файл является частью проекта L2J Mobius.: R- |1 q5 m# z" Y; P6 m- |
  3. *
    3 R) b3 H8 @+ c& F% _3 [
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять" `6 Y- d: K/ D  M) i- b
  5. * её в соответствии с условиями GNU General Public License, опубликованной& v8 @. J. o9 V" c
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.* s8 t2 P* z, O5 Q
  7. *
    9 v4 H. `6 t; H3 h0 J7 X
  8. * Эта программа распространяется в надежде, что она будет полезной,
    3 v1 E9 i7 x/ l5 o- q. @- D8 R
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии) p5 G) i6 R6 q- H) M4 m+ t2 L
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    0 ^$ ~$ B8 a2 F' X, t7 C3 x
  11. * См. GNU General Public License для получения более подробной информации.
    ( Q, b# N! l5 S& |- O6 a
  12. * 6 n: X$ p' V/ m& x' V! u
  13. * Вы должны были получить копию GNU General Public License; D' ?; P, s% F5 O1 F
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.& C1 X# |+ u9 w' O; Y7 d
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
2 t0 ~" I4 u2 U3 a6 C3 u2 V  x. a" J/ N
* f2 d+ W8 ]8 `7 J
; H* e( y- i; S  _2. Импортируемые библиотеки& O" R& D/ X0 ]5 q+ X6 D

$ o! b( x; q" A7 Q
  1. package org.l2jmobius.gameserver.instancemanager;
    : b' J0 A5 c( l. d% p1 s. O

  2. 7 {6 c- w% E$ ~) `7 E
  3. import java.util.Map;$ ^5 ~- z! O' t6 n
  4. import java.util.concurrent.ConcurrentHashMap;6 v5 b$ B) m; F( ~0 A3 t6 Y0 g( q' b8 R
  5. import java.util.logging.Level;
    3 Q. Z% D& \; C! O1 g  v! [
  6. import java.util.logging.Logger;) o* L) o" l+ a+ {+ H/ j

  7. & @" ?" R& m/ @0 C" k# |
  8. import org.l2jmobius.Config;" P- c3 b4 K  G; a# k: Q* G! b1 r
  9. import org.l2jmobius.commons.util.CommonUtil;8 U5 W' w0 Y- Y7 D
  10. import org.l2jmobius.gameserver.model.quest.Quest;9 J5 u" v6 L% U- A9 b3 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 — менеджер для работы с игровыми скриптами.
" [& a& M+ z& ?7 L0 z1 c+ C
- [; x& a# A. [3. Описание класса QuestManager
6 x* o( @/ j/ Y5 F0 J- t7 _7 r# n
  1. /**
    # J7 |9 q# z  r; S
  2. * Менеджер квестов и скриптов.
    + b4 {% \9 ]; W. W! Z9 ~
  3. * Автор: Zoey76
    ' z1 l! H9 y7 X% b+ e
  4. */& X/ N3 }, _1 f; r- V" `
  5. public class QuestManager; P- ]" L/ s) O8 G( _- }! G- x
  6. {
    1 X5 S8 ~% }7 K9 e. C8 {( \# ^
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    6 t: i) t& J8 E2 g
  8.    
    * r' D6 ?8 b* r: G* H
  9.     /** Карта, содержащая все квесты. */0 u5 S2 M7 v$ M' B+ L" j
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
      h- U( g# ~: s
  11.     /** Карта, содержащая все скрипты. */. q# S& R; h5 r/ F) P
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
      x: o6 [9 h% P% F
  13.    
    9 Q% N: D# g7 ^5 \0 C, h
  14.     protected QuestManager()
    * A! _5 p5 w* z; V4 E
  15.     {- x6 j5 M  |" I1 Q3 q" c* e
  16.     }
    ' l5 t& o  f7 e6 \# _& |& H
  17. }
Скопировать код
4. Методы
! ^9 Y  @# A6 uМетод reload(String questFolder)
7 o' G* z5 P  u& `5 N8 y6 S: b
  1. public boolean reload(String questFolder)
    : i+ p/ p- ]$ m
  2. {% O% ?  U# d' T* p; ]
  3.     final Quest q = getQuest(questFolder);+ I3 x6 E6 z- l4 t5 q
  4.     if (q == null)& j4 e8 l) Z& |: J
  5.     {
    . q4 T9 a- A0 S0 L" w+ y- U$ L) P
  6.         return false;
    : Q0 P' {4 ?) U# \3 y( n
  7.     }: |8 Y* Y* K- ~( A5 b/ q' ]0 t
  8.     return q.reload();
    % x9 ]7 X( Q1 ~: g. k% L' p# O: g% F) L
  9. }
Скопировать код

5 z; ~) }% X8 q3 r- J7 P/ C! E/ t9 M/ T  D5 O" o$ \
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
0 \' f' _7 R# h: K7 ?7 ^8 L9 IМетод reload(int questId)! a* u. [2 y7 r- h. s
1 A, W0 H/ L& H' X
  1. /**3 m/ U# |. f! V# E% K1 o$ Z! N
  2. * Перезагружает квест по ID.
    # ?# Z# [6 I3 c6 W# c" u: C
  3. * @param questId ID квеста для перезагрузки1 u0 p1 @' k& q
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    - F  m. O! r6 {6 \$ v
  5. */
    9 B! k" A8 x: N/ ~+ G4 ]
  6. public boolean reload(int questId)- E! |& G$ e# n4 K
  7. {
    9 |. ~" ?) N1 v& S7 O
  8.     final Quest q = getQuest(questId);
    ; H+ c0 k% \+ S* j, S
  9.     if (q == null)
      @3 R# I. v7 z* \6 l, L
  10.     {# x) M5 R0 X( }1 k) G3 O2 Y
  11.         return false;# |$ i0 {+ l6 u; ]  w
  12.     }
    4 S2 f3 \) S* U* m) c3 u
  13.     return q.reload();
    , M. j% t! _/ h# A0 Y
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.& i$ P5 R. t4 W  N, A
% p8 w' F# ?4 Y1 L/ ^
Метод reloadAllScripts()
! T2 g8 R: l$ A* B& y' T, _8 a+ C  L% \. r
  1. /**
    7 d9 E# v0 L4 a7 U4 M
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
      r! v9 o: h( I5 p; m, p
  3. */
    4 P7 o4 q& c% ?) ?: f
  4. public void reloadAllScripts()
    8 J& u' f/ }; T0 p2 g
  5. {5 V2 n* z# ]1 B! ]2 q; w2 C! e
  6.     unloadAllScripts();
    ; c2 Y2 {# R6 H6 ^& Y  q
  7.    
    * g* S3 X, O- [4 X' A9 M
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");2 I8 c6 w! W2 Q+ h5 X7 Y
  9.     try
      b2 n( Q# H+ u/ R' r% S
  10.     {
    6 L' c+ G; p/ C8 j# v0 M1 E3 }
  11.         ScriptEngineManager.getInstance().executeScriptList();
    ! R" ?- m: s4 B5 O, j2 e( a
  12.     }1 t# T" ^# [* G) p
  13.     catch (Exception e)
    0 W: e- \2 ?8 F; c+ R+ G& a4 ^
  14.     {; U& J; `: o! o2 f2 F7 H
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);2 z: `3 ~7 r$ M& {. W0 o
  16.     }
    $ q5 U: }. C! j4 J4 k
  17.    
    : G* k9 E8 N; j
  18.     getInstance().report();) ]7 D' {9 O9 h/ j. p" L* e& I
  19. }
Скопировать код
Метод unloadAllScripts(). S# u1 L/ o4 c6 q6 O8 @" @" B

! O; J0 g# a; {6 f3 }) ~6 k1 h* e
  1. /**
    2 L, ^/ k+ r4 a& U9 m5 T% ]! i* f
  2. * Выгружает все квесты и скрипты.2 I; v1 ?+ \! }
  3. */
    5 u2 R3 O/ O1 M
  4. public void unloadAllScripts()' E7 m  k7 O4 T# _
  5. {+ r7 P* ]  ?$ }; v) \) p
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    & w5 x  i* [  I9 \# k# t
  7.     7 R4 e0 }3 g$ h) [; }% r6 N, I
  8.     // Выгрузка квестов.
    ; \! ~6 P; ~9 [' U( ~
  9.     for (Quest quest : _quests.values()): H/ O$ h# p# ]6 K7 Q' n
  10.     {
    # W# {2 Y; E5 E3 v4 V2 V4 K4 v1 y9 j
  11.         if (quest != null)
    1 Z0 T4 R/ c8 b4 p5 A/ f0 e& b
  12.         {; E! m7 J/ u! W$ I# C$ v$ _' J- W& G
  13.             quest.unload(false);9 [" z/ j" y' T/ X) I
  14.         }
    : ?! R8 V. o" `' v, n. S
  15.     }
    . z* e, x/ d) L; \, o% U
  16.     _quests.clear();
    1 z, |% Z% J( _
  17.     // Выгрузка скриптов.2 ]! Y" v5 p+ C9 C( T$ i' U
  18.     for (Quest script : _scripts.values())
    7 X) n! ]: }% s  r, S( o
  19.     {. y9 o: R1 D- K0 {) Y
  20.         if (script != null)  c+ E2 C+ S/ ]* z/ L
  21.         {
    ) l# [3 s: g- W0 q6 S
  22.             script.unload(false);
    $ Q3 u1 F, O  v7 _- n5 |3 G  z
  23.         }# R' r  n. _# E
  24.     }- S: i9 v2 |3 B$ u2 b
  25.     _scripts.clear();8 V) t1 S7 y5 g" R) L
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    2 ]% ]1 t8 O" ?/ F
- L8 P- V/ H0 R' \( B4 ]" U# v/ D
Метод report()0 x5 E& [, P9 J) n. p& b7 S( X0 h
6 H; L- @, ^, {  I
  1. /*** X1 P) j6 @# w; B1 p
  2. * Логирует количество загруженных квестов и скриптов.
    " e" V0 d) a! A, Y/ J7 Q
  3. */% N( E6 H$ G# x' V6 s
  4. public void report()
    ) `6 i4 L+ I7 V5 A7 u
  5. {) x8 G; Q, w) s4 d
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    & O0 o: ]( B1 i9 m% l
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    ( P/ q1 `8 `; M8 Z
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.* I7 B+ U" l# X' F& Y3 m
/ c* N+ K: [% ^9 _
Метод getQuest(String name)" B8 q3 ~1 J( |& |3 J

% ?0 T, t# O9 b/ k- T/ M4 a
  1. /**
    ; B# F, k3 r4 _! C. b  Z8 h1 d& w
  2. * Получает квест по имени.6 Q3 p$ G0 S- q1 Z- P( v. b4 o! o: p5 p
  3. * @param name имя квеста
    ! D8 q' y" a, d" B; ?: Y; l, C0 C' ~
  4. * @return квест
    ' J8 M1 {5 N$ J7 F/ D: \
  5. */
    8 `5 _$ V" F4 T9 j0 d" U& O
  6. public Quest getQuest(String name)2 e+ x2 \) ]1 h* m! P# C
  7. {1 D8 l3 B; Y2 s, V1 ~
  8.     if (_quests.containsKey(name))
      n, g5 j9 g( n9 [) |* h+ ^: R1 ?
  9.     {- L- ^, W/ P7 L! \# {5 M6 F. D5 N' s
  10.         return _quests.get(name);
    3 T. l9 y/ {! |
  11.     }1 \6 f  w8 h* t
  12.     return _scripts.get(name);( y) d' G- G/ @; H7 o% K  ^
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.* X# ~/ T+ g! _4 m4 ]# P$ I7 A

" ]0 l: ^2 @" Y  y: @" ?7 o. ]Метод getQuest(int questId)" V  G( s# ]( x# _& X1 c1 I8 ~

; e" j* @' x9 i4 n
  1. /**3 A0 `4 M$ f* p( A
  2. * Получает квест по ID./ r% X' K$ @' G$ v' u
  3. * @param questId ID квеста/ l1 k+ L: B% b- m- W5 g) }3 s
  4. * @return квест, если найден, {@code null} в противном случае; R: |. f% ^. l7 h& Y" R6 j/ `( i4 A
  5. */6 ?0 P" K3 L$ `- x/ i
  6. public Quest getQuest(int questId)
    - z+ w; n7 k1 E; v8 c  x
  7. {
    " h" |" t3 ?7 x  a  T
  8.     for (Quest q : _quests.values()): M& a1 z* I. r; f) e, ]1 D
  9.     {
    ( e  J6 T# g1 }
  10.         if (q.getId() == questId)2 |  D  o9 v- l9 n# p! E
  11.         {
    8 d1 ~! ~) @) D4 l3 \5 L
  12.             return q;
    * d5 L, s/ u3 ]3 Z  R
  13.         }
    3 d/ @$ \4 w- Q6 N9 }; w9 T: E! `4 `
  14.     }
    2 ]5 u. I' E; h( \! |6 d" W& P
  15.     return null;
    5 Q# e. L' d7 W! q- G- V! @
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    4 m6 u5 H9 F) D# }" k& t

. R) b. t0 u+ A/ D1 e9 J  uМетод addQuest(Quest quest); r$ `6 u$ ?. O/ N  ~2 |* i
0 K+ J8 z" c; X1 i  B, R- U" D2 E1 G
  1. /**
    # M( _; X& j" f+ M% x: q, V+ H
  2. * Добавляет новый квест.' t3 {3 e- C, X! `
  3. * @param quest квест для добавления( F% P! T# U, D0 [
  4. */) V  [0 g# n4 e* s6 D1 p$ a
  5. public void addQuest(Quest quest)% [  Q; x9 d- E7 L. W) P
  6. {
    5 e5 F3 l: ?# l6 X
  7.     if (quest == null)
    0 Q7 P3 g1 E5 B- Z0 S0 N& w$ b
  8.     {
    1 d6 R$ D: i2 C
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    % F: `( {. N  J$ p3 x
  10.     }8 W) ]. H4 F3 }9 _
  11.    
    6 \% R7 T5 C( d
  12.     final Quest old = _quests.put(quest.getName(), quest);# Z) U2 ?* C9 {4 B# v$ Y# r: g
  13.     if (old != null)
    5 [& k: ~2 a+ {; R
  14.     {% B, x2 M; t2 a$ V9 ?/ c% l
  15.         old.unload();
    . s- _) D( l1 d+ g& V7 [) L
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");0 t! o& A/ x, a% }$ B$ s
  17.     }
    $ \! U6 Y- {' h+ M5 s
  18.    
    8 |+ |/ [2 u" M9 C
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)  C  O+ D2 _5 M' Z' Z) q
  20.     {' G' P1 |: ~4 J$ x' [1 n
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();2 N; j+ O8 U. H7 y
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");' k5 g7 c3 P, D/ ^3 [" Y+ C
  23.     }% j  A- m9 }1 X$ q2 `) F, T, [
  24. }
    ! a! u5 z7 ]- Z! [: _
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.: K4 E3 m  \& d" l0 H* y* j# m  w
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
# W. X- o5 l# L8 z% U
6 X, ^0 @+ }1 u& V4 k; u
2 l3 q2 P  v* C0 S9 H( [& l- R. |- T7 D, \; U
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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