Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
4 M( Y4 c. T& g1 T1 y
- A% ?7 C) n" k4 T# s: RРазбор файла QuestManager.java9 a9 O5 d) R5 h( k& c4 h
1 m0 r8 y; Y5 V9 g# ]$ p/ |9 u* Y
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
1 }: n& k* v/ g9 d. n# H- N2 A) aОсновные элементы2 d3 O4 h& H; v3 l( Z5 X/ L
  • Лицензия
    , D9 e& ^: g' A+ r
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.9 X6 T: {+ ^% X( f- m9 r+ p
  • Импорты
    % d1 t0 B' ^# `0 U$ Y6 T1 _6 _, l

) N& ~3 R9 n& d% ^. kQuestManager.java — управление квестами и скриптами.
8 F5 x5 l1 A' C) Y6 C) LПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\/ [6 W3 D+ Z0 t& s
9 r& J+ N% R) f/ k
5 ]1 |1 i8 b0 @5 r+ _
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
& t0 P3 K) Q# T' |% k8 U" G' i( i1. Лицензионное соглашение
' v& G: K2 @3 g! M3 N( e6 ]
  1. /*" ]4 S2 f. V! Y5 G1 |) t
  2. * Этот файл является частью проекта L2J Mobius.
    + \4 R$ K) Y+ H, t4 v
  3. *
    ; f- Y: G5 E3 a, A0 A0 R% a- r4 w
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    . n' |4 D) l$ U  y. ^0 w
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    7 D: C2 m# G, P
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    " d& {$ X% ?5 ~* G; N
  7. * ; M4 b& Y8 }' ^/ W3 u) }( X# Y
  8. * Эта программа распространяется в надежде, что она будет полезной,
    * J5 ?  s; H& ~  }. \
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии) Z( X  O  W5 }+ X3 g
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    4 D# w' [9 s; e( D" s
  11. * См. GNU General Public License для получения более подробной информации.8 E5 B' {+ L4 P; X$ C, U5 o4 C, t
  12. *
    4 {+ z- N0 V/ U9 H5 y% y  U
  13. * Вы должны были получить копию GNU General Public License8 ]! e( E8 f5 V& K
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    % u) O6 g5 b! s1 N( @
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
: Y% r' e1 X3 D" I& {
5 ?. r8 a  q! M. H- Q5 i- U  [7 T! ^/ ^
2. Импортируемые библиотеки% m+ i/ \$ G# d8 r

5 z  d: F1 w* x' K9 |
  1. package org.l2jmobius.gameserver.instancemanager;
    6 ]) h( l! `+ q6 e
  2.   l! }8 E$ ?, W. q5 r: _
  3. import java.util.Map;: R2 N, R4 v# Z7 L# k4 |$ }4 h
  4. import java.util.concurrent.ConcurrentHashMap;
    / v+ N8 a$ s; d2 C# @+ _$ r1 Q
  5. import java.util.logging.Level;
    ! }" a. J- e" F& r4 Z9 l0 a1 S
  6. import java.util.logging.Logger;
    % D$ w  I$ F: a: v" w9 Q1 x

  7. . L5 Y) A- R. B. q8 b
  8. import org.l2jmobius.Config;* h% v& t$ Y7 d  H9 F; ]
  9. import org.l2jmobius.commons.util.CommonUtil;. C+ ?# Y# L" M  ?' u
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    - w2 G/ B) w4 a" Z% I
  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 — менеджер для работы с игровыми скриптами.
  D9 g7 z8 ~- R6 Q; }
* f' g9 L$ M  `% P6 ^5 R3. Описание класса QuestManager
- J& s  `7 J& v1 l$ L
  1. /**1 ^* h+ t$ _4 d
  2. * Менеджер квестов и скриптов.+ p1 _! @, l( k7 ?4 x& y  F
  3. * Автор: Zoey76
    - [8 I4 |" U# I6 U, q
  4. */" L/ ^4 w7 A1 [! {3 f* A  C  L
  5. public class QuestManager. y- E& `1 ^$ u) R" Z
  6. {6 k/ Y2 U+ H% p6 K6 d
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    - b% c% z% a- c/ W
  8.    
    . Z5 l. J! [/ M7 O
  9.     /** Карта, содержащая все квесты. */
    7 J0 o& K. K9 \6 A- t
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();2 V2 A& A. b+ X; F/ E* g9 E
  11.     /** Карта, содержащая все скрипты. */
    % ~0 R( R- F, @" P  W, W
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();! s$ o% i) f6 `+ M
  13.    
    8 r  v" R! E' Q6 t# ^9 S' \
  14.     protected QuestManager()
    ; W# T% U7 N6 i7 P
  15.     {2 o* k$ P# n5 a9 S! r2 O/ M
  16.     }
    # L; T- f' G& F- ]& P7 ~% V
  17. }
