Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
' i) N; s5 z, S( t6 Q1 j4 U
6 I* Z4 Y  E! o' w2 Q) O/ EРазбор файла QuestManager.java
( W6 }1 e/ y$ O1 f$ n1 A: X$ Q* Z$ K
5 N2 Z; v- |3 s" ZЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
1 G. o! \, |+ u" w5 u( M& LОсновные элементы7 I; b  m! B: |( O7 j2 k
  • Лицензия. l8 o% u( s) ]$ W" [; Q9 O
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.$ ]; h' m% q2 ~" w7 X! Y
  • Импорты5 U: m3 Q3 T7 P7 N/ y4 d

5 o" z2 H/ k# e% {QuestManager.java — управление квестами и скриптами.
! Z9 |, i8 c- P( F3 v. `Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
; F" ^& j% L8 n3 _4 ^3 a" y
1 O* E3 P5 V5 S! ?
* f1 S5 p: o0 `* k" s4 L7 B3 }9 F
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
7 A2 M$ |# Y9 R: G# r  l* A1. Лицензионное соглашение
, m: ^3 K: h8 H4 ~0 B- i
  1. /*
    2 m7 ~" I- U6 l
  2. * Этот файл является частью проекта L2J Mobius.
    + Y- b1 \& P) f7 N
  3. * 4 ~3 x/ ]+ n4 O! @8 w+ y
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять& }# X: |' i, P' y- Y& a
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    - p, M+ {/ [9 a5 d0 M6 P1 `) I
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    8 B; w4 ]$ l9 E; l8 i# ]
  7. * , u4 r; i, G) ]
  8. * Эта программа распространяется в надежде, что она будет полезной,
    6 H9 G3 d8 H! z. V8 S+ X# |2 [
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    ' y5 o: P+ V9 V, ]
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.2 a2 `! Q( ]$ z9 T/ _
  11. * См. GNU General Public License для получения более подробной информации.7 A6 a$ [2 H6 O- [" \, f
  12. * + z1 z, w: Z" G. e! F+ `
  13. * Вы должны были получить копию GNU General Public License* C! B5 S, D! X
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    + g& m" M# K' i. h3 i3 }
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
7 i; u4 L/ E  r' Z3 b0 V/ R7 ^' r6 S/ A5 c# ^! p5 N( d

/ @3 I2 G8 }6 f' Q: a# k2. Импортируемые библиотеки9 J3 M! [. ^! k) `- X

9 y; t/ n7 H* q6 C1 I" }' {' |
  1. package org.l2jmobius.gameserver.instancemanager;
    $ A* u0 E- v+ i; x, R
  2. + M  Z8 e& A- G8 L# [$ t- P* l8 }
  3. import java.util.Map;% f! N" |' y8 n1 m
  4. import java.util.concurrent.ConcurrentHashMap;1 X0 f0 D2 X" b& ~! N
  5. import java.util.logging.Level;
    # E3 L; {$ ~5 x& A
  6. import java.util.logging.Logger;" f1 f# U6 v% X1 l

  7. ( f' C  o4 N* z8 j
  8. import org.l2jmobius.Config;/ r- l. P4 ^% o9 P0 g
  9. import org.l2jmobius.commons.util.CommonUtil;
    $ K6 }! I+ t/ P" ?8 o9 q
  10. import org.l2jmobius.gameserver.model.quest.Quest;& z. t6 h' C: {/ u  x8 N
  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 — менеджер для работы с игровыми скриптами./ F% E# Z/ L5 e+ p' E
1 Q5 s6 T8 J0 p
3. Описание класса QuestManager. {1 Q! x1 T; p4 |
  1. /**
    ) [5 v/ B  |. |. h  p
  2. * Менеджер квестов и скриптов.
    ( k8 w! }# M0 `
  3. * Автор: Zoey76! X; V# w! l2 o% t8 Z
  4. */
    4 O# @% }* H( Y- @
  5. public class QuestManager; J# m$ j+ X! ]: F% n- T
  6. {2 b! K% A1 r7 G
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());8 w+ X7 N' p% n  @3 B
  8.     , B, U: N# h) r7 T
  9.     /** Карта, содержащая все квесты. */( a1 |4 c1 C+ t$ L+ \
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();0 ^9 y) t: t% |! z
  11.     /** Карта, содержащая все скрипты. */
      a# Y+ o& t( \# a9 v2 f- `) |! B
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    ( @' x# u: Z/ J; X; n
  13.    
    5 K* n6 \- t/ `2 a
  14.     protected QuestManager()
    7 _$ b& y2 d9 f0 y
  15.     {+ t& V8 P# n5 I4 E+ `
  16.     }0 }% X$ x. m1 G. u" p$ i6 y& o* T* D% W
  17. }
