Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
0 S% F- K6 Y( i1 U6 `. Y
- `& P' D1 U% z- v' KРазбор файла QuestManager.java
0 q' {# @, y& [5 N: Q1 e
1 d2 O* t5 a" F2 m  F& O7 hЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
3 O6 R( o2 w' ~1 O2 L8 |Основные элементы, b+ N/ Z. ^1 I- V, ~' c/ L
  • Лицензия
      r( _" H2 r0 c# t
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.8 w" i6 T* N! _) X* }
  • Импорты! A9 B' R! ~% N
. M, J7 ^6 P$ J: G! \
QuestManager.java — управление квестами и скриптами.
  A+ ]* o6 g8 Q3 Q6 j( qПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\, G7 O7 F) g- `: g

+ Y  |$ f: Z: U4 z. q! A

$ k; n$ C& {8 wДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
* P4 j, h) N) ^3 J$ \+ t1. Лицензионное соглашение$ ~& u) X$ I0 @
  1. /*( v" P* V  L  e& i6 V
  2. * Этот файл является частью проекта L2J Mobius.3 G# j% q4 O* x$ D- |4 W% W
  3. *
      h7 ]; t* d, W. ~+ d% }3 [
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    $ q" U% D) x1 ^( R- G
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    - P0 L0 y! n3 Q$ `
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.0 E1 U( X) x0 n$ z# q: P, O
  7. *
    5 d3 R# [+ O. y3 a& E
  8. * Эта программа распространяется в надежде, что она будет полезной,3 F" w( }6 e+ h3 u% W# I
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    ! F# `5 r0 c; R7 i+ f
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.4 A% U: s( p3 N0 W5 T6 v; ?
  11. * См. GNU General Public License для получения более подробной информации.
    4 ?) C2 X6 f0 g" v2 N. v2 n
  12. * 2 M4 g* j6 I! s: ^
  13. * Вы должны были получить копию GNU General Public License
    0 H9 ~* o; t1 M
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.3 ]9 N) `1 I# i+ a
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.& ~" n6 L2 c5 j$ E" X1 p

% m3 ]- h' Q, T# o
( R8 d' F, |8 @6 ^4 m% A3 r/ i2. Импортируемые библиотеки$ @9 p" O7 J* Q: x" ~% A

5 _6 a6 k$ X" r; s/ H& j
  1. package org.l2jmobius.gameserver.instancemanager;3 q% L0 ?3 O3 e. L" k8 j  T
  2. ; b* Q  g0 T$ @" Q
  3. import java.util.Map;
    8 N- }( p4 P' q" ~* h
  4. import java.util.concurrent.ConcurrentHashMap;' ]% D  c9 d; ]
  5. import java.util.logging.Level;7 X4 }" z( N+ m2 F% ^# n
  6. import java.util.logging.Logger;
    , h# c/ B! g1 X/ M( Y

  7. & B$ ~- t' F* w$ g" c( o* V$ J
  8. import org.l2jmobius.Config;: u/ U) ~7 C2 J2 U7 c9 o
  9. import org.l2jmobius.commons.util.CommonUtil;  }8 a& z) o; u5 g
  10. import org.l2jmobius.gameserver.model.quest.Quest;9 c5 }9 u7 \" I: 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 — менеджер для работы с игровыми скриптами.
- M2 ~, A% d( l8 F9 K8 S4 s" F9 H& k
2 J5 X3 Y8 T3 A' X, _9 ]" ]9 u7 ~- R3. Описание класса QuestManager
) Y+ ~2 U- r1 M
  1. /**9 o# Z+ k8 @' W: x& F! f# l
  2. * Менеджер квестов и скриптов.( n+ J) Q) r1 J' q  @7 X
  3. * Автор: Zoey76
    , U+ n1 k0 E+ T" C2 w  q- e
  4. */
    $ q( j+ {, r, w& o) g1 {
  5. public class QuestManager5 ~- @3 [4 R3 X
  6. {
    4 ^- r; z7 [  I
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());) y" g/ W& d4 w9 m, N4 a
  8.    
    8 D- u8 n9 W: t+ v3 W0 {
  9.     /** Карта, содержащая все квесты. */  L9 d# k1 \7 m- W) w& z+ M
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    # o  H" ^$ o9 V# W4 T
  11.     /** Карта, содержащая все скрипты. */
    9 }8 t) m$ V; j  H. c. ^
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();" c: G5 w- G9 m! }. m! [% O' ?
  13.    
    ; L2 }( ?- V, L* F0 j+ [
  14.     protected QuestManager()
    3 K1 F( G: O1 O  p5 w; d4 S6 Y
  15.     {0 z# l* l4 j( a" w3 I
  16.     }7 p: t* _5 r" ^; |# R
  17. }
Скопировать код
4. Методы0 p. y( n# {' [% _* }7 H  j3 K
Метод reload(String questFolder)
- W$ u  W6 y1 V1 z$ D8 A7 g/ u# z
  1. public boolean reload(String questFolder)
    & G) k7 E. O$ _' ]! n/ w8 q" X
  2. {- K5 @4 B. d3 p. ^
  3.     final Quest q = getQuest(questFolder);
    ( R" @9 U5 t. z7 _- d, ?$ K3 G
  4.     if (q == null)% g% M2 w' v" ~
  5.     {
    ( t% I' B) p7 i. ]+ \  w0 ?5 D$ Q
  6.         return false;
    ) ?6 \3 ~/ @6 O% z1 D( R7 d: Q, H
  7.     }
    " o9 u; L' K5 N, |
  8.     return q.reload();
    2 r# }" G, Q# G) X2 {; `
  9. }