Скопировать код
4. Методы; ~2 y" S/ ^6 ]( w+ \
Метод reload(String questFolder)( Z9 ?1 N% q9 G" I' W5 P* o
  1. public boolean reload(String questFolder)4 `0 i8 K/ `1 N" H: e
  2. {
    4 M) R3 @7 g- I$ R, Z0 p
  3.     final Quest q = getQuest(questFolder);8 j& S; j* t8 m7 U% r/ A8 R: C
  4.     if (q == null)5 Y$ G' u, i) S0 z
  5.     {
    7 f1 H) G7 i6 W  X6 y6 Q
  6.         return false;: {& o0 I! i1 e& n
  7.     }
    : L, U$ Z8 Y7 E2 n5 U; A
  8.     return q.reload();
    ( x, j& _$ g& a  a/ N( u3 B) {. E
  9. }
Скопировать код

/ R% g% a8 v( z! j( u, [% a' ?- r- D# T8 L& J
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
, R: a' z4 P! |6 _9 IМетод reload(int questId)
3 W' N6 {* w  B  A/ x+ u# ~8 W; b2 c' X2 O2 V" j
  1. /**1 O" B9 Q' p0 y& [  @
  2. * Перезагружает квест по ID.% F$ p8 g8 ]' b4 Q( c
  3. * @param questId ID квеста для перезагрузки
    + |* c0 _7 N% `8 l
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае: D' v/ H7 T; q+ E; z
  5. */3 l$ T6 D+ e5 X8 g  \) l+ e0 l
  6. public boolean reload(int questId)/ p3 n% K0 D% Q4 Q" {3 [1 B
  7. {
    - I. \1 V; l0 d, Z* B
  8.     final Quest q = getQuest(questId);
    ; K8 O/ t3 v7 @. d: O- ]' x% V3 N
  9.     if (q == null)8 j2 D- X3 u! ~9 ?
  10.     {" ~* q6 s7 k! s, d
  11.         return false;/ {' s. T5 T/ ^) w' p
  12.     }1 k) ~8 S& L9 l* X3 M+ ^4 q/ ^
  13.     return q.reload();  @; b  e) f1 `# V1 `& Z0 e- Q
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.. K7 z! W; Y; L4 H" T  A

7 e; L( R3 Q2 p7 lМетод reloadAllScripts()1 I. x; p' y5 f& w& s$ X( Y

; n, w$ e& d8 g" u7 H
  1. /**0 Y7 ]- Q% a0 f! D
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    ( ^! y% W" L9 g6 e' F7 n: ~
  3. */
    6 T, Z' p6 z* t
  4. public void reloadAllScripts()
    ) b/ _. Q0 a8 l# a& Z1 s& F- a1 r
  5. {7 d6 @) r# s' X% q
  6.     unloadAllScripts();5 ]3 d. R6 q; H, U, L" S& {& f
  7.     ' r, F" `; q( ^* O( u
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");- S6 f- U9 X9 u) ~
  9.     try, w# r9 K! n- X* d. k3 s
  10.     {% V- D+ t% `# I( O/ K$ c* d* l
  11.         ScriptEngineManager.getInstance().executeScriptList();
    % ~0 |, A4 {. `" z6 L5 k; E- ~
  12.     }
    1 o, k# m  r: X
  13.     catch (Exception e). F& s9 t3 L; d/ E: F8 k
  14.     {8 L0 _1 F# w8 d& s4 A
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    & V7 l3 P4 O5 C* i
  16.     }8 l9 a+ ^4 t/ a8 ~6 p
  17.    
    + ]2 [4 g7 V6 _) I) g
  18.     getInstance().report();! o) o6 n4 r0 ?: F) z. t% n
  19. }