Скопировать код
4. Методы
4 _( q8 I4 P& K# C- ~3 Z7 ZМетод reload(String questFolder)
/ w; t: f0 |4 a; n# O0 C) y
  1. public boolean reload(String questFolder)% c8 E+ t6 g( X
  2. {) r5 \9 n+ f, p: B# Y& f6 w- X
  3.     final Quest q = getQuest(questFolder);1 Y4 X$ N5 P' S& B
  4.     if (q == null)3 j2 B: ^' R  z: ?' ?  L
  5.     {
    ) T/ [- }% Z: ^1 f" D
  6.         return false;
    1 B8 t% K# F, r; G& r# I7 l5 f
  7.     }1 u1 K/ \) o6 E1 C+ Z* X7 b) s
  8.     return q.reload();3 k# K! J8 |: ?5 ^" M; b
  9. }
Скопировать код

1 @3 J6 Q  j) ~$ G( w- A% }( T3 G; C1 A
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.# G. `0 \* P" S  q2 N  Q+ [1 l9 t
Метод reload(int questId)- @0 \7 c: [: ]! I+ }
: v8 j. W) U  y4 G' h1 E  f  `
  1. /**. k, s& ]% {. D
  2. * Перезагружает квест по ID.$ S5 F1 S& D* H; R( R  A+ u7 T8 Q
  3. * @param questId ID квеста для перезагрузки; _' u& t2 a) p
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае! e; K2 f; R% L9 N! @
  5. */
    ! Z+ e. b: O, B$ J! ?  Y+ }- a0 I
  6. public boolean reload(int questId)/ Z7 b( \' W# h, P: d
  7. {/ P6 p/ A* O& C  s5 o) _
  8.     final Quest q = getQuest(questId);) B1 V2 E& N% x% p+ @% ?
  9.     if (q == null)/ n: q. I8 ~5 D' U7 B8 i1 `
  10.     {( U+ x1 l1 [8 F* m: F- U' [( u
  11.         return false;' E8 X# [$ g) ~% h2 j* q
  12.     }
    ) i+ C8 m4 ?4 O5 n
  13.     return q.reload();
    % _4 E3 t8 `$ {2 x0 \% @
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.0 a% X$ Y4 Y; K1 l; F3 n

, x1 T% I& q. i7 j. T( G' lМетод reloadAllScripts()
% n0 r* E: Q; Z0 O  f' Q
4 ^4 {2 c; h4 r* g) A: Q5 C3 n' P
  1. /**
    # K$ \( r* ?- X! s1 Z) _
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    8 m5 P, n/ n! P6 s  ?' x
  3. */
    + M: w5 p2 L" x" t, v/ P9 h
  4. public void reloadAllScripts()% u. v( s9 s1 ^9 z* q3 i# }3 X
  5. {' ?" Y9 }* f" T5 [1 C
  6.     unloadAllScripts();3 S6 S# h$ Q, V
  7.     - [. g( f: ]9 W5 ?2 o# F* k
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    ; `! g: k8 }: D% @( ]6 X! h7 M
  9.     try
    ! K& A0 r! J- |! j1 y: ^9 E
  10.     {$ L. f2 n! o& v8 K0 U% `" }2 b* J1 v
  11.         ScriptEngineManager.getInstance().executeScriptList();
    . n' k6 |( e& l
  12.     }5 @4 }4 O; \5 r5 L& {% G
  13.     catch (Exception e)4 J5 X/ d, a/ `
  14.     {, q  l& U1 p$ V* E
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);% c/ V( y: a/ k4 S) ~- o
  16.     }
    ) I2 X. q; `2 ]$ ?6 |( k9 s' h- W
  17.     1 ^0 n4 W4 S5 b+ B8 r( F
  18.     getInstance().report();
    0 n& ?! J( [6 E; k
  19. }
Скопировать код
Метод unloadAllScripts()1 s1 G; |. n5 C- H6 u3 L

, ]% x4 Y2 o" u& y" c+ w3 Z3 J, m3 ^1 e
  1. /**5 [. e" @1 ?# M! C$ v+ H  e
  2. * Выгружает все квесты и скрипты.
    7 I2 M/ o  o3 c! ]
  3. */
    / y& o; T% B$ ~( K' V  M2 ]
  4. public void unloadAllScripts()
    / I8 Q2 z. ]8 e+ V0 C: k1 p7 q; |
  5. {9 O# t& z; p4 ?7 j) W
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");5 }/ |$ K5 O8 ~/ L& H* }6 H* T
  7.     + Z4 M0 Q: D1 a+ |3 U5 H  g$ o- c
  8.     // Выгрузка квестов.
    " t1 s" Y9 T! B
  9.     for (Quest quest : _quests.values())! Q- e; G* l5 D3 z' Q$ P# L2 K
  10.     {
    ) I% n4 g0 _+ c  m
  11.         if (quest != null)2 r4 l+ \; C2 G$ U1 K' [
  12.         {: ~' _( j! E: v0 k4 K( S$ V
  13.             quest.unload(false);
    # m% l) D4 r$ y5 Q
  14.         }5 V0 ?& b4 ^- Y$ F
  15.     }
    % [% K4 a6 X& T) Y" s
  16.     _quests.clear();" a1 u* w2 k9 k" V/ U9 r
  17.     // Выгрузка скриптов.: i4 P% ~2 y: ^" L
  18.     for (Quest script : _scripts.values()). o" U. U8 F5 p- F9 G1 _# d
  19.     {
    7 F2 v0 r  h* n7 d+ ?2 B$ z% n
  20.         if (script != null)2 g0 g! T2 h1 S7 F7 ^* B/ h4 R4 e
  21.         {
    % B  X5 a7 ?9 N% s
  22.             script.unload(false);' h9 k0 e7 B! t1 L- Z" H: r
  23.         }& D) E4 k5 U1 R$ y; x
  24.     }
    ' H% x  G2 v- Q! [! l  Q
  25.     _scripts.clear();
    2 O4 h: K) k" o. G+ P' f; u0 j+ H, u
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    ! C* [7 H) E& R& m1 P' r: D

, [0 Y3 g  L+ B/ eМетод report()6 u3 j, S( d" d. h7 A
7 M4 [$ }3 r$ A: g; f
  1. /**' r. ]+ `# p3 I" t9 e
  2. * Логирует количество загруженных квестов и скриптов., {3 @9 P  \. l% L
  3. */$ L5 ?' G" f- Q' g! E) W
  4. public void report()
    0 |5 O6 g' s$ H. J2 c  C' k2 b
  5. {
    6 R1 H# ~' K3 Z
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");, n6 ?4 N. J; P( s5 X) m, m
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    , P! s9 A: Z9 \9 G; s1 t; v
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    * q8 i4 S6 w+ `/ ?
7 m0 D4 \4 k7 j( U- \0 M! o
Метод getQuest(String name)
& S9 \' L; i+ A1 k! K  ~
5 m* z6 b1 x1 T/ A: o8 ~) F' E, A
  1. /**
    0 L+ i. v6 v: y2 s
  2. * Получает квест по имени.
    ) b- [# z- a% \& _
  3. * @param name имя квеста( A2 C- O% q& r  |& I! B- u% v
  4. * @return квест4 ~) f4 l# l3 R/ _% k, g
  5. */
    3 w0 {, q. o/ U
  6. public Quest getQuest(String name)
    " s3 e1 Q" @0 C4 n% ^
  7. {" M+ A* M8 Y: q; N9 \$ {; w
  8.     if (_quests.containsKey(name))/ r5 k; A! j7 [
  9.     {
    ! U8 G6 x( e/ k" s: J! ]
  10.         return _quests.get(name);  I+ y- l1 z. A. w2 Z0 W
  11.     }0 e2 Q2 U2 E$ j( [$ v
  12.     return _scripts.get(name);! K# Y3 Z/ o  [) z% f" E+ E
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.- `0 }$ ?5 J  ^* I+ G6 s

