Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
3 _% ?/ I0 X3 a7 N# p9 ~7 V8 e: [7 n* P! g
Разбор файла QuestManager.java  Z: Q% ~# f6 }

3 d# F6 c9 a" L: |9 iЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.8 ?, x2 I7 S5 ]$ O4 U5 X9 m- [
Основные элементы( O& i1 ?4 d9 _( I  `4 t
  • Лицензия
    4 _' S; E& @; w8 C
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.# ]% h; B4 n7 V' {
  • Импорты
    ! \5 g+ B. [1 H7 s
: A+ C3 F. p% p
QuestManager.java — управление квестами и скриптами./ f& f. p! e* j: A  U2 B( ]
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
5 I) N. _9 L, @- S
, Y- y9 ^$ }* Y5 {* \8 d. E0 f
2 D/ r2 O" A. v0 Y( A# g
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.5 }! i$ a4 ^: g5 b7 J
1. Лицензионное соглашение
3 E: c: v7 [4 M( C- Y5 `
  1. /*
    # w# V) v  M1 A. b
  2. * Этот файл является частью проекта L2J Mobius." X! E9 [5 x8 a  ~- V
  3. *   f7 p, m- {5 {- b; i
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять6 x2 \& _8 Y1 S: B
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    $ ^/ Z0 f5 K- }+ F3 e( b/ O5 @
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.$ ?% h. N8 Z: x( C+ r& [
  7. * . {* U$ o8 s" J" r, v8 u2 e
  8. * Эта программа распространяется в надежде, что она будет полезной," F5 P7 X! z+ }6 P
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии" C# o6 K* M5 C4 R! C
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    ' r: [. e3 @* p: D5 x" a
  11. * См. GNU General Public License для получения более подробной информации.( u. z; ]" k, x0 n
  12. * % q; B6 S" E, M  |
  13. * Вы должны были получить копию GNU General Public License
    ) K- ?! j; v  R) q- I% d
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    0 t* y9 a( f* e7 ~/ s1 w0 ?, S
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.: j8 \3 C7 }. k( n0 q& L

+ p6 U$ D' Y& e4 ~& y
3 u# ]7 I7 {+ c! U" K+ O0 G4 \2. Импортируемые библиотеки
& g7 _, L/ F* M' U
9 k  n/ W3 ^* i9 @3 q/ K  q
  1. package org.l2jmobius.gameserver.instancemanager;: U* q- n( h3 a2 v  g2 s

  2. $ V3 y. C. g  C0 x- l
  3. import java.util.Map;
    - t- D3 @+ }. a
  4. import java.util.concurrent.ConcurrentHashMap;- ~7 b. ?: A, E7 g9 F: A; r
  5. import java.util.logging.Level;; n% h1 k0 \6 z4 W( B9 G! t
  6. import java.util.logging.Logger;6 h$ s  b; k) K  I. q) ~

  7. $ c! d; v% ?3 h8 @, k/ H9 v2 r
  8. import org.l2jmobius.Config;
    ! W1 }2 b' k9 P( r9 t
  9. import org.l2jmobius.commons.util.CommonUtil;2 C2 B0 \# j/ P) Z
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    . }! J+ o5 W& E' ?/ @% X! h
  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 F" q# q2 A: L2 G' e7 r& x
; F( a: _0 ^9 H/ G& [. ~7 ~3. Описание класса QuestManager
- k- q3 U+ W# E3 f" v
  1. /**- ]# v: Z7 F. X; P
  2. * Менеджер квестов и скриптов.
    5 @- x. P2 F. m, j1 d
  3. * Автор: Zoey76
    ' c( J! W  f% r" e" P& D
  4. */
    8 _0 q( v" Q8 T! V/ E8 i
  5. public class QuestManager
    ! f$ @+ i- N/ }. K4 v
  6. {# D% N/ Q, [4 x: Y# L0 s0 \: M
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    - @/ \6 x% K7 }  E& L, l
  8.    
    $ ?: j  M. g  n- A
  9.     /** Карта, содержащая все квесты. */
    5 n/ e/ r2 L8 {" q: u3 `9 G' H
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();7 d9 e3 q: r; r! I( z9 t
  11.     /** Карта, содержащая все скрипты. */: @3 X( ^% H1 K1 Q7 v' [
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();: d+ L, M0 t* Y2 n( Y! t
  13.    
    " V- h* u& u* {% }  Z1 v
  14.     protected QuestManager()
    % y8 k4 ~, v* s% m$ f. ]
  15.     {
      d  o& s( b+ p' U
  16.     }% |9 R: B2 N0 {8 L- a$ z
  17. }
Скопировать код
4. Методы' p- ~4 {( f9 E5 o0 J* P5 ^
Метод reload(String questFolder)
; @" q( K5 ]% l
  1. public boolean reload(String questFolder)
    " ], P; x& q  _- V0 S: `
  2. {3 j1 f: ~' `7 B) a9 f
  3.     final Quest q = getQuest(questFolder);8 P1 }, y5 c9 H* V) `; j& e3 p
  4.     if (q == null)
    6 b4 V' [3 r  L
  5.     {
    6 W- l" x- I5 }. ]! ^  e- J$ H( N
  6.         return false;; i4 k# W- |- s/ A) C9 W  ^+ |
  7.     }- x% d) Q; t9 N
  8.     return q.reload();1 w# x0 a1 V- ]) S! D* E. S3 y
  9. }
Скопировать код
1 L" _0 c6 F' `" x. p) U5 C2 s
0 p+ w! s) o8 E; f
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.) b3 s1 [( M0 j( n8 R: E1 W
Метод reload(int questId)0 o/ x0 _  k1 Z
' e6 G/ d! w& [4 L$ P' ~1 ]
  1. /**
    8 ~- H7 L3 P7 H# U! n
  2. * Перезагружает квест по ID.
    ( U' Y/ D1 |7 {% G. \( r( R
  3. * @param questId ID квеста для перезагрузки
    % Z, {# \; X% d8 e# [
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    & i7 g; V  Z0 B) y
  5. */
    * J$ _* H, A) J3 I% f
  6. public boolean reload(int questId)- |9 T" \6 R9 N' ]8 `
  7. {" c, C% r+ E$ V' b7 x
  8.     final Quest q = getQuest(questId);( @, f- o* a& o; Z: I% |) U
  9.     if (q == null)
    / u9 p( [8 D# t, |! d: x+ q7 B
  10.     {
    , D9 l9 H' ^: Z& l
  11.         return false;9 t9 }  B( |( i4 D; Y5 k; R8 |
  12.     }, a* Z4 s" p: c1 R1 P! |
  13.     return q.reload();% p! S# ?1 q4 E
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    ; j' v  \6 ^8 a# v5 T2 d! a

- ]3 o" D- a; {3 JМетод reloadAllScripts()% Y! s5 Y8 s4 l2 ?" Z  J/ D$ G8 Y

; n4 C* \, T$ [( i& J" ^
  1. /**3 r$ j; a5 L0 y- r4 S
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    # E0 I! `! }1 v; i% ?
  3. */
    $ M) Z: h5 ]& h- J. K
  4. public void reloadAllScripts()
    . q8 A! _  i+ l( J: h
  5. {
    ' {1 \  R5 f# Z: z* Y
  6.     unloadAllScripts();
    / L4 B4 b3 t# v# H+ n) O) L
  7.    
    % x$ x' d5 w8 a: E5 m9 C! j+ H
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    5 }' ]1 e. g2 H& v( Z/ c7 `- b5 {" p
  9.     try
    0 h/ ?/ v/ x% {0 }3 }
  10.     {3 A6 ]9 [  e# s. B
  11.         ScriptEngineManager.getInstance().executeScriptList();
    6 \4 C7 w& {  }7 b- ^( Q6 s  _7 ^4 v
  12.     }; q8 Q7 i, Y2 e' u/ }( F
  13.     catch (Exception e)
      ~5 a9 \$ }: E3 K5 ]
  14.     {+ T) E6 E# O6 u/ T/ s, @1 Z! q% s
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);7 E' d/ F2 j& {  _0 ~
  16.     }6 R" _8 B/ W9 s
  17.    
    " r. k7 c0 S' v) I* w3 e
  18.     getInstance().report();
    0 ]  `- G: g& w( B& A* N3 Y
  19. }
Скопировать код
Метод unloadAllScripts()0 i+ n6 W7 D: @/ {5 O* a
+ M0 b9 W* K( @  [# e0 @
  1. /**& P. g3 l1 Z( G
  2. * Выгружает все квесты и скрипты.( f/ @& m$ M2 a. m. g
  3. */
    % u0 `; g. ?; Y  w+ B* y
  4. public void unloadAllScripts()
    3 m1 `( y5 V3 I8 D7 w
  5. {
    ' u- m/ H7 X/ C) I; x
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");) J6 n7 _' j. }1 n1 o+ H- t7 d
  7.     0 Z. r9 f1 [+ }9 I* ]; N
  8.     // Выгрузка квестов.
    9 W3 I2 a0 v, u1 i0 Q
  9.     for (Quest quest : _quests.values())
    6 p" F6 w+ M: }4 N# `3 o
  10.     {. y# G! l, Z9 X# g  j* ?! ?
  11.         if (quest != null)
    , M# d8 N% p: o
  12.         {
    ) M  r% u) R: R2 G( i  ?
  13.             quest.unload(false);
    + w, |" s0 r0 b( F5 ]0 g
  14.         }& P0 g! U( t& M0 R
  15.     }9 Y6 t  X  E: b" s* X) a
  16.     _quests.clear();
    " p% ]4 I4 U5 P
  17.     // Выгрузка скриптов.
    0 O  s* y) z. s9 u# Y$ T
  18.     for (Quest script : _scripts.values())0 R, j  A* V' ~" }
  19.     {
    / Q: e& i; k5 F. J
  20.         if (script != null)
    8 z3 T$ Y3 H: G' d
  21.         {
    9 E5 V, ^7 A4 W! J/ U5 z
  22.             script.unload(false);
    0 B7 Q# O7 S2 ]3 S' d
  23.         }
    9 X$ ]% X" `4 m* x6 v9 r
  24.     }1 v. f8 [4 a1 G# B8 _
  25.     _scripts.clear();
    5 F% R8 a7 o* o2 I% c
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.+ ^7 C. x  a3 y# a$ E* d) E/ Z
) P& O; S9 J1 T3 l! u, O
Метод report()6 p1 n* e& h% `; c0 t- R
; }/ Y' ~( O, v; l! C) H# T
  1. /**+ P5 C' u+ y" C4 S* g( m7 w
  2. * Логирует количество загруженных квестов и скриптов.
    ) [3 s: ^9 l  I$ R/ z
  3. */# z* K& R/ k3 e+ g1 b" r5 z$ e8 D- R% a, X
  4. public void report(): P+ A/ j& A, m+ F: E
  5. {
    , V/ ^# i$ W8 X# T1 L) U
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");' W; Q" p) c$ k
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");0 ]/ f' V" g& U4 z8 ~, R
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
      U7 I; K8 K; A0 s& N7 j1 c4 R

0 U, w5 c# _4 n+ WМетод getQuest(String name)
8 [$ N3 G  Y# z8 b( w1 ^. ?/ h. {7 M- C* Z5 p( X# j
  1. /**
    9 p; n3 e" E& v# N$ G
  2. * Получает квест по имени.4 z0 f; Z0 k& p1 ]+ F; E! y. G) q
  3. * @param name имя квеста
      g  q* W% ~1 s. g
  4. * @return квест: }: R6 L1 x. i3 }$ l
  5. */. M6 \! ]: l8 a6 N1 |  D
  6. public Quest getQuest(String name)* u) p# y. p4 s# x/ g' u( |2 W, l: {
  7. {
    % Z0 K( V2 B9 L$ b5 d
  8.     if (_quests.containsKey(name))  D; W3 z) V7 K0 o. R
  9.     {: w1 `5 f6 F9 j8 V
  10.         return _quests.get(name);; t! \! d% M& k. }! D; U9 x
  11.     }
    5 t6 r4 f5 n! G# ?
  12.     return _scripts.get(name);! G! R' w; L$ g
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    9 u& X( Y* J; Z" g5 c

9 o+ O) ?5 R1 }6 f0 FМетод getQuest(int questId), A1 \5 q$ m4 N. b* t8 {/ c
3 ~" ]6 n) x. T) Q/ G( T  Z
  1. /**5 |( u( |4 S' O( P$ S
  2. * Получает квест по ID.
    ) h" ]3 }2 e4 D8 b, s
  3. * @param questId ID квеста3 J4 Z0 s8 i# }' L
  4. * @return квест, если найден, {@code null} в противном случае; N# p) e& Z- b* f! r/ w0 e
  5. */
    / O& g: e! ~3 A* q& N
  6. public Quest getQuest(int questId)0 g- h$ U" I6 B
  7. {
    % |3 F- B' x) H6 A
  8.     for (Quest q : _quests.values())4 H/ J+ R. O/ T  P
  9.     {) k& w% W' ~" F; I
  10.         if (q.getId() == questId)7 L0 i. ^1 I2 r( n9 y) p8 u
  11.         {5 b, g- e8 Z4 S- k+ Q( T3 V
  12.             return q;
    + x9 o& o7 q) F7 B
  13.         }) {, p2 d6 ]- W) w5 t
  14.     }
    ( M- C$ y' b' W2 j3 G. j/ O0 b
  15.     return null;
    2 a2 i# ~6 L& W
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.% g1 P3 H) O5 }5 W) n9 t- o. t. h# B

