Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
/ W# j/ [. R% c# U
- m6 |: S% T% }4 hРазбор файла QuestManager.java
+ a% b: o. B, l# F* H$ }' L( F3 L2 M; d% ^% p2 y
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.* W& V! O* V6 e+ ?3 r! t
Основные элементы2 o, z1 K) V: F, a! z7 n
  • Лицензия
    ! z) j: h% x% b9 ]1 R
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      & f# O' `( t2 x1 e
  • Импорты
    4 m) T5 w2 O2 Q) Q

4 I; z4 p' a& }; H% C0 eQuestManager.java — управление квестами и скриптами.
. G" y0 L) s; v7 u4 |Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
" j) j* f- r  J& O% Q8 }
7 `' f1 t! W  y$ _

7 ^! N: e* B& ]& f! D# \Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.1 z. Y" q2 w$ w1 ~. e* S' S. r
1. Лицензионное соглашение$ J+ E! X7 |, F9 @
  1. /*
    9 m  ?, ]* r% o+ m
  2. * Этот файл является частью проекта L2J Mobius.# z: F1 e( R* _) N
  3. * - x8 u, ^  H( g$ l- u1 O) i8 M
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    - e) O# j1 R' k8 P: ]& Z3 }
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    $ k7 d/ D" L# W( `+ z! P
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.0 F9 J2 Y) n6 S
  7. *
    1 Q0 u4 s7 ^9 ~! S* T
  8. * Эта программа распространяется в надежде, что она будет полезной,
    6 S" J+ g* d/ z2 H9 n
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    ; |3 E; o. }& y" O
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    # y( j) Y" f: g' [' u
  11. * См. GNU General Public License для получения более подробной информации.& F6 v4 r" e" t4 k! a$ S8 _
  12. *
    : M$ |0 I: a# n  g. p
  13. * Вы должны были получить копию GNU General Public License
    8 c- t, r& G* Y; Z
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    3 f9 O: S3 N/ L9 A: f/ V/ A
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3." `% J. P  _( J) }( j5 Q2 k
- c8 E) o( w1 v" }9 L% g
6 s3 b" _& Q! ?6 q, k- G
2. Импортируемые библиотеки* ~) G1 s% F# A
/ \; l  z1 |/ W
  1. package org.l2jmobius.gameserver.instancemanager;) x" r$ [' p! C3 R$ C9 U7 G- ~
  2. 9 ~9 V6 ?; o% e
  3. import java.util.Map;
    5 O! H% e8 a$ j
  4. import java.util.concurrent.ConcurrentHashMap;# L- d& g8 P, ^4 \* a5 \  Y
  5. import java.util.logging.Level;0 U# `% H5 ]! X
  6. import java.util.logging.Logger;, c' v) N% x; S7 T

  7. & k1 {/ K' u/ F( D& D6 w
  8. import org.l2jmobius.Config;( l/ f  _) b3 f4 Z3 v1 z) a+ k' j
  9. import org.l2jmobius.commons.util.CommonUtil;
    # j  B# ^1 |: h+ w
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    ( `; \; M) R$ a
  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 — менеджер для работы с игровыми скриптами.* o* p1 z9 `1 h1 I6 q' h2 D

: M6 V& b3 h. S) `5 S5 V3. Описание класса QuestManager$ q% ]( D! }' A$ y
  1. /**
    - W$ L6 d- o! V" O# L' k' ]  Y' u
  2. * Менеджер квестов и скриптов.
    / z* {! n* l- G2 H
  3. * Автор: Zoey76! `3 J$ Z+ ?( S( D1 p2 E* V% J$ l
  4. */
    " G, p" u# a3 ~1 A; U' O
  5. public class QuestManager- c9 x4 `4 v+ @* y! D* B) y1 W, Q
  6. {
    4 q# A, A3 r& y8 G- z) b7 Y; _
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());4 M% O# S$ Q4 T5 b) n
  8.    
    ; C( O0 p" V9 {' Q/ A* Y
  9.     /** Карта, содержащая все квесты. */' @( }% s$ U2 S& ^
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();. E" R$ E* e1 q2 K) L; O
  11.     /** Карта, содержащая все скрипты. */
    2 C% b. e6 {$ L5 U# ^. X4 [7 A4 ]- J2 W
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    : B1 k& b1 ]( h
  13.    
    6 T5 Z/ p% j/ z
  14.     protected QuestManager()6 J' [) X2 G6 U
  15.     {* @  R" G% i4 ]1 i0 x/ L
  16.     }
    - j+ z& u5 }2 u. L5 }$ ~, d, g
  17. }
Скопировать код
4. Методы, F( L$ c# |4 |) M0 E
Метод reload(String questFolder)
. N0 }' z+ u1 y
  1. public boolean reload(String questFolder)
    & w1 @0 U+ E: z7 @- h
  2. {, H  p, O5 b3 k8 k5 P6 c/ |% q
  3.     final Quest q = getQuest(questFolder);* Y$ U; Q( a3 b3 i  ?  V
  4.     if (q == null)+ H2 F+ d- D1 v, s* C5 a0 S
  5.     {
    ' L& c; X' i' c3 f! ~/ Z0 B
  6.         return false;
    - A- R( n( @. l* Q
  7.     }
    ! ?- m+ H1 Y3 ]7 @* C8 ~( Q# p% r# o) m
  8.     return q.reload();
    3 {% V7 y, `1 C9 P2 ?
  9. }
Скопировать код
7 f: Y, ?1 u7 E8 K$ @" C0 k

. y- B4 R$ ]( S1 T* C9 fМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
& o2 K' I* l* Y% R" t: n" w2 sМетод reload(int questId)9 m* {1 C6 G- M9 k0 s  ^& o( W. C
7 v( G" J/ f4 H3 ^3 v8 p
  1. /**
    , ^* M% Z  R; @% ^; i* t
  2. * Перезагружает квест по ID.2 H) o. U5 l. F; _
  3. * @param questId ID квеста для перезагрузки3 y: C" b( u5 ]" N
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае8 X3 T7 G4 T, C, H. m/ @+ E
  5. *// A' L+ N  F5 I" m. N3 O% ^5 ]& U
  6. public boolean reload(int questId)7 @/ E- `( e2 n( n; N
  7. {
    6 Q! T/ v# Y0 m. b- @& Z7 ]9 b
  8.     final Quest q = getQuest(questId);
    ( g! E6 }0 g% b% x
  9.     if (q == null)) ]% Q' i# j* S$ {& n
  10.     {
    2 y, K5 Y7 Z- J  J
  11.         return false;- m- O, Y1 g7 I
  12.     }% X1 o: y3 b9 }/ d) P+ T" s
  13.     return q.reload();
    . a( N9 K' N8 [. `
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    9 _8 o5 P* t! u

. ?+ J: D5 M/ I7 z9 \  h9 F/ g- {Метод reloadAllScripts()$ J2 `8 t. N5 _3 L: J+ }
9 [& d6 P- f- y( F$ w9 F
  1. /**
    4 O5 W* W) Z' Q
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    9 P) j, w. A. ~" C( A% R$ V
  3. */+ a2 i! Z, f" m5 h  \( Y4 r
  4. public void reloadAllScripts()+ E) u* E4 ]2 [4 p. d$ s6 P
  5. {. D2 H( A4 p, D+ W% ?- b
  6.     unloadAllScripts();( U' ]+ @$ A/ ~6 }
  7.    
    / ?- v5 @5 q; ]: z$ X
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");$ e( {8 w2 p' q/ h- x
  9.     try, ?7 i9 t1 F! Y% v" |
  10.     {
    + e, e, f  }& k9 H! |  K& d
  11.         ScriptEngineManager.getInstance().executeScriptList();) {+ N: Q- n* U. a
  12.     }
    9 g$ L+ ~' g5 t: w" j
  13.     catch (Exception e). M/ h( y; B  V9 t# P4 o
  14.     {9 N- ~5 E( B5 B) ]$ |( v9 w! I  U
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);( w, }2 z7 R: d
  16.     }/ f! p- L2 @* G7 |
  17.    
    3 E, w& w, u4 V# c, }8 T
  18.     getInstance().report();
    & w0 J6 ]" J6 _& i( S, o
  19. }
Скопировать код
Метод unloadAllScripts()
  {  y( o, ?( T8 ?8 w' _7 S0 f! R/ o- Y$ g5 D
  1. /**
    . ~7 n7 ^4 ?; A: Y; U
  2. * Выгружает все квесты и скрипты.. @0 d) i6 _; r8 a. d: x+ |
  3. */  `6 a0 v( Z# }9 d/ [: W6 X
  4. public void unloadAllScripts()
    ) F% v) W1 O* w
  5. {/ B$ K; H7 F$ a! P
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");% N4 }8 o5 Q% [9 p: A+ @
  7.     % |3 m: T4 z- G* p/ ~
  8.     // Выгрузка квестов.3 `' j4 @1 p- _
  9.     for (Quest quest : _quests.values())7 U! i4 z; }+ x4 Z5 x& P5 ?5 V
  10.     {
    $ A; ?/ a- n2 z
  11.         if (quest != null)
    & p: X, i; _# \) S
  12.         {8 O. c1 k: @; N0 V0 G
  13.             quest.unload(false);
    & J/ z' }0 M& z3 O. e; V
  14.         }- @: m0 s) U" O& [9 S/ T1 R
  15.     }6 {( X  M/ V2 e) M' z3 z1 C5 Y$ N
  16.     _quests.clear();! e" t) \8 t3 N; N' @, C5 E
  17.     // Выгрузка скриптов.7 D3 z- ]  U- f8 U% V3 r0 m: v3 \
  18.     for (Quest script : _scripts.values())
    2 P7 V7 P; l# ^, g* C  T9 h
  19.     {, t& q; ]  _% o  ~' f# _
  20.         if (script != null)
    . w6 c) L5 s* _& o
  21.         {' w( h! ]! N7 c- u( |; u4 p
  22.             script.unload(false);
    2 y) D0 v7 h- P. b9 x
  23.         }
    # @* N# \' a: \( C
  24.     }2 d% o! J1 N6 `; c/ a* G5 [
  25.     _scripts.clear();
    4 I  E0 d* ]8 B6 A2 B, d6 Y# F
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    ' p; Y4 @- O4 l/ n8 @$ p
: {# B% G: S# ~" q* d7 v* y
Метод report()0 G6 w1 o" B7 J2 q& x. ]: |

) S8 A2 v  j* C
  1. /**' d* O2 i6 K$ E
  2. * Логирует количество загруженных квестов и скриптов.
    / U* ?( N# x9 o% I* W7 K
  3. */% u  F" l" h7 s5 Q- ^2 w$ o
  4. public void report()) _) f- t" }0 e: T, \- U+ k: H1 ^
  5. {9 i+ T" F0 m: g) K
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    ' x; N" n, l- q4 D1 a" E3 \
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");; g. B+ M; J0 T, t  g
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.. R4 Q  @; L$ U: ]$ O7 w
! J) n* i- J: ^! S' Q
Метод getQuest(String name): W) C5 d; p9 Q+ S9 \2 T6 @

! U: B- s5 u2 k5 ]
  1. /**& w# C# j/ [/ I! F4 \/ v
  2. * Получает квест по имени., f# ?" P% |7 w, h! I
  3. * @param name имя квеста6 G- {" Z- t. z0 s( Z
  4. * @return квест
    - A7 [( [) E  j9 l) E; ]
  5. */$ Q4 {: ?. m( c4 \; q5 q- x5 q
  6. public Quest getQuest(String name)* b) R/ f  W$ J1 \
  7. {& @6 y/ v4 I: x* p2 N( |
  8.     if (_quests.containsKey(name))
    / _$ Z& w3 U! \/ P( P
  9.     {
    % k" @3 V9 [2 D( L) ~
  10.         return _quests.get(name);( W* \! k0 E0 [& \+ f! ~9 c) O5 B
  11.     }( A9 {' E% h  v* {3 Q' Z; x
  12.     return _scripts.get(name);
    " l9 d! A% ]# @4 f' ]& ?
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    ) _9 j- B% W4 g. o" R

( W6 v' L- ~, `, j8 E. [' V" KМетод getQuest(int questId)" j9 Q" V% Q7 c: c3 Q7 y
6 g* {! ^( q& y/ w; S1 a0 d
  1. /**
    8 @, L2 [/ u- f- s
  2. * Получает квест по ID.
    1 m( Y) q# r* X: {  Y! |0 C
  3. * @param questId ID квеста
    4 [; g+ I7 o9 E% W6 r$ n; G
  4. * @return квест, если найден, {@code null} в противном случае
    ; S; c; U+ W. P5 ~( Z
  5. */$ i1 S. |9 M5 |0 c
  6. public Quest getQuest(int questId)
    8 Z) _$ R  h" ~  ^3 \* |4 r
  7. {
    $ P& t/ ?) M& y% {. D  l
  8.     for (Quest q : _quests.values())- c$ ]$ ~; K( G4 l
  9.     {
    ; U) B( G) l# o  e7 h' T
  10.         if (q.getId() == questId)' c' U; Y5 U: Z
  11.         {' v. x4 R) t: j4 T* ~4 I
  12.             return q;
    9 j2 L  D) T8 Y$ h: o. P4 m5 q
  13.         }+ q0 I# E) M$ T' F; n/ O9 k
  14.     }
    9 j* x( k/ H* {: y% n" p
  15.     return null;
    " P: K9 U/ U+ l1 m
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.6 D! d) F2 f# R: I

# \" ~$ ?8 Z* i" `# WМетод addQuest(Quest quest)4 y7 }# X9 H* b4 [
1 F- D9 s" M0 d# ?& F6 N
  1. /**, o4 D) ]7 e1 ^' P# H4 u
  2. * Добавляет новый квест.. q9 @) O) T1 x0 u2 T& p# G" E8 e
  3. * @param quest квест для добавления
    6 _. V. f1 [! |
  4. */) I( v3 Y) p2 f/ A0 A7 i# F
  5. public void addQuest(Quest quest)- g- j+ ?' p, v! m# J
  6. {
    ) c$ M$ E: J& p! W
  7.     if (quest == null)8 F% j# f1 x% o% q
  8.     {$ p# q, P7 [6 b3 e6 P+ K
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    3 ^+ F0 o  z! ?/ Y& F3 G/ g# C
  10.     }
    & I( v4 g" f, Y
  11.    
    2 E+ ~! a( {8 ]
  12.     final Quest old = _quests.put(quest.getName(), quest);3 o- C  E3 ^: D- a1 {
  13.     if (old != null)
    - Z2 r2 Q5 Y* b0 [3 Z$ @% ^
  14.     {
    $ K; O8 l4 D9 Z* U
  15.         old.unload();
    ! C9 ?3 f: H0 ?2 V. @
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
      C, U, p/ S; n. X' e+ L, L
  17.     }
    5 i% [( K6 `4 j" J1 t, Q5 c
  18.     0 K* F9 e9 Q$ B7 [
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)% A: p; T$ D* r. N( t& L" B
  20.     {
    2 _- z3 k8 I) S* Y
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();5 M$ x! Q/ G) \
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    $ Q$ t! q: T! m2 D9 ?
  23.     }
    $ z8 P2 W, o9 K
  24. }
    ; p- M9 w. x0 T! y  ]" s3 v% {% j+ q
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера." S" Z0 S: P/ |
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
0 p1 ^' m% w! j5 {. J
9 P. c: l8 B; P& Q$ C0 k9 N7 h! l6 O* P$ \) L" p
" g1 ~& x% K2 m
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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