Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius4 o" R3 I( Q" I3 A: I( [! L
( N9 i0 t) R1 u# n3 @3 t) o
Разбор файла QuestManager.java
" w: _: [( A. s7 w6 z9 w& j. `8 U' i
8 }$ j, P# a' l/ |8 `" k1 ?& ]Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
. O! m+ z% ~$ ]8 f! U5 L: ~Основные элементы; G6 s2 C8 W1 m* r% f" k, O" G
  • Лицензия' c) K, B" y" J$ \
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.4 _4 \1 j. j% {; Q, L6 D9 _
  • Импорты+ k- L8 d* R4 U6 p
3 W4 b- v3 T' h0 {- @; }2 O' G
QuestManager.java — управление квестами и скриптами.
/ |) U1 B+ o6 d5 LПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\# L1 z, [0 Q* I. ~( ]1 y
- V* d+ i7 `+ W& f6 p& W
2 T2 t0 V: i! b+ J( r
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
! [0 ?3 y" g! m4 a1 b9 Y  u! b1. Лицензионное соглашение
6 V0 Z2 W" y8 r4 p+ ~) b/ M
  1. /*+ w- H6 q7 a2 y3 a$ W; J) N
  2. * Этот файл является частью проекта L2J Mobius.
    . y' t# Z; r( z# E- A2 A  G, c
  3. *
    3 P7 S0 Z& L  d9 |4 ^! M* i) S
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    : u2 d; r! j# D: R8 h: O3 [1 X
  5. * её в соответствии с условиями GNU General Public License, опубликованной
      C3 Y2 D" x% X+ o/ x- q
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.8 ?1 D2 H, n* X- l" }4 n
  7. *
    & D( o4 _9 t3 b; s
  8. * Эта программа распространяется в надежде, что она будет полезной,
    + }; ~- c) @" |; [' u: W, q9 N
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    1 q7 u% W, l  @) M& I
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    ! S: y- \% {. @$ K* u  h1 c
  11. * См. GNU General Public License для получения более подробной информации.) P7 _% B0 b/ a5 [- a& \/ ~
  12. * 9 T7 Y5 S8 T* Q
  13. * Вы должны были получить копию GNU General Public License1 A, y: I2 h  @2 r4 Q, ]2 P
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    , j- ]# e3 a9 d  q" D- N: }
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
% m1 H: _0 F. a" Z& G+ ^5 `
( Q  y9 K; ]! V5 |- S- b
' L3 Q! h2 q" d3 x, c3 {7 h2. Импортируемые библиотеки: m1 E+ ^( s$ `. I/ U