Скопировать код

0 p2 u+ j4 N/ F% Z5 f$ L8 w, `: I3 |  `& \, ?8 Z' m' e$ n$ c
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.4 F% |' G# l7 P! a+ g' _
Метод reload(int questId)( ^% y% L+ V% G4 [, x& Z: s

/ \4 `4 Q) ?* L# l* U
  1. /**
    - ]1 z( u. ?# F1 X8 S* V+ B
  2. * Перезагружает квест по ID.& Q, n7 t! P- w8 q- S9 y% _
  3. * @param questId ID квеста для перезагрузки
    8 o. s( M6 Z# R2 e7 Q
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае. q% j0 Y6 a% k. R, c" `( c
  5. */
    & p5 ?) F1 Y, |* U! S
  6. public boolean reload(int questId)
    ( q% E2 g# J0 \# h: x0 E9 f
  7. {
    1 Y% I/ h" u: l) O
  8.     final Quest q = getQuest(questId);
    + `4 R$ _6 }# T
  9.     if (q == null)
    5 Q1 q7 h4 O5 w, I8 F
  10.     {) L& I) X# p- c2 F
  11.         return false;- O1 x) Z9 [) i: ~! G6 ]6 T* k
  12.     }7 k$ z- f" L1 R. j
  13.     return q.reload();3 w- L5 ~& k+ F  d+ X, |! Q
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.! G7 [6 Z1 `+ J# M3 f8 a

9 t) c! s+ P3 k1 Y* wМетод reloadAllScripts()" }/ X& j" z% G( S
" E- j8 D3 ]% E5 ^
  1. /**1 z1 E4 U9 i5 E  {. _
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.9 D: d6 \$ Y: [$ f, A
  3. */
    4 ]6 w5 W2 ]' z( b
  4. public void reloadAllScripts()7 F4 Q" |7 }, f0 Y' n0 Y4 X" \
  5. {
    ( t. V4 f% C+ n6 |/ S
  6.     unloadAllScripts();
    $ R! v9 h! N# }9 [
  7.     % J9 e7 O' ^2 d. X
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");  y/ Q* s8 J! S4 r+ V4 s
  9.     try, w; k3 U( u' X- Q" ~: Z' X
  10.     {3 j* x( p+ e1 u4 u5 ?2 d. ?
  11.         ScriptEngineManager.getInstance().executeScriptList();
    $ B* @6 w  g" `& n" U: J  ~4 H4 i
  12.     }
    2 }5 d+ ]3 D, R' X. J7 I
  13.     catch (Exception e)& M. m, j" n5 y( M) @4 j
  14.     {
    2 k! f$ k4 ~. `# d! A4 Z8 [
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);9 r+ {! n' A& J- K) y
  16.     }
    , v$ E* ^7 L0 H4 B6 k5 c
  17.     - P7 Y; g2 W! B0 u& I' m
  18.     getInstance().report();+ A! J$ I6 w/ N* \
  19. }
Скопировать код
Метод unloadAllScripts()# v, O% q6 C5 r& o$ Y- @* M
1 t8 H6 m9 x2 k( I% @* @
  1. /**
    : i* o# h8 |$ i, Y- p. O7 F' b( c8 k
  2. * Выгружает все квесты и скрипты.* j6 a6 R9 d! D7 p" y
  3. */- f5 i& L8 ]7 f( S$ r& L4 u
  4. public void unloadAllScripts()
    ; d7 x; u4 Z/ N$ H1 m( R
  5. {
    7 J! k# N" e9 J( `$ c, B" `+ F& O1 S
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    $ I# s( i8 Q* w- E8 U# c
  7.    
    ) _! h) N$ S- R# l; u$ F
  8.     // Выгрузка квестов.# X4 D3 H! u) c
  9.     for (Quest quest : _quests.values())
    4 g, `2 B% C" W6 Z
  10.     {3 }  ^' l1 G% l3 R
  11.         if (quest != null)* X3 X% y4 {2 A! _& F) y
  12.         {8 n* A( p. G3 b% w
  13.             quest.unload(false);
    + `# s, \8 x9 ~. ]
  14.         }
    5 P3 \; h8 r, J6 f/ }
  15.     }4 h7 J8 Q1 m  d. _' b% I  k
  16.     _quests.clear();
    $ L* q' T9 k5 U2 K6 _& g! Y+ ]
  17.     // Выгрузка скриптов.
    6 b6 |1 \* z6 x0 e
  18.     for (Quest script : _scripts.values())
    1 D: ?4 }5 q, q7 t' z
  19.     {
    5 Q3 a$ ?- p9 d: o7 E4 b2 ?
  20.         if (script != null)8 ?8 M: D2 N$ F
  21.         {
    # u$ ^  D$ g, Q$ t7 W" a' X9 }
  22.             script.unload(false);2 _9 u0 w2 w0 w; Z# W
  23.         }
    * q5 d& ?2 j3 Q0 m! |1 h
  24.     }
    $ C8 e* m; _: T4 Z, b8 Q) I3 O) A
  25.     _scripts.clear();
    1 J' W+ [4 V) _1 s9 W6 u3 e4 ]- y* n
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    ' A: a9 v; k& z$ z* M& K9 W" L! @
% G! p' y" \4 R9 b$ \
Метод report()- T1 B# r/ \) r+ P: r$ O! U
; v$ K$ B) U" i  ?8 @+ B
  1. /**' h3 w! r/ h+ a$ x* ?& }
  2. * Логирует количество загруженных квестов и скриптов.+ m  o5 ^) S) I- D2 G8 [% s& ]
  3. */* V# \: T9 x9 h, P# Z7 s
  4. public void report()$ \3 V# \0 p5 T6 |+ I5 n
  5. {
    ' j  ~! A8 P* t
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    5 F3 R, H" s2 Y/ a9 ^% R% r% E3 x
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");$ `- z- E/ K/ E  K+ ^
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов., s6 K1 z, u$ N7 K

% a$ M8 t$ M5 L3 N( e0 |" c, I3 EМетод getQuest(String name)
6 {6 ^* }0 Q8 W, L3 N' K8 s" h. X5 p$ u  L& D0 }2 U$ z
  1. /**
    ) L( Q8 c5 U! o% u
  2. * Получает квест по имени.4 s9 g( F$ N$ L+ X, M2 s! U
  3. * @param name имя квеста( S1 p  a- u. j( B; T, k- Q
  4. * @return квест% g+ X+ i4 g: T5 X) K
  5. */
    ( ~  }: R: }8 _+ ?
  6. public Quest getQuest(String name)$ Y; j6 {" n- ~
  7. {5 ]* O9 v; e7 {3 k% x
  8.     if (_quests.containsKey(name))5 a# e3 d3 b9 V. @
  9.     {7 c( ~* Y1 ~, i/ R: {; m+ `/ \
  10.         return _quests.get(name);  t& I" g7 A: |. W  z/ U, Z
  11.     }
    & @) n) \3 Q. ^) [
  12.     return _scripts.get(name);
    # y' A& |1 W8 e% E
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе." O- f$ Q3 c/ @9 U% u2 P. {
( Y* a  j: u6 E, c& x/ W
Метод getQuest(int questId)% |6 j7 R# U8 z4 [0 L  m
- w1 o6 i5 O! I
  1. /**1 o* [  b& [" @: E7 p  q
  2. * Получает квест по ID.
    8 d5 B  A, z" c3 u  s
  3. * @param questId ID квеста
    9 P+ V( i3 Z  ]; h2 K$ c8 k
  4. * @return квест, если найден, {@code null} в противном случае+ d: B$ @4 G( ]( v& D
  5. */
    ; C  t: V+ `  D4 d
  6. public Quest getQuest(int questId). J: ]- W3 W1 M
  7. {$ b; o9 B6 S" H7 |
  8.     for (Quest q : _quests.values())& o* s. a% Z* {( w6 M& @& ?" w
  9.     {( R' v! C- O4 _6 w
  10.         if (q.getId() == questId)
    / U' Z+ `+ V& {9 T. K/ Z
  11.         {& O( [6 c5 E4 ~% z
  12.             return q;- s/ I: D( g1 E8 M* u/ F. D( L" D% _
  13.         }8 @! h/ Q  H$ i8 V# _9 p
  14.     }& E  `& G6 P9 H2 e: ^* J
  15.     return null;
    + l: Z- v  R! F. F  a
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.! Q& \  Q9 q3 U4 C; Q
3 \0 R' f: q2 X4 x4 @' a0 a1 w1 V' j% K
Метод addQuest(Quest quest), M; v& a, r5 P
$ K* P0 Y! B7 \- V  r7 D
  1. /**
    ; i5 b) @. T: [  K+ r- l1 E9 V, A0 `! x
  2. * Добавляет новый квест.
    % o8 \% C* z+ X* P$ x. |) a* l1 y
  3. * @param quest квест для добавления
    ; n" g1 V( H2 v$ }/ b
  4. */1 U  W* i8 ^: M/ a  j
  5. public void addQuest(Quest quest)
    , `( K0 d+ {2 h/ t0 ?+ {
  6. {
    ( _5 I2 s6 H$ ^0 X$ I& M0 Z# n
  7.     if (quest == null)# K4 e3 `4 q- ]
  8.     {
    0 u& y1 D$ e5 @9 k0 [- _. I
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    0 A7 S+ g* X+ j: M- J6 l
  10.     }, n( T& D+ W' y! b5 H
  11.     ; V8 o7 m& h: Y3 J: n0 y) b( o
  12.     final Quest old = _quests.put(quest.getName(), quest);
    6 |. x8 i" |* s
  13.     if (old != null)
    ' N2 t! o) ?4 f# i' o4 C
  14.     {
    . w' X5 h: D1 t8 X
  15.         old.unload();/ C1 U2 d; B; [2 _" u
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    ( u& c# Q% r7 q2 t0 [: j$ p! D2 l
  17.     }$ }4 M" z# q2 N
  18.    
    % Z! a$ i6 O, u5 E$ c0 {. R% G& d
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)* n( {4 I$ Q( d4 i
  20.     {
    2 r, I( m& m+ M( w
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    ! Y, |- h0 b9 \2 g/ ?' u
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    2 I6 h* B- H7 ?2 F5 o0 }5 V1 q( d! Z
  23.     }; ^4 _3 U/ K7 D/ h
  24. }* k4 W+ ?4 y; G
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
9 S& a, Z2 S. \ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.# u# l) n1 p7 X% O4 H, v4 }$ q6 ^3 @

0 Y* g6 w% Z3 _' n( r+ u/ \9 N
1 [& T" I9 s7 ^7 t9 _3 k; r1 }6 Z1 m: ~  M- F. R. N: f
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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