; G) J% k! _: |+ c2 G1 N) i7 GМетод getQuest(int questId)5 g" F5 ^2 J: t
. F8 P' {: M0 A6 w8 G! J, P3 N
  1. /**
    ; G! h1 a3 p$ V  w- E9 H
  2. * Получает квест по ID./ \/ A' K" ^# |; A& K6 {' l5 q
  3. * @param questId ID квеста
    - E5 i0 L5 i  w7 U& M+ `. ]! g
  4. * @return квест, если найден, {@code null} в противном случае
    2 ?) t  x2 d3 A( C1 v
  5. */
    ) ~9 i, f. R* a' S! p  r8 Y
  6. public Quest getQuest(int questId)5 Y9 A+ j/ q1 X# J5 d6 l( V* l
  7. {
    " @, h& G% v2 H1 ?* ?1 H8 S: k
  8.     for (Quest q : _quests.values())1 c; l4 f0 N) W( G' ]$ o$ x& J8 s) o
  9.     {
    ( ~( R8 X$ g# F1 U- U" |
  10.         if (q.getId() == questId)
    & F1 V& _4 v9 p- {. ^9 l
  11.         {3 R; P& i- N' I' b% g  O
  12.             return q;
    * x( w* ?) f" |: T% a, G- e/ U
  13.         }
    ( G. ?5 `, o, D" L4 i4 L
  14.     }6 k/ C. n4 o% q  z4 L8 R7 ~7 E
  15.     return null;! w/ d1 Q# }" s0 |3 Q3 A4 I0 J
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    9 G4 [" u$ C' }  h0 V* v0 z4 A
5 x- |4 A2 h% {4 b
Метод addQuest(Quest quest)
* `2 N- j. z) [! \4 d
7 \6 n4 L+ Y; S: N$ k/ `
  1. /**7 W5 p) |& n$ v. d% p' f2 O
  2. * Добавляет новый квест." p9 S) t4 E( ~9 d+ N- w
  3. * @param quest квест для добавления
    2 M/ T5 N5 d2 ?( U
  4. */
    4 N% ~% y0 Y5 A$ }6 P  ^* m. B
  5. public void addQuest(Quest quest): Y8 _! l, G" q
  6. {8 ^( Z' n; G* ?% ^$ _" O' w5 X
  7.     if (quest == null)- M' V+ {% B4 A2 f1 v* `
  8.     {$ q, z, v- a2 D( Y2 o
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");( s+ Q( d- {' n- g. k
  10.     }2 @& `% v4 a8 i8 ~5 f0 ?
  11.    
    , T3 c3 N) c2 C4 t
  12.     final Quest old = _quests.put(quest.getName(), quest);
    2 D' B* u0 w1 C# G8 s. c( J* A8 i
  13.     if (old != null)
      }2 Y+ {; ^- U& ^9 V0 ?" l* k8 Y' j  f
  14.     {
    & W  X; E7 B' [% M7 c
  15.         old.unload();
    9 r8 x9 U9 e' o; l' M( M8 y
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    8 x( W1 Z* s. q; |- `, U3 r
  17.     }( c% m" K5 t9 B, ^2 _* c1 F2 Z
  18.     5 C2 x" N6 ^' x+ z* X- j
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    ' B1 ], {$ {/ v* ~* Z
  20.     {$ |. Z& M" F0 Y" v9 ?8 n4 K
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();5 H, r8 [7 D' a0 A: C4 @* R
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");  p5 `) d9 ]$ G! h# b) c$ Z0 j$ G
  23.     }! b2 n: S. U* D2 H$ r7 \, y
  24. }
    , y2 w- v* A- g( X- J) d4 p
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.% g& ]5 i$ t* I' y0 ?9 v
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.+ W( }% j7 }$ @7 o9 }# P

" J# _" H) h: H
7 X, m+ Y4 z3 Q$ ]$ {
( a& Z. \2 `4 M  _6 o) H) a
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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