% b+ b: i$ |8 x2 cМетод addQuest(Quest quest): G2 H8 Q- D! h
- C$ z7 F. [8 x! y2 S! t. s
  1. /**
    0 D% N# m- @/ L. G4 j- Q+ R9 }
  2. * Добавляет новый квест.
    1 I7 ^: l- k' X; k1 S
  3. * @param quest квест для добавления" j' z$ l) N5 H- n- f" c) R- x# n5 S5 U% x
  4. */8 Z' q4 q! [4 o* V/ @* Z* p: U
  5. public void addQuest(Quest quest)
    6 m) A0 T, P$ ^) i3 |, U( E
  6. {; j8 }( P0 g& z3 t
  7.     if (quest == null)
      a- a: O  X( q0 v3 H
  8.     {
    8 {6 d" P* Z4 r9 d1 a# ~, L
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");" F+ s. p7 G! r6 N# q
  10.     }
    8 O( U' y- B2 T- m: M' ]9 a
  11.     . @) @2 x' r9 P- ~. `. i
  12.     final Quest old = _quests.put(quest.getName(), quest);, h' j1 r" I7 `0 A7 b0 ^) c2 u: I
  13.     if (old != null)
    + B$ A8 Z* S& r* z  Y- ~; \  }
  14.     {3 }- S% j5 M8 W: s* _( \3 \
  15.         old.unload();
    0 ^1 P8 J% u& ~( t" p3 P* K7 n
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    9 u/ e4 [8 T& K: M
  17.     }. [& M% Q0 m2 \; M; C5 k& E9 G
  18.    
    1 |; S( w) J+ Y& ^. e
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)# K9 m# `! D/ l4 S$ F
  20.     {
    + ]# {7 h( ~1 y* H
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    ) a; q- f( O6 c: F) i  d
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");1 y8 i; z5 s3 i3 k- f, a6 q
  23.     }
    " v( r6 P" U2 u4 Z2 k
  24. }
    " d; w4 @& e5 c: K- L) c2 R
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера., e! A' z* h; H% X; I- b  p% a5 N8 |+ Z& ~
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.) V9 W: q7 y/ S  d  x7 e
: ?( C) W( J8 Q, F1 `

8 z4 ~0 l& G- E9 t. T5 i4 r' S- d6 D2 I/ F9 L8 C/ P
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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