Скопировать код
Метод unloadAllScripts()$ m- z# ?8 _7 u- |/ S/ G) t5 W

6 D1 b. ^! P7 U# U- e
  1. /**
    0 H3 w# z" l$ a
  2. * Выгружает все квесты и скрипты.
    . x+ y9 a1 I( c# @# Q1 H* {
  3. *// j4 x" P  s6 z
  4. public void unloadAllScripts()" e& {! _! E, q; g
  5. {
    * n4 g# Z9 m, e0 e/ k$ p) Q) `
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");( J; r. d+ {( s8 C& I7 S4 W2 H
  7.    
    0 a" S8 |6 l/ O5 s% E3 o
  8.     // Выгрузка квестов.: n6 N) c$ K9 I7 K6 _* g3 O
  9.     for (Quest quest : _quests.values())
    . \1 X" Q: g1 A4 {
  10.     {5 \% n6 B. i8 G+ A) C
  11.         if (quest != null)
    , A- u+ ?& n5 @
  12.         {: h$ z' m) e5 b( z1 t
  13.             quest.unload(false);
    * G0 u! t) ^7 P/ U/ l* u: ]
  14.         }0 X) R9 E! D; P0 g% P
  15.     }
    ; X8 O! @8 ^) V' D: U
  16.     _quests.clear();4 t( f% C: [% P9 H% W
  17.     // Выгрузка скриптов.
    - Y9 k. p2 C) Z* _' J6 u( K; E6 ~5 D
  18.     for (Quest script : _scripts.values())
    4 S7 R4 K6 e1 T# s7 X8 V
  19.     {& q8 A6 Y0 }) d: c" F! E
  20.         if (script != null)
    0 R3 U. u/ X% B2 O- A
  21.         {' w7 C: l9 u# P# ]5 e1 M
  22.             script.unload(false);
      b( R+ V( V* b, X, `9 e$ a
  23.         }# @- m% ^  x6 t. T7 w( q
  24.     }; U, s- k3 I( Z- d
  25.     _scripts.clear();/ \( {% G) C; Q! f  ]5 n
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    5 ]: B' l# M/ U9 B" B- V8 ^' F
& D; F# P( {( X2 \6 `0 L6 \
Метод report()7 S: }6 Z1 N2 z# v6 B0 R. ]$ |& P
$ j% i+ r; C! r- O
  1. /**
    - A. F4 \( V" [( }/ m/ w3 x
  2. * Логирует количество загруженных квестов и скриптов.. V5 [. H' |$ A& I. y% V* @
  3. */! C4 j0 m9 |0 a" A" Z- D
  4. public void report()% ^, z  O7 Z! x8 E4 b! W- e' }7 k
  5. {; {% i% v4 f7 V6 K) v
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");) S; h/ G) d7 T$ W
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");9 F: j6 Y. I/ q) v; u3 \/ h: L
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов./ V9 q2 @" ^, m* y0 H1 Y' {
+ L+ g. I  E. c  S* y
Метод getQuest(String name)
9 F. @& ]! u9 D3 l" l# L
) n# @/ C$ E4 f% v5 l
  1. /**
    ! c7 L$ |; r( h  ~, h5 x
  2. * Получает квест по имени.5 U3 g% p; Y. M7 g7 Z# ]$ i+ \
  3. * @param name имя квеста
    9 C: o3 t! a$ }7 H) h
  4. * @return квест
      b2 l1 G: k. V( r* t
  5. */
    ( h& E' |  G* C6 G0 y% x( O8 ^
  6. public Quest getQuest(String name)
    5 X: a+ \" B( T4 O0 P
  7. {
    . {: x! q$ C7 K: X+ p8 _: h4 L. r
  8.     if (_quests.containsKey(name))% n0 D6 }+ x) z9 {
  9.     {2 \  G4 z; S8 H% ~/ g
  10.         return _quests.get(name);
    ' c. t. x! O$ f. t9 v/ s9 w' J$ ~( ~
  11.     }# p! b1 p. {0 S/ s% x
  12.     return _scripts.get(name);
    $ ^3 h7 i- j( }) L* e; \
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.+ g1 T" H/ B" f& g6 Y
: E- ~3 o9 {1 M7 }- d  @
Метод getQuest(int questId)  g7 x$ Y! F( g& \/ L2 v( p0 H( Q$ g

  \" i" \! d6 ]- o
  1. /**
    " {: P( m, M) ?3 F/ E3 [4 j8 |
  2. * Получает квест по ID.
      U, v. R: L/ n* z( I3 V
  3. * @param questId ID квеста
    9 K4 M* s0 o1 H! I5 s) Q
  4. * @return квест, если найден, {@code null} в противном случае
    9 E3 `( b) ?% e( L& ^" B3 ]
  5. */
    5 g( [, C3 |( ], o
  6. public Quest getQuest(int questId)' ?0 h2 U( A# v" T- R/ A" j( J
  7. {
    + U8 M3 V; ^% `' q+ W. [' S
  8.     for (Quest q : _quests.values())
    . L' K$ @: |6 }  ^, I4 c
  9.     {
    : b: o0 ?) `# {: k, N. }
  10.         if (q.getId() == questId)
    * ^9 Y# w: X3 B. O9 i+ H
  11.         {
    9 w( J6 o- J) C" w* u) l& `, E
  12.             return q;
    & |3 Z3 \& ?" _: J, z
  13.         }
    . A4 |" ~1 d& _9 k1 Q7 A
  14.     }
    - S3 `/ h  X3 y6 V0 `; n' J
  15.     return null;* I* t4 V) L7 Z& f7 E3 M) ]
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    0 N% N" l$ X) C0 y6 d

6 j( ~* T) `8 P& WМетод addQuest(Quest quest)# r# F" u* `" R5 B2 ?

; h/ E% p, {; D5 E% L: F- b
  1. /**
    $ z% [2 Y, ~: {
  2. * Добавляет новый квест.4 o5 }. k8 p7 n/ @" m* y
  3. * @param quest квест для добавления
    ; t- L" s' j. g8 @& p
  4. */- @8 ~) N7 p# `
  5. public void addQuest(Quest quest)
    & s) O: v) ^5 Q3 ]9 S
  6. {
    4 u( A* A! M+ M" ]- F
  7.     if (quest == null)
    ( ]9 t- m2 G5 w. U& H
  8.     {
    ( J2 L9 B4 W; h: b  E: a+ C
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");# a* Z) I/ H. |, F' h. w$ l1 j0 Z# y
  10.     }
    - A! I6 t7 a+ [; I; _
  11.     ( R: K* @! F! J! K* d/ E- c
  12.     final Quest old = _quests.put(quest.getName(), quest);" f& p9 |8 F: ~) R# Y6 _: [5 F
  13.     if (old != null)
    # k3 \( D/ v! t  [2 n* x% @8 A0 ~. S. J
  14.     {7 y4 m& J7 }5 x% Q8 T' [
  15.         old.unload();. W& e' V" M( M( q1 P. n
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");7 I  b4 v. f9 F, \: r/ r8 J  [
  17.     }& O% k+ [. O8 }' v4 n
  18.     0 c1 F6 S* d6 u0 I8 K' o7 P
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)% H3 a0 R5 E4 G) D- v. Q6 W% g
  20.     {- }6 U, o) `& J2 b( v7 L# y
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    5 F" b# U" i$ p$ R/ s/ P
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    $ I) d0 y& X. C  B7 ?
  23.     }! U; y( K' Y4 y( V
  24. }. e% x! j( e# `: }
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
  y' ?: B) l- HЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.  e; _/ T: z. f' U6 [& g9 m

! M5 Z8 |+ y. o6 k* ~  ]! Z8 g8 W8 r7 U( n% r

# q' `: d7 Q% _. L
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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