Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius; _1 k' g. Z! ?' y8 ]

. j' e; P4 X; h3 FРазбор файла QuestManager.java
% k9 B; U4 u5 s9 ]7 w7 i+ [" N3 ?# N
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
2 ~( l$ ]6 b* S& k9 _* KОсновные элементы# O- X' ~1 V( |* m
  • Лицензия5 Z( ]3 O( P; ~+ J+ S, [
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      ! i: T( N* i1 Q+ }: l) c
  • Импорты
    $ T4 X3 i2 i" s& d: J9 l0 M
! R, K  g! W' p( W* P3 E
QuestManager.java — управление квестами и скриптами.
/ @  M9 p2 s, j) Q9 I2 _' o9 DПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\' s( U# p4 A& M3 [, R

0 k; ~7 k0 h6 ^" j  a: ?8 K

5 s' c- R& F* m; L# MДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
$ J- `" P+ W5 b1. Лицензионное соглашение
: t2 V/ w6 Q; U  Y5 s, Y
  1. /*9 e1 C% o3 L! T: e) I
  2. * Этот файл является частью проекта L2J Mobius.
    ; B. x' W. z' L( g9 S8 ^' t' Q) k3 r
  3. *
    ) L0 g, [9 v8 ^$ G( B% N- {
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    ' f3 O" P4 s* {. n  }3 o3 J
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    $ H) b6 Q$ U) g1 s
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.+ C% S# p2 s# K
  7. * , @- s4 q; D$ Z; h" Q7 Q6 e
  8. * Эта программа распространяется в надежде, что она будет полезной,+ T* V; ]3 b. R, k! t8 H
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    * l% g. A# ~% u1 X# I, Z& H
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    0 c) w0 ^) k! M% _) _2 `: c
  11. * См. GNU General Public License для получения более подробной информации.
    ; B4 K. |# V+ A* E5 S6 {6 g
  12. *
    & O  E3 e, Z  c0 V" ~5 _$ O5 M
  13. * Вы должны были получить копию GNU General Public License( d4 w3 N9 J' v8 L. Q$ b1 D1 n+ x
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    , f7 s3 h( s# a5 r
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.) v. ?% d4 P+ T+ {$ y' C6 ^1 ]

) n! H/ I+ W5 f: ^2 a: x
+ t9 p- N: @/ _9 w2. Импортируемые библиотеки
* M# G1 R3 m0 j) Q* B0 y# V" d2 f2 P
2 S2 j4 L. i' u4 E* H  N7 Y
  1. package org.l2jmobius.gameserver.instancemanager;$ C' ]5 M7 s% ]) b; L) h

  2. 3 ?* q8 ?( \6 j  r) Q$ }
  3. import java.util.Map;, t" Q! L1 d3 t. s( t% f! ?
  4. import java.util.concurrent.ConcurrentHashMap;, ?8 @2 \4 a/ ~. V
  5. import java.util.logging.Level;
    1 e/ \& M; f5 ^0 l" B3 y1 S
  6. import java.util.logging.Logger;7 V0 \- i: r: O( d- `/ H
  7. , D( |) U, w: K2 |
  8. import org.l2jmobius.Config;
    4 |! r: V  G. U# |- o6 i9 W
  9. import org.l2jmobius.commons.util.CommonUtil;
    * _3 `: S* ?& O: K6 W+ b
  10. import org.l2jmobius.gameserver.model.quest.Quest;$ |  l3 T( f, L5 w; r* e
  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 — менеджер для работы с игровыми скриптами.
% X0 I: x) R: H+ v5 l/ p9 h
: F1 O$ I1 B2 |( m& _' H# P* m3. Описание класса QuestManager
8 h- N3 I8 `* w7 t: c* S
  1. /**
    9 z6 G% E. o* ^& H# K
  2. * Менеджер квестов и скриптов.
    5 _9 W8 J3 a8 \4 Y0 h
  3. * Автор: Zoey76
    ) U6 z9 Z" H8 v% N: n  K
  4. */
    7 K0 E, e* z: }
  5. public class QuestManager4 C- Q4 w' ~1 d  R1 R5 z. K
  6. {; _1 q) `6 @" Y* K% C# l; M  M
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());" s# H$ W5 R3 @' s; l
  8.     " g& u6 O5 ?6 X' r8 v
  9.     /** Карта, содержащая все квесты. */& H9 H* n: u+ z6 U. e2 S1 e4 ?1 C, d
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();8 f  l6 s/ h# W0 V5 y+ X
  11.     /** Карта, содержащая все скрипты. */5 v  r3 I" b& E$ k
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();* U; e- Z# G7 K$ U5 N! J$ l
  13.     # O: @* e0 V  c$ W6 s* o# h/ ?7 x
  14.     protected QuestManager()  m+ B& _- q( M+ s3 o
  15.     {
    ! P* }* P0 Q* e/ l
  16.     }
    0 _" b: Z$ Z6 L
  17. }
Скопировать код
4. Методы) Q1 F5 N& ]- ~1 o  W
Метод reload(String questFolder)
' P; V9 }: J; w4 j
  1. public boolean reload(String questFolder)6 ~" O6 r$ v( n8 D! e
  2. {
    8 l5 Y& _' o: E, s
  3.     final Quest q = getQuest(questFolder);& h- M; r/ o. p/ k- [; |  s
  4.     if (q == null)
    + m2 J: S; v. |% {
  5.     {
    & E5 p. H2 {. d$ z6 L
  6.         return false;
    0 M- b) \* _# \3 k
  7.     }
    ) i9 b# @. Q! m/ w
  8.     return q.reload();; R: X9 m: ]3 E9 _  `: @1 r
  9. }
Скопировать код

/ B" ?7 c7 V. G! l* ~" `6 ~
# U9 F0 G  d) N$ [Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
# N, \3 q  i) e1 ^. YМетод reload(int questId)
! O# H' T$ t5 C8 K+ w
8 }  }7 ]" T9 e7 ~, |
  1. /**( y9 z. a- _) C4 H
  2. * Перезагружает квест по ID.3 @& X/ x4 S1 N! e
  3. * @param questId ID квеста для перезагрузки( B+ E. _" |7 G
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    ( U% m1 e& U% e2 y+ U7 Z- e9 M, P0 |
  5. */
    ! i" P2 c& g2 O; Z! M
  6. public boolean reload(int questId)5 v1 U- P: P6 i6 |* F
  7. {4 ]+ a0 y. V, H
  8.     final Quest q = getQuest(questId);
    4 f$ b. V7 @" l1 D7 V
  9.     if (q == null)
    # Y. `1 a) C. c- `  h+ n
  10.     {6 h% Y& i) R; B4 ?
  11.         return false;2 h3 Z5 j% |3 o- ^+ c
  12.     }% [: \5 f1 N1 t0 Y2 h! \; Q0 s
  13.     return q.reload();6 O# x4 f/ T: R: N0 o
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.$ w  P3 W+ R# w$ x: ?- D
/ G' h- {3 [  n* ]6 A* y
Метод reloadAllScripts()
3 c; o: q1 `( s4 a7 M4 a7 g. \( l/ w* c$ f
  1. /**2 a: r+ V! a# v) Z1 L5 d9 a2 I
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    6 _8 V+ n; N% ^) S+ V/ r. K; l; A% J
  3. */8 ?7 B' P0 k% X% Y: n' J4 o9 V
  4. public void reloadAllScripts()  \9 l5 x/ a7 H! `
  5. {
      d1 a8 W, D" r( I* j/ w  p% K" ]
  6.     unloadAllScripts();# ?+ h% D- s5 i, A
  7.     9 z) C3 E; J3 j4 v
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    + W$ t& v3 w9 o0 D0 E1 a3 W
  9.     try; w6 v# e8 I! |
  10.     {
    ! N7 b6 ~) a, }& T  J2 B/ m# R
  11.         ScriptEngineManager.getInstance().executeScriptList();- G1 I0 j0 l" c1 [1 ~0 n
  12.     }
    ( Y) `# h. ~- n  q: h0 B: o. n  d
  13.     catch (Exception e)
    # x  Q  ~2 d* [0 e
  14.     {
    # F  i# H% }4 G  v
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    / \- m, q: n5 G. m* m8 E  `
  16.     }/ F+ W5 K$ D) c& m5 l
  17.     ( T7 W# x+ s. X  Y0 i0 g
  18.     getInstance().report();0 q: k7 e5 i" m
  19. }