# f+ l' I- ~: v. V4 D! G" J3 _+ Q
  1. package org.l2jmobius.gameserver.instancemanager;
    $ |0 e& [/ ^" J

  2. + M& s# F" u8 U- o" W2 H% m
  3. import java.util.Map;
    & U5 k* b1 ?: t4 x
  4. import java.util.concurrent.ConcurrentHashMap;
    3 e( s: R4 v5 K; @  ~
  5. import java.util.logging.Level;( p" [  P& F- Z- Z% l
  6. import java.util.logging.Logger;4 N; H0 Q2 F: }- h( R

  7. - D8 i# Q) y" u' p
  8. import org.l2jmobius.Config;7 ~7 y' p  p9 ?7 B4 K
  9. import org.l2jmobius.commons.util.CommonUtil;" y/ z/ g  b2 k, Z
  10. import org.l2jmobius.gameserver.model.quest.Quest;) y9 m/ c! `! B6 t4 s! G; a. Z
  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 — менеджер для работы с игровыми скриптами.
: z1 O- R6 K' L, Z# E' W$ y  S( R; W, P# z8 R" o
3. Описание класса QuestManager, u3 d# o9 U% e- ^3 Y) E0 g7 B
  1. /**
    : y8 h( L) J- B' e* m
  2. * Менеджер квестов и скриптов.
    3 N$ @7 ~! |+ E" Y; I+ c
  3. * Автор: Zoey76
    + S7 A: M: b0 e. i  q
  4. */
    / e; m, p- }% B+ M' p* v1 g2 A
  5. public class QuestManager* J. j- R7 J& G9 R. |
  6. {
    $ _" }# P9 N  Y/ w6 g& R9 d
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());, g' b7 k* X6 m
  8.     2 j8 H, l6 Z$ I& ^+ k6 f; x; a
  9.     /** Карта, содержащая все квесты. */
    - _! e0 W  _1 X5 `' H* N% U2 N4 Q
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();, C7 t. Q' K3 Q5 @7 W7 z4 c- r
  11.     /** Карта, содержащая все скрипты. */
    4 e' F2 ]2 b# F2 Y7 E9 k, A$ R
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    " Z4 }* ]5 A4 Y7 h, |
  13.    
    5 _* p( @: k) A' p) `
  14.     protected QuestManager()
    4 M; \6 |9 z5 [  g( P; P0 |+ ~& N
  15.     {
    9 p% f+ Q2 A4 I7 O
  16.     }
    ; z+ r- a. a! H. \0 Z2 b
  17. }
Скопировать код
4. Методы, Q5 m/ f4 x+ K; X
Метод reload(String questFolder)
' ~6 Z1 J7 C' p9 g
  1. public boolean reload(String questFolder)
    1 X$ {* x, L7 ~; _
  2. {
    . I% n4 W- W; [% F! i
  3.     final Quest q = getQuest(questFolder);
    ! V* D9 r; |4 e8 s5 A
  4.     if (q == null)' W; z4 u9 u0 _. ^4 S
  5.     {" w! l  h/ J% M8 h
  6.         return false;
    + y4 D% z4 c' w7 q) V) E& O
  7.     }8 R$ d) Y* x+ H# }' j9 B
  8.     return q.reload();7 a* c$ I2 G+ ^
  9. }
Скопировать код
6 c( {, y7 k' c, n# U* r, _

0 J5 ?0 d4 B* b$ l( R7 v( YМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
7 i% L: z7 @8 u; P' lМетод reload(int questId)
% T4 _8 E) A% e4 `5 T$ Z5 O0 B' D" |  O( C/ Y4 W# E2 x# K0 r3 D* z1 c
  1. /**
    % y: s2 M  F  d! N% x
  2. * Перезагружает квест по ID.) @2 \: t' |2 V, Z
  3. * @param questId ID квеста для перезагрузки1 c$ ?  W- q) g
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    $ J1 {  i/ f, [  A1 ^: M# A
  5. */
    * L; Q" Z& d! C. S8 F' T/ e
  6. public boolean reload(int questId)
    ! d4 O. L) f# g0 n* u
  7. {
    ( ~/ U6 v+ D! s) g# h7 ~4 w8 R
  8.     final Quest q = getQuest(questId);
    , K; a- F0 q! _& i
  9.     if (q == null)% {  t* {/ K6 p3 y4 h' ~/ R
  10.     {
    - a4 V5 K, n' `% I" u
  11.         return false;) k* a! D$ U) Y0 y- ~
  12.     }
    ( {4 I  i  C) g% @$ U) v
  13.     return q.reload();- x# K% ]6 n$ {' C0 O
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    ) x% B# w( I( }

  x$ }/ E8 f' w( _Метод reloadAllScripts()
, Y' v, n' n5 Y+ |" E: k; O# K+ b* N4 `$ t) I- q4 ^
  1. /**
    * W# z. f" x7 Z- K' j
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.$ F0 K' I& ~# g+ g8 T) [
  3. */
    * g; e1 e6 g8 n' a3 z8 {
  4. public void reloadAllScripts()
    & {, R0 W, N: P9 A; g
  5. {
    # R) K' S% r% H6 s- L: G! V: U
  6.     unloadAllScripts();3 A5 T: L4 r2 ^) n$ [4 R
  7.     & T! N' W* w' `- A
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");: {# h6 U+ I' z/ M( @
  9.     try' N* C5 B7 |* g0 N; ~
  10.     {( _" u0 h+ d3 \# }9 z
  11.         ScriptEngineManager.getInstance().executeScriptList();
    % A( e5 H* Q3 B8 J5 W2 q
  12.     }
    , ~% F- F1 {  R* i8 r; s1 R
  13.     catch (Exception e)
    $ G; h% ?' a& B) J" s7 y, K
  14.     {' d* Z: \6 c/ D$ e
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    # C8 e; X% L: M
  16.     }* }$ G8 }/ V; U; W4 }) i4 h6 y
  17.    
    & w; V" K/ X1 Z, U! |
  18.     getInstance().report();
    . ], T* T; J- [& ?9 k
  19. }
Скопировать код
Метод unloadAllScripts()0 z  P! H3 p3 l6 ^  U! v* j

4 i& A0 K. N3 x2 _
  1. /**
    3 D9 L9 N: n, }
  2. * Выгружает все квесты и скрипты.
    4 D4 D2 z, Y5 e
  3. */  V7 h# ~( Y0 n! W" ~& r" q
  4. public void unloadAllScripts()
    5 u0 q4 ~5 `, x0 b5 b1 r
  5. {
    : x3 C* W( w2 Q: R. K
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    % V' o( C" H6 y. r, h# C
  7.    
    4 E! G4 b! M3 X
  8.     // Выгрузка квестов.
    ; @' a' [1 z. _
  9.     for (Quest quest : _quests.values())
    4 @# a: x0 q; T/ K8 ?' T
  10.     {
    - H+ Y/ d( A4 \, D9 K/ R  O% {0 G, O
  11.         if (quest != null)( M$ w1 X% Y9 T1 }/ `5 \9 Z3 Z
  12.         {9 X% c  k8 a) B5 E  E6 ?
  13.             quest.unload(false);
    $ M2 H/ G& U1 n5 S
  14.         }
    " e; ?, P( P+ B" O% R( ?$ R$ z
  15.     }
    - Z1 G& Y7 L9 a( w
  16.     _quests.clear();+ @- Z# ~- p" g  J; p
  17.     // Выгрузка скриптов." h& \' E5 q  J' R" z0 ~4 V
  18.     for (Quest script : _scripts.values())1 A' d3 o+ G7 g9 @+ Y2 }; n
  19.     {
    ( P8 s* F( \9 @) r
  20.         if (script != null)2 ]* u; ?' w6 A* X' w7 V( Q6 G
  21.         {" x( U- T' b6 t  f" H( T
  22.             script.unload(false);
    3 |/ N6 S. ?! f* y$ E0 n
  23.         }: n: P/ R! P7 \6 E* F9 C; l% E/ P
  24.     }. `$ y/ l, D1 \; M% |% c: q
  25.     _scripts.clear();
    * g0 Q7 ^) g+ ^# A9 b
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.2 ?7 s- ~$ F, W, _) ]1 T2 X) C8 G
+ y, S6 {' `$ f! Q- j- y
Метод report()
' T( c' L/ \9 K. T  E3 j, b* R& A
6 k3 z$ a( b1 V/ u- {
  1. /**
    , l2 y  M/ P( q4 x5 L: C1 u, n# B  e
  2. * Логирует количество загруженных квестов и скриптов.
    * z+ @8 _- R, I
  3. */
    5 Y/ X" M& ~, x! x" {, {
  4. public void report()
    5 F7 `' C% d6 V
  5. {6 ?+ Y8 q; R3 ?7 Z
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");$ i- W) g( U& N  O* h; r
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    , p. X1 F6 w$ o6 x
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    ; k+ A( A  i7 e- b& t; ~

8 ]" q; X+ u" n0 r, Z6 |Метод getQuest(String name)
# @# M0 C/ ]  a4 i# t: f1 ?( h. v$ \  p
( x! v# p( S2 s  R* n3 D
  1. /**+ P; @7 l  T! [9 ?3 U
  2. * Получает квест по имени.
    " I/ |; q4 H( g- |
  3. * @param name имя квеста
    6 n! H3 I" A/ [4 k( A$ H" h; o
  4. * @return квест$ l; w+ o& X7 F; Q
  5. */$ e8 H+ C) \- [: o- P0 u* K
  6. public Quest getQuest(String name). y$ s! w! t6 L9 _" k" w0 A9 q# q
  7. {1 M# A1 u1 u2 Y' W
  8.     if (_quests.containsKey(name))
    8 n! e6 p+ J* V* ], }
  9.     {  S: I" l) d0 \* F6 t$ o# {* u
  10.         return _quests.get(name);1 O! ~* g' `' ?1 i9 b
  11.     }
      j8 I0 {+ F' |6 o/ K" F* P# i0 k, J
  12.     return _scripts.get(name);% M9 g. o  k8 W- t$ ^7 M: s
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.5 O+ b+ N7 ]$ }
$ C" C7 D- F) ?- f# u
Метод getQuest(int questId)
  i8 T% f( ^7 c0 D" }6 Z: A- a# i# I" S2 u9 s6 G8 F' g4 u
  1. /**
    9 a/ t8 s; g0 s' ?' r- X+ Y
  2. * Получает квест по ID.$ I: d1 U2 r* E& L& }
  3. * @param questId ID квеста
    9 _9 [: a' M* H7 t; R1 e0 |
  4. * @return квест, если найден, {@code null} в противном случае1 |) P2 B' {9 X+ {4 d" h
  5. */
    # B1 M; d0 K$ b: X3 j) s
  6. public Quest getQuest(int questId)
    ! n  `8 f2 a0 o) Y* K2 I) j. J! w  N
  7. {
    - k2 t* @" ^8 c! ~$ S2 s. c
  8.     for (Quest q : _quests.values())
    ( L- L) @- [2 L. ]0 K
  9.     {+ n) d  m. ~- e- {, Z: R- O) M. q
  10.         if (q.getId() == questId)5 @9 m# `) m, J1 y, W) V' R' k& e
  11.         {
    8 j, t. E) \8 ^9 @' X4 G
  12.             return q;2 X! z+ H1 M7 l" s/ ~; O+ }) Y
  13.         }# P* W- t+ b- @/ d1 B
  14.     }
    3 x0 R/ f( O5 T% D$ }1 F$ }( X
  15.     return null;
    & d) x" X' ?1 Z
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    ' R& f/ B# a4 ]% N, @
0 V. |" j, ?3 q4 C+ e
Метод addQuest(Quest quest)
) h0 x) W1 `' z; }& a( z  x, G3 {, o5 V2 F2 T
  1. /**
    , a; y( o& o" J+ U# E, D) I( o
  2. * Добавляет новый квест.
    1 ?9 x* _' L% V4 j7 ^/ l5 ^2 `
  3. * @param quest квест для добавления
    / [( b9 i  J- n: P( ^+ [
  4. */' D2 C! ]5 F& E4 V1 [3 x
  5. public void addQuest(Quest quest)/ E4 c7 @! J, t9 K5 i
  6. {
    5 c- E- k/ B3 L* u
  7.     if (quest == null)
    " }7 X# y( y6 O& [! H' P
  8.     {+ h7 J) }1 F  n) H0 s( O  y8 W$ H
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    $ L% R4 ?6 q! ^& c$ o0 n
  10.     }* j  a" v% j  Z/ E1 M0 C
  11.     ; h: J9 }1 q- D
  12.     final Quest old = _quests.put(quest.getName(), quest);$ d' t, S$ E# q5 z
  13.     if (old != null)
    # k4 e4 w& _8 @! W
  14.     {
    , V4 _( J$ i4 y
  15.         old.unload();
    , l2 J$ n6 \% Y8 }) n* }
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    1 v9 i" S: ~; F8 x
  17.     }# A" U1 t( z2 h$ O1 m; D% k
  18.     2 Q/ D! k! l% q1 [  {, q* s  _
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)* L; X7 X6 I4 `2 o! w: ]0 U+ j1 F7 W
  20.     {, r, {  A% l$ k) Q) t
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();5 A4 {4 F% [4 p5 w
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");. y' v) d4 W( b) H. b
  23.     }8 _2 j% ?6 @& k8 m
  24. }' {, z0 J7 O  b; [$ l5 W' i6 z
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.) d* F  I' d0 i# g' `9 C, ~  P
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
; L7 C  l) t+ E) f' e: ^
' s# M+ h- H9 a) G6 ^  J
' _1 {- T' Y! Y+ Z, Z  c. J& t( F, g6 b& g# ]
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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