Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
( V  x7 {' o( f/ ?6 h6 y. `& ?% U7 E
Разбор файла QuestManager.java$ b7 `0 O: e, U. Q; @; s

% @7 M6 o) T5 l" J" E: L8 a( r+ kЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.7 b+ ?6 @% w$ s& o! B0 l
Основные элементы
) @+ i) I/ i! |
  • Лицензия
    4 a! h* w6 p/ z8 ~. o
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии./ ^- c# x$ R! M6 p7 J: _1 u3 i
  • Импорты
    % C3 Y0 g, M( Z, _

# s2 |% A1 r9 y0 }QuestManager.java — управление квестами и скриптами.2 T+ |* k( f9 M& p5 m1 c
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\$ A% A& B+ Y1 Z. `9 K

! _- e0 j# g7 A+ f/ P) ^
- ^3 O$ Q5 h" r8 G
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.) q0 Z! \% A  \/ g+ v; z7 V
1. Лицензионное соглашение# E$ q. ?+ U, q4 m' \3 }6 M8 v
  1. /** j4 E( _/ p1 `$ R
  2. * Этот файл является частью проекта L2J Mobius.& f6 t7 X  @% B7 Q3 [
  3. * 7 x$ j2 G5 s2 n. q9 [  ?
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    # R2 n+ B- B- ?% L4 W
  5. * её в соответствии с условиями GNU General Public License, опубликованной" d. j# F$ F9 O7 |
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    7 I0 u" o5 O- s+ Q/ ~- [; x$ l
  7. * 8 D/ t& D$ S7 s. w2 @. D) h
  8. * Эта программа распространяется в надежде, что она будет полезной,. R( Y) ~2 ^) L) j
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    3 K/ y+ N& @% E; \- y( F! `9 X
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.4 p. W0 {8 K5 `/ j' n
  11. * См. GNU General Public License для получения более подробной информации.
    ' e5 F& t6 L+ N2 v+ Z8 g
  12. *
    & F3 `6 G; O) ~3 ^0 I, c0 q1 r
  13. * Вы должны были получить копию GNU General Public License
    0 }( a6 L. B# _0 n+ G
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    8 \& k+ z4 o/ j% c. f
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3./ z6 a5 b" I- k" y$ R  K6 m
1 e" G3 w3 B0 s$ E: @4 E: Q6 y. _

5 L# d5 |) I3 X- T. T. m* N2. Импортируемые библиотеки
; o: N5 U1 f6 z' o0 u/ Z% ?; O5 U
% P! Y% \$ R5 x+ Z1 |: Y
  1. package org.l2jmobius.gameserver.instancemanager;8 J' h) S8 E( z. N1 U& M' T
  2. ( L, L& j/ d) p: X7 B
  3. import java.util.Map;
    $ R( o5 }+ H+ k% i) }
  4. import java.util.concurrent.ConcurrentHashMap;+ ]% E" S0 M# S+ O& L) Y
  5. import java.util.logging.Level;! h1 U* d+ D5 }) v
  6. import java.util.logging.Logger;3 C4 D4 b. r1 W& c$ F
  7. ( x7 T. F* {% Q& B9 V+ {# X
  8. import org.l2jmobius.Config;+ z; g8 B- W5 o: N+ A3 b
  9. import org.l2jmobius.commons.util.CommonUtil;
    # {, y3 N+ I1 o+ R- i
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    1 K1 E% y' d9 J) U1 h' l  x
  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 — менеджер для работы с игровыми скриптами.
* ?0 B0 Q% b, Q: J+ U' y) G' T1 W9 \3 A$ v6 T" a/ ~
3. Описание класса QuestManager7 r5 \: U+ i* ]6 o8 C5 _. ?
  1. /**, f. u9 A* J5 p
  2. * Менеджер квестов и скриптов.
    5 m1 F, ]  _& O6 @  y$ S7 u
  3. * Автор: Zoey76
    $ ?# C9 I( ]+ k1 S& ~+ q* }$ F7 `
  4. */, ^; [# s9 [! M
  5. public class QuestManager
      l/ f' N: x# h; _  _$ m
  6. {
    - Q& m; U9 I8 ]) ]: ?* v2 H/ E
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    ( P( K: |4 V' f4 K3 {. e
  8.     1 u1 k% ]6 R2 L  x) b- |+ N8 P
  9.     /** Карта, содержащая все квесты. */( t4 H* p1 x2 b- M
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();( |" T6 J! R3 g! |) ^
  11.     /** Карта, содержащая все скрипты. */
    % T1 H. L& w% `* }3 J
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();$ R- H  h. G6 A4 I5 {( v; R
  13.    
    9 l: [1 S/ q2 x) m
  14.     protected QuestManager()6 e  ~* d$ j: u" d+ x
  15.     {
    + @: n' h9 H( P! \, a. T
  16.     }2 `, M1 j$ @& n2 p
  17. }
Скопировать код
4. Методы* D6 H' L( p& n& M4 \6 U' B
Метод reload(String questFolder)# A3 M* R8 r& x" i8 t
  1. public boolean reload(String questFolder)
    : F( u, \. e1 V' m" ?
  2. {; c* e! c$ w1 a8 V
  3.     final Quest q = getQuest(questFolder);" ~# c' s8 v) s0 O
  4.     if (q == null)0 h0 Z' m9 K+ k# r9 }+ ^
  5.     {6 `6 L/ |0 B. `5 x; D
  6.         return false;
    " k( b9 N9 K7 Y0 ?
  7.     }
    4 q3 S7 r1 K  S$ x, k
  8.     return q.reload();4 R( B& ^2 e1 z+ Q, o# w% ]0 o9 W& c
  9. }
Скопировать код

* e# C7 ?1 E! |4 A- e1 x5 Y( e4 n% s& ]- n
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.1 e1 k! v1 X. z7 B9 [! F6 h
Метод reload(int questId)
1 J# d- q7 A2 y% X% Y3 V
) N( n$ \* y' n9 f& `0 Y
  1. /**6 q) p$ q0 m0 y' m! _9 f
  2. * Перезагружает квест по ID.
    7 u# d' W8 h! R% K; u3 F8 B3 @
  3. * @param questId ID квеста для перезагрузки' ^5 u6 s4 B9 ?
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    : G- ]) L. M& l! i1 z% ]
  5. */
    # X: A3 e2 |0 \  k
  6. public boolean reload(int questId)
    ' m1 A- \& C, u9 e8 J' p; D
  7. {# u: d# ~9 |9 L/ ^* ^3 |
  8.     final Quest q = getQuest(questId);7 G  p- Q# j: ^# t7 B
  9.     if (q == null): h' x! v$ g+ }* Q) ?3 i. B
  10.     {/ {/ g' l2 T  g9 P, h8 F% ?0 x
  11.         return false;# M( p$ y8 L, L0 y9 o' [1 n. N
  12.     }5 C" j: A, M  B8 r$ y2 U
  13.     return q.reload();
    7 ?) b: w  V4 L) e
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.& h* v6 F8 d7 y& I% b/ A( g

$ A6 y+ N) p9 {2 @Метод reloadAllScripts()
; }' n/ V/ T/ e
( `, k! _- r6 i  K5 B% |  @) e
  1. /**  J/ T5 `9 v4 D# a4 r  m$ }0 X
  2. * Выгружает все квесты и скрипты, а затем перезагружает их." h! Z* Q. O3 _
  3. */) m4 g. L7 F7 b0 Z3 P! ]
  4. public void reloadAllScripts()' V! A% y( }& E, q
  5. {
    1 s7 v1 a9 x2 T% \* Q4 `2 m
  6.     unloadAllScripts();
    9 Q  A3 s6 I+ e9 U8 X4 U- C* c
  7.     ' ]9 M  F# N& e+ q9 [# ?/ C
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");5 i: }& Z# X" {7 p. A
  9.     try
    5 m  N3 y+ W9 C$ V! S# Y/ ^8 Y# y
  10.     {
    - F% D+ |2 d0 Q
  11.         ScriptEngineManager.getInstance().executeScriptList();
    3 o& t2 ^* N6 E# Z
  12.     }3 c( q% k! y  V4 V4 B
  13.     catch (Exception e)/ k$ B. Y) Q& v6 |( g6 S+ V- C
  14.     {
    2 U% {. G) v8 t5 J( @$ r
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);3 Z# ?/ e+ C& J! g: w  [5 Q. {
  16.     }+ {1 E$ R* S; p" }, p) a
  17.     : |, g% g, S2 m  X* z4 b
  18.     getInstance().report();( m3 p. C% Q) s* P5 W' B( S
  19. }
Скопировать код
Метод unloadAllScripts()
6 x7 I, T. A% m2 S8 @) ?
1 U- @; e8 p% f5 j; m2 Q7 E
  1. /**
    : ]" o8 I7 o: K( O! N3 F; {
  2. * Выгружает все квесты и скрипты.+ B* o( a% I% z- [
  3. */
    % l0 I& Q% I3 B! |$ F7 z
  4. public void unloadAllScripts()* D5 R3 y8 W! m, R8 c/ k
  5. {! h  L5 d% j  C- ?
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");% Y0 j" r2 s4 L: a! N- Q! Y
  7.     6 ~& g1 V, p/ c8 ~2 ?' V
  8.     // Выгрузка квестов.5 I4 j: ], x( r" J& D
  9.     for (Quest quest : _quests.values())4 @2 c' |4 W6 J  P
  10.     {: \- D, }8 l2 E% k
  11.         if (quest != null)
    " b* E" X8 h/ V% u4 N
  12.         {* p7 T; Y! p+ C$ {" w- X
  13.             quest.unload(false);
    / O" Y0 [+ ~9 z% ~1 N- y8 f
  14.         }
    ) y  u; n- L1 X
  15.     }( _* {3 l6 O, @# r
  16.     _quests.clear();0 B0 V: z- r6 h' _6 f  K9 m
  17.     // Выгрузка скриптов.
    $ Z. G6 r! C7 Q( z  {
  18.     for (Quest script : _scripts.values())6 W: x, L; r/ w9 w
  19.     {
      G* |& \5 s" P0 b: M
  20.         if (script != null)
    / T# M+ S/ e+ ?3 T: {
  21.         {: c0 L( p6 N' S* N% C' I+ K
  22.             script.unload(false);0 |; i( c$ H& o$ H& G* {; W5 `: b
  23.         }( |3 V' ~- a5 O+ w( ^
  24.     }, d' U6 x& _7 G: z( F2 |
  25.     _scripts.clear();) R: x; g, e7 F) N1 K: m0 Q
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.: s* ?" W1 j" [7 y& T, k' _9 ]2 J

' D8 X# K% N  W: B0 x8 y/ ]( WМетод report()
  F  w$ G; R5 p% u' M" ~2 W) @$ Z) P
9 P; @; h3 X' }1 y
  1. /**$ G' H. i1 \2 F1 _! F2 g) i4 w
  2. * Логирует количество загруженных квестов и скриптов.
    : m$ S$ K6 A( _! A% z
  3. */
    0 e  X3 a1 f0 o8 Q' D& @' `
  4. public void report()
    : f! o6 ~2 f: |- A6 H
  5. {
    - h" z* O+ _: t8 w7 L: D
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");! R) z7 Q+ s% x3 f/ `* \6 t' J
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");. v& I6 ?* e- U- @% p+ Z* |
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.1 }- k$ W) ^! ]$ s* X2 O5 {( r

( n: R9 q2 y% \! _2 @Метод getQuest(String name)# U8 U  t/ x0 ]0 ]! |- V

6 w* G' {9 R, ]/ @: d& i8 j( y. D
  1. /*** K0 X. n6 p8 W9 B$ h
  2. * Получает квест по имени.
    6 P' w/ \) u( H$ L) k
  3. * @param name имя квеста
    1 S/ t+ q% J- N% [7 w
  4. * @return квест3 ]3 J. R8 ]1 O6 x
  5. */
    : e! D3 e6 x3 E  N& ^  x8 S0 |
  6. public Quest getQuest(String name)- N' G' r9 v% t
  7. {4 A: c6 w3 k) A
  8.     if (_quests.containsKey(name))7 w5 b# h2 I7 i' f( f- ]
  9.     {
    + d% p4 E' }: ?0 l' v2 [
  10.         return _quests.get(name);
    / ^, |6 D" K6 E7 D% K! b& p+ w! K  ?  @
  11.     }: H" N. C1 c" \! V
  12.     return _scripts.get(name);
    / S8 u. `9 S1 ?) P
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    + l! g% q% p$ S; l, d' x" l
: [& d$ j* X; O2 ~' e* P/ @
Метод getQuest(int questId)
/ g( N/ g( f8 `: s4 q2 b3 i# m1 o/ Z3 ^0 ]
  1. /**3 H; F+ D4 G- x
  2. * Получает квест по ID.
    ) s7 j( D- L9 k" b
  3. * @param questId ID квеста
    7 N+ H( ?. L% K
  4. * @return квест, если найден, {@code null} в противном случае$ ^* J2 N" A9 d) f- v: C# p( M
  5. */
    % m, Y1 j4 q4 N. L/ ?9 c
  6. public Quest getQuest(int questId)6 v' X, J% w/ q  U8 M% D2 v& [8 h( i
  7. {. s: h; c& L4 ^) {" W1 c
  8.     for (Quest q : _quests.values())
    / N; ]3 J7 X- O- p) D, y. O2 E
  9.     {
    " T. S4 Z0 n- Z% H( E
  10.         if (q.getId() == questId)
    - z* [. [0 ]3 X6 f6 H
  11.         {0 l$ A/ f( t/ v8 A" L
  12.             return q;
    4 s0 [) K/ V/ N  H" a
  13.         }
    . e8 p: F' B9 L- @7 A; J! @6 I
  14.     }1 V1 D. [( J) H" _0 W2 T
  15.     return null;
    ( l( l! Y1 j6 f  h
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.& N) r; \5 x  u; w

( v- X: n1 D% Q2 C  HМетод addQuest(Quest quest)- W% V# O+ y1 [2 w) r( w9 R% |# ^
. M* a" v! F' J1 P' a  Z( j
  1. /**
    . S8 ?- I; g2 u# [3 o
  2. * Добавляет новый квест.! _4 |* V% G! N7 Y1 \# L- O3 i
  3. * @param quest квест для добавления1 I: _( K4 h7 W- x3 U* K7 w' Z# H
  4. */3 o+ E6 A9 f( p) M0 Z% j9 e5 f
  5. public void addQuest(Quest quest)
    + B6 _' h7 q7 [5 J
  6. {) W% l. _, G+ ^
  7.     if (quest == null)
    7 M7 [1 Q8 a/ g( h$ e
  8.     {- S- b4 w+ u% |6 Q
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");$ q' x! x: S* \
  10.     }' ^( n; |# t* a7 F! q: M9 z, b
  11.    
      U) V" y1 v; \0 H
  12.     final Quest old = _quests.put(quest.getName(), quest);
    # q% v7 I9 Y/ `; t! d) v
  13.     if (old != null): |/ i. {; d  }- l1 A* t  ~8 k
  14.     {: M$ g) }' O$ I# `+ C1 |
  15.         old.unload();
    " F6 c, X7 u! [4 {: M& O
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    $ l, X, A' Q  C& [9 z0 c
  17.     }! S, q7 F; ]7 e' M  W* W8 t" N$ F
  18.    
    # p! }4 W3 c5 p, {& @9 J( U
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)$ D/ U7 k4 n% `- _% y! _  T4 P
  20.     {
    ' @4 \2 X: E: f1 b, f
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();3 d6 t6 t" Q4 D2 U2 m5 H: H
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");$ ]  m; j' E/ a  k& H
  23.     }
      o" C4 s3 Y, x- h1 S  g& }6 F
  24. }5 w9 |+ G6 W( l' \: n
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
- n  _2 m$ W# r0 o, `& \ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.$ f. Z% \. G0 @% B7 u: M, F% c

- V% j2 W" D; V* w, f; J8 s
+ O* B8 o  E) @0 o1 \- L* S9 H6 ^" t+ y5 A0 P, ?+ V0 R
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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