Скопировать код
Метод unloadAllScripts()/ Z" P& R+ V( |7 z- C, t  J
' E- g9 F3 @6 z8 H
  1. /**9 E/ j8 J% V6 Y! P( b( g) h6 Q
  2. * Выгружает все квесты и скрипты.
    5 ]7 k# @: h5 g8 {, r% T
  3. */, p" |+ I) j. @8 O4 g% y7 c4 P
  4. public void unloadAllScripts()( I4 ?5 x8 Q% ?2 @  _8 U
  5. {1 `# i/ L# ^8 p7 l
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");  b% p# T/ l6 D/ g; j; q
  7.    
    9 k$ a9 T# \+ A% m0 X
  8.     // Выгрузка квестов.
    ; B! [' t; j& D6 e; c
  9.     for (Quest quest : _quests.values())7 P% \/ v$ z$ P' S+ p$ ~) H$ O, A
  10.     {
    # D. u9 c- e' d/ e
  11.         if (quest != null)
    5 D  S6 F) }  h4 K( b- Y& X7 x, i' J
  12.         {
    ( U. e+ A7 a7 Z/ c# o6 l
  13.             quest.unload(false);
    ' u2 J, ?" ~* |- H; S
  14.         }+ r6 |' u! R0 a8 W6 f
  15.     }, n" M, M% R' n" Q( r- o, x% d/ o
  16.     _quests.clear();
    9 W6 Z( Q$ X- \: ?. P0 {6 ^/ p4 {
  17.     // Выгрузка скриптов.  }) F% K) N. ?" k) t% E& t2 H
  18.     for (Quest script : _scripts.values())
    & U9 Q" f2 w( `* ]$ J0 L2 p
  19.     {# V" I4 ~% c2 r5 \* \
  20.         if (script != null)
    : d* f: k/ J; E; Z5 F
  21.         {3 l+ q) ?0 s6 l$ l
  22.             script.unload(false);
    / ?. d' ^. h* o. j* A6 S/ n& [
  23.         }7 m% E& b. F/ N) s  @9 w; _3 \/ p
  24.     }
    ) x* f. \6 b1 W7 U& c
  25.     _scripts.clear();5 U3 r. q, `' }$ t5 A0 u
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    ( n) G* A1 m6 i% i% [

9 D( j0 o1 h" s9 S) [: t# aМетод report()
- J7 X1 [" w. f' B, S" C* r# m! H# T% n7 {- s6 @) p5 I+ M* ^% F
  1. /**
    % V- ^8 x3 y; p7 h
  2. * Логирует количество загруженных квестов и скриптов.. P  W' G. F! T) B
  3. */9 V8 H1 i2 X/ Q+ G5 D7 T
  4. public void report()6 M' @% `! K: {8 [0 i8 F
  5. {, M0 m: I+ b# `2 _5 K
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");+ g/ |' ^$ s9 T+ Z
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    , `7 ]( ]7 r3 r  L: s9 I5 l" J
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    1 m- c4 N0 l6 a, }! B

* @& }: w- C9 D. p5 S) PМетод getQuest(String name)
/ R! }  o/ k& P' B# n- o& H, ~+ M0 U9 h; w2 V4 p! X
  1. /**
    4 J+ w# L5 K6 A4 i, @( y) r
  2. * Получает квест по имени.4 c: S. H6 n0 M0 r
  3. * @param name имя квеста
    , a$ j8 x& Y+ c6 R" U. E
  4. * @return квест/ s) G6 l4 L, Z
  5. */
    7 O. h( q, j  k. _  U+ s0 c" ~8 S
  6. public Quest getQuest(String name)
    + D- O# e/ E$ b# ~
  7. {7 a, n: J4 \+ q$ i  j
  8.     if (_quests.containsKey(name))
    / _1 O/ q" _: t  [9 U
  9.     {& u, u& V  d7 s. |) V0 b( q
  10.         return _quests.get(name);( g" j  M; f6 R( h; A% q; J
  11.     }
    # u5 q/ m/ Z/ C9 y$ o1 A
  12.     return _scripts.get(name);
    # v& M; ^7 k0 `$ \  A. f
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.( r7 w) U! i# x$ `- A

2 s3 I8 g3 P$ vМетод getQuest(int questId)
0 d% F( G) n! Q9 o" i  G4 U7 b7 d0 |8 _& m7 e' T: j
  1. /**
      h/ @# c' n; a% Y; [2 p% |
  2. * Получает квест по ID.7 _% d8 g3 Q. A3 p7 V* y( @, H
  3. * @param questId ID квеста
      U+ Z- e2 k  r, |! t
  4. * @return квест, если найден, {@code null} в противном случае
    2 Z" u( V3 o* n' L& [/ F
  5. */6 W8 f! P* O& Z8 x7 J( F, t9 K
  6. public Quest getQuest(int questId)/ j  [; T6 d& {1 j
  7. {7 Z1 G# O  c8 d
  8.     for (Quest q : _quests.values())- J6 M/ j, V& F; E6 ]" z# K7 X
  9.     {
    & O9 @  A5 \- c+ \% v( N0 o) ~
  10.         if (q.getId() == questId)' ]" ?  U  K1 N+ A' y
  11.         {% u6 |0 l: Y1 s+ \
  12.             return q;
    $ s; T  x2 P- m5 y& v
  13.         }' L2 |1 j2 U5 R# ^5 W
  14.     }" U/ W+ s* M( a4 ?
  15.     return null;
    ; b/ K) e6 k# G; `% b5 P5 I/ J% v/ T
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    2 n, h0 ~- \0 Y* p; f7 w
3 t4 U, h5 d# p% C. c% \4 K$ S
Метод addQuest(Quest quest)( J) X& f5 w% Q8 D0 @  m: Z5 t* B! _
# C# F. ?2 w/ ^8 D
  1. /**
    9 M/ T6 Q& W* P. i& C1 I8 @* @3 i* W
  2. * Добавляет новый квест.
    ; X$ a8 j6 f- r2 s- P3 e% @
  3. * @param quest квест для добавления
    5 X8 ~9 s' \8 E3 w  @6 _. y
  4. */1 ]/ U: s6 _! h7 V- \: `# j5 N5 K+ S, d
  5. public void addQuest(Quest quest)7 c8 q: g# h: F5 R+ V  ?" r) D
  6. {
    $ L* H# a4 a6 h( l1 o( o4 Y( ?
  7.     if (quest == null)1 w7 h: \3 n4 |4 L' \& _
  8.     {7 U; Z: i  x3 P0 C! ^" \
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    9 g- V* A' k5 B8 {, \! G) I4 l
  10.     }
    $ U) n1 j; Y+ U1 J7 M9 v
  11.    
    ( F+ g$ B8 @* F" B! X
  12.     final Quest old = _quests.put(quest.getName(), quest);" C8 P: U5 ]0 j6 B: a* ^
  13.     if (old != null)
    / L# Z* |+ ^, e* K2 e3 `: O/ }1 W
  14.     {
    7 p; D! x# ^2 V* ^
  15.         old.unload();
    ' `7 t: t( B/ ]8 H6 X8 T
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");4 c& ?5 m. w. L$ K- V- ]! ~
  17.     }
    ( {8 _! N. C/ w- l% q+ O+ C! m
  18.     & p& P5 \7 @0 r  g$ _9 E  X3 C- C
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)( j2 a: A8 _3 j/ G) n
  20.     {+ _9 g9 D6 }- H9 _
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    % q/ T1 O2 [9 p4 `+ q8 _  y0 V
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    ; m" ^; F: u" |( Z1 k2 M
  23.     }
    4 j7 e, y8 B9 R5 \+ M4 X5 A) l% ]
  24. }
      E: K) H5 H" \8 ?: \
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.4 z7 }1 f- H9 ~5 [- h* c7 A
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
' t3 w& u8 `8 }, m
% @' g# P  R' O  e* C& X7 H9 A3 e6 A; [, D/ o4 E

" Z* J9 J$ @+ I
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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